From c7b3111d33aa29abcc8fd7ba19d74a75c25787d2 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Thu, 19 Sep 2024 11:21:32 +0800 Subject: [PATCH 001/164] =?UTF-8?q?fix(backend):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=9B=86=E7=BE=A4=E5=85=8D=E5=AE=A1=E6=89=B9=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20#6993?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_services/mysql/remote_service/handlers.py | 12 +++++++----- dbm-ui/backend/ticket/handler.py | 16 ++++++++++------ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/dbm-ui/backend/db_services/mysql/remote_service/handlers.py b/dbm-ui/backend/db_services/mysql/remote_service/handlers.py index 3290fdcc7c..41d2351069 100644 --- a/dbm-ui/backend/db_services/mysql/remote_service/handlers.py +++ b/dbm-ui/backend/db_services/mysql/remote_service/handlers.py @@ -8,6 +8,7 @@ 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 copy from collections import defaultdict from typing import Any, Dict, List, Union @@ -29,12 +30,13 @@ def __init__(self, bk_biz_id: int): @classmethod def _format_db_tb_name(cls, _data_names): - for index in range(len(_data_names)): + _copied_data = copy.deepcopy(_data_names) + for index in range(len(_copied_data)): # mysql模糊匹配单个字符,用_,原本字符串里带的_,要\_转义,如果是*,则转为%表示like % --> 永真 - _data_names[index] = ( - _data_names[index].replace("_", "\_").replace("?", "_").replace("*", "%") # noqa: W605 - ) - return _data_names + _copied_data[index] = ( + _copied_data[index].replace("_", "\_").replace("?", "_").replace("*", "%") + ) # noqa: W605 + return _copied_data @classmethod def _get_db_tb_sts(cls, _data_names, key, default): diff --git a/dbm-ui/backend/ticket/handler.py b/dbm-ui/backend/ticket/handler.py index 5e5970d462..010f7f8a14 100644 --- a/dbm-ui/backend/ticket/handler.py +++ b/dbm-ui/backend/ticket/handler.py @@ -370,21 +370,25 @@ def query_ticket_flows_describe(cls, bk_biz_id, db_type, ticket_types=None): ticket_flow_configs = TicketFlowsConfig.objects.filter(config_filter) # 获得单据flow配置映射表和集群映射表 - flow_config_map = {config.ticket_type: config.configs for config in ticket_flow_configs} + biz_config_map = {cfg.ticket_type: cfg.configs for cfg in ticket_flow_configs if not cfg.cluster_ids} + cluster_config_map = {cfg.ticket_type: cfg.configs for cfg in ticket_flow_configs if cfg.cluster_ids} + + # 获得集群映射表 cluster_ids = list(itertools.chain(*ticket_flow_configs.values_list("cluster_ids", flat=True))) clusters_map = {c.id: c for c in Cluster.objects.filter(id__in=cluster_ids)} # 获取单据流程配置信息 flow_desc_list: List[Dict] = [] for flow_config in ticket_flow_configs: - # 获取当前单据的执行流程描述 - flow_desc = BuilderFactory.registry[flow_config.ticket_type].describe_ticket_flows(flow_config_map) # 获取集群的描述 cluster_info = [ - {"cluster_id": clusters_map[c].id, "immute_domain": clusters_map[c].immute_domain} - for c in flow_config.cluster_ids - if c in clusters_map + {"cluster_id": clusters_map[cluster_id].id, "immute_domain": clusters_map[cluster_id].immute_domain} + for cluster_id in flow_config.cluster_ids + if cluster_id in clusters_map ] + # 获取当前单据的执行流程描述 + config_map = cluster_config_map if cluster_info else biz_config_map + flow_desc = BuilderFactory.registry[flow_config.ticket_type].describe_ticket_flows(config_map) # 获取配置的基本信息 flow_config_info = model_to_dict(flow_config) flow_config_info.update( From 0e7cf0d2f2e68055d5e577ae55816977a87d4f1a Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Thu, 19 Sep 2024 19:43:22 +0800 Subject: [PATCH 002/164] =?UTF-8?q?fix(backend):=20RedisCluster=E3=80=81Te?= =?UTF-8?q?ndisplus=20=E7=9A=84=E8=AE=BF=E9=97=AE=E5=AF=86=E7=A0=81=20?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=90=8C=E6=97=B6=E4=BD=9C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?Proxy=20=E5=92=8C=E5=90=8E=E7=AB=AF=20#7011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py b/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py index b19735ea8e..f7182ad733 100644 --- a/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py +++ b/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py @@ -188,7 +188,10 @@ def format_ticket_data(self): proxy_pwd = self.ticket_data.get("proxy_pwd") or DBPasswordHandler.get_random_password( security_type=DBPrivSecurityType.REDIS_PASSWORD ) + # 如果部署类型是RedisCluster、Tendisplus,则后端密码和proxy密码相同,以proxy为准 ticket_type = self.ticket_data["cluster_type"] + if ticket_type in [ClusterType.TendisPredixyRedisCluster, ClusterType.TendisPredixyTendisplusCluster]: + redis_pwd = proxy_pwd # 默认db数量 DEFAULT_DATABASES = 2 From 3d5e5ad5953102e95ceac65ad01558d80d8287fd Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Thu, 19 Sep 2024 20:31:23 +0800 Subject: [PATCH 003/164] =?UTF-8?q?fix(backend):=20=E5=AE=B9=E9=87=8F?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=8E=87=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20#7013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_periodic_task/local_tasks/db_meta/sync_cluster_stat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/db_meta/sync_cluster_stat.py b/dbm-ui/backend/db_periodic_task/local_tasks/db_meta/sync_cluster_stat.py index 178ff0e7b4..169119895b 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/db_meta/sync_cluster_stat.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/db_meta/sync_cluster_stat.py @@ -124,7 +124,7 @@ def sync_cluster_stat_by_cluster_type(bk_biz_id, cluster_type): cap["in_use"] = round(cap["used"] * 100.0 / cap["total"], 2) cache.set( - f"{CACHE_CLUSTER_STATS}_{bk_biz_id}_{cluster_type}", json.dumps(cluster_stats), timeout=1 * TimeUnit.HOUR + f"{CACHE_CLUSTER_STATS}_{bk_biz_id}_{cluster_type}", json.dumps(cluster_stats), timeout=2 * TimeUnit.HOUR ) From 98487fe717025fea5f26368e3b1b9a7ad2ba382f Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Thu, 19 Sep 2024 21:17:33 +0800 Subject: [PATCH 004/164] =?UTF-8?q?feat(backend):=20sqlserver=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E7=AD=96=E7=95=A5=E7=BB=B4=E5=BA=A6=20#7015?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_monitor/models/alarm.py | 4 ++-- ...sql\345\244\261\350\264\245\347\255\226\347\225\245.json" | 2 +- ...sql\346\210\220\345\212\237\347\255\226\347\225\245.json" | 2 +- ...dis\345\244\261\350\264\245\347\255\226\347\225\245.json" | 2 +- ...dis\346\210\220\345\212\237\347\255\226\347\225\245.json" | 2 +- ...P99\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...207\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...260\351\207\217\346\257\217\345\210\206\351\222\237.json" | 5 +++-- ...P99\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...207\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...260\351\207\217\346\257\217\345\210\206\351\222\237.json" | 5 +++-- ...P99\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...207\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...260\351\207\217\346\257\217\345\210\206\351\222\237.json" | 5 +++-- ...P99\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...207\350\256\277\351\227\256\350\200\227\346\227\266.json" | 5 +++-- ...260\351\207\217\346\257\217\345\210\206\351\222\237.json" | 5 +++-- .../Sqlserver-CPU\345\210\251\347\224\250\347\216\207.json" | 5 +++-- ...275\344\273\273\345\212\241\345\244\261\350\264\245.json" | 5 +++-- ...266\344\273\273\345\212\241\345\244\261\350\264\245.json" | 5 +++-- ...242\346\227\245\345\277\227\346\225\260\351\207\217.json" | 5 +++-- ...274\202\345\270\270\343\200\220Alwayson\343\200\221.json" | 5 +++-- ...74\202\345\270\270\343\200\220mirroring\343\200\221.json" | 5 +++-- ...227\266\351\227\264\343\200\220Alwayson\343\200\221.json" | 5 +++-- ...20\216\351\207\217\343\200\220mirroring\343\200\221.json" | 5 +++-- ...266\345\277\253\347\205\247\347\274\272\345\244\261.json" | 5 +++-- ...274\272\345\244\261\343\200\220Alwayson\343\200\221.json" | 5 +++-- ...74\272\345\244\261\343\200\220mirroring\343\200\221.json" | 5 +++-- ...277\347\224\250\347\251\272\351\227\264\351\207\217.json" | 5 +++-- ...275\344\273\273\345\212\241\345\244\261\350\264\245.json" | 5 +++-- ...er-\350\277\233\347\250\213\345\255\230\346\264\273.json" | 5 +++-- ...213\347\232\204\350\277\236\346\216\245\346\225\260.json" | 5 +++-- 32 files changed, 87 insertions(+), 60 deletions(-) diff --git a/dbm-ui/backend/db_monitor/models/alarm.py b/dbm-ui/backend/db_monitor/models/alarm.py index 5f3991c531..d7530ee73e 100644 --- a/dbm-ui/backend/db_monitor/models/alarm.py +++ b/dbm-ui/backend/db_monitor/models/alarm.py @@ -673,9 +673,9 @@ def patch_target_and_metric_id(details, db_type): items = details["items"] # 事件类告警,无需设置告警目标,否则要求上报的数据必须携带服务实例id(告警目标匹配依据) for item in items: - # 更新监控目标为db_type对应的cmdb拓扑,其中 DBHA 的策略,无需添加目标 + # 更新监控目标为db_type对应的cmdb拓扑,其中标签 NO_MONITOR_TARGET 的策略,无需添加监控目标 objs = AppMonitorTopo.get_set_by_dbtype(db_type=db_type) - if objs and "DBHA_SWITCH" not in details["labels"]: + if objs and "NO_MONITOR_TARGET" not in details["labels"]: item["target"] = [ [ { diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\345\244\261\350\264\245\347\255\226\347\225\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\345\244\261\350\264\245\347\255\226\347\225\245.json" index 252d4b73f8..1263fe4cd3 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\345\244\261\350\264\245\347\255\226\347\225\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\345\244\261\350\264\245\347\255\226\347\225\245.json" @@ -238,7 +238,7 @@ "labels": [ "DBM", "DBM_MYSQL", - "DBHA_SWITCH" + "NO_MONITOR_TARGET" ], "app": "", "path": "", diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\346\210\220\345\212\237\347\255\226\347\225\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\346\210\220\345\212\237\347\255\226\347\225\245.json" index 08dd78b906..532fd78957 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\346\210\220\345\212\237\347\255\226\347\225\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/mysql/Mysql dbha\345\210\207\346\215\242mysql\346\210\220\345\212\237\347\255\226\347\225\245.json" @@ -238,7 +238,7 @@ "labels": [ "DBM", "DBM_MYSQL", - "DBHA_SWITCH" + "NO_MONITOR_TARGET" ], "app": "", "path": "", diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\345\244\261\350\264\245\347\255\226\347\225\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\345\244\261\350\264\245\347\255\226\347\225\245.json" index 67a8a88644..eb9cc02cf1 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\345\244\261\350\264\245\347\255\226\347\225\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\345\244\261\350\264\245\347\255\226\347\225\245.json" @@ -238,7 +238,7 @@ "labels": [ "DBM", "DBM_REDIS", - "DBHA_SWITCH" + "NO_MONITOR_TARGET" ], "app": "", "path": "", diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\346\210\220\345\212\237\347\255\226\347\225\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\346\210\220\345\212\237\347\255\226\347\225\245.json" index d294c8eaba..0098adc23d 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\346\210\220\345\212\237\347\255\226\347\225\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis dbha\345\210\207\346\215\242redis\346\210\220\345\212\237\347\255\226\347\225\245.json" @@ -238,7 +238,7 @@ "labels": [ "DBM", "DBM_REDIS", - "DBHA_SWITCH" + "NO_MONITOR_TARGET" ], "app": "", "path": "", diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" index 885d0772ea..6ea00c7279 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[RedisCluster]集群P99访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" index 92d2624d72..cc88d7674d 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[RedisCluster]集群平均访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" index 0f70a07a57..c427dc55a0 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(RedisCluster)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[RedisCluster]集群访问耗时超过1秒的请求数量每分钟", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" index 46b4a8e6ec..5dcd01543a 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisCache]集群P99访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" index e4598b1271..0f77b0ab51 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisCache]集群平均访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" index 727903f225..6b21a50b2f 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisCache)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisCache]集群访问耗时超过1秒的请求数量每分钟", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" index 3960db28e9..76dfee5720 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisPlus]集群P99访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" index 7c19f44869..91709942fe 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisPlus]集群平均访问耗时", - "version": 4, + "version": 5, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" index 6159890a7c..590277ab6e 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisPlus)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisPlus]集群访问耗时超过1秒的请求数量每分钟", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" index dc2ed7f0db..116dd438c5 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244P99\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisSSD]集群P99访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" index a8aa7f706d..809da4b882 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\345\271\263\345\235\207\350\256\277\351\227\256\350\200\227\346\227\266.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisSSD]集群平均访问耗时", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" index 8374bd7598..27532b738e 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/redis/Redis(TendisSSD)\351\233\206\347\276\244\350\256\277\351\227\256\350\200\227\346\227\266\350\266\205\350\277\2071\347\247\222\347\232\204\350\257\267\346\261\202\346\225\260\351\207\217\346\257\217\345\210\206\351\222\237.json" @@ -258,7 +258,8 @@ }, "labels": [ "DBM", - "DBM_REDIS" + "DBM_REDIS", + "NO_MONITOR_TARGET" ], "app": "", "path": "", @@ -271,7 +272,7 @@ }, "is_enabled": true, "monitor_indicator": "[TendisSSD]集群访问耗时超过1秒的请求数量每分钟", - "version": 3, + "version": 4, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-07-23T16:36:12+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-CPU\345\210\251\347\224\250\347\216\207.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-CPU\345\210\251\347\224\250\347\216\207.json" index 4df26729f1..39b8b7ea0b 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-CPU\345\210\251\347\224\250\347\216\207.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-CPU\345\210\251\347\224\250\347\216\207.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_cpu_use_precent", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_cpu_use_precent)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\205\250\351\207\217\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\205\250\351\207\217\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" index 7a3e0a5d5a..2509480450 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\205\250\351\207\217\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\205\250\351\207\217\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_full_backup_fail", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_full_backup_fail)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\256\232\346\227\266\344\273\273\345\212\241\345\244\261\350\264\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\256\232\346\227\266\344\273\273\345\212\241\345\244\261\350\264\245.json" index a941561292..2d270556c9 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\256\232\346\227\266\344\273\273\345\212\241\345\244\261\350\264\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\345\256\232\346\227\266\344\273\273\345\212\241\345\244\261\350\264\245.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_job_fail", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_job_fail)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\205\242\346\227\245\345\277\227\346\225\260\351\207\217.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\205\242\346\227\245\345\277\227\346\225\260\351\207\217.json" index 1d4b12af15..92ee5a8606 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\205\242\346\227\245\345\277\227\346\225\260\351\207\217.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\205\242\346\227\245\345\277\227\346\225\260\351\207\217.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_slow_queries", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_slow_queries)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" index 4f4cb5df1c..3d08fc85b6 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_alwayson_status", @@ -253,7 +254,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_alwayson_status)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220mirroring\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220mirroring\343\200\221.json" index 7cacdf33f6..4807d44742 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220mirroring\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220mirroring\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_mirroring_status", @@ -253,7 +254,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_mirroring_status)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\346\227\266\351\227\264\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\346\227\266\351\227\264\343\200\220Alwayson\343\200\221.json" index 790d764e76..557bd39544 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\346\227\266\351\227\264\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\346\227\266\351\227\264\343\200\220Alwayson\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_alwayson_delay", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_alwayson_delay)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\351\207\217\343\200\220mirroring\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\351\207\217\343\200\220mirroring\343\200\221.json" index 85e0a3984b..9e60fd8cdc 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\351\207\217\343\200\220mirroring\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\350\220\275\345\220\216\351\207\217\343\200\220mirroring\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_mirroring_delay", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_mirroring_delay)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\256\232\346\227\266\345\277\253\347\205\247\347\274\272\345\244\261.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\256\232\346\227\266\345\277\253\347\205\247\347\274\272\345\244\261.json" index 83d694aa8b..d86c8bbca6 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\256\232\346\227\266\345\277\253\347\205\247\347\274\272\345\244\261.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\256\232\346\227\266\345\277\253\347\205\247\347\274\272\345\244\261.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_snapshot_deploy", @@ -253,7 +254,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_snapshot_deploy)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" index c5bd402803..0dd1927e7c 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_alwayson_deploy", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_alwayson_deploy)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220mirroring\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220mirroring\343\200\221.json" index bc514377f6..812b1cff87 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220mirroring\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220mirroring\343\200\221.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_mirroring_deploy", @@ -249,7 +250,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_mirroring_deploy)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\344\275\277\347\224\250\347\251\272\351\227\264\351\207\217.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\344\275\277\347\224\250\347\251\272\351\227\264\351\207\217.json" index 4497777cab..8d8d25b09b 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\344\275\277\347\224\250\347\251\272\351\227\264\351\207\217.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\344\275\277\347\224\250\347\251\272\351\227\264\351\207\217.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_database_ldfsize", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_database_ldfsize)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" index d62794b7bb..0a4934d401 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\227\245\345\277\227\345\244\207\344\273\275\344\273\273\345\212\241\345\244\261\350\264\245.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_log_backup_fail", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_log_backup_fail)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" index 546b9ed0bc..5b8d9b2ad9 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" @@ -37,7 +37,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_serveice_available", @@ -248,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_serveice_available)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\347\232\204\350\277\236\346\216\245\346\225\260.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\347\232\204\350\277\236\346\216\245\346\225\260.json" index 57c1950d2e..e9c8dc3d6e 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\347\232\204\350\277\236\346\216\245\346\225\260.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\347\232\204\350\277\236\346\216\245\346\225\260.json" @@ -42,7 +42,8 @@ "cluster_domain", "instance", "instance_role", - "appid" + "appid", + "bk_target_service_instance_id" ], "agg_condition": [], "metric_field": "mssql_connections", @@ -253,7 +254,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_connections)", - "version": 1, + "version": 2, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" From 4b82eda479db518eb0db5aa00310065233e0beec Mon Sep 17 00:00:00 2001 From: zfrendo <842557664@qq.com> Date: Thu, 19 Sep 2024 09:48:17 +0800 Subject: [PATCH 005/164] =?UTF-8?q?style:=20tendbHa=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=B5=81=E7=A8=8B=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=20#6973?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cluster/tendbha/switch_storage.py | 2 +- .../mysql/common/slave_recover_switch.py | 2 +- .../mysql_migrate_cluster_remote_flow.py | 58 ++++++++++++-- .../mysql/mysql_restore_slave_remote_flow.py | 75 +++++++++++++++++-- .../collections/mysql/mysql_crond_control.py | 22 +++--- .../flow/utils/mysql/mysql_act_dataclass.py | 3 +- .../ticket/builders/mysql/mysql_add_slave.py | 8 +- .../builders/mysql/mysql_migrate_cluster.py | 8 +- .../mysql/mysql_restore_local_slave.py | 8 +- .../builders/mysql/mysql_restore_slave.py | 8 +- 10 files changed, 137 insertions(+), 57 deletions(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py index 65e61f05e1..f18a701f91 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py @@ -34,7 +34,7 @@ def switch_storage(cluster_id: int, target_storage_ip: str, origin_storage_ip: s ) cluster.storageinstance_set.remove(origin_storage) target_storage.status = InstanceStatus.RUNNING.value - if role and target_storage == InstanceRole.BACKEND_REPEATER: + if role and target_storage.instance_role == InstanceRole.BACKEND_REPEATER.value: # 如果是REPEATER角色,改成传入的role变量 target_storage.instance_role = role target_storage.instance_inner_role = InstanceRoleInstanceInnerRoleMap[role].value diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py index 3c082d7920..eadb3ef073 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py @@ -151,4 +151,4 @@ def slave_migrate_switch_sub_flow( ) ), ) - return sub_pipeline.build_sub_process(sub_name=_("[{}]成对切换".format(cluster.name))) + return sub_pipeline.build_sub_process(sub_name=_("{}切换到新从库{}:{}".format(cluster.name, new_slave_ip, master.port))) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py index 8f094441ab..329da94339 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py @@ -20,7 +20,8 @@ from backend.components import DBConfigApi from backend.components.dbconfig.constants import FormatType, LevelName from backend.configuration.constants import DBType -from backend.db_meta.enums import ClusterType, InstanceInnerRole +from backend.constants import IP_PORT_DIVIDER +from backend.db_meta.enums import ClusterType, InstanceInnerRole, InstanceStatus from backend.db_meta.models import Cluster from backend.db_package.models import Package from backend.db_services.mysql.fixpoint_rollback.handlers import FixPointRollbackHandler @@ -33,6 +34,9 @@ ) from backend.flow.engine.bamboo.scene.mysql.common.get_master_config import get_instance_config from backend.flow.engine.bamboo.scene.mysql.common.master_and_slave_switch import master_and_slave_switch +from backend.flow.engine.bamboo.scene.mysql.common.mysql_resotre_data_sub_flow import ( + mysql_restore_master_slave_sub_flow, +) from backend.flow.engine.bamboo.scene.mysql.common.uninstall_instance import uninstall_instance_sub_flow from backend.flow.engine.bamboo.scene.spider.common.exceptions import TendbGetBackupInfoFailedException from backend.flow.engine.bamboo.scene.spider.spider_remote_node_migrate import remote_instance_migrate_sub_flow @@ -53,6 +57,7 @@ from backend.flow.utils.mysql.mysql_act_playload import MysqlActPayload from backend.flow.utils.mysql.mysql_context_dataclass import ClusterInfoContext from backend.flow.utils.mysql.mysql_db_meta import MySQLDBMeta +from backend.ticket.builders.common.constants import MySQLBackupSource logger = logging.getLogger("flow") @@ -74,6 +79,9 @@ def __init__(self, root_id: str, ticket_data: Optional[Dict]): # 定义备份文件存放到目标机器目录位置 self.backup_target_path = f"/data/dbbak/{self.root_id}" + self.local_backup = False + if self.ticket_data.get("backup_source") == MySQLBackupSource.LOCAL: + self.local_backup = True def migrate_cluster_flow(self, use_for_upgrade=False): """ @@ -234,18 +242,42 @@ def migrate_cluster_flow(self, use_for_upgrade=False): cluster["slave_ip"] = self.data["slave_ip"] cluster["master_port"] = master_model.port cluster["slave_port"] = master_model.port + cluster["mysql_port"] = master_model.port cluster["file_target_path"] = f"/data/dbbak/{self.root_id}/{master_model.port}" cluster["cluster_id"] = cluster_model.id cluster["bk_cloud_id"] = cluster_model.bk_cloud_id cluster["change_master_force"] = False + cluster["change_master"] = False cluster["charset"] = self.data["charset"] sync_data_sub_pipeline = SubBuilder(root_id=self.root_id, data=copy.deepcopy(self.data)) - sync_data_sub_pipeline.add_sub_pipeline( - sub_flow=remote_instance_migrate_sub_flow( - root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + if self.local_backup: + stand_by_slaves = cluster_model.storageinstance_set.filter( + instance_inner_role=InstanceInnerRole.SLAVE.value, + is_stand_by=True, + status=InstanceStatus.RUNNING.value, + ).exclude(machine__ip__in=[self.data["new_slave_ip"], self.data["new_master_ip"]]) + # 从standby从库找备份 + inst_list = ["{}{}{}".format(master_model.machine.ip, IP_PORT_DIVIDER, master_model.port)] + if len(stand_by_slaves) > 0: + inst_list.append( + "{}{}{}".format(stand_by_slaves[0].machine.ip, IP_PORT_DIVIDER, stand_by_slaves[0].port) + ) + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=mysql_restore_master_slave_sub_flow( + root_id=self.root_id, + ticket_data=copy.deepcopy(self.data), + cluster=cluster, + cluster_model=cluster_model, + ins_list=inst_list, + ) + ) + else: + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=remote_instance_migrate_sub_flow( + root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + ) ) - ) sync_data_sub_pipeline.add_act( act_name=_("数据恢复完毕,写入新主节点和旧主节点的关系链元数据"), @@ -297,7 +329,7 @@ def migrate_cluster_flow(self, use_for_upgrade=False): ) ) switch_sub_pipeline.add_act( - act_name=_("集群切换完成,写入 {} 的元信息".format(cluster_model.id)), + act_name=_("集群切换完成,写入 {} 的元信息".format(cluster_model.name)), act_component_code=MySQLDBMetaComponent.code, kwargs=asdict( DBMetaOPKwargs( @@ -308,7 +340,7 @@ def migrate_cluster_flow(self, use_for_upgrade=False): ), ) switch_sub_pipeline_list.append( - switch_sub_pipeline.build_sub_process(sub_name=_("集群 {} 切换".format(cluster_model.id))) + switch_sub_pipeline.build_sub_process(sub_name=_("集群 {} 切换".format(cluster_model.name))) ) # 第四步 卸载实例 uninstall_svr_sub_pipeline_list = [] @@ -405,6 +437,18 @@ def migrate_cluster_flow(self, use_for_upgrade=False): db_backup_pkg_type=MysqlVersionToDBBackupForMap[self.data["db_version"]], ) ) + # tendb_migrate_pipeline.add_act( + # act_name=_("屏蔽监控 {} {}").format(self.data["new_master_ip"], self.data["new_slave_ip"]), + # act_component_code=MysqlCrondMonitorControlComponent.code, + # kwargs=asdict( + # CrondMonitorKwargs( + # bk_cloud_id=cluster_class.bk_cloud_id, + # exec_ips=[self.data["new_master_ip"], self.data["new_slave_ip"]], + # port=0, + # minutes=240, + # ) + # ), + # ) # 人工确认切换迁移实例 tendb_migrate_pipeline.add_act(act_name=_("人工确认切换"), act_component_code=PauseComponent.code, kwargs={}) # 切换迁移实例 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py index 92d2fa4c1f..569900870f 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py @@ -29,6 +29,7 @@ install_mysql_in_cluster_sub_flow, ) from backend.flow.engine.bamboo.scene.mysql.common.get_master_config import get_instance_config +from backend.flow.engine.bamboo.scene.mysql.common.mysql_resotre_data_sub_flow import mysql_restore_data_sub_flow from backend.flow.engine.bamboo.scene.mysql.common.recover_slave_instance import slave_recover_sub_flow from backend.flow.engine.bamboo.scene.mysql.common.slave_recover_switch import slave_migrate_switch_sub_flow from backend.flow.engine.bamboo.scene.mysql.common.uninstall_instance import uninstall_instance_sub_flow @@ -57,6 +58,7 @@ from backend.flow.utils.mysql.mysql_act_playload import MysqlActPayload from backend.flow.utils.mysql.mysql_context_dataclass import ClusterInfoContext from backend.flow.utils.mysql.mysql_db_meta import MySQLDBMeta +from backend.ticket.builders.common.constants import MySQLBackupSource logger = logging.getLogger("flow") @@ -76,6 +78,9 @@ def __init__(self, root_id: str, tick_data: Optional[Dict]): self.data = {} # 仅添加从库。不切换。不复制账号 self.add_slave_only = self.ticket_data.get("add_slave_only", False) + self.local_backup = False + if self.ticket_data.get("backup_source") == MySQLBackupSource.LOCAL: + self.local_backup = True def tendb_ha_restore_slave_flow(self): """ @@ -200,13 +205,38 @@ def tendb_ha_restore_slave_flow(self): "file_target_path": f"/data/dbbak/{self.root_id}/{master.port}", "charset": self.data["charset"], "change_master_force": True, + "change_master": True, } sync_data_sub_pipeline = SubBuilder(root_id=self.root_id, data=copy.deepcopy(self.data)) - sync_data_sub_pipeline.add_sub_pipeline( - sub_flow=slave_recover_sub_flow( - root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + if self.local_backup: + # 获取本地备份并恢复 + inst_list = ["{}{}{}".format(master.machine.ip, IP_PORT_DIVIDER, master.port)] + stand_by_slaves = cluster_model.storageinstance_set.filter( + instance_inner_role=InstanceInnerRole.SLAVE.value, + is_stand_by=True, + status=InstanceStatus.RUNNING.value, + ).exclude(machine__ip__in=[self.data["new_slave_ip"]]) + if len(stand_by_slaves) > 0: + inst_list.append( + "{}{}{}".format(stand_by_slaves[0].machine.ip, IP_PORT_DIVIDER, stand_by_slaves[0].port) + ) + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=mysql_restore_data_sub_flow( + root_id=self.root_id, + ticket_data=copy.deepcopy(self.data), + cluster=cluster, + cluster_model=cluster_model, + ins_list=inst_list, + ) ) - ) + + else: + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=slave_recover_sub_flow( + root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + ) + ) + sync_data_sub_pipeline.add_act( act_name=_("同步完毕,写入主从关系,设置节点为running状态"), act_component_code=MySQLDBMetaComponent.code, @@ -218,6 +248,7 @@ def tendb_ha_restore_slave_flow(self): ) ), ) + sync_data_sub_pipeline_list.append(sync_data_sub_pipeline.build_sub_process(sub_name=_("恢复实例数据"))) switch_sub_pipeline_list = [] @@ -319,6 +350,19 @@ def tendb_ha_restore_slave_flow(self): cluster_type=ClusterType.TenDBHA.value, ) ) + # tendb_migrate_pipeline.add_act( + # act_name=_("屏蔽监控 {}").format(self.data["new_slave_ip"]), + # act_component_code=MysqlCrondMonitorControlComponent.code, + # kwargs=asdict( + # CrondMonitorKwargs( + # bk_cloud_id=cluster_class.bk_cloud_id, + # exec_ips=[self.data["new_slave_ip"]], + # port=0, + # minutes=240, + # ) + # ), + # ) + if not self.add_slave_only: # 人工确认切换迁移实例 tendb_migrate_pipeline.add_act(act_name=_("人工确认切换"), act_component_code=PauseComponent.code, kwargs={}) @@ -473,12 +517,27 @@ def restore_local_slave_flow(self): "charset": self.data["charset"], "change_master_force": True, "cluster_type": cluster_model.cluster_type, + "change_master": True, } - tendb_migrate_pipeline.add_sub_pipeline( - sub_flow=slave_recover_sub_flow( - root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + + if self.local_backup: + inst_list = ["{}{}{}".format(master.machine.ip, IP_PORT_DIVIDER, master.port)] + tendb_migrate_pipeline.add_sub_pipeline( + sub_flow=mysql_restore_data_sub_flow( + root_id=self.root_id, + ticket_data=copy.deepcopy(self.data), + cluster=cluster, + cluster_model=cluster_model, + ins_list=inst_list, + ) ) - ) + else: + tendb_migrate_pipeline.add_sub_pipeline( + sub_flow=slave_recover_sub_flow( + root_id=self.root_id, ticket_data=copy.deepcopy(self.data), cluster_info=cluster + ) + ) + # 卸载流程人工确认 tendb_migrate_pipeline.add_act(act_name=_("人工确认"), act_component_code=PauseComponent.code, kwargs={}) # 克隆权限 diff --git a/dbm-ui/backend/flow/plugins/components/collections/mysql/mysql_crond_control.py b/dbm-ui/backend/flow/plugins/components/collections/mysql/mysql_crond_control.py index 138f53daa8..4b54c9e426 100644 --- a/dbm-ui/backend/flow/plugins/components/collections/mysql/mysql_crond_control.py +++ b/dbm-ui/backend/flow/plugins/components/collections/mysql/mysql_crond_control.py @@ -44,22 +44,22 @@ def _execute(self, data, parent_data) -> bool: self.log_info("{} exec {}".format(target_ip_info, node_name)) FlowNode.objects.filter(root_id=root_id, node_id=node_id).update(hosts=exec_ips) + cmd_str = "cd /home/mysql/mysql-crond && ./mysql-crond " if kwargs["enable"]: - monitor_command = ( - "cd /home/mysql/mysql-crond && ./mysql-crond enable-job --name-match mysql-monitor-{}-.*".format( - kwargs["port"] - ) - ) + cmd_str += " enable-job" else: - monitor_command = ( - "cd /home/mysql/mysql-crond && ./mysql-crond pause-job --name-match mysql-monitor-{}-.* -r {}m".format( - kwargs["port"], kwargs["minutes"] - ) - ) + cmd_str += " pause-job -r {}m".format(kwargs["minutes"]) + if kwargs["port"] == 0: + cmd_str += " --name-match mysql-monitor-.*" + else: + cmd_str += " --name-match mysql-monitor-{}-.*".format(kwargs["port"]) + if kwargs["name"] != "": + cmd_str += " --name {}".format(kwargs["name"]) + self.log_info(cmd_str) body = { "bk_biz_id": env.JOB_BLUEKING_BIZ_ID, "task_name": f"DBM_{node_name}_{node_id}", - "script_content": base64_encode(monitor_command), + "script_content": base64_encode(cmd_str), "script_language": 1, "target_server": {"ip_list": target_ip_info}, } diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py b/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py index 1ab3a483cd..ab15a3df10 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py @@ -402,7 +402,8 @@ class CrondMonitorKwargs: bk_cloud_id: int exec_ips: list - port: int + name: str = "" + port: int = 0 minutes: int = 1440 enable: bool = False diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_add_slave.py b/dbm-ui/backend/ticket/builders/mysql/mysql_add_slave.py index aee33a3b05..373fed42d7 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_add_slave.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_add_slave.py @@ -52,13 +52,7 @@ def validate(self, attrs): class MysqlAddSlaveParamBuilder(builders.FlowParamBuilder): # 复用重建 slave 的场景 - controller_remote = MySQLController.mysql_add_slave_remote_scene - controller_local = MySQLController.mysql_add_slave_scene - - def build_controller_info(self) -> dict: - backup_source = self.ticket_data.get("backup_source", MySQLBackupSource.LOCAL) - self.controller = getattr(self, f"controller_{backup_source}") - return super().build_controller_info() + controller = MySQLController.mysql_add_slave_remote_scene def format_ticket_data(self): self.ticket_data["add_slave_only"] = True diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_migrate_cluster.py b/dbm-ui/backend/ticket/builders/mysql/mysql_migrate_cluster.py index fc18d390eb..e37d7d16b4 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_migrate_cluster.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_migrate_cluster.py @@ -55,13 +55,7 @@ def validate(self, attrs): class MysqlMigrateClusterParamBuilder(builders.FlowParamBuilder): - controller_remote = MySQLController.mysql_migrate_remote_scene - controller_local = MySQLController.mysql_migrate_cluster_scene - - def build_controller_info(self) -> dict: - backup_source = self.ticket_data.get("backup_source", MySQLBackupSource.LOCAL) - self.controller = getattr(self, f"controller_{backup_source}") - return super().build_controller_info() + controller = MySQLController.mysql_migrate_remote_scene def format_ticket_data(self): if self.ticket_data["ip_source"] == IpSource.RESOURCE_POOL: diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_restore_local_slave.py b/dbm-ui/backend/ticket/builders/mysql/mysql_restore_local_slave.py index d41db9a208..2ea4b6b40e 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_restore_local_slave.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_restore_local_slave.py @@ -49,13 +49,7 @@ def validate(self, attrs): class MysqlRestoreLocalSlaveParamBuilder(builders.FlowParamBuilder): - controller_remote = MySQLController.mysql_restore_local_remote_scene - controller_local = MySQLController.mysql_restore_local_slave_scene - - def build_controller_info(self) -> dict: - backup_source = self.ticket_data.get("backup_source", MySQLBackupSource.LOCAL) - self.controller = getattr(self, f"controller_{backup_source}") - return super().build_controller_info() + controller = MySQLController.mysql_restore_local_remote_scene def format_ticket_data(self): for index, info in enumerate(self.ticket_data["infos"]): diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_restore_slave.py b/dbm-ui/backend/ticket/builders/mysql/mysql_restore_slave.py index e61113ae61..568d483a43 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_restore_slave.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_restore_slave.py @@ -54,13 +54,7 @@ def validate(self, attrs): class MysqlRestoreSlaveParamBuilder(builders.FlowParamBuilder): - controller_remote = MySQLController.mysql_restore_slave_remote_scene - controller_local = MySQLController.mysql_restore_slave_scene - - def build_controller_info(self) -> dict: - backup_source = self.ticket_data.get("backup_source", MySQLBackupSource.LOCAL) - self.controller = getattr(self, f"controller_{backup_source}") - return super().build_controller_info() + controller = MySQLController.mysql_restore_slave_remote_scene def format_ticket_data(self): self.ticket_data["add_slave_only"] = False From 52e8a09c585a49a6e4e573365f3d702a46c0df1c Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Thu, 19 Sep 2024 17:32:40 +0800 Subject: [PATCH 006/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Ddbha=E5=A4=84?= =?UTF-8?q?=E7=90=86sqlserver=E5=88=87=E6=8D=A2=E5=A4=84=E7=90=86=E6=97=A7?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=85=B3=E7=B3=BB=20#7000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbha/ha-module/dbmodule/sqlserver/sqlserver_switch.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dbm-services/common/dbha/ha-module/dbmodule/sqlserver/sqlserver_switch.go b/dbm-services/common/dbha/ha-module/dbmodule/sqlserver/sqlserver_switch.go index 5cea8b8f48..a77cbb3b36 100644 --- a/dbm-services/common/dbha/ha-module/dbmodule/sqlserver/sqlserver_switch.go +++ b/dbm-services/common/dbha/ha-module/dbmodule/sqlserver/sqlserver_switch.go @@ -124,6 +124,11 @@ func (ins *SqlserverSwitch) DoSwitch() error { ins.StandBySlave.Port, ), ) + // delete dns for old_master + if err := ins.DeleteNameService(ins.Entry); err != nil { + return err + } + // create dns in new master conf := ins.Config ins.ReportLogs( From 4b88876f002fa05aaabb46720071b095c6ec64de Mon Sep 17 00:00:00 2001 From: xiaog Date: Sat, 14 Sep 2024 11:20:59 +0800 Subject: [PATCH 007/164] =?UTF-8?q?fix(mysql):=20=E5=AE=9A=E7=82=B9?= =?UTF-8?q?=E5=9B=9E=E6=A1=A3=E4=B8=8D=E6=A0=A1=E9=AA=8C=20binlog=20?= =?UTF-8?q?=E4=BD=8D=E7=82=B9=20#6947?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/restore/dbloader_restore.go | 20 ++++++++++++++++--- .../pkg/components/mysql/restore/restore.go | 1 + .../db-tools/dbactuator/pkg/util/dbcnf.go | 18 +++++++++++++---- .../mysql-dbbackup/pkg/config/public.go | 2 +- .../mysql-dbbackup/pkg/src/common/getinfo.go | 10 ---------- .../db-tools/mysql-dbbackup/pkg/util/misc.go | 2 +- 6 files changed, 34 insertions(+), 19 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go index 9e9a3a5d07..53cc81fd63 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go @@ -65,8 +65,18 @@ func (m *DBLoader) PreCheck() error { return err } // validateBackupInfo before run import - if _, err := m.getChangeMasterPos(m.SrcInstance); err != nil { - return err + // 重建模式,不需要 restore_opt 选项,但要校验位点信息 + // 回档模式,如果是备份记录回档则不需要位点,如果是需要基于 binlog 回档,则要检验位点信息 + if m.RestoreParam.RestoreOpt == nil { + m.RestoreParam.RestoreOpt = &RestoreOpt{ + EnableBinlog: false, + WillRecoverBinlog: true, + } + } + if m.RestoreParam.RestoreOpt.WillRecoverBinlog { + if _, err := m.getChangeMasterPos(m.SrcInstance); err != nil { + return err + } } // 工具可执行权限 // 本地实例是否可联通 @@ -163,7 +173,11 @@ func (m *DBLoader) PostCheck() error { // ReturnChangeMaster TODO func (m *DBLoader) ReturnChangeMaster() (*mysqlutil.ChangeMaster, error) { - return m.getChangeMasterPos(m.SrcInstance) + if m.RestoreParam.RestoreOpt != nil && m.RestoreParam.RestoreOpt.WillRecoverBinlog { // + return m.getChangeMasterPos(m.SrcInstance) + } else { + return &mysqlutil.ChangeMaster{}, nil + } } func (m *DBLoader) initDirs() error { diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/restore.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/restore.go index 87a87872d4..b6cac9d2e0 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/restore.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/restore.go @@ -42,6 +42,7 @@ type RestoreParam struct { // work_id 标识本次恢复,若为0则为当前时间戳 WorkID string `json:"work_id"` // 恢复选项,比如恢复库表、是否导入binlog等。目前只对逻辑恢复有效 + // 重建 slave时,这里可不传 RestoreOpt *RestoreOpt `json:"restore_opts"` } diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/dbcnf.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/dbcnf.go index ee642b8318..be02899a9c 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/dbcnf.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/dbcnf.go @@ -186,12 +186,22 @@ func (m *CnfFile) Load() error { // @return datadir // @return err // -// e.g: datadir=/data1/mysqldata/20000/data -func (m *CnfFile) GetMySQLDataDir() (datadir string, err error) { +// e.g: datadir=/data1/mysqldata/20000/data 返回 /data1/mysqldata/20000 +// datadir=/data/mysqldata/data 返回 /data/mysqldata/ +func (m *CnfFile) GetMySQLDataDir() (string, error) { + var datadir string if m.Cfg.Section(MysqldSec).HasKey("datadir") { - return filepath.Dir(m.Cfg.Section(MysqldSec).Key("datadir").String()), nil + datadir = m.Cfg.Section(MysqldSec).Key("datadir").String() + } else { + return "", fmt.Errorf("在配置中没找到datadir的配置项") + } + // datadirName := filepath.Base(datadir) // "data" + datadirPath := filepath.Dir(datadir) // "/data1/mysqldata/20000" or "/data/mysqldata" + if _, err := strconv.Atoi(filepath.Base(datadirPath)); err != nil { // "/data/mysqldata" + return datadir, nil // "/data/mysqldata/data" + } else { + return filepath.Dir(datadir), nil // "/data/mysqldata/20000/data" } - return "", fmt.Errorf("在配置中没找到datadir的配置项") } // GetMySQLLogDir 从配置中获取mysql logdir diff --git a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/config/public.go b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/config/public.go index 06fe00514e..b1f1497796 100644 --- a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/config/public.go +++ b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/config/public.go @@ -47,7 +47,7 @@ type Public struct { // DataSchemaGrant data,grant,schema,priv,all,写了 data 则只备data,不备份 schema DataSchemaGrant string `ini:"DataSchemaGrant" validate:"required"` // BackupDir backup files to save - BackupDir string `ini:"BackupDir" validate:"required"` + BackupDir string `ini:"BackupDir" validate:"required,dir"` MysqlRole string `ini:"MysqlRole"` // oneof=master slave MysqlCharset string `ini:"MysqlCharset"` // BackupTimeOut 备份时间阈值,格式 09:00:01 diff --git a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/common/getinfo.go b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/common/getinfo.go index 890f4b13f0..086581038c 100644 --- a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/common/getinfo.go +++ b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/common/getinfo.go @@ -19,16 +19,6 @@ func GetDatadir(port int) (string, error) { return "", errors.WithMessage(err, "get data dir") } return cnfFile.GetMySQLDataDir() - - cmdStr := "ps -ef|grep mysqld|grep " + strconv.Itoa(port) + "|grep datadir|grep -o '\\-\\-datadir=\\S*'" - res, err := exec.Command("/bin/bash", "-c", cmdStr).CombinedOutput() - if err != nil { - logger.Log.Error("cant get mysql datadir") - return "", err - } - datadir := strings.Replace(string(res), "\n", "", -1) - words := strings.Split(datadir, "=") - return words[1], err } // GetTableNum get table number of mysql server diff --git a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go index d49b3fa99a..c16c0decb8 100644 --- a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go +++ b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go @@ -111,7 +111,7 @@ func CalServerDataSize(port int) (uint64, error) { cmdStr := "du -sb " + datadir + "/.." res, err := exec.Command("/bin/bash", "-c", cmdStr).CombinedOutput() if err != nil { - return 0, err + return 0, errors.WithMessage(err, string(res)) } datasize := strings.Replace(string(res), "\n", "", -1) words := strings.Fields(datasize) From 4da3d39681904307ee61165140ef0f3fcfb399a2 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 20 Sep 2024 10:37:23 +0800 Subject: [PATCH 008/164] =?UTF-8?q?fix(backend):=20=E4=BF=AE=E5=A4=8Dnginx?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=B8=B2=E6=9F=93=E5=8F=82=E6=95=B0=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=20#7020?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py b/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py index b2a6d92fc1..1a1b886cf9 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py @@ -103,7 +103,7 @@ def _job_push_config_file(_cloud_id, _file_list, _nginx_list): for extension in cloud__db_type__extension[cloud_id][db_type]: # 渲染配置 - file_list.append(nginxconf_tpl.render_nginx_tpl(template, extension, encode=True)) + file_list.append(nginxconf_tpl.render_nginx_tpl(extension=extension, template=template, encode=True)) # 这里先提前写入access url,至于是否执行成功根据is_flush extension.save_access_url(nginx_url=f"{proxy.external_address}:{manage_port}") extension_ids.append(extension.id) From 41d086a9b34776677684cdfefda9d4bf100604cf Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 20 Sep 2024 10:51:49 +0800 Subject: [PATCH 009/164] =?UTF-8?q?fix(backend):=20=E4=B8=8B=E5=8F=91nginx?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BF=AE=E6=94=B9=E4=BD=BF=E7=94=A8admin=20#?= =?UTF-8?q?7020?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py b/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py index 1a1b886cf9..95f9eba854 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/db_proxy.py @@ -64,7 +64,7 @@ def _job_push_config_file(_cloud_id, _file_list, _nginx_list): job_payload["callback_url"] = f"{env.BK_SAAS_CALLBACK_URL}/apis/proxypass/push_conf_callback/" logger.info(_("nginx配置文件下发参数:{}").format(job_payload)) - _resp = JobApi.push_config_file(job_payload, raw=True) + _resp = JobApi.push_config_file(job_payload, raw=True, use_admin=True) if not _resp["result"]: raise ProxyPassBaseException(_("下发文件job启动失败,错误信息: {}").format(_resp["message"])) From 7c6bb4da0b89ffb2547ae2feefc0e6f3e4d535c2 Mon Sep 17 00:00:00 2001 From: xiepaup Date: Fri, 13 Sep 2024 11:05:38 +0800 Subject: [PATCH 010/164] =?UTF-8?q?fix(redis):=20rediscluster=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=BB=E4=BB=8E=E4=BA=92=E5=88=87=20#6907?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/atomjobs/atomredis/redis_switch.go | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_switch.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_switch.go index fc2202fba3..1633e68774 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_switch.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_switch.go @@ -403,6 +403,7 @@ func (job *RedisSwitch) doTendisStorageSwitch4Cluster(storagePair InstanceSwitch err = fmt.Errorf("Err:SwitchFailed4Role") } else { job.setSwitchRst(storagePair, true) + job.trySetMasterAuth(storagePair) job.runtime.Logger.Info("on [%s] exec cluster failover %s with no err, and role is ", newMasterAddr, job.params.SyncCondition.SwitchOpt) break @@ -422,6 +423,25 @@ func (job *RedisSwitch) doTendisStorageSwitch4Cluster(storagePair InstanceSwitch return nil } +// cluster模式下,执行互切,尝试给新slave(OldMaster)设置密码 +func (job *RedisSwitch) trySetMasterAuth(sp InstanceSwitchParam) { + oldAddr := fmt.Sprintf("%s:%d", sp.MasterInfo.IP, sp.MasterInfo.Port) + conn, err := myredis.NewRedisClientWithTimeout(oldAddr, + job.params.ClusterMeta.StoragePassword, 0, job.params.ClusterMeta.ClusterType, time.Second*10) + if err != nil { + job.runtime.Logger.Warn("try conn old master :%s:%d failed:%+v", sp.MasterInfo.IP, sp.MasterInfo.Port, err) + return + } + defer conn.Close() + if _, err := conn.ConfigSet("masterauth", job.params.ClusterMeta.StoragePassword); err != nil { + job.runtime.Logger.Warn("try set old master :%s:%d failed:%+v", sp.MasterInfo.IP, sp.MasterInfo.Port, err) + } + if _, err := conn.ConfigRewrite(); err != nil { + job.runtime.Logger.Warn("try rewrite old master :%s:%d failed:%+v", sp.MasterInfo.IP, sp.MasterInfo.Port, err) + } + job.runtime.Logger.Info("try set new slave masterAuth :%s:%d success ^_^", sp.MasterInfo.IP, sp.MasterInfo.Port) +} + // doTendisStorageSwitch4Twemproxy 刷新twemproxy 后端 func (job *RedisSwitch) doTendisStorageSwitch4Twemproxy(storagePair InstanceSwitchParam) error { wg := &sync.WaitGroup{} @@ -565,7 +585,9 @@ func (job *RedisSwitch) GetClusterRuntimeMasters() (map[string]string, error) { return runtimeMasters, fmt.Errorf("get cluster nodes failed:%s;%+v", job.params.ClusterMeta.ImmuteDomain, err) } else { for _, node := range nodes { - runtimeMasters[node.Addr] = node.SlotSrcStr + if node.Role == "master" && node.SlotSrcStr != "" { //需要是Master,并且承担Slot的节点 + runtimeMasters[node.Addr] = node.SlotSrcStr + } } } // 单实例主从模式 From fc58e3bfef4d0607f23f100a71b8f834c66585b6 Mon Sep 17 00:00:00 2001 From: xiepaup Date: Fri, 13 Sep 2024 15:26:10 +0800 Subject: [PATCH 011/164] =?UTF-8?q?fix(redis):=20clusterForget=E6=95=85?= =?UTF-8?q?=E9=9A=9C=E8=8A=82=E7=82=B9=20=20#6923?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/atomjobs/atomredis/cluster_forget.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_forget.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_forget.go index ecf518fa26..3db29435df 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_forget.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_forget.go @@ -171,20 +171,12 @@ func (job *RedisClusterForget) clusterForgetNode( if node.NodeID == fnode.NodeID { continue } + x, _ := json.Marshal(node) job.runtime.Logger.Info("exec {cluster forget %s:%s} from [%s]", fnode.Addr, fnode.NodeID, node.Addr) - var ignoreErr bool - if len(node.FailStatus) != 0 { - ignoreErr = true - job.runtime.Logger.Warn("exec forget node maybe fail,will ignore err,%s:%+v", node.Addr, node.FailStatus) - } - nodeConn, err := myredis.NewRedisClientWithTimeout(node.Addr, job.params.ClusterMeta.StoragePassword, 0, job.params.ClusterMeta.ClusterType, time.Second) if err != nil { - if ignoreErr { - job.runtime.Logger.Warn("current node status maybe fail, ignore %s:%+v", node.Addr, err) - continue - } + job.runtime.Logger.Warn("connect node failed %s:%+v", x, err) return err } defer nodeConn.Close() @@ -192,8 +184,8 @@ func (job *RedisClusterForget) clusterForgetNode( if err := nodeConn.ClusterForget(fnode.NodeID); err != nil { // // (error) ERR:18,msg:forget node unkown 传了不存在的NodeID 1. 节点表中找不到指定的节点标识。 !!! 这里和官方版本返回错误不一致 !!! job.runtime.Logger.Error("forget node %s:%s failed :+%v [just Ignore::%+v]", fnode.Addr, fnode.NodeID, err, fnode) - if ignoreErr && (strings.Contains(err.Error(), "Unknown node") || strings.Contains(err.Error(), "node unkown")) { - job.runtime.Logger.Warn("current node status maybe fail, ignore %s:%+v", node.Addr, err) + if strings.Contains(err.Error(), "Unknown node") || strings.Contains(err.Error(), "node unkown") { + job.runtime.Logger.Warn("forgeted node status maybe fail, ignore %s:%+v", x, err) continue } return fmt.Errorf("ErrForgetNode:%s:%+v", fnode.Addr, err) From 8c786a246cce3b31614777356d80e140c29464b5 Mon Sep 17 00:00:00 2001 From: Austin <1344583166@qq.com> Date: Fri, 20 Sep 2024 11:34:02 +0800 Subject: [PATCH 012/164] =?UTF-8?q?fix(frontend):=20=E9=9B=86=E7=BE=A4?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E6=8C=89=E9=92=AE=E4=BA=A4=E4=BA=92=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E5=A4=8D=20#7032?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/frontend/src/services/model/hdfs/hdfs.ts | 4 ++++ dbm-ui/frontend/src/services/model/pulsar/pulsar.ts | 4 ++++ .../db-manage/elastic-search/list/components/list/Index.vue | 1 + .../src/views/db-manage/hdfs/list/components/list/Index.vue | 1 + .../src/views/db-manage/pulsar/list/components/list/Index.vue | 1 + .../src/views/db-manage/redis/list/components/list/Index.vue | 2 +- 6 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dbm-ui/frontend/src/services/model/hdfs/hdfs.ts b/dbm-ui/frontend/src/services/model/hdfs/hdfs.ts index c99cbffcd6..1b85fe6462 100644 --- a/dbm-ui/frontend/src/services/model/hdfs/hdfs.ts +++ b/dbm-ui/frontend/src/services/model/hdfs/hdfs.ts @@ -261,4 +261,8 @@ export default class Hdfs { return payload; } + + get isStarting() { + return Boolean(this.operations.find((item) => item.ticket_type === Hdfs.HDFS_ENABLE)); + } } diff --git a/dbm-ui/frontend/src/services/model/pulsar/pulsar.ts b/dbm-ui/frontend/src/services/model/pulsar/pulsar.ts index c6615ca357..b846e799fb 100644 --- a/dbm-ui/frontend/src/services/model/pulsar/pulsar.ts +++ b/dbm-ui/frontend/src/services/model/pulsar/pulsar.ts @@ -265,4 +265,8 @@ export default class Pulsar { return payload; } + + get isStarting() { + return Boolean(this.operations.find((item) => item.ticket_type === Pulsar.PULSAR_ENABLE)); + } } diff --git a/dbm-ui/frontend/src/views/db-manage/elastic-search/list/components/list/Index.vue b/dbm-ui/frontend/src/views/db-manage/elastic-search/list/components/list/Index.vue index 0e1bb5f866..e39758e125 100644 --- a/dbm-ui/frontend/src/views/db-manage/elastic-search/list/components/list/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/elastic-search/list/components/list/Index.vue @@ -684,6 +684,7 @@ handleSwitchRedis(TicketTypes.REDIS_PROXY_OPEN, data)}> { t('启用') } From 9a4817d00170dd551f5367c0a645bc3f2d87116c Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Fri, 20 Sep 2024 15:08:28 +0800 Subject: [PATCH 013/164] =?UTF-8?q?fix(backend):=20dba=20=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E4=BF=9D=E5=AD=98=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20#7040?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/configuration/handlers/dba.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/configuration/handlers/dba.py b/dbm-ui/backend/configuration/handlers/dba.py index a718351d53..08b6103408 100644 --- a/dbm-ui/backend/configuration/handlers/dba.py +++ b/dbm-ui/backend/configuration/handlers/dba.py @@ -57,7 +57,7 @@ def upsert_biz_admins(bk_biz_id: int, db_admins: List[Dict[str, Union[str, List[ operator = new_dba[0] bk_bak_operator = new_dba[1] if len(new_dba) > 1 else operator cluster_types = ClusterType.db_type_to_cluster_types(db_type) - for cluster_type in cluster_types: + for cluster_type in cluster_types or []: bk_host_ids = [ machine.bk_host_id for machine in Machine.objects.filter(cluster_type=cluster_type, bk_biz_id=bk_biz_id) From b2c025149f7cc3254a91fdfd03c586be9cd53cbd Mon Sep 17 00:00:00 2001 From: lukemakeit <2302063437@qq.com> Date: Tue, 10 Sep 2024 21:15:12 +0800 Subject: [PATCH 014/164] =?UTF-8?q?feat(redis):=20tendisplus=E7=A6=BB?= =?UTF-8?q?=E7=BA=BF=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=20#6596?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-services/redis/db-tools/dbactuator/go.mod | 5 + dbm-services/redis/db-tools/dbactuator/go.sum | 21 + .../dbactuator/models/myredis/client.go | 57 +++ .../atomredis/cluster_reset_flush_meet.go | 220 +++++++++ .../atomjobs/atomredis/redis_config_set.go | 4 +- .../pkg/atomjobs/atomredis/redis_reshape.go | 181 ++++++++ .../dbactuator/pkg/jobmanager/jobmanager.go | 2 + .../pkg/redismaxmemory/redismaxmemory.go | 18 +- .../redis-dts/build/config-template.yaml | 12 + dbm-services/redis/redis-dts/main.go | 3 +- .../redis/redis-dts/models/myredis/myredis.go | 129 ++++-- .../tendisdb/{job.go => tendisDtsJob.go} | 0 .../tendisdb/{task.go => tendisDtsTask.go} | 12 +- .../tendisdb/tendisplus_lightning_job.go | 87 ++++ .../tendisdb/tendisplus_lightning_task.go | 435 ++++++++++++++++++ .../redis/redis-dts/pkg/constvar/constvar.go | 45 ++ .../redis/redis-dts/pkg/dtsJob/base.go | 9 +- .../pkg/dtsJob/tendisplusLightningJob.go | 430 +++++++++++++++++ .../redis-dts/pkg/dtsTask/factory/factory.go | 21 +- .../redis/redis-dts/pkg/dtsTask/init.go | 102 ++-- .../pkg/dtsTask/rediscache/makeCacheSync.go | 4 +- .../pkg/dtsTask/tendisplus/makeSync.go | 4 +- .../dtsTask/tendispluslightning/fatherTask.go | 203 ++++++++ .../step1CosFileDownload.go | 94 ++++ .../tendispluslightning/step2FileSplit.go | 98 ++++ .../tendispluslightning/step3GenerateSST.go | 140 ++++++ .../tendispluslightning/step4ScpSST.go | 199 ++++++++ .../tendispluslightning/step5SlaveLoadSST.go | 189 ++++++++ .../pkg/dtsTask/tendisssd/backupFileFetch.go | 4 +- .../pkg/dtsTask/tendisssd/cmdsImporter.go | 4 +- .../pkg/dtsTask/tendisssd/makeSync.go | 4 +- .../pkg/dtsTask/tendisssd/tendisBackup.go | 6 +- .../pkg/dtsTask/tendisssd/tendisdump.go | 4 +- .../redis/redis-dts/pkg/txycos/txycos.go | 172 +++++++ dbm-services/redis/redis-dts/util/util.go | 9 + .../redis_clusternodes_update/task.py | 1 + .../db_proxy/views/redis_dts/serializers.py | 44 ++ .../backend/db_proxy/views/redis_dts/views.py | 124 ++++- .../db_services/redis/redis_dts/apis.py | 177 +++++++ ...8_1038_squashed_0018_auto_20240914_1754.py | 249 ++++++++++ .../redis/redis_dts/models/__init__.py | 2 + .../models/tb_tendisplus_lightning_job.py | 42 ++ .../models/tb_tendisplus_lightning_task.py | 51 ++ dbm-ui/backend/flow/consts.py | 2 + .../scene/mongodb/mongodb_pitr_restore.py | 2 +- .../mongodb/sub_task/download_subtask.py | 2 +- .../scene/mongodb/sub_task/hello_sub.py | 2 +- .../mongodb/sub_task/pitr_restore_sub.py | 2 +- .../scene/redis/tendisplus_lightning_data.py | 252 ++++++++++ .../backend/flow/engine/controller/redis.py | 8 + .../collections/redis/tendisplus_lightning.py | 146 ++++++ .../flow/utils/cloud/cloud_act_payload.py | 13 + .../redis_dts_server_template.py | 6 + .../flow/utils/mongodb/mongodb_repo.py | 1 - .../flow/utils/redis/redis_act_playload.py | 35 +- .../utils/redis/redis_context_dataclass.py | 12 + .../backend/flow/utils/redis/redis_db_meta.py | 67 +++ .../flow/utils/redis/redis_proxy_util.py | 56 +++ .../redis/tendisplus_lightning_data.py | 56 +++ dbm-ui/backend/ticket/constants.py | 3 +- 60 files changed, 4145 insertions(+), 137 deletions(-) create mode 100644 dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_reset_flush_meet.go create mode 100644 dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_reshape.go rename dbm-services/redis/redis-dts/models/mysql/tendisdb/{job.go => tendisDtsJob.go} (100%) rename dbm-services/redis/redis-dts/models/mysql/tendisdb/{task.go => tendisDtsTask.go} (98%) create mode 100644 dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_job.go create mode 100644 dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_task.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsJob/tendisplusLightningJob.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/fatherTask.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step1CosFileDownload.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step2FileSplit.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step3GenerateSST.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step4ScpSST.go create mode 100644 dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step5SlaveLoadSST.go create mode 100644 dbm-services/redis/redis-dts/pkg/txycos/txycos.go create mode 100644 dbm-ui/backend/db_services/redis/redis_dts/migrations/0017_auto_20240908_1038_squashed_0018_auto_20240914_1754.py create mode 100644 dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_job.py create mode 100644 dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_task.py create mode 100644 dbm-ui/backend/flow/engine/bamboo/scene/redis/tendisplus_lightning_data.py create mode 100644 dbm-ui/backend/flow/plugins/components/collections/redis/tendisplus_lightning.py create mode 100644 dbm-ui/backend/ticket/builders/redis/tendisplus_lightning_data.py diff --git a/dbm-services/redis/db-tools/dbactuator/go.mod b/dbm-services/redis/db-tools/dbactuator/go.mod index a12516835b..00722ac4a1 100644 --- a/dbm-services/redis/db-tools/dbactuator/go.mod +++ b/dbm-services/redis/db-tools/dbactuator/go.mod @@ -22,12 +22,14 @@ require ( require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/clbanning/mxj v1.8.4 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -38,11 +40,14 @@ require ( github.com/leodido/go-urn v1.2.3 // indirect github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mozillazg/go-httpheader v0.4.0 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.8.0 // indirect github.com/smartystreets/assertions v1.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/tencentyun/cos-go-sdk-v5 v0.7.54 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect diff --git a/dbm-services/redis/db-tools/dbactuator/go.sum b/dbm-services/redis/db-tools/dbactuator/go.sum index b075ce6a7c..61ba29d938 100644 --- a/dbm-services/redis/db-tools/dbactuator/go.sum +++ b/dbm-services/redis/db-tools/dbactuator/go.sum @@ -1,10 +1,14 @@ +github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -31,15 +35,21 @@ github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/grafov/m3u8 v0.12.0/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -62,6 +72,12 @@ github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1 github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= +github.com/mozillazg/go-httpheader v0.4.0 h1:aBn6aRXtFzyDLZ4VIRLsZbbJloagQfMnCiYgOq6hK4w= +github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -100,12 +116,17 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0= +github.com/tencentyun/cos-go-sdk-v5 v0.7.54 h1:FRamEhNBbSeggyYfWfzFejTLftgbICocSYFk4PKTSV4= +github.com/tencentyun/cos-go-sdk-v5 v0.7.54/go.mod h1:UN+VdbCl1hg+kKi5RXqZgaP+Boqfmk+D04GRc4XFk70= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= diff --git a/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go b/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go index 5b2235b587..b59654098e 100644 --- a/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go +++ b/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go @@ -2176,3 +2176,60 @@ func (db *RedisClient) TailRedisLogFile(tailNLine int) (data string, err error) } return string(dataBytes), nil } + +// IsReshapeRunning 判断tendisplus/tendisssd是否正在执行reshape +func (db *RedisClient) IsReshapeRunning() (ret bool, err error) { + compactInfo, err := db.Info("Compaction") + if err != nil { + return false, err + } + running := compactInfo["current-compaction-status"] + if running == "running" { + return true, nil + } + return false, nil +} + +// WaitTendisReshapeDone 等待tendisplus/tendisssd reshape完成 +func (db *RedisClient) WaitTendisReshapeDone() (err error) { + var msg string + count := 0 + for { + isReshaping, err := db.IsReshapeRunning() + if err != nil { + return err + } + if !isReshaping { + msg = fmt.Sprintf("redis:%s reshape done", db.Addr) + mylog.Logger.Info(msg) + return nil + } + count++ + if (count % 12) == 0 { + msg = fmt.Sprintf("redis:%s reshape is running", db.Addr) + mylog.Logger.Info(msg) + } + time.Sleep(5 * time.Second) + } +} + +// TendisReshapeAndWaitDone tendisplus/tendisssd reshape并等待reshape完成 +func (db *RedisClient) TendisReshapeAndWaitDone() (err error) { + if db.InstanceClient == nil { + err := fmt.Errorf("reshape redis:%s must create a standalone client", db.Addr) + mylog.Logger.Error(err.Error()) + return err + } + isReshaping, err := db.IsReshapeRunning() + if err != nil { + return err + } + if isReshaping { + // 如果正在reshape,则等待reshape完成,不重复执行reshape + return db.WaitTendisReshapeDone() + } + cmd := []interface{}{"reshape"} + // reshape 是阻塞操作,可能会超时,所以不捕获错误 + db.InstanceClient.Do(context.TODO(), cmd...).Result() + return db.WaitTendisReshapeDone() +} diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_reset_flush_meet.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_reset_flush_meet.go new file mode 100644 index 0000000000..eb69b83abc --- /dev/null +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/cluster_reset_flush_meet.go @@ -0,0 +1,220 @@ +package atomredis + +import ( + "encoding/json" + "fmt" + "strconv" + "sync" + "time" + + "github.com/go-playground/validator/v10" + + "dbm-services/redis/db-tools/dbactuator/models/myredis" + "dbm-services/redis/db-tools/dbactuator/pkg/consts" + "dbm-services/redis/db-tools/dbactuator/pkg/jobruntime" +) + +// ClusterResetFlushMeetItem cluster reset flush meet item +type ClusterResetFlushMeetItem struct { + ResetIP string `json:"reset_ip" validate:"required"` + ResetPort int `json:"reset_port" validate:"required"` + ResetRedisPassword string `json:"reset_redis_password" validate:"required"` + MeetIP string `json:"meet_ip" validate:"required"` + MeetPort int `json:"meet_port" validate:"required"` + DoFlushall bool `json:"do_flushall"` // 是否执行flushall + DoClusterMeet bool `json:"do_cluster_meet"` // 是否执行cluster meet +} + +// ResetRedisAddr reset redis addr +func (item *ClusterResetFlushMeetItem) ResetRedisAddr() string { + return fmt.Sprintf("%s:%d", item.ResetIP, item.ResetPort) +} + +// ClusterResetFlushMeetParams 参数 +type ClusterResetFlushMeetParams struct { + ResetFlushMeetParams []ClusterResetFlushMeetItem `json:"reset_flush_meet_params" validate:"required"` +} + +// ClusterResetFlushMeet TODO +type ClusterResetFlushMeet struct { + runtime *jobruntime.JobGenericRuntime + params ClusterResetFlushMeetParams + tasks []*clusterResetFlushMeetTask +} + +// 无实际作用,仅确保实现了 jobruntime.JobRunner 接口 +var _ jobruntime.JobRunner = (*ClusterResetFlushMeet)(nil) + +// NewClusterResetFlushMeet new +func NewClusterResetFlushMeet() jobruntime.JobRunner { + return &ClusterResetFlushMeet{} +} + +// Init 初始化,参数校验 +func (job *ClusterResetFlushMeet) Init(m *jobruntime.JobGenericRuntime) error { + job.runtime = m + + err := json.Unmarshal([]byte(job.runtime.PayloadDecoded), &job.params) + if err != nil { + job.runtime.Logger.Error(fmt.Sprintf("json.Unmarshal failed,err:%+v\n", err)) + return err + } + // 参数有效性检查 + validate := validator.New() + err = validate.Struct(job.params) + if err != nil { + if _, ok := err.(*validator.InvalidValidationError); ok { + job.runtime.Logger.Error("ClusterResetFlushMeet Init params validate failed,err:%v,params:%+v", err, job.params) + return err + } + for _, err := range err.(validator.ValidationErrors) { + job.runtime.Logger.Error("ClusterResetFlushMeet Init params validate failed,err:%v,params:%+v", err, job.params) + return err + } + } + return nil +} + +// Name 名字 +func (job *ClusterResetFlushMeet) Name() string { + return "redis_cluster_reset_flush_meet" +} + +// Run 执行 +func (job *ClusterResetFlushMeet) Run() (err error) { + job.tasks = make([]*clusterResetFlushMeetTask, 0, len(job.params.ResetFlushMeetParams)) + for _, item := range job.params.ResetFlushMeetParams { + task := &clusterResetFlushMeetTask{ + ClusterResetFlushMeetItem: item, + runtime: job.runtime, + } + job.tasks = append(job.tasks, task) + } + err = job.allInstCconnect() + if err != nil { + return err + } + defer job.allInstDisconnect() + + for _, tmp := range job.tasks { + task := tmp + task.resetAndFlushallAndMeet() + if task.Err != nil { + return task.Err + } + } + return nil +} + +func (job *ClusterResetFlushMeet) allInstCconnect() (err error) { + wg := sync.WaitGroup{} + // 并发确认所有实例是否可连接 + for _, tmp := range job.tasks { + task := tmp + wg.Add(1) + go func(task *clusterResetFlushMeetTask) { + defer wg.Done() + task.createResetConn() + }(task) + } + wg.Wait() + for _, tmp := range job.tasks { + task := tmp + if task.Err != nil { + return task.Err + } + } + return nil +} + +// allInstDisconnect 所有实例断开连接 +func (job *ClusterResetFlushMeet) allInstDisconnect() { + for _, tmp := range job.tasks { + task := tmp + if task.resetRedisConn != nil { + task.resetRedisConn.Close() + task.resetRedisConn = nil + } + } +} + +// Retry 返回可重试次数 +func (job *ClusterResetFlushMeet) Retry() uint { + return 2 +} + +// Rollback 回滚函数,一般不用实现 +func (job *ClusterResetFlushMeet) Rollback() error { + return nil +} + +// clusterResetFlushMeetTask task,为了做并发连接,单独定义一个struct +type clusterResetFlushMeetTask struct { + ClusterResetFlushMeetItem + resetRedisConn *myredis.RedisClient + runtime *jobruntime.JobGenericRuntime + Err error +} + +// createResetConn 创建连接 +func (task *clusterResetFlushMeetTask) createResetConn() { + task.resetRedisConn, task.Err = myredis.NewRedisClientWithTimeout(task.ResetRedisAddr(), task.ResetRedisPassword, 0, + consts.TendisTypeRedisInstance, 10*time.Hour) +} + +// resetAndFlushallAndMeet cluster reset并flushall并meet +func (task *clusterResetFlushMeetTask) resetAndFlushallAndMeet() { + var role string + var clustreInfo *myredis.CmdClusterInfo + var addrToNodes map[string]*myredis.ClusterNodeData + // 先执行cluster reset + task.runtime.Logger.Info(fmt.Sprintf("redis %s cluster reset start", task.ResetRedisAddr())) + task.Err = task.resetRedisConn.ClusterReset() + if task.Err != nil { + return + } + for { + role, _ = task.resetRedisConn.GetRole() + clustreInfo, _ = task.resetRedisConn.ClusterInfo() + if role == consts.RedisMasterRole && clustreInfo.ClusterState != consts.ClusterStateOK { + task.runtime.Logger.Info(fmt.Sprintf("redis %s cluster reset success,current_role:%s cluster_state:%s", + task.ResetRedisAddr(), role, clustreInfo.ClusterState)) + break + } + task.runtime.Logger.Info(fmt.Sprintf("redis %s cluster reset done,but current_role:%s cluster_state:%s", + task.ResetRedisAddr(), role, clustreInfo.ClusterState)) + time.Sleep(3 * time.Second) + } + if task.DoFlushall { + // 执行flushall + task.runtime.Logger.Info(fmt.Sprintf("redis %s flushall start", task.ResetRedisAddr())) + cmd := []string{consts.TendisPlusFlushAllRename} // cache 和 tendisplus的 flushall 命令一样 + _, task.Err = task.resetRedisConn.DoCommand(cmd, 0) + if task.Err != nil { + return + } + } + if task.DoClusterMeet { + // 执行cluster meet + task.runtime.Logger.Info(fmt.Sprintf("redis %s 'cluster meet %s %d' start", + task.ResetRedisAddr(), task.MeetIP, task.MeetPort)) + _, task.Err = task.resetRedisConn.ClusterMeet(task.MeetIP, strconv.Itoa(task.MeetPort)) + if task.Err != nil { + return + } + for { + addrToNodes, task.Err = task.resetRedisConn.GetAddrMapToNodes() + if task.Err != nil { + return + } + if _, ok := addrToNodes[task.ResetRedisAddr()]; ok { + task.runtime.Logger.Info(fmt.Sprintf("redis %s 'cluster meet %s %d' success", + task.ResetRedisAddr(), task.MeetIP, task.MeetPort)) + break + } + task.runtime.Logger.Info(fmt.Sprintf("redis %s 'cluster meet %s %d' done,but not in 'cluster nodes'", + task.ResetRedisAddr(), task.MeetIP, task.MeetPort)) + time.Sleep(3 * time.Second) + } + } +} diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_config_set.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_config_set.go index 12227a5267..fa98f30bfa 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_config_set.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_config_set.go @@ -136,7 +136,9 @@ func (job *RedisConfigSet) allInstsAbleToConnect() (err error) { } job.AddrMapConfigFile[addr] = confFile // 获取密码 - if job.params.Role == consts.MetaRolePredixy || job.params.Role == consts.MetaRoleTwemproxy { + if job.params.Role == consts.MetaRolePredixy { + password, err = myredis.GetPredixyAdminPasswdFromConfFlie(port) + } else if job.params.Role == consts.MetaRoleTwemproxy { password, err = myredis.GetProxyPasswdFromConfFlie(port, job.params.Role) } else { password, err = myredis.GetRedisPasswdFromConfFile(port) diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_reshape.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_reshape.go new file mode 100644 index 0000000000..4f5dac5083 --- /dev/null +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_reshape.go @@ -0,0 +1,181 @@ +package atomredis + +import ( + "encoding/json" + "fmt" + "sync" + "time" + + "github.com/go-playground/validator/v10" + + "dbm-services/redis/db-tools/dbactuator/models/myredis" + "dbm-services/redis/db-tools/dbactuator/pkg/consts" + "dbm-services/redis/db-tools/dbactuator/pkg/jobruntime" +) + +// RedisReshapeParam redis reshape param +type RedisReshapeParam struct { + RedisPassword string `json:"redis_password" validate:"required"` + Instances []instItem `json:"instances" validate:"required"` +} + +// reshapeTaskItem reshape task item,便于做并发 +type reshapeTaskItem struct { + instItem + Password string `json:"password"` + redisConn *myredis.RedisClient + Err error +} + +// RedisReshape redis shape +type RedisReshape struct { + runtime *jobruntime.JobGenericRuntime + params RedisReshapeParam + ReshapeTasks []*reshapeTaskItem +} + +// 无实际作用,仅确保实现了 jobruntime.JobRunner 接口 +var _ jobruntime.JobRunner = (*RedisReshape)(nil) + +// NewRedisReshape new +func NewRedisReshape() jobruntime.JobRunner { + return &RedisReshape{} +} + +// Init 初始化 +func (job *RedisReshape) Init(m *jobruntime.JobGenericRuntime) error { + job.runtime = m + err := json.Unmarshal([]byte(job.runtime.PayloadDecoded), &job.params) + if err != nil { + job.runtime.Logger.Error(fmt.Sprintf("json.Unmarshal failed,err:%+v", err)) + return err + } + // 参数有效性检查 + validate := validator.New() + err = validate.Struct(job.params) + if err != nil { + if _, ok := err.(*validator.InvalidValidationError); ok { + job.runtime.Logger.Error("RedisReshape Init params validate failed,err:%v,params:%+v", + err, job.params) + return err + } + for _, err := range err.(validator.ValidationErrors) { + job.runtime.Logger.Error("RedisReshape Init params validate failed,err:%v,params:%+v", + err, job.params) + return err + } + } + return nil +} + +// Name 原子任务名 +func (job *RedisReshape) Name() string { + return "redis_reshape" +} + +// Run Command Run +func (job *RedisReshape) Run() (err error) { + job.ReshapeTasks = make([]*reshapeTaskItem, 0, len(job.params.Instances)) + for _, instItem := range job.params.Instances { + reshapeTask := &reshapeTaskItem{ + instItem: instItem, + Password: job.params.RedisPassword, + } + job.ReshapeTasks = append(job.ReshapeTasks, reshapeTask) + } + err = job.allInstCconnect() + if err != nil { + return err + } + defer job.allInstDisconnect() + + err = job.ReshapeAndWaitDone() + if err != nil { + return err + } + return nil +} + +func (job *RedisReshape) allInstCconnect() (err error) { + wg := sync.WaitGroup{} + // 并发建立连接 + for _, tmp := range job.ReshapeTasks { + task := tmp + wg.Add(1) + go func(task *reshapeTaskItem) { + defer wg.Done() + task.redisConn, task.Err = myredis.NewRedisClientWithTimeout(task.Addr(), task.Password, 0, + consts.TendisTypeRedisInstance, 10*time.Hour) + }(task) + } + wg.Wait() + for _, tmp := range job.ReshapeTasks { + task := tmp + if task.Err != nil { + return task.Err + } + } + return nil +} + +// allInstDisconnect 所有实例断开连接 +func (job *RedisReshape) allInstDisconnect() { + for _, tmp := range job.ReshapeTasks { + task := tmp + if task.redisConn != nil { + task.redisConn.Close() + task.redisConn = nil + } + } +} + +// ReshapeAndWaitDone 多实例并发执行reshape +func (job *RedisReshape) ReshapeAndWaitDone() error { + // 根据salveIP做分组 + tasksMapSlice := make(map[string][]*reshapeTaskItem) + maxCount := 0 + for _, tmp := range job.ReshapeTasks { + task := tmp + tasksMapSlice[task.IP] = append(tasksMapSlice[task.IP], task) + if len(tasksMapSlice[task.IP]) > maxCount { + maxCount = len(tasksMapSlice[task.IP]) + } + } + // 同IP实例间串行,多IP实例间并行 + for idx := 0; idx < maxCount; idx++ { + groupTasks := []*reshapeTaskItem{} + for ip := range tasksMapSlice { + if len(tasksMapSlice[ip]) > idx { + groupTasks = append(groupTasks, tasksMapSlice[ip][idx]) + } + } + wg := sync.WaitGroup{} + for _, taskItem := range groupTasks { + task01 := taskItem + wg.Add(1) + go func(task02 *reshapeTaskItem) { + defer wg.Done() + job.runtime.Logger.Info("tendisplus %s start reshape", task02.Addr()) + task02.Err = task02.redisConn.TendisReshapeAndWaitDone() + }(task01) + } + wg.Wait() + for _, taskItem := range groupTasks { + task01 := taskItem + if task01.Err != nil { + return task01.Err + } + } + } + return nil +} + +// Retry times +func (job *RedisReshape) Retry() uint { + return 2 +} + +// Rollback rollback +func (job *RedisReshape) Rollback() error { + return nil +} diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go b/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go index 86dbf77685..cb722be478 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go @@ -203,6 +203,8 @@ func (m *JobGenericManager) atomjobsMapperLoading() { m.atomJobMapper[atomsys.NewChangePassword().Name()] = atomsys.NewChangePassword m.atomJobMapper[atomredis.NewRedisLoadModules().Name()] = atomredis.NewRedisLoadModules m.atomJobMapper[atomproxy.NewPredixyAddModulesCmds().Name()] = atomproxy.NewPredixyAddModulesCmds + m.atomJobMapper[atomredis.NewRedisReshape().Name()] = atomredis.NewRedisReshape + m.atomJobMapper[atomredis.NewClusterResetFlushMeet().Name()] = atomredis.NewClusterResetFlushMeet // 老备份系统 // m.atomJobMapper[atomredis.NewRedisDataRecover().Name()] = atomredis.NewRedisDataRecover m.atomJobMapper[atomredis.NewRedisDataStructure().Name()] = atomredis.NewRedisDataStructure diff --git a/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go b/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go index 5c5287b74f..8168ea16e8 100644 --- a/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go +++ b/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go @@ -260,6 +260,10 @@ func (job *Job) SetEventSender() { job.Conf.BeatPath, job.Conf.AgentAddress, ) + if job.Err != nil { + mylog.Logger.Error(fmt.Sprintf("set event sender fail,err:%v", job.Err)) + return + } if len(job.Conf.Servers) == 0 { return } @@ -535,25 +539,25 @@ func (job *Job) ConcurrentlyConfigSetMaxmemory() { var resourceSpecOsMem = map[string]int64{ "2g_min": consts.GiByte * 3 / 2, "2g_max": consts.GiByte * 2, - "2g_avail": consts.GiByte * 2 * 6 / 10, + "2g_avail": consts.GiByte * 2 * 5 / 10, // 1GB可用 "4g_min": consts.GiByte * 7 / 2, "4g_max": consts.GiByte * 4, - "4g_avail": consts.GiByte * 4 * 6 / 10, + "4g_avail": consts.GiByte * 4 * 5 / 10, // 2GB可用 "8g_min": consts.GiByte * 15 / 2, "8g_max": consts.GiByte * 8, - "8g_avail": consts.GiByte * 8 * 8 / 10, + "8g_avail": consts.GiByte * 8 * 75 / 100, // 6GB可用 "16g_min": consts.GiByte * 15, "16g_max": consts.GiByte * 16, - "16g_avail": consts.GiByte * 16 * 85 / 100, + "16g_avail": consts.GiByte * 16 * 85 / 100, // 13.6GB可用 "32g_min": consts.GiByte * 30, "32g_max": consts.GiByte * 32, - "32g_avail": consts.GiByte * 32 * 85 / 100, + "32g_avail": consts.GiByte * 32 * 85 / 100, // 27.2GB可用 "64g_min": consts.GiByte * 61, "64g_max": consts.GiByte * 64, - "64g_avail": consts.GiByte * 64 * 9 / 10, + "64g_avail": consts.GiByte * 64 * 9 / 10, // 57.6GB可用 "128g_min": consts.GiByte * 125, "128g_max": consts.GiByte * 128, - "128g_avail": consts.GiByte * 128 * 9 / 10, + "128g_avail": consts.GiByte * 128 * 9 / 10, // 115.2GB可用 } // GetLocalHostAvailMemory TODO diff --git a/dbm-services/redis/redis-dts/build/config-template.yaml b/dbm-services/redis/redis-dts/build/config-template.yaml index 11dcd80696..08e6ecb4a3 100644 --- a/dbm-services/redis/redis-dts/build/config-template.yaml +++ b/dbm-services/redis/redis-dts/build/config-template.yaml @@ -37,3 +37,15 @@ RsyncPullTimeout: 36000 # rsync timeout,10 hour WarnMessageNotifier: VAR_warning_msg_notifiers #告警通知人 DtsServerDiskMaxUsgRatio: 85 #dtsserver磁盘最大使用90%,超过则发送告警 DtsServerMemMaxUsgRatio: 80 #dtsserver内存最大使用90%,超过则发送告警 + +# tendisplus lightning +maxLocalDiskDataSizeRatioNLightning: 5 # 单台DTS最大迁移的Tendisplus lightning数据量为本地磁盘的 1/5 +lightningCosFileDownloadParallelLimit: 5 +lightningFileSplitParallelLimit: 5 +lightningGenerateSstParallelLimit: 5 +lightningScpSstParallelLimit: 5 +lightningSlaveLoadSstParallelLimit: 5 +txycos: + url: VAR_txycos_url + secret_id: VAR_txycos_secret_id + secret_key: VAR_txycos_secret_key \ No newline at end of file diff --git a/dbm-services/redis/redis-dts/main.go b/dbm-services/redis/redis-dts/main.go index f38f8f113e..092a589eea 100644 --- a/dbm-services/redis/redis-dts/main.go +++ b/dbm-services/redis/redis-dts/main.go @@ -77,7 +77,8 @@ func main() { constvar.GetZoneName(), tclog.Logger, wg)) jobers = append(jobers, dtsJob.NewRedisCacheDtsJob(constvar.GetBkCloudID(), localIP, constvar.GetZoneName(), tclog.Logger, wg)) - + jobers = append(jobers, dtsJob.NewTendisplusLightningJob(constvar.GetBkCloudID(), localIP, + constvar.GetZoneName(), tclog.Logger, wg)) for _, jober := range jobers { jober.StartBgWorkers() } diff --git a/dbm-services/redis/redis-dts/models/myredis/myredis.go b/dbm-services/redis/redis-dts/models/myredis/myredis.go index 38df74283e..3a63da81e2 100644 --- a/dbm-services/redis/redis-dts/models/myredis/myredis.go +++ b/dbm-services/redis/redis-dts/models/myredis/myredis.go @@ -18,11 +18,12 @@ import ( // RedisWorker redis连接信息 type RedisWorker struct { - Addr string `json:"addr"` - Password string `json:"password"` - DB int `json:"db"` - Client *redis.Client `json:"-"` - logger *zap.Logger `json:"-"` + Addr string `json:"addr"` + Password string `json:"password"` + DB int `json:"db"` + MaxRetryTime int `json:"maxRetryTimes"` + Client *redis.Client `json:"-"` + logger *zap.Logger `json:"-"` } // ParamsString 将连接信息返回为字符串 @@ -33,44 +34,86 @@ func (db *RedisWorker) ParamsString() string { // NewRedisClient 新建redis连接 func NewRedisClient(addr, passwd string, db int, logger *zap.Logger) (conn *RedisWorker, err error) { - retry := 0 // 如果失败。重试12次,10秒一次 if logger == nil { logger = tclog.NewFileLogger("log/main.log") } conn = &RedisWorker{ - Addr: addr, - Password: passwd, - DB: db, - logger: logger, - } -RECONNCT: - if conn.Password == "" { - conn.Client = redis.NewClient(&redis.Options{ - Addr: conn.Addr, - DB: conn.DB, - DialTimeout: 10 * time.Second, - MaxConnAge: 24 * time.Hour, - }) - } else { - conn.Client = redis.NewClient(&redis.Options{ - Addr: conn.Addr, - Password: conn.Password, - DB: conn.DB, - DialTimeout: 10 * time.Second, - MaxConnAge: 24 * time.Hour, - }) - } - _, err = conn.Client.Ping(context.TODO()).Result() + Addr: addr, + Password: passwd, + DB: db, + logger: logger, + MaxRetryTime: 60, // 默认重试次数 + } + err = conn.newConn(1 * time.Minute) + if err != nil { + return + } + return +} + +// NewRedisClientWithTimeout 新建redis连接,可制定超时时间 +func NewRedisClientWithTimeout(addr, passwd string, db int, timeout time.Duration, + logger *zap.Logger) (conn *RedisWorker, err error) { + if logger == nil { + logger = tclog.NewFileLogger("log/main.log") + } + conn = &RedisWorker{ + Addr: addr, + Password: passwd, + DB: db, + logger: logger, + MaxRetryTime: int(timeout.Seconds()), + } + err = conn.newConn(timeout) if err != nil { - conn.logger.Error("redis new client fail,sleep 10s then retry.err:%v,addr:%s", - zap.Error(err), zap.String("params", conn.ParamsString())) - if retry < 12 { - retry++ - time.Sleep(10 * time.Second) - goto RECONNCT - } else { - return nil, fmt.Errorf("redis new client fail,err:%v addr:%s", err, conn.Addr) + return + } + return +} + +func (db *RedisWorker) newConn(timeout time.Duration) (err error) { + // 执行命令失败重连,确保重连后,databases正确 + var redisConnHook = func(ctx context.Context, cn *redis.Conn) error { + pipe01 := cn.Pipeline() + _, err := pipe01.Select(context.TODO(), db.DB).Result() + if err != nil { + err = fmt.Errorf("newConnct pipeline change db fail,err:%v", err) + db.logger.Error(err.Error()) + return err + } + _, err = pipe01.Exec(context.TODO()) + if err != nil { + err = fmt.Errorf("newConnct pipeline.exec db fail,err:%v", err) + db.logger.Error(err.Error()) + return err } + return nil + } + redisOpt := &redis.Options{ + Addr: db.Addr, + DB: db.DB, + DialTimeout: timeout, + ReadTimeout: timeout, + MaxConnAge: 24 * time.Hour, + MaxRetries: db.MaxRetryTime, // 失败自动重试,重试次数 + MinRetryBackoff: 1 * time.Second, // 重试间隔 + MaxRetryBackoff: 1 * time.Second, + PoolSize: 10, + OnConnect: redisConnHook, + } + if db.Password != "" { + redisOpt.Password = db.Password + } + db.Client = redis.NewClient(redisOpt) + _, err = db.Client.Ping(context.TODO()).Result() + if err != nil && strings.Contains(err.Error(), "LOADING Redis is loading") { + db.logger.Warn(fmt.Sprintf("redis:%s conn warn,err:%v", db.Addr, err)) + err = nil + } + if err != nil { + errStr := fmt.Sprintf("redis new conn fail,sleep 10s then retry.err:%v,addr:%s", err, db.Addr) + db.logger.Error(errStr) + return fmt.Errorf("redis new conn fail,err:%v addr:%s", err, db.Addr) } return } @@ -394,6 +437,18 @@ func (db *RedisWorker) GetMasterAddrAndPasswd() (masterAddr, masterAuth string, return } +// Loadexternalfiles 加载外部sst文件 +func (db *RedisWorker) Loadexternalfiles(sstDir, slosStr, loadMode string) (err error) { + cmd := []interface{}{"loadexternalfiles", sstDir, slosStr, loadMode} + _, err = db.Client.Do(context.TODO(), cmd...).Result() + if err != nil { + err = fmt.Errorf("redis:%s %+v,err:%v", db.Addr, cmd, err) + db.logger.Error(err.Error()) + return + } + return +} + // Close :关闭client func (db *RedisWorker) Close() { if db.Client == nil { diff --git a/dbm-services/redis/redis-dts/models/mysql/tendisdb/job.go b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisDtsJob.go similarity index 100% rename from dbm-services/redis/redis-dts/models/mysql/tendisdb/job.go rename to dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisDtsJob.go diff --git a/dbm-services/redis/redis-dts/models/mysql/tendisdb/task.go b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisDtsTask.go similarity index 98% rename from dbm-services/redis/redis-dts/models/mysql/tendisdb/task.go rename to dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisDtsTask.go index 0a44754bf8..0f0bee90f3 100644 --- a/dbm-services/redis/redis-dts/models/mysql/tendisdb/task.go +++ b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisDtsTask.go @@ -18,8 +18,8 @@ import ( ) var ( - tbTaskFiledToColunm map[string]string // struct filedName map to colunmName - once01 sync.Once + tbDtsTaskFiledToColunm map[string]string // struct filedName map to colunmName + tbDtsTaskOnce sync.Once ) // TbTendisDTSTask 迁移task @@ -429,11 +429,11 @@ func GetJobSrcIPRunningTasks(billID int64, srcCluster, dstCluster, srcIP string, // DtsTaskStructFieldsToColumns 获取 TbTendisDTSTask 字段名 到 列名之间的对应关系 // 如 filedNames=["BillID","App","User","SrcIP"] 对应的 columnNames=["bill_id","app","user","src_ip"] func DtsTaskStructFieldsToColumns(fieldNames []string, logger *zap.Logger) (columnNames []string, err error) { - once01.Do(func() { + tbDtsTaskOnce.Do(func() { t01 := TbTendisDTSTask{} reg01 := regexp.MustCompile(`column:(\w+)`) getType := reflect.TypeOf(t01) - tbTaskFiledToColunm = make(map[string]string, getType.NumField()) + tbDtsTaskFiledToColunm = make(map[string]string, getType.NumField()) for i := 0; i < getType.NumField(); i++ { field := getType.Field(i) gormTag := string(field.Tag.Get("gorm")) @@ -441,12 +441,12 @@ func DtsTaskStructFieldsToColumns(fieldNames []string, logger *zap.Logger) (colu if len(l01) < 2 { continue } - tbTaskFiledToColunm[field.Name] = l01[1] + tbDtsTaskFiledToColunm[field.Name] = l01[1] } }) columnNames = make([]string, 0, len(fieldNames)) for _, field01 := range fieldNames { - colName, ok := tbTaskFiledToColunm[field01] + colName, ok := tbDtsTaskFiledToColunm[field01] if ok == false { err = fmt.Errorf("struct TbTendisDTSTask have no field:%s", colName) logger.Error(err.Error()) diff --git a/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_job.go b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_job.go new file mode 100644 index 0000000000..27ebb92f4c --- /dev/null +++ b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_job.go @@ -0,0 +1,87 @@ +package tendisdb + +import ( + "encoding/json" + "fmt" + "net/http" + + "github.com/spf13/viper" + "go.uber.org/zap" + + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/customtime" + "dbm-services/redis/redis-dts/pkg/scrdbclient" +) + +/* +create table tb_tendisplus_lightning_job ( +id bigint NOT NULL primary key, +ticket_id bigint(20) NOT NULL, +user varchar(64) NOT NULL, +bk_biz_id varchar(64) NOT NULL, +bk_cloud_id bigint(20) NOT NULL, +dst_cluster varchar(128) NOT NULL, +dst_cluster_id bigint(20) NOT NULL, +cluster_nodes longtext NOT NULL, +create_time datetime(6) NOT NULL, +key idx_create_time(create_time), +key idx_dst_cluster_id(dst_cluster_id), +key idx_user(user), +unique index uniq_ticket_cluster(ticket_id,dst_cluster) +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +*/ + +// TbTendisplusLightningJob TODO +type TbTendisplusLightningJob struct { + // gorm + ID int64 `gorm:"primary_key;column:id;type:bigint(20) unsigned;not null" json:"id"` + TicketID int64 `gorm:"column:ticket_id;type:bigint(20) unsigned;not null" json:"ticket_id"` + User string `gorm:"column:user;type:varchar(64);not null" json:"user"` + BkBizID string `gorm:"column:bk_biz_id;type:varchar(64);not null" json:"bk_biz_id"` + BkCloudID int64 `gorm:"column:bk_cloud_id;type:bigint(20) unsigned;not null" json:"bk_cloud_id"` + DstCluster string `gorm:"column:dst_cluster;type:varchar(128);not null" json:"dst_cluster"` + DstClusterID int64 `gorm:"column:dst_cluster_id;type:bigint(20) unsigned;not null" json:"dst_cluster_id"` + ClusterNodes string `gorm:"column:cluster_nodes;type:longtext;not null" json:"cluster_nodes"` + CreateTime customtime.CustomTime `json:"create_time" gorm:"column:create_time"` // 创建时间 +} + +// TableName 表名 +func (t *TbTendisplusLightningJob) TableName() string { + return "tb_tendisplus_lightning_job" +} + +// GetLightningJob 获取 lightning job对应row +func GetLightningJob( + ticketID int64, dstCluster string, + logger *zap.Logger, +) (jobRows []*TbTendisplusLightningJob, err error) { + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + jobRows = []*TbTendisplusLightningJob{} + subURL = constvar.DbmLightningJobDetailURL + type lightningJobReq struct { + TicketID int64 `json:"ticket_id"` + DstCluster string `json:"dst_cluster"` + } + param := lightningJobReq{ + TicketID: ticketID, + DstCluster: dstCluster, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, &jobRows) + if err != nil { + err = fmt.Errorf("GetLightningJob unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return +} diff --git a/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_task.go b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_task.go new file mode 100644 index 0000000000..61799a4046 --- /dev/null +++ b/dbm-services/redis/redis-dts/models/mysql/tendisdb/tendisplus_lightning_task.go @@ -0,0 +1,435 @@ +package tendisdb + +import ( + "encoding/json" + "fmt" + "net/http" + "reflect" + "regexp" + "sync" + + "github.com/spf13/viper" + "go.uber.org/zap" + + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/scrdbclient" +) + +var ( + lightningTaskFiledToColunm map[string]string // struct filedName map to colunmName + lightningTaskOnce sync.Once +) + +/* +create table tb_tendisplus_lightning_task ( +task_id varchar(64) NOT NULL primary key, +ticket_id bigint(20) NOT NULL, +user varchar(64) NOT NULL, +bk_biz_id varchar(64) NOT NULL, +bk_cloud_id bigint(20) NOT NULL, +cos_key varchar(128) NOT NULL, +cos_file_size bigint(20) NOT NULL, +dts_server varchar(128) NOT NULL, +dst_cluster varchar(128) NOT NULL, +dst_cluster_id bigint(20) NOT NULL, +dst_cluster_priority int(11) NOT NULL, +dst_zonename varchar(128) NOT NULL, +task_type varchar(128) NOT NULL, +operate_type varchar(128) NOT NULL, +status int(11) NOT NULL, +message longtext NOT NULL, +create_time datetime(6) NOT NULL, +update_time datetime(6) NOT NULL, +key idx_update_time(update_time), +key idx_dst_cluster_id(dst_cluster_id), +key idx_user(user), +key idx_ticket_cluster(ticket_id,dst_cluster_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +*/ + +// TbTendisplusLightningTask TODO +type TbTendisplusLightningTask struct { + // gorm + TaskId string `gorm:"column:task_id;type:varchar(64);primary_key" json:"task_id"` + TicketID int64 `gorm:"column:ticket_id;type:bigint(20) unsigned;not null" json:"ticket_id"` + User string `gorm:"column:user;type:varchar(64);not null" json:"user"` + BkBizID string `gorm:"column:bk_biz_id;type:varchar(64);not null" json:"bk_biz_id"` + BkCloudID int64 `gorm:"column:bk_cloud_id;type:bigint(20) unsigned;not null" json:"bk_cloud_id"` + CosKey string `gorm:"column:cos_key;type:varchar(128);not null" json:"cos_key"` + CosFileSize int64 `gorm:"column:cos_file_size;type:bigint(20) unsigned;not null" json:"cos_file_size"` + DtsServer string `gorm:"column:dts_server;type:varchar(128);not null" json:"dts_server"` + DstCluster string `gorm:"column:dst_cluster;type:varchar(128);not null" json:"dst_cluster"` + DstClusterID int64 `gorm:"column:dst_cluster_id;type:bigint(20) unsigned;not null" json:"dst_cluster_id"` + DstClusterPriority int `gorm:"column:dst_cluster_priority;type:int(11);not null" json:"dst_cluster_priority"` + DstZonename string `gorm:"column:dst_zonename;type:varchar(128);not null" json:"dst_zonename"` + TaskType string `gorm:"column:task_type;type:varchar(128);not null" json:"task_type"` + OperateType string `gorm:"column:operate_type;type:varchar(128);not null" json:"operate_type"` + Status int `gorm:"column:status;type:int(11);not null" json:"status"` + Message string `gorm:"column:message;type:longtext;not null" json:"message"` + CreateTime string `gorm:"column:create_time;type:datetime(6);not null" json:"create_time"` + UpdateTime string `gorm:"column:update_time;type:datetime(6);not null" json:"update_time"` +} + +// TableName 表名 +func (t *TbTendisplusLightningTask) TableName() string { + return "tb_tendisplus_lightning_task" +} + +// TaskLockKey keyname +func (t *TbTendisplusLightningTask) TaskLockKey() string { + return fmt.Sprintf("Lightning_task_lock_%d_%s_%s", + t.TicketID, t.DstCluster, t.TaskId, + ) +} + +// LightningDtsSvrMigratingTasks 获取dtsserver正在迁移的task,与task对应多少dataSize +// 对Tendisplus Lightning 来说,'迁移中'指处于 status=1 状态的task +func LightningDtsSvrMigratingTasks(bkCloudID int64, dtsSvr string, taskTypes []string, + logger *zap.Logger) (tasks []*TbTendisplusLightningTask, dataSize uint64, err error) { + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + tasks = []*TbTendisplusLightningTask{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningDtsServerMigratingTasksURL + } + type lightningDtsSvrMigratingTasksReq struct { + BkCloudID int64 `json:"bk_cloud_id"` + DtsServer string `json:"dts_server"` + TaskTypes []string `json:"task_types"` + } + param := lightningDtsSvrMigratingTasksReq{ + BkCloudID: bkCloudID, + DtsServer: dtsSvr, + TaskTypes: taskTypes, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, &tasks) + if err != nil { + err = fmt.Errorf("LightningDtsSvrMigratingTasks unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + dataSize = 0 + for _, tmp := range tasks { + task := tmp + dataSize = dataSize + uint64(task.CosFileSize) + } + return +} + +// LightningLast30DaysToExecuteTasks 用于获取最近一个月本地等待执行的lightning tasks +func LightningLast30DaysToExecuteTasks( + bkCloudID int64, + dtsServer, taskType string, + status, limit int, + logger *zap.Logger) (tasks []*TbTendisplusLightningTask, err error) { + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + type lightningLast30DaysToExecTasksReq struct { + BkCloudID int64 `json:"bk_cloud_id"` + DtsServer string `json:"dts_server"` + TaskType string `json:"task_type"` + Status int `json:"status"` + Limit int `json:"limit"` + } + tasks = []*TbTendisplusLightningTask{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningLast30DaysToExecuteTasksURL + } + param := lightningLast30DaysToExecTasksReq{ + DtsServer: dtsServer, + TaskType: taskType, + Status: status, + Limit: limit, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, &tasks) + if err != nil { + err = fmt.Errorf("LightningLast30DaysToExecuteTasks unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return +} + +// LightningLast30DaysToScheduleJobs 获取最近30天待调度的Jobs +// jobs必须满足: 有一个待调度的task.dataSize < maxDataSize +func LightningLast30DaysToScheduleJobs(bkCloudID int64, maxDataSize int64, zoneName string, + logger *zap.Logger) (jobs []*TbTendisplusLightningTask, err error) { + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + type lightningLast30DaysToScheduleJobsReq struct { + BkCloudID int64 `json:"bk_cloud_id"` + MaxDataSize int64 `json:"max_data_size"` + ZoneName string `json:"zone_name"` + } + jobs = []*TbTendisplusLightningTask{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningLast30DaysToScheduleJobsURL + } + param := lightningLast30DaysToScheduleJobsReq{ + BkCloudID: bkCloudID, + MaxDataSize: maxDataSize, + ZoneName: zoneName, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, &jobs) + if err != nil { + err = fmt.Errorf("LightningLast30DaysToScheduleJobs unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return +} + +// LightningJobToScheduleTasks 获取job中所有待调度的task +// ticketId、dstCluster确定一个job +// dtsserver='1.1.1.1' and status=0 and task_type="" 代表 '未执行' +// 一个job可能部分task执行,部分未执行; +// 根据权重src_weight排序,权重越小,越前面执行 +func LightningJobToScheduleTasks(ticketID int64, dstCluster string, + logger *zap.Logger) (tasks []*TbTendisplusLightningTask, err error) { + if ticketID == 0 || dstCluster == "" { + err = fmt.Errorf("ticketID:%d or dstCluster:%s cann't be empty", + ticketID, dstCluster) + logger.Error(err.Error()) + return tasks, err + } + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + type lightningJobToScheduleTasks struct { + TicketID int64 `json:"ticket_id"` + DstCluster string `json:"dst_cluster"` + } + tasks = []*TbTendisplusLightningTask{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningJobToScheduleTasksURL + } + param := lightningJobToScheduleTasks{ + TicketID: ticketID, + DstCluster: dstCluster, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, &tasks) + if err != nil { + err = fmt.Errorf("LightningJobToScheduleTasks unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return +} + +// LightningTaskByID 根据id获得task详细信息 +func LightningTaskByID(taskID string, logger *zap.Logger) (task *TbTendisplusLightningTask, err error) { + if logger == nil { + err = fmt.Errorf("LightningTaskByID logger cannot be nil") + return + } + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + type lightningTaskRowByIDReq struct { + TaskID string `json:"task_id"` + } + + task = &TbTendisplusLightningTask{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningTaskRowByIDURL + } + param := lightningTaskRowByIDReq{ + TaskID: taskID, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + if len(data.Data) == 4 && string(data.Data) == "null" { + return nil, nil + } + err = json.Unmarshal(data.Data, task) + if err != nil { + err = fmt.Errorf("LightningTaskByID unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return +} + +// LightningTaskStructFieldsToColumns 获取 TbTendisplusLightningTask 字段名 到 列名之间的对应关系 +// 如 filedNames=["BillID","App","User","SrcIP"] 对应的 columnNames=["bill_id","app","user","src_ip"] +func LightningTaskStructFieldsToColumns(fieldNames []string, logger *zap.Logger) (columnNames []string, err error) { + lightningTaskOnce.Do(func() { + t01 := TbTendisplusLightningTask{} + reg01 := regexp.MustCompile(`column:(\w+)`) + getType := reflect.TypeOf(t01) + lightningTaskFiledToColunm = make(map[string]string, getType.NumField()) + for i := 0; i < getType.NumField(); i++ { + field := getType.Field(i) + gormTag := string(field.Tag.Get("gorm")) + l01 := reg01.FindStringSubmatch(gormTag) + if len(l01) < 2 { + continue + } + lightningTaskFiledToColunm[field.Name] = l01[1] + } + }) + columnNames = make([]string, 0, len(fieldNames)) + for _, field01 := range fieldNames { + colName, ok := lightningTaskFiledToColunm[field01] + if ok == false { + err = fmt.Errorf("struct TbTendisplusLightningTask have no field:%s", colName) + logger.Error(err.Error()) + return + } + columnNames = append(columnNames, colName) + } + return +} + +// GetFieldsValue 根据 字段名 从task中获取其字段values +// 如 filedNames=["DtsServer","CosFileSize"] 其对应值为 ret=["1.1.1.1",11111] +func (t *TbTendisplusLightningTask) GetFieldsValue(fieldNames []string, logger *zap.Logger) (ret []interface{}, + err error) { + _, err = LightningTaskStructFieldsToColumns(fieldNames, logger) + if err != nil { + return + } + ret = make([]interface{}, 0, len(fieldNames)) + getValue := reflect.ValueOf(t) + for _, field01 := range fieldNames { + val01 := reflect.Indirect(getValue).FieldByName(field01) + ret = append(ret, val01.Interface()) + } + return +} + +// GetColToValByFields 根据struct fieldName 生成 表列名=>值 之间的对应关系 +func (t *TbTendisplusLightningTask) GetColToValByFields(fieldNames []string, logger *zap.Logger) ( + colToVal map[string]interface{}, err error) { + var columnNames []string + var values []interface{} + columnNames, err = LightningTaskStructFieldsToColumns(fieldNames, logger) + if err != nil { + return + } + values, err = t.GetFieldsValue(fieldNames, logger) + if err != nil { + return + } + colToVal = make(map[string]interface{}, len(fieldNames)) + for idx, col := range columnNames { + colToVal[col] = values[idx] + } + return +} + +// UpdateFieldsValues 根据字段名 自动生成update 语句并进行更新 +// 如 filedNames=["DtsServer","CosFileSize"] +// 生成的update语句: update tb_tendis_dts_task set dts_server=?,cos_file_size=?,update_time=now() where task_id=xxxx; +// 该函数主要目的只更新 值变化的字段,而不是row全部值 +func (t *TbTendisplusLightningTask) UpdateFieldsValues(fieldNames []string, logger *zap.Logger) (err error) { + var colToVal map[string]interface{} + colToVal, err = t.GetColToValByFields(fieldNames, logger) + if err != nil { + return err + } + _, err = UpdateLightningTaskRows([]string{t.TaskId}, colToVal, logger) + return +} + +// UpdateLightningTaskRows 更新tasks多行 +func UpdateLightningTaskRows(taskIDs []string, colToValue map[string]interface{}, + logger *zap.Logger) (rowsAffected int64, + err error) { + var cli01 *scrdbclient.Client + var subURL string + var data *scrdbclient.APIServerResponse + cli01, err = scrdbclient.NewClient(viper.GetString("serviceName"), logger) + if err != nil { + return + } + type dtsTaskRowsUpdateReq struct { + TaskIDs []string `json:"task_ids"` + ColumnToValue map[string]interface{} `json:"col_to_val"` + } + + type dtsTaskRowsUpdateRsp struct { + RowsAffected int64 `json:"rows_affected"` + } + + ret := &dtsTaskRowsUpdateRsp{} + if cli01.GetServiceName() == constvar.BkDbm { + subURL = constvar.DbmLightningUpdateTaskRowsURL + } + param := dtsTaskRowsUpdateReq{ + TaskIDs: taskIDs, + ColumnToValue: colToValue, + } + data, err = cli01.Do(http.MethodPost, subURL, param) + if err != nil { + return + } + err = json.Unmarshal(data.Data, ret) + if err != nil { + err = fmt.Errorf("UpdateLightningTaskRows unmarshal data fail,err:%v,resp.Data:%s,subURL:%s,param:%+v", + err.Error(), string(data.Data), subURL, param) + logger.Error(err.Error()) + return + } + return ret.RowsAffected, nil +} + +// IsAllLightningTasksToForceKill 是否全部tasks都等待被force kill +func IsAllLightningTasksToForceKill(tasks []*TbTendisplusLightningTask) (allForceKill bool) { + if len(tasks) == 0 { + return false + } + for _, t01 := range tasks { + t02 := t01 + if t02.OperateType != constvar.RedisForceKillTaskTodo { + return false + } + } + return true +} diff --git a/dbm-services/redis/redis-dts/pkg/constvar/constvar.go b/dbm-services/redis/redis-dts/pkg/constvar/constvar.go index 03f1a34f98..30b32d43db 100644 --- a/dbm-services/redis/redis-dts/pkg/constvar/constvar.go +++ b/dbm-services/redis/redis-dts/pkg/constvar/constvar.go @@ -104,6 +104,30 @@ const ( TendisplusSendIncrTaskType = "tendisplusSendIncr" ) +// tendisplus lightning task type +const ( + TendisplusLightningCosFileDownload = "lightningCosFileDownload" + TendisplusLightningFileSplit = "lightningFileSplit" + TendisplusLightningGenerateSst = "lightningGenerateSst" + TendisplusLightningScpSst = "lightningScpSst" + TendisplusLightningSlaveLoadSst = "lightningSlaveLoadSst" +) + +// tendisplus lightning tools +const ( + ToolLightningKVFileSplit = "tendisplus_lightning_kvfile_split" + ToolLightningSstGenerator = "tendisplus_lightning_sst_generator" +) + +const ( + // ToolZstd tool + ToolZstd = "zstd" + // DbbakDir dir + DbbakDir = "/data/dbbak/" + // MysqlOSAccount os account + MysqlOSAccount = "mysql" +) + /* migrating tasks type '迁移中' 是指那些正在占用资源 或者 即将占用资源 阶段, 资源主要指磁盘 or 内存 @@ -124,6 +148,13 @@ var ( TendisplusMakeSyncTaskType, TendisplusSendBulkTaskType, } + LightningMigratingTasksType = []string{ + TendisplusLightningCosFileDownload, + TendisplusLightningFileSplit, + TendisplusLightningGenerateSst, + TendisplusLightningScpSst, + // TendisplusLightningSlaveLoadSst + } ) // Tredisdump 结果文件格式 @@ -223,6 +254,16 @@ const ( DbmJobApiGetJobInstanceStatusURL = "/apis/proxypass/jobapi/get_job_instance_status/" DbmJobApiBatchGetJobInstanceIPLogURL = "/apis/proxypass/jobapi/batch_get_job_instance_ip_log/" DbmJobApiTransferFileURL = "/apis/proxypass/jobapi/fast_transfer_file/" + + // DbmLightningDtsServerMigratingTasksURL TODO + // tendisplus Lightning api + DbmLightningDtsServerMigratingTasksURL = "/apis/proxypass/tendisplus_lightning/dts_server_migrating_tasks/" + DbmLightningLast30DaysToExecuteTasksURL = "/apis/proxypass/tendisplus_lightning/last_30_days_to_exec_tasks/" + DbmLightningLast30DaysToScheduleJobsURL = "/apis/proxypass/tendisplus_lightning/last_30_days_to_schedule_jobs/" + DbmLightningJobToScheduleTasksURL = "/apis/proxypass/tendisplus_lightning/job_to_schedule_tasks/" + DbmLightningJobDetailURL = "/apis/proxypass/tendisplus_lightning/job_detail/" + DbmLightningTaskRowByIDURL = "/apis/proxypass/tendisplus_lightning/task_by_task_id/" + DbmLightningUpdateTaskRowsURL = "/apis/proxypass/tendisplus_lightning/tasks_update/" ) // ZonenameTransform 城市转换 @@ -230,8 +271,12 @@ func ZonenameTransform(zoneName string) string { switch zoneName { case "苏州": return "上海" + case "昆山": + return "上海" case "扬州": return "南京" + case "仪征": + return "南京" case "清远": return "广州" default: diff --git a/dbm-services/redis/redis-dts/pkg/dtsJob/base.go b/dbm-services/redis/redis-dts/pkg/dtsJob/base.go index 785ab12713..cd05a5b3a9 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsJob/base.go +++ b/dbm-services/redis/redis-dts/pkg/dtsJob/base.go @@ -89,7 +89,7 @@ func (job *DtsJobBase) BgDtsTaskRunnerWithConcurrency(taskType, dbType string) { latestRow.ID, latestRow.SrcIP, latestRow.SrcPort, latestRow.Status, latestRow.TaskType, taskType)) continue } - task01 := factory.MyTaskFactory(latestRow) + task01 := factory.MyTendisDtsTaskFactory(latestRow) task01.Init() // 执行Init,成功则status=1,失败则status=-1 task01.Execute() } @@ -110,8 +110,7 @@ func (job *DtsJobBase) BgDtsTaskRunnerWithConcurrency(taskType, dbType string) { continue } if len(toExecuteRows) == 0 { - job.logger.Info(fmt.Sprintf("not found to be executed %q task,sleep 10s", taskType), - zap.String("serverIP", job.ServerIP)) + job.logger.Info(fmt.Sprintf("serverIP:%s not found to be executed %s task,sleep 10s", job.ServerIP, taskType)) continue } for _, row := range toExecuteRows { @@ -151,7 +150,7 @@ func (job *DtsJobBase) BgDtsTaskRunnerWithoutLimit(taskType, dbType string) { job.logger.Error(string(debug.Stack())) } }() - task01 := factory.MyTaskFactory(rowData) + task01 := factory.MyTendisDtsTaskFactory(rowData) task01.Init() task01.Execute() }(rowItem) @@ -175,7 +174,7 @@ func (job *DtsJobBase) BgDtsTaskRunnerWithoutLimit(taskType, dbType string) { continue } if len(toExecuteRows) == 0 { - job.logger.Info(fmt.Sprintf("not found to be executed %q task,sleep 10s", taskType), + job.logger.Info(fmt.Sprintf("not found to be executed %s task,sleep 10s", taskType), zap.String("serverIP", job.ServerIP)) continue } diff --git a/dbm-services/redis/redis-dts/pkg/dtsJob/tendisplusLightningJob.go b/dbm-services/redis/redis-dts/pkg/dtsJob/tendisplusLightningJob.go new file mode 100644 index 0000000000..51f7b69c15 --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsJob/tendisplusLightningJob.go @@ -0,0 +1,430 @@ +package dtsJob + +import ( + "fmt" + "runtime/debug" + "sync" + "time" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/dtsTask/factory" + "dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning" + "dbm-services/redis/redis-dts/pkg/osPerf" + "dbm-services/redis/redis-dts/pkg/scrdbclient" + "dbm-services/redis/redis-dts/pkg/txycos" + + "github.com/dustin/go-humanize" + "github.com/jinzhu/gorm" + "github.com/spf13/viper" + "github.com/tencentyun/cos-go-sdk-v5" + "go.uber.org/zap" +) + +// TendisplusLightningJob tendis lightning job +type TendisplusLightningJob struct { + BkCloudID int64 `json:"bk_cloud_id"` + ServerIP string `json:"serverIP"` + ZoneName string `json:"zoneName"` + logger *zap.Logger + wg *sync.WaitGroup + cosWorker *txycos.TxyCosWoker +} + +// NewTendisplusLightningJob new +func NewTendisplusLightningJob(bkCloudID int64, serverIP, zoneName string, + logger *zap.Logger, wg *sync.WaitGroup) (job *TendisplusLightningJob) { + var err error + job = &TendisplusLightningJob{ + BkCloudID: bkCloudID, + ServerIP: serverIP, + ZoneName: zoneName, + logger: logger, + wg: wg, + } + job.cosWorker, err = txycos.NewTxyCosWoker(job.logger) + if err != nil { + panic(err) + } + return +} + +// GetRatioN_LocalDisk 最大使用是本地磁盘的几分之一 +func (job *TendisplusLightningJob) GetRatioN_LocalDisk() (ratioNOfLocalDisk uint64) { + ratioNOfLocalDisk = viper.GetUint64("maxLocalDiskDataSizeRatioNLightning") + if ratioNOfLocalDisk == 0 { + ratioNOfLocalDisk = 4 + } + return +} + +// IsDataMigrationExceedingDiskLimit 检查迁移中数据量是否超过本地磁盘限制 +func (job *TendisplusLightningJob) IsDataMigrationExceedingDiskLimit() (ok bool, + allowedMigrationDataSize int64, err error) { + var myDisk01 osPerf.HostDiskUsage + var msg string + ratioNOfLocalDisk := job.GetRatioN_LocalDisk() + myDisk01, err = osPerf.GetMyHostDisk() + if err != nil { + return + } + if myDisk01.UsageRatio > 50 { + // 如果当前已使用磁盘大于50%,则不继续给自己分配迁移任务 + msg = fmt.Sprintf("%s 磁盘使用率大于50%%,磁盘路径:%s,使用率:%d%%,stop accept tendisplus lightning dts task", + job.ServerIP, myDisk01.DirName, myDisk01.UsageRatio) + job.logger.Info(msg) + return + } + lightningMigratingTasks, lightningMigratingDataSize, err := tendisdb.LightningDtsSvrMigratingTasks( + job.BkCloudID, job.ServerIP, constvar.LightningMigratingTasksType, job.logger) + if err != nil && gorm.IsRecordNotFoundError(err) == false { + return false, 0, err + } + // '我'正在迁移中的数据量大于 本地磁盘的 1/ratioNOfLocalDisk, 则不继续给自己分配迁移任务 + if lightningMigratingDataSize > myDisk01.TotalSize/ratioNOfLocalDisk { + msg = fmt.Sprintf( + "正在迁移中的tendisplus lightning task 数据量:%s > 本地磁盘的1/%d:%s,本地磁盘大小:%s,stop accept tendisplus lightning dts task", + humanize.Bytes(lightningMigratingDataSize), + ratioNOfLocalDisk, + humanize.Bytes(myDisk01.TotalSize/ratioNOfLocalDisk), + humanize.Bytes(myDisk01.TotalSize)) + job.logger.Info(msg) + return false, 0, nil + } + allowedMigrationDataSize = int64(myDisk01.TotalSize/ratioNOfLocalDisk - lightningMigratingDataSize) + if allowedMigrationDataSize < 10*constvar.GiByte { // less than 10GB + msg = fmt.Sprintf( + "本地磁盘可用于迁移的空间:%s,tendisplus lightning 迁移中的数据量:%s,剩余可迁移数据量:%s < 10GB,stop accept tendisplus lightning dts task", + humanize.Bytes(myDisk01.TotalSize/ratioNOfLocalDisk), + humanize.Bytes(lightningMigratingDataSize), + humanize.Bytes(uint64(allowedMigrationDataSize))) + job.logger.Info(msg) + return false, allowedMigrationDataSize, nil + } + // 如果'我'上面还有2个及以上task等待做 lightningCosFileDownload,则不继续认领 + todoBackupTasks := []*tendisdb.TbTendisplusLightningTask{} + for _, task01 := range lightningMigratingTasks { + task02 := task01 + if task02.TaskType == constvar.TendisplusLightningCosFileDownload && task02.Status == 0 { + todoBackupTasks = append(todoBackupTasks, task02) + } + } + if len(todoBackupTasks) >= 2 { + job.logger.Info(fmt.Sprintf( + "tendisplus lightning 正在等待 lightningCosFileDownload 的task数量:%d>=2,stop accept tendisplus lightning dts task", + len(todoBackupTasks))) + return false, allowedMigrationDataSize, nil + } + return true, allowedMigrationDataSize, nil +} + +func (job *TendisplusLightningJob) updateTasksCosFileSize(taskRows []*tendisdb.TbTendisplusLightningTask) ( + anyRowUpdate bool, err error) { + var cosRet *cos.BucketGetResult + var rowFatherTask tendispluslightning.LightningFatherTask + var msg string + anyRowUpdate = false + for _, row := range taskRows { + taskRow := row + job.logger.Info(fmt.Sprintf("start updateTasksCosFileSize ticket_id:%d dst_cluster:%s task_id:%s", + taskRow.TicketID, taskRow.DstCluster, taskRow.TaskId)) + // 如果没有设置过,则默认为 0 + if taskRow.CosFileSize != 0 { + job.logger.Info(fmt.Sprintf("ticket_id:%d dst_cluster:%s task_id:%s cos_file_size:%d skip.....", + taskRow.TicketID, taskRow.DstCluster, taskRow.TaskId, taskRow.CosFileSize)) + continue + } + if taskRow.CosKey == "" { + job.logger.Info(fmt.Sprintf("ticket_id:%d dst_cluster:%s task_id:%s cos_key:%s skip.....", + taskRow.TicketID, taskRow.DstCluster, taskRow.TaskId, taskRow.CosKey)) + continue + } + rowFatherTask = tendispluslightning.NewLightningFatherTask(taskRow) + rowFatherTask.Logger = job.logger + cosRet, err = job.cosWorker.GetFileList(taskRow.CosKey, 100) + if err != nil { + // 更新数据库 + msg += err.Error() + "\n" + rowFatherTask.SetMessage(err.Error()) + rowFatherTask.SetStatus(-1) + rowFatherTask.UpdateRow() + continue + } + if len(cosRet.Contents) == 0 { + // 更新数据库 + err = fmt.Errorf("cos key:%s file.Contents empty records", taskRow.CosKey) + msg += err.Error() + "\n" + rowFatherTask.SetMessage(err.Error()) + rowFatherTask.SetStatus(-1) + rowFatherTask.UpdateRow() + continue + } + job.logger.Info(fmt.Sprintf("ticket_id:%d dst_cluster:%s task_id:%s start update cosFileSize:%d ...", + taskRow.TicketID, taskRow.DstCluster, taskRow.TaskId, cosRet.Contents[0].Size)) + anyRowUpdate = true + rowFatherTask.SetMessage("update fileSize ok") + rowFatherTask.SetCosFileSize(cosRet.Contents[0].Size) + rowFatherTask.SetStatus(0) + rowFatherTask.UpdateRow() + } + if msg != "" { + err = fmt.Errorf(msg) + return + } + return +} + +// ClaimDtsJobs 认领tendisplus lightning dts任务 +func (job *TendisplusLightningJob) ClaimDtsJobs() (err error) { + var diskOk bool + var allowedMigrationDataSize int64 + var toScheduleTasks []*tendisdb.TbTendisplusLightningTask + var acceptOk bool + succClaimTaskCnt := 0 + defer func() { + if r := recover(); r != nil { + job.logger.Error(string(debug.Stack())) + } + }() + for { + time.Sleep(1 * time.Minute) + job.logger.Info(fmt.Sprintf("dts_server:%s start claim tendisplus lightning dts jobs", job.ServerIP)) + // 如果dts_server在黑名单中,则不认领task + if scrdbclient.IsMyselfInBlacklist(job.logger) { + job.logger.Info( + fmt.Sprintf("dts_server:%s in dts_server blacklist,stop accept tendisplus lightning dts task", + job.ServerIP)) + continue + } + diskOk, allowedMigrationDataSize, err = job.IsDataMigrationExceedingDiskLimit() + if err != nil { + continue + } + if !diskOk { + continue + } + // 下面模块执行逻辑: + // - LightningLast30DaysToScheduleJobs 获取最近一个月待调度的Jobs(相同城市) + // - 遍历Jobs + // - lightningJobToScheduleTasks 获取每个job中所有待调度的task + // - 如果task 同时满足条件,则本节点 可调度该task: + // 1. 数据量满足 <= availDiskSize, availDiskSize = 本机磁盘1/fractionalOfLocalDisk - 本机迁移中的(tasks)的dataSize + // 2. 其他dts_server没有在 尝试认领该task + toScheduleJobs, err := tendisdb.LightningLast30DaysToScheduleJobs(job.BkCloudID, allowedMigrationDataSize, + job.ZoneName, job.logger) + if err != nil { + continue + } + if len(toScheduleJobs) == 0 { + job.logger.Info(fmt.Sprintf( + "tendisplus lightningLast30DaysToScheduleJobs empty record,剩余可迁移的数据量:%s,ZoneName:%s", + humanize.Bytes(uint64(allowedMigrationDataSize)), job.ZoneName)) + continue + } + succClaimTaskCnt = 0 + anyRowUpdate := false + for _, tmpJob := range toScheduleJobs { + jobItem := tmpJob + toScheduleTasks, err = tendisdb.LightningJobToScheduleTasks( + jobItem.TicketID, jobItem.DstCluster, job.logger) + if err != nil { + // 执行下一个Job的遍历 + continue + } + if len(toScheduleTasks) == 0 { + + continue + } + // 如果'我'更新了任何task的cosFileSize,则不再继续这个job对应task等认领和执行 + anyRowUpdate, err = job.updateTasksCosFileSize(toScheduleTasks) + if err != nil { + continue + } + if anyRowUpdate { + continue + } + for _, tmpTask := range toScheduleTasks { + taskItem := tmpTask + if allowedMigrationDataSize < 10*constvar.GiByte { + // 如果可用空间小于10GB,则不再继续 + break + } + if taskItem.CosFileSize > allowedMigrationDataSize { + // 数据量过大,遍历job的下一个task + continue + } + // 尝试认领task + acceptOk, err = job.TryAcceptTask(taskItem) + if err != nil { + continue + } + if !acceptOk { + continue + } + allowedMigrationDataSize = allowedMigrationDataSize - taskItem.CosFileSize + succClaimTaskCnt++ + // 如果认领的task个数 超过 backup limit,则等待下一次调度 + if succClaimTaskCnt > job.GetTaskParallelLimit(constvar.TendisplusLightningCosFileDownload) { + break + } + } + if err != nil { + // 执行下一个job的遍历 + continue + } + // 如果认领的task个数 超过 cosfiledownload limit,则等待下一次调度 + if succClaimTaskCnt > job.GetTaskParallelLimit(constvar.TendisplusLightningCosFileDownload) { + break + } + } + } +} + +func (job *TendisplusLightningJob) getFirstTaskType() (taskType string) { + return constvar.TendisplusLightningCosFileDownload +} + +// GetTaskParallelLimit concurrency for task +func (job *TendisplusLightningJob) GetTaskParallelLimit(taskType string) int { + limit := viper.GetInt(taskType + "ParallelLimit") + if limit == 0 { + limit = 5 // 默认值5 + } + return limit +} + +// TryAcceptTask 上锁,尝试认领任务 +func (job *TendisplusLightningJob) TryAcceptTask(taskRow *tendisdb.TbTendisplusLightningTask) (succ bool, err error) { + var lockOK bool + scrCli, err := scrdbclient.NewClient(viper.GetString("serviceName"), job.logger) + if err != nil { + return false, err + } + // 获取锁,尝试认领该task + lockOK, err = scrCli.DtsLockKey(taskRow.TaskLockKey(), job.ServerIP, 120) + if err != nil { + return false, err + } + if !lockOK { + // 已经有其他dtsserver在尝试认领该task,遍历下一个task + job.logger.Info(fmt.Sprintf( + `taskId:%s ticketID:%d dstCluster:%s 已经有其他dts_server在调度,放弃调度`, + taskRow.TaskId, taskRow.TicketID, taskRow.DstCluster)) + return false, nil + } + job.logger.Info(fmt.Sprintf("myself:%s get task dts lock ok,key:%s", job.ServerIP, taskRow.TaskLockKey())) + // 尝试认领task成功 + job.logger.Info(fmt.Sprintf( + `myself:%s 认领task,下一步开始迁移,taskId:%s ticketID:%d dstCluster:%s`, + job.ServerIP, taskRow.TaskId, taskRow.TicketID, taskRow.DstCluster)) + taskRow.DtsServer = job.ServerIP + taskRow.TaskType = job.getFirstTaskType() + taskRow.Status = 0 + taskRow.UpdateFieldsValues([]string{"DtsServer", "TaskType", "Status"}, job.logger) + return true, nil +} + +// BgDtsTaskRunnerWithConcurrency 执行子task,限制并发度,如backup、tredisdump等task任务 +// 如拉起5个goroutine执行 backup tasks, 拉起 5个goroutine执行 tredisdump tasks +func (job *TendisplusLightningJob) BgDtsTaskRunnerWithConcurrency(taskType string) { + var err error + wg := sync.WaitGroup{} + genChan := make(chan *tendisdb.TbTendisplusLightningTask) + limit := job.GetTaskParallelLimit(taskType) + status := 0 + perTaskNum := 5 + + for worker := 0; worker < limit; worker++ { + wg.Add(1) + go func() { + defer wg.Done() + defer func() { + if r := recover(); r != nil { + job.logger.Error(string(debug.Stack())) + } + }() + for oldRow := range genChan { + // 可能在等待调度过程中row01数据已经改变,所以重新获取数据 + latestRow, err := tendisdb.LightningTaskByID(oldRow.TaskId, job.logger) + if err != nil { + latestRow = oldRow + } + if latestRow == nil { + job.logger.Warn(fmt.Sprintf("根据task_id:%s获取task row失败,taskRow:%v", oldRow.TaskId, latestRow)) + continue + } + if latestRow.Status != 0 || latestRow.TaskType != taskType { + job.logger.Info(fmt.Sprintf("task_id:%s status=%d taskType=%s. 期待的taskType:%s 已经在运行中,不做任何处理", + latestRow.TaskId, latestRow.Status, latestRow.TaskType, taskType)) + continue + } + task01 := factory.MyTendisplusLightningTaskFactory(latestRow) + task01.Init() // 执行Init,成功则status=1,失败则status=-1 + task01.Execute() + } + }() + } + go func() { + defer close(genChan) + var toExecuteRows []*tendisdb.TbTendisplusLightningTask + for { + if !tendisdb.IsAllLightningTasksToForceKill(toExecuteRows) { + // 如果所有dts tasks都是 ForceKillTaskTodo 状态,则大概率该dts job用户已强制终止, 无需sleep + // 否则 sleep 10s + time.Sleep(10 * time.Second) + } + toExecuteRows, err = tendisdb.LightningLast30DaysToExecuteTasks(job.BkCloudID, job.ServerIP, taskType, + status, perTaskNum, job.logger) + if err != nil { + continue + } + if len(toExecuteRows) == 0 { + job.logger.Info(fmt.Sprintf("serverIP:%s not found to be executed %s task,sleep 10s", job.ServerIP, taskType)) + continue + } + for _, row := range toExecuteRows { + toDoRow := row + // 将task放入channel,等待消费者goroutine真正处理 + genChan <- toDoRow + } + } + }() + wg.Wait() +} + +// StartBgWorkers 拉起多个后台goroutine +func (job *TendisplusLightningJob) StartBgWorkers() { + // tendisplus lightning job + // 在tasks被认领后,后台负责执行task的worker + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.BgDtsTaskRunnerWithConcurrency(constvar.TendisplusLightningCosFileDownload) + }() + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.BgDtsTaskRunnerWithConcurrency(constvar.TendisplusLightningFileSplit) + }() + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.BgDtsTaskRunnerWithConcurrency(constvar.TendisplusLightningGenerateSst) + }() + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.BgDtsTaskRunnerWithConcurrency(constvar.TendisplusLightningScpSst) + }() + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.BgDtsTaskRunnerWithConcurrency(constvar.TendisplusLightningSlaveLoadSst) + }() + // 根据dts_server自身情况尝试认领 task + go func() { + job.wg.Add(1) + defer job.wg.Done() + job.ClaimDtsJobs() + }() +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/factory/factory.go b/dbm-services/redis/redis-dts/pkg/dtsTask/factory/factory.go index a983953def..67ea443578 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/factory/factory.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/factory/factory.go @@ -6,6 +6,7 @@ import ( "dbm-services/redis/redis-dts/pkg/constvar" "dbm-services/redis/redis-dts/pkg/dtsTask/rediscache" "dbm-services/redis/redis-dts/pkg/dtsTask/tendisplus" + "dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning" "dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd" ) @@ -17,8 +18,8 @@ type MyTasker interface { Execute() } -// MyTaskFactory task工厂 -func MyTaskFactory(taskRow *tendisdb.TbTendisDTSTask) MyTasker { +// MyTendisDtsTaskFactory task工厂 +func MyTendisDtsTaskFactory(taskRow *tendisdb.TbTendisDTSTask) MyTasker { if taskRow.TaskType == (&tendisssd.TendisBackupTask{}).TaskType() { // tendis-ssd return tendisssd.NewTendisBackupTask(taskRow) @@ -44,3 +45,19 @@ func MyTaskFactory(taskRow *tendisdb.TbTendisDTSTask) MyTasker { } return nil } + +// MyTendisplusLightningTaskFactory task工厂 +func MyTendisplusLightningTaskFactory(taskRow *tendisdb.TbTendisplusLightningTask) MyTasker { + if taskRow.TaskType == (&tendispluslightning.CosFileDownloadTask{}).TaskType() { + return tendispluslightning.NewCosFileDownloadTask(taskRow) + } else if taskRow.TaskType == (&tendispluslightning.FileSplitTask{}).TaskType() { + return tendispluslightning.NewFileSplitTask(taskRow) + } else if taskRow.TaskType == (&tendispluslightning.GenerateSstTask{}).TaskType() { + return tendispluslightning.NewGenerateSstTask(taskRow) + } else if taskRow.TaskType == (&tendispluslightning.ScpSstTask{}).TaskType() { + return tendispluslightning.NewScpSstTask(taskRow) + } else if taskRow.TaskType == (&tendispluslightning.SlaveLoadSstTask{}).TaskType() { + return tendispluslightning.NewSlaveLoadSstTask(taskRow) + } + return nil +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/init.go b/dbm-services/redis/redis-dts/pkg/dtsTask/init.go index e689b810ab..cfcb01a3d8 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/init.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/init.go @@ -23,8 +23,8 @@ import ( "go.uber.org/zap" ) -// FatherTask 迁移父task -type FatherTask struct { +// TendisDtsFatherTask 迁移父task +type TendisDtsFatherTask struct { RowData *tendisdb.TbTendisDTSTask `json:"rowData"` valueChangedFields []string // 值已变化的字段名 TaskDir string `json:"taskDir"` @@ -32,27 +32,27 @@ type FatherTask struct { Err error `json:"-"` } -// NewFatherTask 新建tredisdump task -func NewFatherTask(row *tendisdb.TbTendisDTSTask) FatherTask { - ret := FatherTask{} +// NewDtsFatherTask 新建tredisdump task +func NewDtsFatherTask(row *tendisdb.TbTendisDTSTask) TendisDtsFatherTask { + ret := TendisDtsFatherTask{} ret.RowData = row return ret } // SetStatus 设置status的值 -func (t *FatherTask) SetStatus(status int) { +func (t *TendisDtsFatherTask) SetStatus(status int) { t.RowData.Status = status t.valueChangedFields = append(t.valueChangedFields, "Status") } // SetTaskType 设置task_type的值 -func (t *FatherTask) SetTaskType(taskType string) { +func (t *TendisDtsFatherTask) SetTaskType(taskType string) { t.RowData.TaskType = taskType t.valueChangedFields = append(t.valueChangedFields, "TaskType") } // SetMessage 设置message的值 -func (t *FatherTask) SetMessage(format string, args ...interface{}) { +func (t *TendisDtsFatherTask) SetMessage(format string, args ...interface{}) { if len(args) == 0 { t.RowData.Message = format } else { @@ -62,92 +62,92 @@ func (t *FatherTask) SetMessage(format string, args ...interface{}) { } // SetFetchFile set function -func (t *FatherTask) SetFetchFile(file string) { +func (t *TendisDtsFatherTask) SetFetchFile(file string) { t.RowData.FetchFile = file t.valueChangedFields = append(t.valueChangedFields, "FetchFile") } // SetSqlfileDir set function -func (t *FatherTask) SetSqlfileDir(dir string) { +func (t *TendisDtsFatherTask) SetSqlfileDir(dir string) { t.RowData.SqlfileDir = dir t.valueChangedFields = append(t.valueChangedFields, "SqlfileDir") } // SetSyncOperate set function -func (t *FatherTask) SetSyncOperate(op string) { +func (t *TendisDtsFatherTask) SetSyncOperate(op string) { t.RowData.SyncOperate = op t.valueChangedFields = append(t.valueChangedFields, "SyncOperate") } // SetTendisBinlogLag set function -func (t *FatherTask) SetTendisBinlogLag(lag int64) { +func (t *TendisDtsFatherTask) SetTendisBinlogLag(lag int64) { t.RowData.TendisBinlogLag = lag t.valueChangedFields = append(t.valueChangedFields, "TendisBinlogLag") } // SetSrcNewLogCount set function -func (t *FatherTask) SetSrcNewLogCount(logcnt int64) { +func (t *TendisDtsFatherTask) SetSrcNewLogCount(logcnt int64) { t.RowData.SrcNewLogCount = logcnt t.valueChangedFields = append(t.valueChangedFields, "SrcNewLogCount") } // SetSrcOldLogCount set function -func (t *FatherTask) SetSrcOldLogCount(logcnt int64) { +func (t *TendisDtsFatherTask) SetSrcOldLogCount(logcnt int64) { t.RowData.SrcOldLogCount = logcnt t.valueChangedFields = append(t.valueChangedFields, "SrcOldLogCount") } // SetIsSrcLogCountRestored set function -func (t *FatherTask) SetIsSrcLogCountRestored(isRestored int) { +func (t *TendisDtsFatherTask) SetIsSrcLogCountRestored(isRestored int) { t.RowData.IsSrcLogCountRestored = isRestored t.valueChangedFields = append(t.valueChangedFields, "IsSrcLogCountRestored") } // SetIgnoreErrlist set function -func (t *FatherTask) SetIgnoreErrlist(errlist string) { +func (t *TendisDtsFatherTask) SetIgnoreErrlist(errlist string) { t.RowData.IgnoreErrlist = errlist t.valueChangedFields = append(t.valueChangedFields, "IgnoreErrlist") } // SetSyncerPort set function -func (t *FatherTask) SetSyncerPort(syncport int) { +func (t *TendisDtsFatherTask) SetSyncerPort(syncport int) { t.RowData.SyncerPort = syncport t.valueChangedFields = append(t.valueChangedFields, "SyncerPort") } // SetSyncerPid set function -func (t *FatherTask) SetSyncerPid(syncpid int) { +func (t *TendisDtsFatherTask) SetSyncerPid(syncpid int) { t.RowData.SyncerPid = syncpid t.valueChangedFields = append(t.valueChangedFields, "SyncerPid") } // SetSrcHaveListKeys set function -func (t *FatherTask) SetSrcHaveListKeys(havelist int) { +func (t *TendisDtsFatherTask) SetSrcHaveListKeys(havelist int) { t.RowData.SrcHaveListKeys = havelist t.valueChangedFields = append(t.valueChangedFields, "SrcHaveListKeys") } // SetTendisbackupFile set function -func (t *FatherTask) SetTendisbackupFile(file string) { +func (t *TendisDtsFatherTask) SetTendisbackupFile(file string) { t.RowData.TendisbackupFile = file t.valueChangedFields = append(t.valueChangedFields, "TendisbackupFile") } // SetDtsServer set function -func (t *FatherTask) SetDtsServer(svrip string) { +func (t *TendisDtsFatherTask) SetDtsServer(svrip string) { t.RowData.DtsServer = svrip t.valueChangedFields = append(t.valueChangedFields, "DtsServer") } // UpdateDbAndLogLocal update db相关字段 并记录本地日志 -func (t *FatherTask) UpdateDbAndLogLocal(format string, args ...interface{}) { +func (t *TendisDtsFatherTask) UpdateDbAndLogLocal(format string, args ...interface{}) { t.SetMessage(format, args...) t.UpdateRow() t.Logger.Info(t.RowData.Message) } // UpdateRow update tendisdb相关字段(值变化了的字段) -func (t *FatherTask) UpdateRow() { +func (t *TendisDtsFatherTask) UpdateRow() { if len(t.valueChangedFields) == 0 { return } @@ -156,7 +156,7 @@ func (t *FatherTask) UpdateRow() { } // Init 初始化 -func (t *FatherTask) Init() { +func (t *TendisDtsFatherTask) Init() { defer func() { if t.Err != nil { t.SetStatus(-1) @@ -178,7 +178,7 @@ func (t *FatherTask) Init() { } // InitTaskDir 初始化本地任务目录 -func (t *FatherTask) InitTaskDir() error { +func (t *TendisDtsFatherTask) InitTaskDir() error { currExecPath, err := util.CurrentExecutePath() if err != nil { return err @@ -195,7 +195,7 @@ func (t *FatherTask) InitTaskDir() error { } // InitLogger 初始化日志文件logger -func (t *FatherTask) InitLogger() error { +func (t *TendisDtsFatherTask) InitLogger() error { err := t.InitTaskDir() if err != nil { return nil @@ -213,7 +213,7 @@ func (t *FatherTask) InitLogger() error { } // IsSupportPipeImport 是否支持 redis-cli --pipe < $file 导入 -func (t *FatherTask) IsSupportPipeImport() bool { +func (t *TendisDtsFatherTask) IsSupportPipeImport() bool { // if strings.HasPrefix(t.RowData.DstCluster, "tendisx") || constvar.IsGlobalEnv() == true { // return true // } @@ -221,7 +221,7 @@ func (t *FatherTask) IsSupportPipeImport() bool { } // TredisdumpOuputFormat tredisdump结果文件内容格式,resp格式 或 普通命令格式 -func (t *FatherTask) TredisdumpOuputFormat() string { +func (t *TendisDtsFatherTask) TredisdumpOuputFormat() string { if t.IsSupportPipeImport() { return constvar.TredisdumpRespFormat } @@ -229,7 +229,7 @@ func (t *FatherTask) TredisdumpOuputFormat() string { } // TredisdumpOuputFileSize tredisdump结果文件大小 -func (t *FatherTask) TredisdumpOuputFileSize() uint64 { +func (t *TendisDtsFatherTask) TredisdumpOuputFileSize() uint64 { var fileSize uint64 = 0 var sizeStr string if t.IsSupportPipeImport() { @@ -253,7 +253,7 @@ func (t *FatherTask) TredisdumpOuputFileSize() uint64 { } // ImportParallelLimit 导入并发度 -func (t *FatherTask) ImportParallelLimit() int { +func (t *TendisDtsFatherTask) ImportParallelLimit() int { limit := 0 if t.IsSupportPipeImport() { limit = viper.GetInt("respFileImportParallelLimit") @@ -274,7 +274,7 @@ func (t *FatherTask) ImportParallelLimit() int { } // ImportTimeout 导入并发度 -func (t *FatherTask) ImportTimeout() int { +func (t *TendisDtsFatherTask) ImportTimeout() int { timeout := 0 if t.IsSupportPipeImport() { timeout = viper.GetInt("respFileImportTimeout") @@ -294,7 +294,7 @@ func (t *FatherTask) ImportTimeout() int { return timeout } -func (t *FatherTask) newSrcRedisClient() *myredis.RedisWorker { +func (t *TendisDtsFatherTask) newSrcRedisClient() *myredis.RedisWorker { srcAddr := fmt.Sprintf("%s:%d", t.RowData.SrcIP, t.RowData.SrcPort) srcPasswd, err := base64.StdEncoding.DecodeString(t.RowData.SrcPassword) if err != nil { @@ -312,7 +312,7 @@ func (t *FatherTask) newSrcRedisClient() *myredis.RedisWorker { } // SaveSrcSSDKeepCount 保存source ssd的 slave-log-keep-count值 -func (t *FatherTask) SaveSrcSSDKeepCount() { +func (t *TendisDtsFatherTask) SaveSrcSSDKeepCount() { var logcnt int64 srcClient := t.newSrcRedisClient() if t.Err != nil { @@ -341,7 +341,7 @@ func (t *FatherTask) SaveSrcSSDKeepCount() { } // RestoreSrcSSDKeepCount 恢复source ssd的 slave-log-keep-count值 -func (t *FatherTask) RestoreSrcSSDKeepCount() { +func (t *TendisDtsFatherTask) RestoreSrcSSDKeepCount() { srcClient := t.newSrcRedisClient() if t.Err != nil { return @@ -359,7 +359,7 @@ func (t *FatherTask) RestoreSrcSSDKeepCount() { } // ChangeSrcSSDKeepCount 修改source ssd的 slave-log-keep-count值 -func (t *FatherTask) ChangeSrcSSDKeepCount(dstKeepCount int64) { +func (t *TendisDtsFatherTask) ChangeSrcSSDKeepCount(dstKeepCount int64) { srcClient := t.newSrcRedisClient() if t.Err != nil { return @@ -374,7 +374,7 @@ func (t *FatherTask) ChangeSrcSSDKeepCount(dstKeepCount int64) { } // GetSyncSeqFromFullBackup get sync pos from full backup -func (t *FatherTask) GetSyncSeqFromFullBackup() (ret *SyncSeqItem) { +func (t *TendisDtsFatherTask) GetSyncSeqFromFullBackup() (ret *SyncSeqItem) { var err error ret = &SyncSeqItem{} syncPosFile := filepath.Join(t.RowData.SqlfileDir, "sync-pos.txt") @@ -411,7 +411,7 @@ func (t *FatherTask) GetSyncSeqFromFullBackup() (ret *SyncSeqItem) { } // ConfirmSrcRedisBinlogOK confirm binlog seq is OK in src redis -func (t *FatherTask) ConfirmSrcRedisBinlogOK(seq uint64) { +func (t *TendisDtsFatherTask) ConfirmSrcRedisBinlogOK(seq uint64) { srcAddr := fmt.Sprintf("%s:%d", t.RowData.SrcIP, t.RowData.SrcPort) srcPasswd, err := base64.StdEncoding.DecodeString(t.RowData.SrcPassword) if err != nil { @@ -450,7 +450,7 @@ func (t *FatherTask) ConfirmSrcRedisBinlogOK(seq uint64) { } // ClearSrcHostBackup clear src redis remote backup -func (t *FatherTask) ClearSrcHostBackup() { +func (t *TendisDtsFatherTask) ClearSrcHostBackup() { if strings.Contains(t.RowData.TendisbackupFile, "REDIS_FULL_rocksdb_") == false { return } @@ -484,7 +484,7 @@ func (t *FatherTask) ClearSrcHostBackup() { } // ClearLocalFetchBackup clear src redis local backup -func (t *FatherTask) ClearLocalFetchBackup() { +func (t *TendisDtsFatherTask) ClearLocalFetchBackup() { srcAddr := fmt.Sprintf("%s_%d", t.RowData.SrcIP, t.RowData.SrcPort) if strings.Contains(t.RowData.FetchFile, srcAddr) == false { // fetchFile 必须包含 srcAddr,否则不确定传入的是什么参数,对未知目录 rm -rf 很危险 @@ -502,7 +502,7 @@ func (t *FatherTask) ClearLocalFetchBackup() { } // ClearLocalSQLDir clear local sql dir(backup to commands) -func (t *FatherTask) ClearLocalSQLDir() { +func (t *TendisDtsFatherTask) ClearLocalSQLDir() { srcAddr := fmt.Sprintf("%s_%d", t.RowData.SrcIP, t.RowData.SrcPort) if strings.Contains(t.RowData.SqlfileDir, srcAddr) == false { // fetchFile 必须包含 srcAddr,否则不确定传入的是什么参数,对未知目录 rm -rf 很危险 @@ -521,7 +521,7 @@ func (t *FatherTask) ClearLocalSQLDir() { // DealProcessPid 处理进程id; // 如用户发送 ForceKillTaskTodo '强制终止' 指令,则tredisdump、redis-cli等命令均执行kill操作 -func (t *FatherTask) DealProcessPid(pid int) error { +func (t *TendisDtsFatherTask) DealProcessPid(pid int) error { go func(pid01 int) { bakTaskType := t.RowData.TaskType bakStatus := t.RowData.Status @@ -574,7 +574,7 @@ func (t *FatherTask) DealProcessPid(pid int) error { } // TredisdumpThreadCnt get tredisdump threadcnt -func (t *FatherTask) TredisdumpThreadCnt() int { +func (t *TendisDtsFatherTask) TredisdumpThreadCnt() int { threadCnt := viper.GetInt("tredisdumpTheadCnt") if threadCnt <= 0 { threadCnt = 10 // default 10 @@ -585,7 +585,7 @@ func (t *FatherTask) TredisdumpThreadCnt() int { } // SaveIgnoreErrs 记录忽略的错误类型 -func (t *FatherTask) SaveIgnoreErrs(igErrs []string) { +func (t *TendisDtsFatherTask) SaveIgnoreErrs(igErrs []string) { isUpdated := false for _, igErr := range igErrs { if strings.Contains(t.RowData.IgnoreErrlist, igErr) == false { @@ -603,12 +603,12 @@ func (t *FatherTask) SaveIgnoreErrs(igErrs []string) { } // IsMatchAny is match all -func (t *FatherTask) IsMatchAny(reg01 string) bool { +func (t *TendisDtsFatherTask) IsMatchAny(reg01 string) bool { return reg01 == "*" || reg01 == ".*" || reg01 == "^.*$" } // RefreshRowData refresh task row data -func (task *FatherTask) RefreshRowData() { +func (task *TendisDtsFatherTask) RefreshRowData() { row01, err := tendisdb.GetTaskByID(task.RowData.ID, task.Logger) if err != nil { task.Err = err @@ -623,12 +623,12 @@ func (task *FatherTask) RefreshRowData() { } // GetSrcRedisAddr 源redis_addr -func (task *FatherTask) GetSrcRedisAddr() string { +func (task *TendisDtsFatherTask) GetSrcRedisAddr() string { return task.RowData.SrcIP + ":" + strconv.Itoa(task.RowData.SrcPort) } // GetSrcRedisPasswd 源redis_password -func (task *FatherTask) GetSrcRedisPasswd() string { +func (task *TendisDtsFatherTask) GetSrcRedisPasswd() string { srcPasswd, err := base64.StdEncoding.DecodeString(task.RowData.SrcPassword) if err != nil { task.Err = fmt.Errorf("decode srcPassword fail,err:%v,taskid:%d", err, task.RowData.ID) @@ -639,12 +639,12 @@ func (task *FatherTask) GetSrcRedisPasswd() string { } // GetDstRedisAddr 目的redis_addr -func (task *FatherTask) GetDstRedisAddr() string { +func (task *TendisDtsFatherTask) GetDstRedisAddr() string { return task.RowData.DstCluster } // GetDstRedisPasswd 目的redis_password -func (task *FatherTask) GetDstRedisPasswd() string { +func (task *TendisDtsFatherTask) GetDstRedisPasswd() string { dstPasswd, err := base64.StdEncoding.DecodeString(task.RowData.DstPassword) if err != nil { task.Err = fmt.Errorf("decode DstPassword fail,err:%v,taskid:%d", err, task.RowData.ID) @@ -655,7 +655,7 @@ func (task *FatherTask) GetDstRedisPasswd() string { } // DisableDstClusterSlowlog dst cluster 'config set slowlog-log-slower-than -1' -func (task *FatherTask) DisableDstClusterSlowlog() { +func (task *TendisDtsFatherTask) DisableDstClusterSlowlog() { dstProxyAddrs, err := util.LookupDbDNSIPs(task.RowData.DstCluster) if err != nil { task.Logger.Error(err.Error()) @@ -682,7 +682,7 @@ func (task *FatherTask) DisableDstClusterSlowlog() { } // EnableDstClusterSlowlog dst cluster 'config set slowlog-log-slower-than 100000' -func (task *FatherTask) EnableDstClusterSlowlog() { +func (task *TendisDtsFatherTask) EnableDstClusterSlowlog() { dstProxyAddrs, err := util.LookupDbDNSIPs(task.RowData.DstCluster) if err != nil { task.Logger.Error(err.Error()) diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/rediscache/makeCacheSync.go b/dbm-services/redis/redis-dts/pkg/dtsTask/rediscache/makeCacheSync.go index 3f0acb6801..fa6fc584ea 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/rediscache/makeCacheSync.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/rediscache/makeCacheSync.go @@ -35,7 +35,7 @@ const ( // MakeCacheSyncTask cache_task type MakeCacheSyncTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask RedisShakeBin string `json:"redisSahkeBin"` ShakeLogFile string `json:"shakeLogFile"` ShakeConfFile string `json:"shakeConfFile"` @@ -61,7 +61,7 @@ func (task *MakeCacheSyncTask) NextTask() string { // NewMakeCacheSyncTask 新建一个 RedisShake启动task func NewMakeCacheSyncTask(row *tendisdb.TbTendisDTSTask) *MakeCacheSyncTask { return &MakeCacheSyncTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisplus/makeSync.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisplus/makeSync.go index 064b0e27e2..89d50da6d6 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisplus/makeSync.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisplus/makeSync.go @@ -22,7 +22,7 @@ import ( // MakeSyncTask 启动redis-sync type MakeSyncTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask RedisCliTool string `json:"redisCliTool"` RedisSyncTool string `json:"redisSyncTool"` SyncLogFile string `json:"syncLogFile"` @@ -43,7 +43,7 @@ func (task *MakeSyncTask) NextTask() string { // NewMakeSyncTask 新建一个 redis-sync启动task func NewMakeSyncTask(row *tendisdb.TbTendisDTSTask) *MakeSyncTask { return &MakeSyncTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/fatherTask.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/fatherTask.go new file mode 100644 index 0000000000..3b5e72048a --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/fatherTask.go @@ -0,0 +1,203 @@ +package tendispluslightning + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "path/filepath" + "strings" + + "go.uber.org/zap" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/tclog" + "dbm-services/redis/redis-dts/util" +) + +// LightningFatherTask lightning father task +type LightningFatherTask struct { + RowData *tendisdb.TbTendisplusLightningTask `json:"rowData"` + valueChangedFields []string // 值已变化的字段名 + TaskDir string `json:"taskDir"` + Logger *zap.Logger `json:"-"` + Err error `json:"-"` +} + +// NewLightningFatherTask new lightning father task +func NewLightningFatherTask(rowData *tendisdb.TbTendisplusLightningTask) LightningFatherTask { + return LightningFatherTask{ + RowData: rowData, + valueChangedFields: []string{}, + } +} + +// SetStatus 设置status的值 +func (t *LightningFatherTask) SetStatus(status int) { + t.RowData.Status = status + t.valueChangedFields = append(t.valueChangedFields, "Status") +} + +// SetCosFileSize 设置cosFileSize的值 +func (task *LightningFatherTask) SetCosFileSize(cosFileSize int64) { + task.RowData.CosFileSize = cosFileSize + task.valueChangedFields = append(task.valueChangedFields, "CosFileSize") +} + +// SetMessage 设置message的值 +func (t *LightningFatherTask) SetMessage(format string, args ...interface{}) { + if len(args) == 0 { + t.RowData.Message = format + } else { + t.RowData.Message = fmt.Sprintf(format, args...) + } + t.valueChangedFields = append(t.valueChangedFields, "Message") +} + +// SetOperateType set operateType +func (t *LightningFatherTask) SetOperateType(op string) { + t.RowData.OperateType = op + t.valueChangedFields = append(t.valueChangedFields, "OperateType") +} + +// SetTaskType 设置task_type的值 +func (t *LightningFatherTask) SetTaskType(taskType string) { + t.RowData.TaskType = taskType + t.valueChangedFields = append(t.valueChangedFields, "TaskType") +} + +// UpdateRow update tendisdb相关字段(值变化了的字段) +func (t *LightningFatherTask) UpdateRow() { + if len(t.valueChangedFields) == 0 { + return + } + t.RowData.UpdateFieldsValues(t.valueChangedFields, t.Logger) + t.valueChangedFields = []string{} +} + +// Init 初始化 +func (t *LightningFatherTask) Init() { + defer func() { + if t.Err != nil { + t.SetStatus(-1) + t.SetMessage(t.Err.Error()) + } else { + t.SetStatus(1) // 更新为running状态 + } + t.UpdateRow() + }() + t.Err = t.InitLogger() + if t.Err != nil { + return + } + if t.RowData.OperateType == constvar.RedisForceKillTaskTodo { + t.RowData.OperateType = constvar.RedisForceKillTaskSuccess + t.Err = fmt.Errorf(constvar.RedisForceKillTaskSuccess + "...") + return + } +} + +// InitTaskDir 初始化本地任务目录 +func (t *LightningFatherTask) InitTaskDir() error { + currExecPath, err := util.CurrentExecutePath() + if err != nil { + return err + } + domainPort := strings.Split(t.RowData.DstCluster, ":") + subDir := fmt.Sprintf("tasks/%d_%s_%s/%s", t.RowData.TicketID, + domainPort[0], domainPort[1], t.RowData.TaskId) + t.TaskDir = filepath.Join(currExecPath, subDir) + err = util.MkDirIfNotExists(t.TaskDir) + if err != nil { + return err + } + return nil +} + +// InitLogger 初始化日志文件logger +func (t *LightningFatherTask) InitLogger() error { + err := t.InitTaskDir() + if err != nil { + return nil + } + logFile := fmt.Sprintf("task_%s.log", t.RowData.TaskId) + fullPath := filepath.Join(t.TaskDir, logFile) + t.Logger = tclog.NewFileLogger(fullPath) + return nil +} + +// GetLocalCosFile 获取本地cos文件保存路径 +func (t *LightningFatherTask) GetLocalCosFile() string { + return t.RowData.TaskId + ".cos_binary" +} + +// GetSplitOutputDir 获取split输出目录 +func (t *LightningFatherTask) GetSplitOutputDir() string { + return "split_outout_dir" +} + +// GetSlaveNodeSstDir 获取slave节点sst文件保存目录 +func (t *LightningFatherTask) GetSlaveNodeSstDir(slaveIP, slavePort string) string { + // return filepath.Join("slave_nodes_sst_dir", slaveIP+"_"+slavePort) + return "slave_nodes_sst_dir_" + slaveIP + "_" + slavePort + "_" + t.RowData.TaskId +} + +type clusterNodeItem struct { + MasterAddr string `json:"master_addr"` + SlaveAddr string `json:"slave_addr"` + Slots string `json:"slots"` + RedisPasswordEncode string `json:"redis_password_encode"` + RedisPassword string `json:"redis_password"` +} + +// GetSlaveIpPort 获取slave的ip和port +func (c *clusterNodeItem) GetSlaveIpPort() (ip, port string, err error) { + if c.SlaveAddr == "" { + err = fmt.Errorf("slave_addr is empty,data:%s", util.ToString(c)) + return + } + tempList := strings.Split(c.SlaveAddr, ":") + if len(tempList) != 2 { + err = fmt.Errorf("slave_addr:%s format error,data:%s", c.SlaveAddr, util.ToString(c)) + return + } + ip = tempList[0] + port = tempList[1] + return +} + +// GetDstClusterNodes 获取目标集群 cluster nodes信息 +func (task *LightningFatherTask) GetDstClusterNodes() (clusterNodes []*clusterNodeItem) { + var lightningJobsRows []*tendisdb.TbTendisplusLightningJob + var passwordDecode []byte + lightningJobsRows, task.Err = tendisdb.GetLightningJob(task.RowData.TicketID, task.RowData.DstCluster, task.Logger) + if task.Err != nil { + return + } + if len(lightningJobsRows) == 0 { + task.Err = fmt.Errorf("获取ticket_id:%d dst_cluster:%s cluster nodes信息为空", + task.RowData.TicketID, + task.RowData.DstCluster) + task.Logger.Error(task.Err.Error()) + return + } + task.Err = json.Unmarshal([]byte(lightningJobsRows[0].ClusterNodes), &clusterNodes) + if task.Err != nil { + task.Err = fmt.Errorf("unmarshal clusterNodes:%s fail,err:%v", lightningJobsRows[0].ClusterNodes, task.Err) + task.Logger.Error(task.Err.Error()) + return + } + for _, tmp := range clusterNodes { + clusterNode := tmp + passwordDecode, task.Err = base64.StdEncoding.DecodeString(clusterNode.RedisPasswordEncode) + if task.Err != nil { + task.Err = fmt.Errorf("base64 decode redis password:%s fail,err:%v", clusterNode.RedisPasswordEncode, task.Err) + task.Logger.Error(task.Err.Error()) + return + } + clusterNode.RedisPassword = string(passwordDecode) + task.Logger.Info(fmt.Sprintf("slave_addr:%s encodePassword:%s password:%s", + clusterNode.SlaveAddr, clusterNode.RedisPasswordEncode, clusterNode.RedisPassword)) + } + return +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step1CosFileDownload.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step1CosFileDownload.go new file mode 100644 index 0000000000..02a13210cd --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step1CosFileDownload.go @@ -0,0 +1,94 @@ +// Package tendispluslightning TODO +package tendispluslightning + +import ( + "fmt" + "path/filepath" + "time" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/txycos" + "dbm-services/redis/redis-dts/util" +) + +// CosFileDownloadTask TODO +type CosFileDownloadTask struct { + LightningFatherTask + cosWorker *txycos.TxyCosWoker +} + +// NewCosFileDownloadTask cos 文件下载task +func NewCosFileDownloadTask(row *tendisdb.TbTendisplusLightningTask) *CosFileDownloadTask { + return &CosFileDownloadTask{ + LightningFatherTask: NewLightningFatherTask(row), + } +} + +// TaskType task类型 +func (task *CosFileDownloadTask) TaskType() string { + return constvar.TendisplusLightningCosFileDownload +} + +// NextTask 下一个task类型 +func (task *CosFileDownloadTask) NextTask() string { + return constvar.TendisplusLightningFileSplit +} + +func (task *CosFileDownloadTask) initTxyCos() { + if task.cosWorker == nil { + task.cosWorker, task.Err = txycos.NewTxyCosWoker(task.Logger) + } +} + +// Execute TODO +func (task *CosFileDownloadTask) Execute() { + if task.Err != nil { + return + } + defer func() { + if task.Err != nil { + task.SetStatus(-1) + task.SetMessage(task.Err.Error()) + task.UpdateRow() + } else { + task.SetTaskType(task.NextTask()) + task.SetStatus(0) + task.SetMessage("等待执行cos文件split") + task.UpdateRow() + } + }() + + task.SetStatus(1) + task.SetMessage("开始下载cos中文件") + task.UpdateRow() + + // 初始化 txy cos + task.initTxyCos() + if task.Err != nil { + return + } + + localCosFile := task.GetLocalCosFile() + localFullPath := filepath.Join(task.TaskDir, localCosFile) + // 如果本地文件存在先删除 + if util.FileExists(localFullPath) { + rmCmd := fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, localCosFile) + task.Logger.Info(rmCmd) + util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, 120*time.Second, task.Logger) + } + + // 下载cos文件 + task.Logger.Info(fmt.Sprintf("start download cos file,cosKey:%s,localFile:%s", + task.RowData.CosKey, + localFullPath)) + task.Err = task.cosWorker.DownloadAFile(task.RowData.CosKey, localFullPath) + if task.Err != nil { + return + } + // cos文件下载成功 + task.Logger.Info(fmt.Sprintf("download cos file success,cosKey:%s,localFile:%s", + task.RowData.CosKey, + localFullPath)) + +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step2FileSplit.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step2FileSplit.go new file mode 100644 index 0000000000..deed93fd01 --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step2FileSplit.go @@ -0,0 +1,98 @@ +// Package tendispluslightning TODO +package tendispluslightning + +import ( + "fmt" + "path/filepath" + "time" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/util" +) + +// FileSplitTask TODO +type FileSplitTask struct { + LightningFatherTask +} + +// NewFileSplitTask 新建一个task +func NewFileSplitTask(row *tendisdb.TbTendisplusLightningTask) *FileSplitTask { + return &FileSplitTask{ + LightningFatherTask: NewLightningFatherTask(row), + } +} + +// TaskType task类型 +func (task *FileSplitTask) TaskType() string { + return constvar.TendisplusLightningFileSplit +} + +// NextTask 下一个task类型 +func (task *FileSplitTask) NextTask() string { + return constvar.TendisplusLightningGenerateSst +} + +// Execute TODO +func (task *FileSplitTask) Execute() { + if task.Err != nil { + return + } + defer func() { + if task.Err != nil { + task.SetStatus(-1) + task.SetMessage(task.Err.Error()) + task.UpdateRow() + } else { + task.SetTaskType(task.NextTask()) + task.SetStatus(0) + task.SetMessage("等待执行sst文件生成") + task.UpdateRow() + } + }() + + task.SetStatus(1) + task.SetMessage("开始执行cos文件split") + task.UpdateRow() + + // 确保 tendisplus_lightning_kv_split 工具存在 + kvSplitTool, err := util.IsToolExecutableInCurrDir(constvar.ToolLightningKVFileSplit) + if err != nil { + task.Err = err + return + } + + // 如果本地split输出目录存在,则删除 + splitOutDir := task.GetSplitOutputDir() + fullPath := filepath.Join(task.TaskDir, splitOutDir) + if util.FileExists(fullPath) { + rmCmd := fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, splitOutDir) + task.Logger.Info(rmCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + } + // 创建split输出目录 + task.Err = util.MkDirIfNotExists(fullPath) + if task.Err != nil { + return + } + splitCmd := fmt.Sprintf("cd %s && %s %s %s", task.TaskDir, kvSplitTool, task.GetLocalCosFile(), splitOutDir) + task.Logger.Info(splitCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", splitCmd}, "", nil, 10*time.Hour, task.Logger) + if task.Err != nil { + return + } + // split 成功 + task.Logger.Info("file split success") + + // split成功后,删除本地cos文件 + localCosFile := task.GetLocalCosFile() + localFullPath := filepath.Join(task.TaskDir, localCosFile) + if util.FileExists(localFullPath) { + rmCmd := fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, localCosFile) + task.Logger.Info(rmCmd) + util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, 120*time.Second, task.Logger) + } +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step3GenerateSST.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step3GenerateSST.go new file mode 100644 index 0000000000..e1f2ed3fa7 --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step3GenerateSST.go @@ -0,0 +1,140 @@ +// Package tendispluslightning TODO +package tendispluslightning + +import ( + "fmt" + "path/filepath" + "strconv" + "time" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/util" +) + +// GenerateSstTask TODO +type GenerateSstTask struct { + LightningFatherTask +} + +// NewGenerateSstTask 新建一个task +func NewGenerateSstTask(row *tendisdb.TbTendisplusLightningTask) *GenerateSstTask { + return &GenerateSstTask{ + LightningFatherTask: NewLightningFatherTask(row), + } +} + +// TaskType task类型 +func (task *GenerateSstTask) TaskType() string { + return constvar.TendisplusLightningGenerateSst +} + +// NextTask 下一个task类型 +func (task *GenerateSstTask) NextTask() string { + return constvar.TendisplusLightningScpSst +} + +// Execute TODO +func (task *GenerateSstTask) Execute() { + if task.Err != nil { + return + } + defer func() { + if task.Err != nil { + task.SetStatus(-1) + task.SetMessage(task.Err.Error()) + task.UpdateRow() + } else { + task.SetTaskType(task.NextTask()) + task.SetStatus(0) + task.SetMessage("等待执行scp sst") + task.UpdateRow() + } + }() + + // 确保 tendisplus_lightning_sst_generator 工具存在 + sstGenTool, err := util.IsToolExecutableInCurrDir(constvar.ToolLightningSstGenerator) + if err != nil { + task.Err = err + return + } + + // 先清理之前的sst目录 + var slaveSstSaveDir string + var fullPath string + var rmCmd string + + // 获取dst集群的nodes信息 + clusterNodes := task.GetDstClusterNodes() + if task.Err != nil { + return + } + for _, tmp := range clusterNodes { + clusterNode := tmp + ip, port, err := clusterNode.GetSlaveIpPort() + if err != nil { + task.Err = err + task.Logger.Error(task.Err.Error()) + return + } + slaveSstSaveDir = task.GetSlaveNodeSstDir(ip, port) + fullPath = filepath.Join(task.TaskDir, slaveSstSaveDir) + if util.FileExists(fullPath) { + rmCmd = fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, slaveSstSaveDir) + task.Logger.Info(rmCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + } + } + // 获取到 split输出目录 + splitOutputDir := task.GetSplitOutputDir() + // 在创建sst目录,并执行 sst_generator + for _, tmp := range clusterNodes { + clusterNode := tmp + ip, port, err := clusterNode.GetSlaveIpPort() + if err != nil { + task.Err = err + task.Logger.Error(task.Err.Error()) + return + } + slaveSstSaveDir = task.GetSlaveNodeSstDir(ip, port) + var fullPath string + // 创建目录,$taskDir/$slaveSstDir/0、/1、/2、....、/9,对应的是tendisplus的10个kvstore + for i := 0; i < 10; i++ { + fullPath = filepath.Join(task.TaskDir, slaveSstSaveDir, strconv.Itoa(i)) + if !util.FileExists(fullPath) { + mkCmd := fmt.Sprintf("mkdir -p %s", fullPath) + task.Logger.Info(mkCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", mkCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + } + } + // 执行 sst_generator + sstGenCmd := fmt.Sprintf("cd %s && %s -i %s -o %s -s %q -t 5", + task.TaskDir, + sstGenTool, splitOutputDir, + slaveSstSaveDir, clusterNode.Slots) + task.Logger.Info(sstGenCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", sstGenCmd}, "", nil, 10*time.Hour, task.Logger) + if task.Err != nil { + return + } + } + task.Logger.Info("generate sst success") + + // sst文件生成成功后,删除split输出目录 + fullPath = filepath.Join(task.TaskDir, splitOutputDir) + if util.FileExists(fullPath) { + rmCmd := fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, splitOutputDir) + task.Logger.Info(rmCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + } + return +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step4ScpSST.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step4ScpSST.go new file mode 100644 index 0000000000..cbf67a2ce1 --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step4ScpSST.go @@ -0,0 +1,199 @@ +// Package tendispluslightning TODO +package tendispluslightning + +import ( + "fmt" + "path/filepath" + "sync" + "time" + + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/scrdbclient" + "dbm-services/redis/redis-dts/util" +) + +// ScpSstTask TODO +type ScpSstTask struct { + LightningFatherTask +} + +// NewScpSstTask 新建一个task +func NewScpSstTask(row *tendisdb.TbTendisplusLightningTask) *ScpSstTask { + return &ScpSstTask{ + LightningFatherTask: NewLightningFatherTask(row), + } +} + +// TaskType task类型 +func (task *ScpSstTask) TaskType() string { + return constvar.TendisplusLightningScpSst +} + +// NextTask 下一个task类型 +func (task *ScpSstTask) NextTask() string { + return constvar.TendisplusLightningSlaveLoadSst +} + +// Execute TODO +func (task *ScpSstTask) Execute() { + if task.Err != nil { + return + } + defer func() { + if task.Err != nil { + task.SetStatus(-1) + task.SetMessage(task.Err.Error()) + task.UpdateRow() + } else { + task.SetTaskType(task.NextTask()) + task.SetStatus(0) + task.SetMessage("scp sst完成,等待slave load sst") + task.UpdateRow() + } + }() + + zstdTool, err := util.IsToolExecutableInCurrDir(constvar.ToolZstd) + if err != nil { + task.Logger.Error(err.Error()) + task.Err = err + return + } + localIp, err := util.GetLocalIP() + if err != nil { + task.Logger.Error(err.Error()) + task.Err = err + return + } + + // 获取dst集群的nodes信息 + clusterNodes := task.GetDstClusterNodes() + if task.Err != nil { + return + } + var slaveSstSaveDir string + var fullPath string + var tarFile string + var zstdFile string + var tarCmd string // 打包命令 + var zstdCmd string // 压缩命令 + var rmCmd string // 删除命令 + transferMap := map[string][]string{} // key是dst ip,value是 zstd文件列表 + for _, tmp := range clusterNodes { + clusterNode := tmp + slaveIP, slavePort, _ := clusterNode.GetSlaveIpPort() + slaveSstSaveDir = task.GetSlaveNodeSstDir(slaveIP, slavePort) + tarFile = slaveSstSaveDir + ".tar" + zstdFile = tarFile + ".zst" + fullPath = filepath.Join(task.TaskDir, slaveSstSaveDir) + + // 如果 tar不存在,zst文件存在,则跳过 打包压缩环节 + isSkipCompress := util.FileExists(filepath.Join(task.TaskDir, zstdFile)) && + !util.FileExists(filepath.Join(task.TaskDir, tarFile)) + if !isSkipCompress { + if !util.FileExists(fullPath) { + task.Err = fmt.Errorf("slave_sst_dir:%s not exists", fullPath) + task.Logger.Error(task.Err.Error()) + return + } + if util.FileExists(tarFile) { + // 删除老的tar包 + rmCmd = fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, tarFile) + task.Logger.Info(rmCmd) + util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, time.Hour, task.Logger) + } + // 打包 + tarCmd = fmt.Sprintf("cd %s && tar -cf %s %s && rm -rf %s", task.TaskDir, tarFile, slaveSstSaveDir, slaveSstSaveDir) + task.Logger.Info(tarCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", tarCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + // 压缩 + zstdCmd = fmt.Sprintf("cd %s && %s %s && rm -rf %s", task.TaskDir, zstdTool, tarFile, tarFile) + task.Logger.Info(zstdCmd) + _, task.Err = util.RunLocalCmd("bash", []string{"-c", zstdCmd}, "", nil, time.Hour, task.Logger) + if task.Err != nil { + return + } + } + // 构造参数 + if _, ok := transferMap[slaveIP]; !ok { + transferMap[slaveIP] = []string{} + } + transferMap[slaveIP] = append(transferMap[slaveIP], filepath.Join(task.TaskDir, zstdFile)) + + } + // 多个slave ip 并发传输文件 + type transferWorker struct { + SrcIP string + SrcFiles []string + DstIP string + DstDir string + Err error + } + wokers := []*transferWorker{} + for dstIP, files := range transferMap { + wokers = append(wokers, &transferWorker{ + SrcIP: localIp, + SrcFiles: files, + DstIP: dstIP, + DstDir: constvar.DbbakDir, + }) + } + var wg sync.WaitGroup + for _, woker01 := range wokers { + woker := woker01 + wg.Add(1) + go func(woker *transferWorker) { + defer wg.Done() + var cli *scrdbclient.Client + cli, woker.Err = scrdbclient.NewClient(constvar.BkDbm, task.Logger) + if woker.Err != nil { + return + } + param := scrdbclient.TransferFileReq{ + SourceList: []scrdbclient.TransferFileSourceItem{ + { + BkCloudID: int(task.RowData.BkCloudID), + IP: localIp, + Account: constvar.MysqlOSAccount, + FileList: woker.SrcFiles, + }, + }, + TargetAccount: constvar.MysqlOSAccount, + TargetDir: woker.DstDir, + TargetIPList: []scrdbclient.IPItem{ + {BkCloudID: int(task.RowData.BkCloudID), IP: woker.DstIP}, + }, + Timeout: 86300, + } + woker.Err = cli.SendNew(param, 5) + if woker.Err != nil { + return + } + }(woker) + } + wg.Wait() + for _, woker01 := range wokers { + woker := woker01 + if woker.Err != nil { + task.Err = woker.Err + return + } + } + // 文件传输文成后,删除本地压缩文件 + for _, tmp := range clusterNodes { + clusterNode := tmp + slaveIP, slavePort, _ := clusterNode.GetSlaveIpPort() + slaveSstSaveDir = task.GetSlaveNodeSstDir(slaveIP, slavePort) + tarFile = slaveSstSaveDir + ".tar" + zstdFile = tarFile + ".zst" + fullPath = filepath.Join(task.TaskDir, zstdFile) + if util.FileExists(fullPath) { + rmCmd = fmt.Sprintf("cd %s && rm -rf %s", task.TaskDir, zstdFile) + task.Logger.Info(rmCmd) + util.RunLocalCmd("bash", []string{"-c", rmCmd}, "", nil, time.Hour, task.Logger) + } + } +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step5SlaveLoadSST.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step5SlaveLoadSST.go new file mode 100644 index 0000000000..b87778b05e --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendispluslightning/step5SlaveLoadSST.go @@ -0,0 +1,189 @@ +// Package tendispluslightning TODO +package tendispluslightning + +import ( + "fmt" + "path/filepath" + "sync" + "time" + + "dbm-services/redis/redis-dts/models/myredis" + "dbm-services/redis/redis-dts/models/mysql/tendisdb" + "dbm-services/redis/redis-dts/pkg/constvar" + "dbm-services/redis/redis-dts/pkg/scrdbclient" +) + +// SlaveLoadSstTask TODO +type SlaveLoadSstTask struct { + LightningFatherTask +} + +// NewSlaveLoadSstTask TODO +// NewScpSstTask 新建一个task +func NewSlaveLoadSstTask(row *tendisdb.TbTendisplusLightningTask) *SlaveLoadSstTask { + return &SlaveLoadSstTask{ + LightningFatherTask: NewLightningFatherTask(row), + } +} + +// TaskType task类型 +func (task *SlaveLoadSstTask) TaskType() string { + return constvar.TendisplusLightningSlaveLoadSst +} + +// NextTask 下一个task类型,没有下一个task type了 +func (task *SlaveLoadSstTask) NextTask() string { + return constvar.TendisplusLightningSlaveLoadSst +} + +// Execute TODO +func (task *SlaveLoadSstTask) Execute() { + if task.Err != nil { + return + } + defer func() { + if task.Err != nil { + task.SetStatus(-1) + task.SetMessage(task.Err.Error()) + task.UpdateRow() + } else { + task.SetTaskType(task.NextTask()) + task.SetStatus(2) + task.SetMessage("slave load sst文件完成") + task.UpdateRow() + } + }() + clusterNodes := task.GetDstClusterNodes() + if task.Err != nil { + return + } + + var slaveSstSaveDir string + var tarFile string + var zstdFile string + var unCompressCmd string + + type remoteWorker struct { + SlaveIP string + Cmd string + Err error + } + unCompressWorkers := []*remoteWorker{} + rmWorkers := []*remoteWorker{} + for _, tmp := range clusterNodes { + clusterNode := tmp + slaveIP, slavePort, _ := clusterNode.GetSlaveIpPort() + slaveSstSaveDir = task.GetSlaveNodeSstDir(slaveIP, slavePort) + tarFile = slaveSstSaveDir + ".tar" + zstdFile = tarFile + ".zst" + unCompressCmd = fmt.Sprintf("cd %s && rm -rf %s && /home/mysql/dbtools/zstd -d %s && tar -xf %s && rm -rf %s", + constvar.DbbakDir, slaveSstSaveDir, zstdFile, tarFile, tarFile) + unCompressWorkers = append(unCompressWorkers, &remoteWorker{ + SlaveIP: slaveIP, + Cmd: unCompressCmd, + }) + rmWorkers = append(rmWorkers, &remoteWorker{ + SlaveIP: slaveIP, + Cmd: fmt.Sprintf("cd %s && rm -rf %s %s", constvar.DbbakDir, zstdFile, slaveSstSaveDir), + }) + } + // 多个slave ip并发执行命令 + task.Logger.Info("slave start uncompress sst file") + var wg sync.WaitGroup + for _, tmp := range unCompressWorkers { + worker := tmp + wg.Add(1) + go func(worker *remoteWorker) { + defer wg.Done() + var cli *scrdbclient.Client + cli, worker.Err = scrdbclient.NewClient(constvar.BkDbm, task.Logger) + if worker.Err != nil { + return + } + _, worker.Err = cli.ExecNew(scrdbclient.FastExecScriptReq{ + Account: constvar.MysqlOSAccount, + Timeout: 3600, + ScriptLanguage: 1, + ScriptContent: worker.Cmd, + IPList: []scrdbclient.IPItem{ + { + BkCloudID: int(task.RowData.BkCloudID), + IP: worker.SlaveIP, + }, + }, + }, 5) + if worker.Err != nil { + return + } + }(worker) + } + wg.Wait() + + for _, worker := range unCompressWorkers { + if worker.Err != nil { + task.Err = worker.Err + return + } + } + // slave执行 loadexternalfiles 命令 + task.Logger.Info("slave start load sst file") + var slaveSaveDir string + for _, tmp := range clusterNodes { + clusterNode := tmp + slaveIP, slavePort, _ := clusterNode.GetSlaveIpPort() + slaveSstSaveDir = task.GetSlaveNodeSstDir(slaveIP, slavePort) + slaveSaveDir = filepath.Join(constvar.DbbakDir, slaveSstSaveDir) + task.TendisplusSlaveLoadSST(clusterNode, slaveSaveDir) + if task.Err != nil { + return + } + } + + // slave执行 loadexternalfiles命令成功后,删除slave本地的zst文件 + task.Logger.Info("slave start rm local zst file") + var wg01 sync.WaitGroup + for _, tmp := range rmWorkers { + worker := tmp + wg01.Add(1) + go func(worker *remoteWorker) { + defer wg01.Done() + var cli *scrdbclient.Client + cli, worker.Err = scrdbclient.NewClient(constvar.BkDbm, task.Logger) + if worker.Err != nil { + return + } + _, worker.Err = cli.ExecNew(scrdbclient.FastExecScriptReq{ + Account: constvar.MysqlOSAccount, + Timeout: 3600, + ScriptLanguage: 1, + ScriptContent: worker.Cmd, + IPList: []scrdbclient.IPItem{ + { + BkCloudID: int(task.RowData.BkCloudID), + IP: worker.SlaveIP, + }, + }, + }, 5) + if worker.Err != nil { + return + } + }(worker) + } + wg01.Wait() +} + +// TendisplusSlaveLoadSST TODO +func (task *SlaveLoadSstTask) TendisplusSlaveLoadSST(cNode *clusterNodeItem, slaveSaveDir string) { + var slaveConn *myredis.RedisWorker + slaveConn, task.Err = myredis.NewRedisClientWithTimeout(cNode.SlaveAddr, cNode.RedisPassword, + 0, 2*time.Hour, task.Logger) + if task.Err != nil { + return + } + defer slaveConn.Close() + task.Logger.Info(fmt.Sprintf("slave %s start 'loadexternalfiles %s all copy'", cNode.SlaveAddr, slaveSaveDir)) + task.Err = slaveConn.Loadexternalfiles(slaveSaveDir, "all", "copy") + if task.Err != nil { + return + } +} diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/backupFileFetch.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/backupFileFetch.go index d5633a03b1..234d0e4808 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/backupFileFetch.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/backupFileFetch.go @@ -12,7 +12,7 @@ import ( // BakcupFileFetchTask 备份拉取task type BakcupFileFetchTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask } // TaskType task类型 @@ -28,7 +28,7 @@ func (task *BakcupFileFetchTask) NextTask() string { // NewBakcupFileFetchTask 新建一个备份拉取task func NewBakcupFileFetchTask(row *tendisdb.TbTendisDTSTask) *BakcupFileFetchTask { return &BakcupFileFetchTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/cmdsImporter.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/cmdsImporter.go index 81697bb314..c07f949d61 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/cmdsImporter.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/cmdsImporter.go @@ -27,7 +27,7 @@ import ( // CmdsImporterTask 命令导入task type CmdsImporterTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask DelFiles []string `json:"delFiles"` OutputFiles []string `json:"outputFiles"` ListFiles []string `json:"listFiles"` @@ -52,7 +52,7 @@ func (task *CmdsImporterTask) NextTask() string { // NewCmdsImporterTask 新建一个命令导入task func NewCmdsImporterTask(row *tendisdb.TbTendisDTSTask) *CmdsImporterTask { return &CmdsImporterTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/makeSync.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/makeSync.go index 85758d159c..7dd4e141d1 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/makeSync.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/makeSync.go @@ -29,7 +29,7 @@ const ( // MakeSyncTask 启动redis-sync type MakeSyncTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask RedisCliTool string `json:"redisCliTool"` RedisSyncTool string `json:"redisSyncTool"` SyncLogFile string `json:"syncLogFile"` @@ -56,7 +56,7 @@ func (task *MakeSyncTask) NextTask() string { // NewMakeSyncTask 新建一个 redis-sync启动task func NewMakeSyncTask(row *tendisdb.TbTendisDTSTask) *MakeSyncTask { return &MakeSyncTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisBackup.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisBackup.go index 1567e4c217..7a37c79725 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisBackup.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisBackup.go @@ -21,7 +21,7 @@ import ( // TendisBackupTask src tendisssd备份task type TendisBackupTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask srcClient *myredis.RedisWorker `json:"-"` dstClient *myredis.RedisWorker `json:"-"` } @@ -39,7 +39,7 @@ func (task *TendisBackupTask) NextTask() string { // NewTendisBackupTask 新建一个src tendisssd备份拉取task func NewTendisBackupTask(row *tendisdb.TbTendisDTSTask) *TendisBackupTask { return &TendisBackupTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } @@ -54,7 +54,7 @@ func (task *TendisBackupTask) Init() { task.UpdateDbAndLogLocal(task.Err.Error()) } }() - task.FatherTask.Init() + task.TendisDtsFatherTask.Init() if task.Err != nil { return } diff --git a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisdump.go b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisdump.go index 9de4da6861..1295c3c872 100644 --- a/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisdump.go +++ b/dbm-services/redis/redis-dts/pkg/dtsTask/tendisssd/tendisdump.go @@ -18,7 +18,7 @@ import ( // TredisdumpTask 对备份文件执行tredisdump type TredisdumpTask struct { - dtsTask.FatherTask + dtsTask.TendisDtsFatherTask } // TaskType task类型 @@ -34,7 +34,7 @@ func (task *TredisdumpTask) NextTask() string { // NewTredisdumpTask 新建tredisdump task func NewTredisdumpTask(row *tendisdb.TbTendisDTSTask) *TredisdumpTask { return &TredisdumpTask{ - FatherTask: dtsTask.NewFatherTask(row), + TendisDtsFatherTask: dtsTask.NewDtsFatherTask(row), } } diff --git a/dbm-services/redis/redis-dts/pkg/txycos/txycos.go b/dbm-services/redis/redis-dts/pkg/txycos/txycos.go new file mode 100644 index 0000000000..8a5b897d98 --- /dev/null +++ b/dbm-services/redis/redis-dts/pkg/txycos/txycos.go @@ -0,0 +1,172 @@ +// Package txycos TODO +package txycos + +import ( + "context" + "fmt" + "net/http" + "net/url" + + "dbm-services/redis/redis-dts/util" + + "github.com/spf13/viper" + "github.com/tencentyun/cos-go-sdk-v5" + "go.uber.org/zap" +) + +// TxyCosWoker 腾讯云cos客户端 +type TxyCosWoker struct { + URL string `json:"url"` // 接口地址 + SecretID string `json:"secretId"` // 密钥 + SecretKey string `json:"secretKey"` // 密钥的密文 + cosClient *cos.Client + logger *zap.Logger +} + +// NewTxyCosWoker 创建一个TxyCosWoker +func NewTxyCosWoker(logger *zap.Logger) (ret *TxyCosWoker, err error) { + ret = &TxyCosWoker{ + URL: viper.GetString("txycos.url"), + SecretID: viper.GetString("txycos.secret_id"), + SecretKey: viper.GetString("txycos.secret_key"), + logger: logger, + } + if ret.URL == "" || ret.SecretID == "" || ret.SecretKey == "" { + err = fmt.Errorf("txycos.url:%s,secret_id:%s,secret_key:%s cannot be empty", ret.URL, ret.SecretID, ret.SecretKey) + ret.logger.Error(err.Error()) + return nil, err + } + u, err := url.Parse(ret.URL) + if err != nil { + err = fmt.Errorf("txycos.url parse failed,err:%v,url:%s", err, ret.URL) + ret.logger.Error(err.Error()) + return nil, err + } + b := &cos.BaseURL{BucketURL: u} + ret.cosClient = cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: ret.SecretID, + SecretKey: ret.SecretKey, + }, + }) + return +} + +// BucketList 桶列表 +func (t *TxyCosWoker) BucketList() (ret *cos.ServiceGetResult, err error) { + ret, resp, err := t.cosClient.Service.Get(context.Background()) + if err != nil { + err = fmt.Errorf("BucketList failed,err:%v", err) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("BucketList failed,resp.StatusCode:%d\n", resp.StatusCode) + t.logger.Error(err.Error()) + return + } + return +} + +// BucketCreate 创建存储桶 +func (t *TxyCosWoker) BucketCreate() (err error) { + opt := &cos.BucketPutOptions{ + XCosACL: "private", + } + resp, err := t.cosClient.Bucket.Put(context.Background(), opt) + if err != nil { + err = fmt.Errorf("BucketCreate failed,err:%v", err) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("BucketCreate failed,resp.StatusCode:%d\n", resp.StatusCode) + t.logger.Error(err.Error()) + return + } + return nil +} + +// PutAFile 文件上传 +func (t *TxyCosWoker) PutAFile(key, filepath string) (err error) { + opt := &cos.ObjectPutOptions{ + ObjectPutHeaderOptions: &cos.ObjectPutHeaderOptions{ + ContentType: "text/html", + }, + ACLHeaderOptions: &cos.ACLHeaderOptions{ + XCosACL: "private", + }, + } + + resp, err := t.cosClient.Object.PutFromFile(context.Background(), key, filepath, opt) + if err != nil { + err = fmt.Errorf("PutAFile failed,err:%v\n", err) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("PutAFile failed,resp.StatusCode:%d,key:%s,filepath:%s\n", resp.StatusCode, key, filepath) + t.logger.Error(err.Error()) + return + } + return nil +} + +// GetFileList 获取文件列表 +func (t *TxyCosWoker) GetFileList(prefix string, maxKeys int) (ret *cos.BucketGetResult, err error) { + + opt := &cos.BucketGetOptions{ + Prefix: prefix, + MaxKeys: maxKeys, + } + + ret, resp, err := t.cosClient.Bucket.Get(context.Background(), opt) + if err != nil { + err = fmt.Errorf("GetFileList failed,err:%v,opt:%s\n", err, util.ToString(opt)) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("GetFileList failed,resp.StatusCode:%d,opt:%s\n", resp.StatusCode, util.ToString(opt)) + t.logger.Error(err.Error()) + return + } + return +} + +// DownloadAFile 从存储桶下载文件 +func (t *TxyCosWoker) DownloadAFile(key, savePath string) (err error) { + opt := &cos.MultiDownloadOptions{ + ThreadPoolSize: 5, + } + resp, err := t.cosClient.Object.Download( + context.Background(), key, savePath, opt, + ) + if err != nil { + err = fmt.Errorf("DownloadAFile failed,err:%v\n", err) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("DownloadAFile failed,resp.StatusCode:%d,key:%s\n", resp.StatusCode, key) + t.logger.Error(err.Error()) + return + } + return nil +} + +// DeleteAFile 从存储桶删除文件 +func (t *TxyCosWoker) DeleteAFile(key string) (err error) { + resp, err := t.cosClient.Object.Delete(context.Background(), key) + if err != nil { + err = fmt.Errorf("DeleteAFile failed,err:%v,key:%s\n", err, key) + t.logger.Error(err.Error()) + return + } + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("DeleteAFile failed,resp.StatusCode:%d,key:%s\n", resp.StatusCode, key) + t.logger.Error(err.Error()) + return + } + return nil +} diff --git a/dbm-services/redis/redis-dts/util/util.go b/dbm-services/redis/redis-dts/util/util.go index fb4c4f7afa..9335dfbc18 100644 --- a/dbm-services/redis/redis-dts/util/util.go +++ b/dbm-services/redis/redis-dts/util/util.go @@ -287,3 +287,12 @@ func IsToolExecutableInCurrDir(tool string) (fullPath string, err error) { } return } + +// FileExists 检查目录是否已经存在 +func FileExists(path string) bool { + _, err := os.Stat(path) + if err != nil { + return os.IsExist(err) + } + return true +} diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py b/dbm-ui/backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py index 8a546c6e47..cc1ca4c27c 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py @@ -132,6 +132,7 @@ def redis_clusternodes_update_record(): TicketType.REDIS_MASTER_SLAVE_SWITCH.value, TicketType.REDIS_CLUSTER_ADD_SLAVE.value, TicketType.REDIS_VERSION_UPDATE_ONLINE.value, + TicketType.REDIS_TENDISPLUS_LIGHTNING_DATA.value, ]: oper_title = oper["title"] oper_type = oper["ticket_type"] diff --git a/dbm-ui/backend/db_proxy/views/redis_dts/serializers.py b/dbm-ui/backend/db_proxy/views/redis_dts/serializers.py index a5e24c1703..845f2fc2fa 100644 --- a/dbm-ui/backend/db_proxy/views/redis_dts/serializers.py +++ b/dbm-ui/backend/db_proxy/views/redis_dts/serializers.py @@ -109,3 +109,47 @@ class DtsTestRedisConnectionSerializer(BaseProxyPassSerializer): infos = serializers.ListField( help_text=_("复制列表"), child=DtsDataCopyBaseItemSerializer(), allow_empty=False, required=True ) + + +# tendisplus Lightning +class LightningDtsSvrMigatingTasksSerializer(BaseProxyPassSerializer): + bk_cloud_id = serializers.IntegerField(help_text=_("云区域ID"), required=True) + dts_server = serializers.IPAddressField(help_text=_("DTS_server IP"), required=True) + task_types = serializers.ListField( + help_text=_("task类型列表"), child=serializers.CharField(), allow_empty=False, required=True + ) + + +class LightningLast30DaysToExecTasksSerializer(BaseProxyPassSerializer): + bk_cloud_id = serializers.IntegerField(help_text=_("云区域ID"), required=True) + dts_server = serializers.IPAddressField(help_text=_("DTS_server IP"), required=True) + task_type = serializers.CharField(help_text=_("task类型"), required=True) + limit = serializers.IntegerField(help_text=_("限制条数"), required=False) + status = serializers.IntegerField(help_text=_("任务状态"), required=False) + + +class LightningLast30DaysToScheJobsSerializer(BaseProxyPassSerializer): + bk_cloud_id = serializers.IntegerField(help_text=_("云区域ID"), required=True) + max_data_size = serializers.IntegerField(help_text=_("最大数据量"), required=True) + zone_name = serializers.CharField(help_text=_("城市名"), required=True) + + +class LightningJobTasksSerializer(BaseProxyPassSerializer): + ticket_id = serializers.CharField(help_text=_("单据ID"), required=True) + dst_cluster = serializers.CharField(help_text=_("目标集群"), required=True) + + +class LightningJobToScheTasksSerializer(BaseProxyPassSerializer): + ticket_id = serializers.CharField(help_text=_("单据ID"), required=True) + dst_cluster = serializers.CharField(help_text=_("目标集群"), required=True) + + +class LightningTaskByIDSerializer(BaseProxyPassSerializer): + task_id = serializers.CharField(help_text=_("task id"), required=True) + + +class LightningTasksUpdateSerializer(BaseProxyPassSerializer): + task_ids = serializers.ListField( + help_text=_("子任务ID列表"), child=serializers.CharField(), allow_empty=False, required=True + ) + col_to_val = serializers.DictField(child=serializers.CharField()) diff --git a/dbm-ui/backend/db_proxy/views/redis_dts/views.py b/dbm-ui/backend/db_proxy/views/redis_dts/views.py index c3a3278dcd..cefb11d1d1 100644 --- a/dbm-ui/backend/db_proxy/views/redis_dts/views.py +++ b/dbm-ui/backend/db_proxy/views/redis_dts/views.py @@ -27,6 +27,13 @@ DtsTasksUpdateSerializer, DtsTestRedisConnectionSerializer, IsDtsserverInBlacklistSerializer, + LightningDtsSvrMigatingTasksSerializer, + LightningJobTasksSerializer, + LightningJobToScheTasksSerializer, + LightningLast30DaysToExecTasksSerializer, + LightningLast30DaysToScheJobsSerializer, + LightningTaskByIDSerializer, + LightningTasksUpdateSerializer, ) from backend.db_proxy.views.views import BaseProxyPassViewSet from backend.db_services.redis.redis_dts.apis import ( @@ -43,7 +50,14 @@ get_job_to_schedule_tasks, get_last_30days_to_exec_tasks, get_last_30days_to_schedule_jobs, + get_lightning_job_detail, is_dtsserver_in_blacklist, + lightning_dts_server_migrating_tasks, + lightning_dts_task_by_id, + lightning_job_to_schedule_tasks, + lightning_last_30days_to_exec_tasks, + lightning_last_30days_to_schedule_jobs, + lightning_tasks_updates, ) @@ -193,7 +207,7 @@ def get_job_to_schedule_tasks(self, request): return Response(get_job_to_schedule_tasks(validated_data)) @common_swagger_auto_schema( - operation_summary=_("获取一个job的所有待调度的tasks"), + operation_summary=_("获取一个job的中某个slave机器上运行中的tasks"), request_body=DtsJobSrcIPRunningTasksSerializer, tags=[SWAGGER_TAG], ) @@ -208,7 +222,7 @@ def get_job_src_ip_running_tasks(self, request): return Response(get_job_src_ip_running_tasks(validated_data)) @common_swagger_auto_schema( - operation_summary=_("获取一个job的所有待调度的tasks"), + operation_summary=_("根据task_id获取task详情"), request_body=DtsTaskByTaskIDSerializer, tags=[SWAGGER_TAG], ) @@ -248,3 +262,109 @@ def update_tasks(self, request): def test_redis_connection(self, request): validated_data = self.params_validate(self.get_serializer_class()) return Response(dts_test_redis_connections(validated_data)) + + # tendisplus Lightning + @common_swagger_auto_schema( + operation_summary=_("获取dts server迁移中的Lightning任务"), + request_body=LightningDtsSvrMigatingTasksSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningDtsSvrMigatingTasksSerializer, + url_path="tendisplus_lightning/dts_server_migrating_tasks", + ) + def lightning_dts_server_migrating_tasks(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(lightning_dts_server_migrating_tasks(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("获取最近30天内task_type类型的等待执行的tasks"), + request_body=LightningLast30DaysToExecTasksSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningLast30DaysToExecTasksSerializer, + url_path="tendisplus_lightning/last_30_days_to_exec_tasks", + ) + def lightning_last_30days_to_exec_tasks(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(lightning_last_30days_to_exec_tasks(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("获取最近30天内的等待调度的lightning jobs"), + request_body=LightningLast30DaysToScheJobsSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningLast30DaysToScheJobsSerializer, + url_path="tendisplus_lightning/last_30_days_to_schedule_jobs", + ) + def lightning_last_30days_to_schedule_jobs(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(lightning_last_30days_to_schedule_jobs(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("获取数据导入任务详情"), + request_body=LightningJobTasksSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningJobTasksSerializer, + url_path="tendisplus_lightning/job_detail", + ) + def lightning_job_detail(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(get_lightning_job_detail(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("获取一个job的所有待调度的tasks"), + request_body=LightningJobToScheTasksSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningJobToScheTasksSerializer, + url_path="tendisplus_lightning/job_to_schedule_tasks", + ) + def lightning_job_to_schedule_tasks(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(lightning_job_to_schedule_tasks(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("根据task_id获取task详情"), + request_body=LightningTaskByIDSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningTaskByIDSerializer, + url_path="tendisplus_lightning/task_by_task_id", + ) + def lightning_dts_task_by_id(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response(lightning_dts_task_by_id(validated_data)) + + @common_swagger_auto_schema( + operation_summary=_("批量更新dts_tasks"), + request_body=LightningTasksUpdateSerializer, + tags=[SWAGGER_TAG], + ) + @action( + methods=["POST"], + detail=False, + serializer_class=LightningTasksUpdateSerializer, + url_path="tendisplus_lightning/tasks_update", + ) + def lightning_tasks_updates(self, request): + validated_data = self.params_validate(self.get_serializer_class()) + return Response({"rows_affected": lightning_tasks_updates(validated_data)}) diff --git a/dbm-ui/backend/db_services/redis/redis_dts/apis.py b/dbm-ui/backend/db_services/redis/redis_dts/apis.py index 9681def46f..3bf99450fc 100644 --- a/dbm-ui/backend/db_services/redis/redis_dts/apis.py +++ b/dbm-ui/backend/db_services/redis/redis_dts/apis.py @@ -29,8 +29,11 @@ TbTendisDtsDistributeLock, TbTendisDTSJob, TbTendisDtsTask, + TendisplusLightningJob, + TendisplusLightningTask, dts_task_clean_pwd_and_fmt_time, dts_task_format_time, + lightning_task_format_time, ) from .util import dts_job_cnt_and_status, dts_task_status, is_in_incremental_sync @@ -559,3 +562,177 @@ def dts_test_redis_connections(payload: dict): "test redis connection failed,redis_addr:{},please check redis and password is ok".format(redis_addr) ) return True + + +# tendisplus Lightning + + +def lightning_dts_server_migrating_tasks(payload: dict) -> list: + """ + 获取dts server迁移中的任务 + 对Tendisplus Lightning 来说,'迁移中'指处于 status=1 状态的task + """ + + dts_server = payload.get("dts_server") + task_types = payload.get("task_types") + current_time = datetime.now(timezone.utc).astimezone() + thirty_days_ago = current_time - timedelta(days=30) + + where = Q(bk_cloud_id=payload.get("bk_cloud_id")) + if dts_server: + where = where & Q(dts_server=dts_server) + if task_types: + where = where & Q(task_type__in=task_types) + where = where & Q(update_time__gt=thirty_days_ago) + where = where & Q(status__in=[0, 1]) + + rets = [] + for task in TendisplusLightningTask.objects.filter(where): + json_data = model_to_dict(task) + lightning_task_format_time(json_data, task) + rets.append(json_data) + return rets + + +def lightning_last_30days_to_exec_tasks(payload: dict) -> list: + """获取最近30天内task_type类型的等待执行的tasks""" + + bk_cloud_id = payload.get("bk_cloud_id") + dts_server = payload.get("dts_server") + task_type = payload.get("task_type") + limit = payload.get("limit") + status = payload.get("status") + dts_server = dts_server.strip() + task_type = task_type.strip() + current_time = datetime.now(timezone.utc).astimezone() + thirty_days_ago = current_time - timedelta(days=30) + + where = Q(bk_cloud_id=bk_cloud_id) + if dts_server: + where = where & Q(dts_server=dts_server) + if task_type: + where = where & Q(task_type=task_type) + if limit <= 0: + limit = 1 + where = where & Q(status=status) + where = where & Q(create_time__gt=thirty_days_ago) + tasks = TendisplusLightningTask.objects.filter(where).order_by("-dst_cluster_priority", "create_time")[:limit] + if not tasks: + # logger.warning( + # "lightning_last_30days_to_exec_tasks empty records" + # ",bk_cloud_id:{},dts_server:{},task_type:{},status:{}".format( + # bk_cloud_id, dts_server, task_type, status + # ) + # ) + return [] + rets = [] + for task in tasks: + json_data = model_to_dict(task) + lightning_task_format_time(json_data, task) + rets.append(json_data) + return rets + + +def lightning_last_30days_to_schedule_jobs(payload: dict) -> list: + """获取最近30天内的等待调度的jobs + ticket_id,dst_cluster唯一确定一个dts_job + 获取的dts_jobs必须满足: + 有一个待调度的task.dataSize < maxDataSize & status=0 & taskType="" & dtsServer="1.1.1.1" + """ + + max_data_size = payload.get("max_data_size") + zone_name = payload.get("zone_name") + current_time = datetime.now(timezone.utc).astimezone() + thirty_days_ago = current_time - timedelta(days=30) + + where = Q(bk_cloud_id=payload.get("bk_cloud_id")) + where = where & Q(cos_file_size__lte=max_data_size) + if zone_name: + where = where & Q(dst_zonename=zone_name) + where = where & Q(dts_server="1.1.1.1") & Q(task_type="") & Q(status=0) & Q(create_time__gt=thirty_days_ago) + jobs = TendisplusLightningTask.objects.filter(where).order_by("-dst_cluster_priority", "create_time") + if not jobs: + # logger.warning( + # "lightning_last_30days_to_schedule_jobs empty records," + # "bk_cloud_id={},max_data_size={},zone_name={}".format( + # bk_cloud_id, max_data_size, zone_name + # ) + # ) + return [] + rets = [] + unique_set = set() + for job in jobs: + job_uniq_key = "{}-{}".format(job.ticket_id, job.dst_cluster) + if job_uniq_key in unique_set: + continue + unique_set.add(job_uniq_key) + json_data = model_to_dict(job) + lightning_task_format_time(json_data, job) + rets.append(json_data) + return rets + + +def get_lightning_job_detail(payload: dict) -> list: + """获取数据导入任务详情""" + ticket_id = payload.get("ticket_id") + dst_cluster = payload.get("dst_cluster") + + return TendisplusLightningJob.objects.filter(Q(ticket_id=ticket_id) & Q(dst_cluster=dst_cluster)).values() + + +def lightning_job_to_schedule_tasks(payload: dict) -> list: + """获取一个job的所有待调度的tasks""" + # ticket_id: int, dst_cluster: str + ticket_id = payload.get("ticket_id") + dst_cluster = payload.get("dst_cluster") + if not ticket_id or not dst_cluster: + raise Exception("invalid params,ticket_id={},dst_cluster={} all can't be empty".format(ticket_id, dst_cluster)) + current_time = datetime.now(timezone.utc).astimezone() + thirty_days_ago = current_time - timedelta(days=30) + + where = Q(ticket_id=ticket_id) & Q(dst_cluster=dst_cluster) + where = where & Q(update_time__gt=thirty_days_ago) & Q(dts_server="1.1.1.1") & Q(task_type="") & Q(status=0) + tasks = TendisplusLightningTask.objects.filter(where) + if not tasks: + logger.warning( + "lightning_job_to_schedule_tasks empty records,ticket_id={},dst_cluster={}".format(ticket_id, dst_cluster) + ) + return [] + + rets = [] + for task in tasks: + json_data = model_to_dict(task) + lightning_task_format_time(json_data, task) + rets.append(json_data) + return rets + + +def lightning_dts_task_by_id(payload: dict) -> dict: + """根据task_id获取dts_task""" + task_id = payload.get("task_id") + + try: + task = TendisplusLightningTask.objects.get(task_id=task_id) + except TendisplusLightningTask.DoesNotExist: + logger.warning("lightning task not found,task_id={}".format(task_id)) + return None + + json_data = model_to_dict(task) + lightning_task_format_time(json_data, task) + return json_data + + +def lightning_tasks_updates(paylod: dict): + """批量更新dts_tasks + :param + task_ids: task_id列表 + update_params: 列名和值的对应关系,如 {"status": 1,"message": "test"} + """ + task_ids = paylod.get("task_ids") + col_to_val = paylod.get("col_to_val") + if not task_ids: + raise Exception("invalid params,task_ids can't be empty") + if not col_to_val: + raise Exception("invalid params,update_params can't be empty") + rows_affected = TendisplusLightningTask.objects.filter(task_id__in=task_ids).update(**col_to_val) + return rows_affected diff --git a/dbm-ui/backend/db_services/redis/redis_dts/migrations/0017_auto_20240908_1038_squashed_0018_auto_20240914_1754.py b/dbm-ui/backend/db_services/redis/redis_dts/migrations/0017_auto_20240908_1038_squashed_0018_auto_20240914_1754.py new file mode 100644 index 0000000000..fdae41e9e4 --- /dev/null +++ b/dbm-ui/backend/db_services/redis/redis_dts/migrations/0017_auto_20240908_1038_squashed_0018_auto_20240914_1754.py @@ -0,0 +1,249 @@ +# Generated by Django 3.2.25 on 2024-09-14 09:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + replaces = [("redis_dts", "0017_auto_20240908_1038"), ("redis_dts", "0018_auto_20240914_1754")] + + dependencies = [ + ("redis_dts", "0016_auto_20240307_0946"), + ] + + operations = [ + migrations.CreateModel( + name="TendisplusTunnelerJob", + fields=[ + ("id", models.BigAutoField(primary_key=True, serialize=False, verbose_name="ID")), + ("ticket_id", models.BigIntegerField(verbose_name="单据ID")), + ("user", models.CharField(default="", max_length=64, verbose_name="申请人")), + ("bk_biz_id", models.CharField(default="", max_length=64, verbose_name="业务bk_biz_d")), + ("bk_cloud_id", models.BigIntegerField(verbose_name="云区域ID")), + ("dst_cluster", models.CharField(max_length=128, verbose_name="目标集群")), + ("dst_cluster_id", models.BigIntegerField(verbose_name="目标集群ID")), + ("cluster_nodes", models.TextField(verbose_name="集群节点")), + ("create_time", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), + ], + options={ + "verbose_name": "Tendisplus Tunneler Job", + "verbose_name_plural": "Tendisplus Tunneler Job", + "db_table": "tb_tendisplus_tunneler_job", + }, + ), + migrations.CreateModel( + name="TendisplusTunnelerTask", + fields=[ + ("task_id", models.CharField(max_length=64, primary_key=True, serialize=False, verbose_name="任务ID")), + ("ticket_id", models.BigIntegerField(verbose_name="单据ID")), + ("user", models.CharField(default="", max_length=64, verbose_name="申请人")), + ("bk_biz_id", models.CharField(default="", max_length=64, verbose_name="业务bk_biz_d")), + ("bk_cloud_id", models.BigIntegerField(verbose_name="云区域ID")), + ("cos_key", models.CharField(max_length=128, verbose_name="cos文件key")), + ("cos_file_size", models.BigIntegerField(verbose_name="cos文件大小")), + ("dts_server", models.CharField(max_length=128, verbose_name="dts服务地址")), + ("dst_cluster", models.CharField(max_length=128, verbose_name="目标集群")), + ("dst_cluster_id", models.BigIntegerField(verbose_name="目标集群ID")), + ("dst_cluster_priority", models.IntegerField(default=0, verbose_name="目标集群优先级,越大优先级越高")), + ("status", models.IntegerField(default=0, verbose_name="任务状态")), + ("message", models.TextField(verbose_name="任务消息")), + ("create_time", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), + ("update_time", models.DateTimeField(auto_now=True, verbose_name="更新时间")), + ], + options={ + "verbose_name": "Tendisplus Tunneler Task", + "verbose_name_plural": "Tendisplus Tunneler Task", + "db_table": "tb_tendisplus_tunneler_task", + }, + ), + migrations.AddIndex( + model_name="tendisplustunnelertask", + index=models.Index(fields=["update_time"], name="tb_tendispl_update__425a81_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelertask", + index=models.Index(fields=["dst_cluster_id"], name="tb_tendispl_dst_clu_c3fb72_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelertask", + index=models.Index(fields=["user"], name="tb_tendispl_user_d85fd6_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelertask", + index=models.Index(fields=["ticket_id", "dst_cluster_id"], name="tb_tendispl_ticket__da0496_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelerjob", + index=models.Index(fields=["create_time"], name="tb_tendispl_create__b2f3e3_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelerjob", + index=models.Index(fields=["dst_cluster_id"], name="tb_tendispl_dst_clu_c52482_idx"), + ), + migrations.AddIndex( + model_name="tendisplustunnelerjob", + index=models.Index(fields=["user"], name="tb_tendispl_user_65d13e_idx"), + ), + migrations.AddConstraint( + model_name="tendisplustunnelerjob", + constraint=models.UniqueConstraint(fields=("ticket_id", "dst_cluster"), name="uniq_ticket_cluster"), + ), + migrations.CreateModel( + name="TendisplusLightningTask", + fields=[ + ("task_id", models.CharField(max_length=64, primary_key=True, serialize=False, verbose_name="任务ID")), + ("ticket_id", models.BigIntegerField(verbose_name="单据ID")), + ("user", models.CharField(default="", max_length=64, verbose_name="申请人")), + ("bk_biz_id", models.CharField(default="", max_length=64, verbose_name="业务bk_biz_d")), + ("bk_cloud_id", models.BigIntegerField(verbose_name="云区域ID")), + ("cos_key", models.CharField(max_length=128, verbose_name="cos文件key")), + ("cos_file_size", models.BigIntegerField(verbose_name="cos文件大小")), + ("dts_server", models.CharField(max_length=128, verbose_name="dts服务地址")), + ("dst_cluster", models.CharField(max_length=128, verbose_name="目标集群")), + ("dst_cluster_id", models.BigIntegerField(verbose_name="目标集群ID")), + ("dst_cluster_priority", models.IntegerField(default=0, verbose_name="目标集群优先级,越大优先级越高")), + ("dst_zonename", models.CharField(max_length=128, verbose_name="目标集群城市")), + ("task_type", models.CharField(max_length=128, verbose_name="任务类型")), + ("operate_type", models.CharField(max_length=128, verbose_name="操作类型")), + ("status", models.IntegerField(default=0, verbose_name="任务状态")), + ("message", models.TextField(verbose_name="任务消息")), + ("create_time", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), + ("update_time", models.DateTimeField(auto_now=True, verbose_name="更新时间")), + ], + options={ + "verbose_name": "Tendisplus Lightning Task", + "verbose_name_plural": "Tendisplus Lightning Task", + "db_table": "tb_tendisplus_lightning_task", + }, + ), + migrations.RenameModel( + old_name="TendisplusTunnelerJob", + new_name="TendisplusLightningJob", + ), + migrations.DeleteModel( + name="TendisplusTunnelerTask", + ), + migrations.AlterModelOptions( + name="tendispluslightningjob", + options={"verbose_name": "Tendisplus Lightning Job", "verbose_name_plural": "Tendisplus Lightning Job"}, + ), + migrations.RemoveIndex( + model_name="tendispluslightningjob", + name="tb_tendispl_create__b2f3e3_idx", + ), + migrations.RemoveIndex( + model_name="tendispluslightningjob", + name="tb_tendispl_dst_clu_c52482_idx", + ), + migrations.RemoveIndex( + model_name="tendispluslightningjob", + name="tb_tendispl_user_65d13e_idx", + ), + migrations.AddIndex( + model_name="tendispluslightningjob", + index=models.Index(fields=["create_time"], name="tb_tendispl_create__2a0918_idx"), + ), + migrations.AddIndex( + model_name="tendispluslightningjob", + index=models.Index(fields=["dst_cluster_id"], name="tb_tendispl_dst_clu_f167e8_idx"), + ), + migrations.AddIndex( + model_name="tendispluslightningjob", + index=models.Index(fields=["user"], name="tb_tendispl_user_3b18a1_idx"), + ), + migrations.AlterModelTable( + name="tendispluslightningjob", + table="tb_tendisplus_lightning_job", + ), + migrations.AddIndex( + model_name="tendispluslightningtask", + index=models.Index(fields=["update_time"], name="tb_tendispl_update__4c107b_idx"), + ), + migrations.AddIndex( + model_name="tendispluslightningtask", + index=models.Index(fields=["dst_cluster_id"], name="tb_tendispl_dst_clu_0013b5_idx"), + ), + migrations.AddIndex( + model_name="tendispluslightningtask", + index=models.Index(fields=["user"], name="tb_tendispl_user_c6340e_idx"), + ), + migrations.AddIndex( + model_name="tendispluslightningtask", + index=models.Index(fields=["ticket_id", "dst_cluster_id"], name="tb_tendispl_ticket__942488_idx"), + ), + migrations.AlterField( + model_name="tendispluslightningjob", + name="bk_cloud_id", + field=models.BigIntegerField(default=0, verbose_name="云区域ID"), + ), + migrations.AlterField( + model_name="tendispluslightningjob", + name="cluster_nodes", + field=models.TextField(default="", verbose_name="集群节点"), + ), + migrations.AlterField( + model_name="tendispluslightningjob", + name="dst_cluster", + field=models.CharField(default="", max_length=128, verbose_name="目标集群"), + ), + migrations.AlterField( + model_name="tendispluslightningjob", + name="dst_cluster_id", + field=models.BigIntegerField(default=0, verbose_name="目标集群ID"), + ), + migrations.AlterField( + model_name="tendispluslightningjob", + name="ticket_id", + field=models.BigIntegerField(default=0, verbose_name="单据ID"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="bk_cloud_id", + field=models.BigIntegerField(default=0, verbose_name="云区域ID"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="cos_file_size", + field=models.BigIntegerField(default=0, verbose_name="cos文件大小"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="cos_key", + field=models.CharField(default="", max_length=128, verbose_name="cos文件key"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="dst_cluster", + field=models.CharField(default="", max_length=128, verbose_name="目标集群"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="dst_cluster_id", + field=models.BigIntegerField(default=0, verbose_name="目标集群ID"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="dst_zonename", + field=models.CharField(default="", max_length=128, verbose_name="目标集群城市"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="dts_server", + field=models.CharField(default="", max_length=128, verbose_name="dts服务地址"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="message", + field=models.TextField(default="", verbose_name="任务消息"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="operate_type", + field=models.CharField(default="", max_length=128, verbose_name="操作类型"), + ), + migrations.AlterField( + model_name="tendispluslightningtask", + name="task_type", + field=models.CharField(default="", max_length=128, verbose_name="任务类型"), + ), + ] diff --git a/dbm-ui/backend/db_services/redis/redis_dts/models/__init__.py b/dbm-ui/backend/db_services/redis/redis_dts/models/__init__.py index bee20c85ae..a7b622510f 100644 --- a/dbm-ui/backend/db_services/redis/redis_dts/models/__init__.py +++ b/dbm-ui/backend/db_services/redis/redis_dts/models/__init__.py @@ -15,3 +15,5 @@ from .tb_tendis_dts_job import TbTendisDTSJob from .tb_tendis_dts_switch_backup import TbTendisDtsSwitchBackup from .tb_tendis_dts_task import TbTendisDtsTask, dts_task_clean_pwd_and_fmt_time, dts_task_format_time +from .tb_tendisplus_lightning_job import TendisplusLightningJob +from .tb_tendisplus_lightning_task import TendisplusLightningTask, lightning_task_format_time diff --git a/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_job.py b/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_job.py new file mode 100644 index 0000000000..738c21507d --- /dev/null +++ b/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_job.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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. +""" +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class TendisplusLightningJob(models.Model): + id = models.BigAutoField(_("ID"), primary_key=True) + ticket_id = models.BigIntegerField(_("单据ID"), default=0) + user = models.CharField(_("申请人"), max_length=64, default="") + bk_biz_id = models.CharField(_("业务bk_biz_d"), max_length=64, default="") + bk_cloud_id = models.BigIntegerField(_("云区域ID"), default=0) + dst_cluster = models.CharField(_("目标集群"), max_length=128, default="") + dst_cluster_id = models.BigIntegerField(_("目标集群ID"), default=0) + cluster_nodes = models.TextField(_("集群节点"), default="") + create_time = models.DateTimeField(auto_now_add=True, verbose_name=_("创建时间")) + + class Meta: + verbose_name = _("Tendisplus Lightning Job") + verbose_name_plural = _("Tendisplus Lightning Job") + db_table = "tb_tendisplus_lightning_job" + + indexes = [ + models.Index(fields=["create_time"]), + models.Index(fields=["dst_cluster_id"]), + models.Index(fields=["user"]), + ] + + constraints = [ + models.UniqueConstraint( + fields=["ticket_id", "dst_cluster"], + name="uniq_ticket_cluster", + ) + ] diff --git a/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_task.py b/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_task.py new file mode 100644 index 0000000000..075eed9ba1 --- /dev/null +++ b/dbm-ui/backend/db_services/redis/redis_dts/models/tb_tendisplus_lightning_task.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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. +""" +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from backend.utils.time import datetime2str + + +class TendisplusLightningTask(models.Model): + task_id = models.CharField(_("任务ID"), max_length=64, primary_key=True) + ticket_id = models.BigIntegerField(_("单据ID")) + user = models.CharField(_("申请人"), max_length=64, default="") + bk_biz_id = models.CharField(_("业务bk_biz_d"), max_length=64, default="") + bk_cloud_id = models.BigIntegerField(_("云区域ID"), default=0) + cos_key = models.CharField(_("cos文件key"), max_length=128, default="") + cos_file_size = models.BigIntegerField(_("cos文件大小"), default=0) + dts_server = models.CharField(_("dts服务地址"), max_length=128, default="") + dst_cluster = models.CharField(_("目标集群"), max_length=128, default="") + dst_cluster_id = models.BigIntegerField(_("目标集群ID"), default=0) + dst_cluster_priority = models.IntegerField(_("目标集群优先级,越大优先级越高"), default=0) + dst_zonename = models.CharField(_("目标集群城市"), max_length=128, default="") + task_type = models.CharField(_("任务类型"), max_length=128, default="") + operate_type = models.CharField(_("操作类型"), max_length=128, default="") + status = models.IntegerField(_("任务状态"), default=0) + message = models.TextField(_("任务消息"), default="") + create_time = models.DateTimeField(auto_now_add=True, verbose_name=_("创建时间")) + update_time = models.DateTimeField(auto_now=True, verbose_name=_("更新时间")) + + class Meta: + verbose_name = _("Tendisplus Lightning Task") + verbose_name_plural = _("Tendisplus Lightning Task") + db_table = "tb_tendisplus_lightning_task" + indexes = [ + models.Index(fields=["update_time"]), + models.Index(fields=["dst_cluster_id"]), + models.Index(fields=["user"]), + models.Index(fields=["ticket_id", "dst_cluster_id"]), + ] + + +def lightning_task_format_time(json_data: dict, row: TendisplusLightningTask): + json_data["create_time"] = datetime2str(row.create_time) + json_data["update_time"] = datetime2str(row.update_time) diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index 85e6c04243..ce22202c65 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -480,6 +480,8 @@ class RedisActuatorActionEnum(str, StructuredEnum): CONFIG_SET = EnumField("config_set", _("config_set")) LOAD_MODULES = EnumField("load_modules", _("load_modules")) PREDIXY_ADD_MODULES_CMDS = EnumField("predixy_add_modules_cmds", _("predixy_add_modules_cmds")) + RESHAPE = EnumField("reshape", _("reshape")) + CLUSTER_RESET_FLUSH_MEET = EnumField("cluster_reset_flush_meet", _("cluster_reset_flush_meet")) class MongoDBActuatorActionEnum(str, StructuredEnum): diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/mongodb_pitr_restore.py b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/mongodb_pitr_restore.py index 002784f287..2e15054ee4 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/mongodb_pitr_restore.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/mongodb_pitr_restore.py @@ -26,7 +26,7 @@ from backend.flow.engine.bamboo.scene.mongodb.sub_task.pitr_restore_sub import PitrRestoreSubTask from backend.flow.engine.bamboo.scene.mongodb.sub_task.send_media import SendMedia from backend.flow.plugins.components.collections.mongodb.exec_actuator_job2 import ExecJobComponent2 -from backend.flow.utils.mongodb.mongodb_repo import MongoRepository, MongoDBCluster, MongoNode +from backend.flow.utils.mongodb.mongodb_repo import MongoDBCluster, MongoNode, MongoRepository from backend.flow.utils.mongodb.mongodb_script_template import prepare_recover_dir_script from backend.flow.utils.mongodb.mongodb_util import MongoUtil diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py index d9f4491cb0..e95dbb8498 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py @@ -19,7 +19,7 @@ ) from backend.flow.utils.base.payload_handler import PayloadHandler from backend.flow.utils.mongodb.mongodb_dataclass import CommonContext -from backend.flow.utils.mongodb.mongodb_repo import MongoDBCluster, ReplicaSet, MongoNode +from backend.flow.utils.mongodb.mongodb_repo import MongoDBCluster, MongoNode, ReplicaSet # Prepare datafile 准备数据文件 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/hello_sub.py b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/hello_sub.py index 89511485fc..f18c304405 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/hello_sub.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/hello_sub.py @@ -17,7 +17,7 @@ from backend.flow.engine.bamboo.scene.mongodb.sub_task.base_subtask import BaseSubTask from backend.flow.plugins.components.collections.mongodb.exec_actuator_job2 import ExecJobComponent2 from backend.flow.utils.mongodb.mongodb_dataclass import CommonContext -from backend.flow.utils.mongodb.mongodb_repo import ReplicaSet, MongoNode +from backend.flow.utils.mongodb.mongodb_repo import MongoNode, ReplicaSet from backend.flow.utils.mongodb.mongodb_util import MongoUtil diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/pitr_restore_sub.py b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/pitr_restore_sub.py index fca394b881..cc6484282e 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/pitr_restore_sub.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mongodb/sub_task/pitr_restore_sub.py @@ -17,7 +17,7 @@ from backend.flow.engine.bamboo.scene.mongodb.sub_task.base_subtask import BaseSubTask from backend.flow.plugins.components.collections.mongodb.exec_actuator_job2 import ExecJobComponent2 from backend.flow.utils.mongodb.mongodb_dataclass import CommonContext -from backend.flow.utils.mongodb.mongodb_repo import ReplicaSet, MongoNode +from backend.flow.utils.mongodb.mongodb_repo import MongoNode, ReplicaSet from backend.flow.utils.mongodb.mongodb_util import MongoUtil diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/tendisplus_lightning_data.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/tendisplus_lightning_data.py new file mode 100644 index 0000000000..da1cf18706 --- /dev/null +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/tendisplus_lightning_data.py @@ -0,0 +1,252 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 logging.config +from collections import defaultdict +from copy import deepcopy +from dataclasses import asdict +from typing import Dict, Optional + +from django.utils.translation import ugettext as _ + +from backend.configuration.constants import DBType +from backend.db_meta.models import Cluster +from backend.db_services.redis.util import is_tendisplus_instance_type +from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder +from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList +from backend.flow.plugins.components.collections.redis.exec_actuator_script import ExecuteDBActuatorScriptComponent +from backend.flow.plugins.components.collections.redis.get_redis_payload import GetRedisActPayloadComponent +from backend.flow.plugins.components.collections.redis.redis_db_meta import RedisDBMetaComponent +from backend.flow.plugins.components.collections.redis.tendisplus_lightning import TendisplusClusterLightningComponent +from backend.flow.plugins.components.collections.redis.trans_flies import TransFileComponent +from backend.flow.utils.base.payload_handler import PayloadHandler +from backend.flow.utils.redis.redis_act_playload import RedisActPayload +from backend.flow.utils.redis.redis_context_dataclass import ActKwargs, TendisplusLightningContext +from backend.flow.utils.redis.redis_db_meta import RedisDBMeta +from backend.flow.utils.redis.redis_proxy_util import async_multi_clusters_precheck, lightning_cluster_nodes + +logger = logging.getLogger("flow") + + +class TendisPlusLightningData(object): + """ + Tendisplus Lightning 批量,快速导入数据 + """ + + def __init__(self, root_id: str, data: Optional[Dict]): + """ + @param root_id : 任务流程定义的root_id + @param data : 单据传递过来的参数列表,是dict格式 + data = { + "bk_biz_id":"", + "ticket_type": "TENDISPLUS_LIGHTNING_DATA" + "infos":[ + "cluster_id":1, + "cos_file_keys": [ + "xxxx", + "yyy" + ] + ] + } + """ + self.root_id = root_id + self.data = data + self.precheck(self.data["infos"]) + + @staticmethod + def precheck(infos: list): + """ + @summary: 预检查 + """ + to_precheck_cluster_ids = set() + for input_item in infos: + # 如果重复,则报错 + if input_item["cluster_id"] in to_precheck_cluster_ids: + raise Exception( + _("cluster_id:{}重复,同一个集群不能同时执行多个Tendisplus Lightning").format(input_item["cluster_id"]) + ) + to_precheck_cluster_ids.add(input_item["cluster_id"]) + # 并发检查多个cluster的proxy、redis实例状态 + async_multi_clusters_precheck(to_precheck_cluster_ids) + # 检查集群类型 和 是否有running的slave + for input_item in infos: + cluster = Cluster.objects.get(id=input_item["cluster_id"]) + if not is_tendisplus_instance_type(cluster.cluster_type): + raise Exception( + _("cluster_id:{} immute_domain:{} cluster_type:{} Tendisplus Lightning 仅支持Tendisplus集群").format( + cluster.id, cluster.immute_domain, cluster.cluster_type + ) + ) + # 确保每个master都有个running的slave + lightning_cluster_nodes(input_item["cluster_id"]) + + def lightning_data_flow(self): + redis_pipeline = Builder(root_id=self.root_id, data=self.data) + trans_files = GetFileList(db_type=DBType.Redis) + act_kwargs = ActKwargs() + act_kwargs.set_trans_data_dataclass = TendisplusLightningContext.__name__ + act_kwargs.file_list = trans_files.redis_base() + act_kwargs.is_update_trans_data = True + sub_pipelines = [] + + for input_item in self.data["infos"]: + cluster = Cluster.objects.get(id=input_item["cluster_id"]) + passwd_ret = PayloadHandler.redis_get_cluster_password(cluster) + sub_pipeline = SubBuilder(root_id=self.root_id, data=self.data) + cluster_kwargs = deepcopy(act_kwargs) + sub_pipeline.add_act( + act_name=_("初始化配置-{}".format(cluster.immute_domain)), + act_component_code=GetRedisActPayloadComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + cluster_nodes = lightning_cluster_nodes(cluster.id) + slave_ip_instance = defaultdict(list) + slave_ips_set = set() + master_slave_pairs = [] + for node in cluster_nodes: + slave_ip, slave_port = node["slave_addr"].split(":") + master_ip, master_port = node["master_addr"].split(":") + slave_ips_set.add(slave_ip) + slave_ip_instance[slave_ip].append({"ip": slave_ip, "port": int(slave_port)}) + master_slave_pairs.append( + { + "master": {"ip": master_ip, "port": int(master_port)}, + "slave": {"ip": slave_ip, "port": int(slave_port)}, + } + ) + + acts_list = [] + for ip in slave_ips_set: + # 下发介质 + act_kwargs.exec_ip = ip + acts_list.append( + { + "act_name": _("{}-下发介质包").format(ip), + "act_component_code": TransFileComponent.code, + "kwargs": asdict(act_kwargs), + } + ) + if acts_list: + sub_pipeline.add_parallel_acts(acts_list=acts_list) + + # 批量导入数据,并等待任务完成 + cluster_kwargs.cluster["cluster_id"] = cluster.id + cluster_kwargs.cluster["cos_file_keys"] = input_item["cos_file_keys"] + sub_pipeline.add_act( + act_name=_("批量生成sst文件并导入"), + act_component_code=TendisplusClusterLightningComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + # slave执行reshape + acts_list = [] + for slave_ip, instances in slave_ip_instance.items(): + cluster_kwargs.exec_ip = slave_ip + cluster_kwargs.cluster = {"instances": instances, "redis_password": passwd_ret.get("redis_password")} + cluster_kwargs.get_redis_payload_func = RedisActPayload.tendisplus_reshape.__name__ + acts_list.append( + { + "act_name": _("执行reshape: {}").format(slave_ip), + "act_component_code": ExecuteDBActuatorScriptComponent.code, + "kwargs": asdict(cluster_kwargs), + } + ) + if acts_list: + sub_pipeline.add_parallel_acts(acts_list=acts_list) + + # slave执行cluster failover,slave会变成 new master + slave_ips_list = list(slave_ips_set) + cluster_kwargs.exec_ip = slave_ips_list[0] + cluster_kwargs.cluster = { + "redis_master_slave_pairs": master_slave_pairs, + "redis_password": passwd_ret.get("redis_password"), + } + cluster_kwargs.get_redis_payload_func = RedisActPayload.redis_cluster_failover.__name__ + sub_pipeline.add_act( + act_name=_("slave执行cluster failover"), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(cluster_kwargs), + ) + # 断开new_master->new_slave同步关系 + # old master(new slave)上执行 cluster reset + flushall + cluster meet + reset_flush_meet_params = [] + for node in cluster_nodes: + slave_ip, slave_port = node["slave_addr"].split(":") + master_ip, master_port = node["master_addr"].split(":") + reset_flush_meet_params.append( + { + "reset_ip": master_ip, + "reset_port": int(master_port), + "reset_redis_password": passwd_ret.get("redis_password"), + "meet_ip": slave_ip, + "meet_port": int(slave_port), + "do_flushall": True, + "do_cluster_meet": True, + } + ) + cluster_kwargs.exec_ip = slave_ips_list[0] + cluster_kwargs.cluster = {"reset_flush_meet_params": reset_flush_meet_params} + cluster_kwargs.get_redis_payload_func = RedisActPayload.redis_clsuter_reset_flush_meet.__name__ + sub_pipeline.add_act( + act_name=_("new_master->new_slave断开同步关系"), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(cluster_kwargs), + ) + # 重建同步关系 + replica_pairs_params = [] + for node in cluster_nodes: + slave_ip, slave_port = node["slave_addr"].split(":") + master_ip, master_port = node["master_addr"].split(":") + replica_pairs_params.append( + { + "master_ip": slave_ip, + "master_port": int(slave_port), + "master_auth": passwd_ret.get("redis_password"), + "slave_ip": master_ip, + "slave_port": int(master_port), + "slave_password": passwd_ret.get("redis_password"), + } + ) + cluster_kwargs.exec_ip = slave_ips_list[0] + cluster_kwargs.cluster = {"replica_pairs": replica_pairs_params} + cluster_kwargs.get_redis_payload_func = RedisActPayload.redis_init_batch_replicate.__name__ + sub_pipeline.add_act( + act_name=_("new_master->new_slave重建同步关系"), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + # 更新元数据 + switch_master_slave_pairs = {"cluster_id": cluster.id, "replication_pairs": []} + for node in cluster_nodes: + slave_ip, slave_port = node["slave_addr"].split(":") + master_ip, master_port = node["master_addr"].split(":") + switch_master_slave_pairs["replication_pairs"].append( + { + "master_ip": master_ip, + "master_port": int(master_port), + "slave_ip": slave_ip, + "slave_port": int(slave_port), + } + ) + cluster_kwargs.cluster["meta_func_name"] = RedisDBMeta.swith_master_slave_for_cluster_faiover.__name__ + cluster_kwargs.cluster["switch_master_slave_pairs"] = switch_master_slave_pairs + sub_pipeline.add_act( + act_name=_("元数据更新"), + act_component_code=RedisDBMetaComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + sub_pipelines.append( + sub_pipeline.build_sub_process(sub_name=_("集群{}批量导入数据").format(cluster.immute_domain)) + ) + redis_pipeline.add_parallel_sub_pipeline(sub_flow_list=sub_pipelines) + redis_pipeline.run_pipeline() diff --git a/dbm-ui/backend/flow/engine/controller/redis.py b/dbm-ui/backend/flow/engine/controller/redis.py index 48debf1ee7..d94be79cfa 100644 --- a/dbm-ui/backend/flow/engine/controller/redis.py +++ b/dbm-ui/backend/flow/engine/controller/redis.py @@ -57,6 +57,7 @@ ) from backend.flow.engine.bamboo.scene.redis.redis_twemproxy_cluster_apply_flow import RedisClusterApplyFlow from backend.flow.engine.bamboo.scene.redis.single_proxy_shutdown import SingleProxyShutdownFlow +from backend.flow.engine.bamboo.scene.redis.tendisplus_lightning_data import TendisPlusLightningData from backend.flow.engine.controller.base import BaseController @@ -393,3 +394,10 @@ def redis_cluster_load_modules(self): """ flow = RedisClusterLoadModulesSceneFlow(root_id=self.root_id, data=self.ticket_data) flow.batch_clusters_load_modules() + + def tendisplus_lightning_data(self): + """ + tendisplus lightning 数据导入 + """ + flow = TendisPlusLightningData(root_id=self.root_id, data=self.ticket_data) + flow.lightning_data_flow() diff --git a/dbm-ui/backend/flow/plugins/components/collections/redis/tendisplus_lightning.py b/dbm-ui/backend/flow/plugins/components/collections/redis/tendisplus_lightning.py new file mode 100644 index 0000000000..97bd76442d --- /dev/null +++ b/dbm-ui/backend/flow/plugins/components/collections/redis/tendisplus_lightning.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 datetime +import json +import traceback +import uuid +from typing import List + +from django.db import transaction +from django.utils.translation import ugettext as _ +from pipeline.component_framework.component import Component +from pipeline.core.flow.activity import Service, StaticIntervalGenerator + +import backend.flow.utils.redis.redis_context_dataclass as flow_context +from backend.db_services.redis.redis_dts.models import TendisplusLightningJob, TendisplusLightningTask +from backend.flow.plugins.components.collections.common.base_service import BaseService +from backend.flow.utils.redis.redis_context_dataclass import ActKwargs, TendisplusLightningContext +from backend.flow.utils.redis.redis_proxy_util import get_cluster_info_by_cluster_id, lightning_cluster_nodes + + +class TendisplusClusterLightningService(BaseService): + """ + tendisplus集群迁移 + """ + + __need_schedule__ = True + interval = StaticIntervalGenerator(30) + + def _execute(self, data, parent_data): + kwargs: ActKwargs = data.get_one_of_inputs("kwargs") + global_data = data.get_one_of_inputs("global_data") + trans_data: TendisplusLightningContext = data.get_one_of_inputs("trans_data") + + if trans_data is None or trans_data == "${trans_data}": + # 表示没有加载上下文内容,则在此添加 + trans_data = getattr(flow_context, kwargs["set_trans_data_dataclass"])() + + if trans_data.ticket_id and trans_data.dst_cluster: + """如果 ticket_id 和 dst_cluster 已经存在,则表示已经执行过了,无需重复插入""" + return True + try: + ticket_id = int(global_data["uid"]) + bk_biz_id = int(global_data["bk_biz_id"]) + cluster_id = int(kwargs["cluster"]["cluster_id"]) + cos_file_keys = kwargs["cluster"]["cos_file_keys"] + cluster_info = get_cluster_info_by_cluster_id(cluster_id) + cluster_nodes_data = lightning_cluster_nodes(cluster_id=cluster_id) + with transaction.atomic(): + job = TendisplusLightningJob() + job.ticket_id = ticket_id + job.user = global_data["created_by"] + job.bk_biz_id = str(bk_biz_id) + job.bk_cloud_id = cluster_info["bk_cloud_id"] + job.dst_cluster = cluster_info["immute_domain"] + ":" + str(cluster_info["proxy_port"]) + job.dst_cluster_id = cluster_id + job.cluster_nodes = json.dumps(cluster_nodes_data) + job.create_time = datetime.datetime.now() + job.save() + + for cos_file_key in cos_file_keys: + task = TendisplusLightningTask() + task.task_id = uuid.uuid1().hex + task.ticket_id = job.ticket_id + task.user = job.user + task.bk_biz_id = job.bk_biz_id + task.bk_cloud_id = cluster_info["bk_cloud_id"] + task.cos_key = cos_file_key + task.cos_file_size = 0 + task.dts_server = "1.1.1.1" + task.dst_cluster = job.dst_cluster + task.dst_cluster_id = job.dst_cluster_id + task.dst_cluster_priority = 1 + task.dst_zonename = cluster_info["cluster_city_name"] + task.task_type = "" + task.status = 0 + task.create_time = datetime.datetime.now() + task.update_time = datetime.datetime.now() + task.save() + + except Exception as e: + traceback.print_exc() + self.log_error("tendisplus lightning failed:{}".format(e)) + return False + self.log_info("tendisplus lightning success") + trans_data.ticket_id = ticket_id + trans_data.dst_cluster = cluster_info["immute_domain"] + ":" + str(cluster_info["proxy_port"]) + data.outputs["trans_data"] = trans_data + return True + + def _schedule(self, data, parent_data, callback_data=None) -> bool: + kwargs = data.get_one_of_inputs("kwargs") + trans_data: TendisplusLightningContext = data.get_one_of_inputs("trans_data") + + if trans_data is None or trans_data == "${trans_data}": + # 表示没有加载上下文内容,则在此添加 + trans_data = getattr(flow_context, kwargs["set_trans_data_dataclass"])() + ticket_id = trans_data.ticket_id + dst_cluster = trans_data.dst_cluster + tasks_fows = TendisplusLightningTask.objects.filter(ticket_id=ticket_id, dst_cluster=dst_cluster) + if self.__is_any_task_fail(tasks_fows): + self.log_info(_("ticket_id:{} dst_cluster:{} 有任务失败").format(ticket_id, dst_cluster)) + self.finish_schedule() + return False + if self.__is_any_task_running(tasks_fows): + self.log_info(_("ticket_id:{} dst_cluster:{} 有任务仍然在运行中").format(ticket_id, dst_cluster)) + return True + # 任务全部都成功了 + self.log_info(_("ticket_id:{} dst_cluster:{} 全部任务执行成功").format(ticket_id, dst_cluster)) + self.finish_schedule() + return True + + def __is_any_task_fail(self, tasks: List[TendisplusLightningTask]) -> bool: + """ + 判断是否还有任务失败 + """ + for task in tasks: + if task.status == -1: + return True + + def __is_any_task_running(self, tasks: List[TendisplusLightningTask]) -> bool: + """ + 判断是否还有任务运行中 + """ + for task in tasks: + if task.status in [0, 1]: + return True + + def inputs_format(self) -> List: + return [ + Service.InputItem(name="kwargs", key="kwargs", type="dict", requiredc=True), + Service.InputItem(name="global_data", key="global_data", type="dict", required=True), + ] + + +class TendisplusClusterLightningComponent(Component): + name = __name__ + code = "tendisplus_cluster_lightning" + bound_service = TendisplusClusterLightningService diff --git a/dbm-ui/backend/flow/utils/cloud/cloud_act_payload.py b/dbm-ui/backend/flow/utils/cloud/cloud_act_payload.py index b8bf9fb1a4..f6c3b92482 100644 --- a/dbm-ui/backend/flow/utils/cloud/cloud_act_payload.py +++ b/dbm-ui/backend/flow/utils/cloud/cloud_act_payload.py @@ -216,6 +216,16 @@ def get_redis_dts_server_apply_payload(self): } paylod_json = json.dumps(paylod_obj) payload_base64 = base64_encode(paylod_json) + # update txy cos config + dts_config = SystemSettings.get_setting_value(key="TENDIS_DTS_CONFIG") + txycos_url = "not_found_url" + txycos_secret_id = "not_found_secret_id" + txycos_secret_key = "not_found_secret_key" + if dts_config and dts_config.get("txycos"): + txycos_url = dts_config["txycos"].get("url", "not_found_url") + txycos_secret_id = dts_config["txycos"].get("secret_id", "not_found_secret_id") + txycos_secret_key = dts_config["txycos"].get("secret_key", "not_found_secret_key") + return { "bk_dbm_nginx_url": nginx_url, "bk_dbm_cloud_id": self.cloud_id, @@ -226,6 +236,9 @@ def get_redis_dts_server_apply_payload(self): "warning_msg_notifiers": "xxxxx", "sys_init_paylod": payload_base64, "dns_servers": dns_servers, + "txycos_url": txycos_url, + "txycos_secret_id": txycos_secret_id, + "txycos_secret_key": txycos_secret_key, } def get_redis_dts_server_reduce_payload(self): diff --git a/dbm-ui/backend/flow/utils/cloud/script_template/redis_dts_server_template.py b/dbm-ui/backend/flow/utils/cloud/script_template/redis_dts_server_template.py index 128b77dd49..5c413b1e3a 100644 --- a/dbm-ui/backend/flow/utils/cloud/script_template/redis_dts_server_template.py +++ b/dbm-ui/backend/flow/utils/cloud/script_template/redis_dts_server_template.py @@ -38,6 +38,9 @@ system_password="{{system_password}}" city_name="{{city_name}}" warning_msg_notifiers="{{warning_msg_notifiers}}" +txycos_url="{{txycos_url}}" +txycos_secret_id="{{txycos_secret_id}}" +txycos_secret_key="{{txycos_secret_key}}" dts_server_tool="redis_dts_server" @@ -134,6 +137,9 @@ sed -i -e "s#VAR_system_password#$system_password#g" $conf_tmp_file sed -i -e "s#VAR_city_name#$city_name#g" $conf_tmp_file sed -i -e "s#VAR_warning_msg_notifiers#$warning_msg_notifiers#g" $conf_tmp_file + sed -i -e "s#VAR_txycos_url#$txycos_url#g" $conf_tmp_file + sed -i -e "s#VAR_txycos_secret_id#$txycos_secret_id#g" $conf_tmp_file + sed -i -e "s#VAR_txycos_secret_key#$txycos_secret_key#g" $conf_tmp_file echo "generate tmp config file:$conf_tmp_file success" } diff --git a/dbm-ui/backend/flow/utils/mongodb/mongodb_repo.py b/dbm-ui/backend/flow/utils/mongodb/mongodb_repo.py index ad6a2e6834..7fc11038e2 100644 --- a/dbm-ui/backend/flow/utils/mongodb/mongodb_repo.py +++ b/dbm-ui/backend/flow/utils/mongodb/mongodb_repo.py @@ -12,7 +12,6 @@ from backend.flow.utils.mongodb import mongodb_password from backend.ticket.constants import InstanceType - # entities # Node -> ReplicaSet -> Cluster[Rs,ShardedCluster] # MongoNodeWithLabel diff --git a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py index b660d01af3..bb9eb4e94b 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py +++ b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py @@ -2095,12 +2095,12 @@ def redis_cluster_failover(self, **kwargs) -> dict: "redis_password":"xxxx", "redis_master_slave_pairs":[ { - "master": {"ip":"a.a.a.a","port":"30000"}, - "slave": {"ip":"b.b.b.b","port":"30000"} + "master": {"ip":"a.a.a.a","port":30000}, + "slave": {"ip":"b.b.b.b","port":30000} }, { - "master": {"ip":"a.a.a.a","port":"30001"}, - "slave": {"ip":"b.b.b.b","port":"30001"} + "master": {"ip":"a.a.a.a","port":30001}, + "slave": {"ip":"b.b.b.b","port":30001} } ], "force":false @@ -2445,3 +2445,30 @@ def redis_custer_rename_domain_update_dbconfig(self, cluster_map: dict) -> Any: "level_value": new_domain, } DBConfigApi.upsert_conf_item(upsert_param) + + def tendisplus_reshape(self, **kwargs) -> dict: + """ + tendisplus reshape + """ + params = kwargs["params"] + return { + "db_type": DBActuatorTypeEnum.Redis.value, + "action": DBActuatorTypeEnum.Redis.value + "_" + RedisActuatorActionEnum.RESHAPE.value, + "payload": { + "instances": params["instances"], + "redis_password": params["redis_password"], + }, + } + + def redis_clsuter_reset_flush_meet(self, **kwargs) -> dict: + """ + redis cluster reset+flush+meet + """ + params = kwargs["params"] + return { + "db_type": DBActuatorTypeEnum.Redis.value, + "action": DBActuatorTypeEnum.Redis.value + "_" + RedisActuatorActionEnum.CLUSTER_RESET_FLUSH_MEET.value, + "payload": { + "reset_flush_meet_params": params["reset_flush_meet_params"], + }, + } diff --git a/dbm-ui/backend/flow/utils/redis/redis_context_dataclass.py b/dbm-ui/backend/flow/utils/redis/redis_context_dataclass.py index 8e5e4c9536..cee9eb0255 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_context_dataclass.py +++ b/dbm-ui/backend/flow/utils/redis/redis_context_dataclass.py @@ -201,3 +201,15 @@ class DownloadBackupFileKwargs: login_passwd: str cluster: dict = None tendis_backup_info: list = None # 占位:执行备份后的信息 + + +@dataclass() +class TendisplusLightningContext: + """ + 定义tendisplus lightning 数据批量导入的变量结构体 + """ + + redis_act_payload: Optional[Any] = None # 代表获取payload参数的类 + tendis_backup_info: list = None # 执行备份后的信息 + ticket_id: int = None # 代表dts job id,对应表tb_tendis_dts_job + dst_cluster: str = None # 代表目标集群 diff --git a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py index 7d158a034e..118fd3f65a 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py +++ b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py @@ -1816,3 +1816,70 @@ def update_cluster_entry(self) -> bool: ) ) return True + + @transaction.atomic + def swith_master_slave_for_cluster_faiover(self): + """ + 交换cluster集群的master和slave + cluster["switch_master_slave_pairs"]={ + "cluster_id": 1, + "replication_pairs": [ + {"master_ip": "a.a.a.a", "master_port": 30000, "slave_ip": "b.b.b.b", "slave_port": 30000}, + {"master_ip": "a.a.a.a", "master_port": 30001, "slave_ip": "b.b.b.b", "slave_port": 30001} + ] + } + """ + switch_master_slave_pairs = self.cluster["switch_master_slave_pairs"] + cluster = Cluster.objects.get(id=switch_master_slave_pairs["cluster_id"]) + cc_manage = CcManage(cluster.bk_biz_id, cluster.cluster_type) + bk_host_ids = [] + for replication_pair in switch_master_slave_pairs["replication_pairs"]: + master_ip = replication_pair["master_ip"] + master_port = replication_pair["master_port"] + slave_ip = replication_pair["slave_ip"] + slave_port = replication_pair["slave_port"] + + master_obj = cluster.storageinstance_set.get(machine__ip=master_ip, port=master_port) + if not master_obj: + raise Exception( + _("cluster:{} master实例 {}:{} 不存在").format(cluster.immute_domain, master_ip, master_port) + ) + + slave_obj = cluster.storageinstance_set.get(machine__ip=slave_ip, port=slave_port) + if not slave_obj: + raise Exception(_("cluster:{} slave实例 {}:{} 不存在").format(cluster.immute_domain, slave_ip, slave_port)) + + bk_host_ids.append(master_obj.machine.bk_host_id) + bk_host_ids.append(slave_obj.machine.bk_host_id) + + new_master_obj = slave_obj + new_master_obj.instance_role = InstanceRole.REDIS_MASTER + new_master_obj.instance_inner_role = InstanceInnerRole.MASTER + new_master_obj.cluster_type = cluster.cluster_type + new_master_obj.save(update_fields=["instance_role", "instance_inner_role", "cluster_type"]) + + new_slave_obj = master_obj + new_slave_obj.instance_role = InstanceRole.REDIS_SLAVE + new_slave_obj.instance_inner_role = InstanceInnerRole.SLAVE + new_slave_obj.cluster_type = cluster.cluster_type + new_slave_obj.save(update_fields=["instance_role", "instance_inner_role", "cluster_type"]) + + StorageInstanceTuple.objects.filter(ejector=master_obj, receiver=slave_obj).update( + ejector=new_master_obj, receiver=new_slave_obj + ) + + for proxy in cluster.proxyinstance_set.all(): + proxy.storageinstance.remove(master_obj) + proxy.storageinstance.add(new_master_obj) + proxy.save() + # 切换新master服务实例角色标签 + cc_manage.add_label_for_service_instance( + bk_instance_ids=[new_master_obj.bk_instance_id], + labels_dict={"instance_role": InstanceRole.REDIS_MASTER.value}, + ) + # 切换新slave服务实例角色标签 + cc_manage.add_label_for_service_instance( + bk_instance_ids=[new_slave_obj.bk_instance_id], + labels_dict={"instance_role": InstanceRole.REDIS_SLAVE.value}, + ) + cc_manage.update_host_properties(bk_host_ids) diff --git a/dbm-ui/backend/flow/utils/redis/redis_proxy_util.py b/dbm-ui/backend/flow/utils/redis/redis_proxy_util.py index c4ea061b7f..ae8a4265ec 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_proxy_util.py +++ b/dbm-ui/backend/flow/utils/redis/redis_proxy_util.py @@ -46,9 +46,12 @@ ConfigTypeEnum, MediumEnum, RedisCapacityUpdateType, + RedisRole, ) from backend.flow.utils.base.payload_handler import PayloadHandler +from backend.flow.utils.redis.redis_cluster_nodes import decode_cluster_nodes from backend.flow.utils.redis.redis_util import version_ge +from backend.utils.string import base64_encode logger = logging.getLogger("flow") @@ -1107,3 +1110,56 @@ async def async_handler(cluster_ids: List[int]): await asyncio.gather(*tasks) return asyncio.run(async_handler(cluster_ids)) + + +def lightning_cluster_nodes(cluster_id: int) -> list: + """ + 解析redis 'cluster nodes'命令返回的信息 + return: + [ + {"master_addr":"a.a.a.a:30000","slave_addr":"b.b.b.b:30000","slots":"0-4095","redis_password":"xxxx"} + {"master_addr":"c.c.c.c:30000","slave_addr":"d.d.d.d:30000","slots":"4096-8191","redis_password":"xxxx"} + ] + """ + cluster = Cluster.objects.get(id=cluster_id) + one_master = cluster.storageinstance_set.filter( + instance_role=InstanceRole.REDIS_MASTER.value, status=InstanceStatus.RUNNING + ).first() + passwd_ret = PayloadHandler.redis_get_cluster_password(cluster) + master_addrs = ["{}:{}".format(one_master.machine.ip, one_master.port)] + resp = DRSApi.redis_rpc( + { + "addresses": master_addrs, + "db_num": 0, + "password": passwd_ret.get("redis_password"), + "command": "cluster nodes", + "bk_cloud_id": cluster.bk_cloud_id, + } + ) + if len(resp) == 0 or (not resp[0]["result"]): + raise Exception(_("redis集群 {} master {} cluster nodes 命令执行失败").format(cluster.immute_domain, master_addrs)) + cluster_nodes_raw_data = resp[0]["result"] + node_ret = decode_cluster_nodes(cluster_nodes_raw_data) + node_list = node_ret[0] + id_nodemap = {node.node_id: node for node in node_list} + master_to_item = {} + redis_password_encode = base64_encode(passwd_ret.get("redis_password")) + for node in node_list: + if node.get_role() == RedisRole.SLAVE.value and node.is_running(): + master_id = node.master_id + master_node = id_nodemap.get(master_id) + master_to_item[master_node.addr] = { + "master_addr": master_node.addr, + "slave_addr": node.addr, + "slots": master_node.slot_src_str, + "redis_password_encode": redis_password_encode, + } + masters_with_slots = [] + for node in node_list: + if node.get_role() == RedisRole.MASTER.value and node.slot_cnt > 0: + masters_with_slots.append(node) + for master in masters_with_slots: + master_addr = master.addr + if master_addr not in master_to_item: + raise Exception(_("redis集群 {} master {} 没有对应running的slave节点").format(cluster.immute_domain, master_addr)) + return list(master_to_item.values()) diff --git a/dbm-ui/backend/ticket/builders/redis/tendisplus_lightning_data.py b/dbm-ui/backend/ticket/builders/redis/tendisplus_lightning_data.py new file mode 100644 index 0000000000..02c3b123e3 --- /dev/null +++ b/dbm-ui/backend/ticket/builders/redis/tendisplus_lightning_data.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 logging.config + +from django.utils.translation import ugettext_lazy as _ +from rest_framework import serializers + +from backend.flow.engine.bamboo.scene.redis.tendisplus_lightning_data import TendisPlusLightningData +from backend.flow.engine.controller.redis import RedisController +from backend.ticket import builders +from backend.ticket.builders.common.base import SkipToRepresentationMixin +from backend.ticket.builders.redis.base import BaseRedisTicketFlowBuilder, ClusterValidateMixin +from backend.ticket.constants import TicketType + +logger = logging.getLogger("flow") + + +class TendisPlusLightningDataSerializer(SkipToRepresentationMixin, serializers.Serializer): + """TendisPlus闪电导入数据""" + + class InfoSerializer(ClusterValidateMixin, serializers.Serializer): + cluster_id = serializers.IntegerField(help_text=_("集群ID")) + cos_file_keys = serializers.ListField(help_text=_("cos文件key列表"), child=serializers.CharField()) + + infos = serializers.ListField(help_text=_("参数列表"), child=InfoSerializer()) + + def validate(self, attr): + TendisPlusLightningData.precheck(attr["infos"]) + return attr + + +class TendisplusLightingDataParamBuilder(builders.FlowParamBuilder): + controller = RedisController.tendisplus_lightning_data + + def format_ticket_data(self): + super().format_ticket_data() + + +@builders.BuilderFactory.register(TicketType.REDIS_TENDISPLUS_LIGHTNING_DATA, is_apply=False) +class RedisClusterRenameDomainFlowBuilder(BaseRedisTicketFlowBuilder): + serializer = TendisPlusLightningDataSerializer + inner_flow_builder = TendisplusLightingDataParamBuilder + inner_flow_name = _("tendisplus闪电导入数据") + default_need_itsm = False + default_need_manual_confirm = True + + def patch_ticket_detail(self): + super().patch_ticket_detail() diff --git a/dbm-ui/backend/ticket/constants.py b/dbm-ui/backend/ticket/constants.py index c09ab262ad..b23ddd8afe 100644 --- a/dbm-ui/backend/ticket/constants.py +++ b/dbm-ui/backend/ticket/constants.py @@ -335,9 +335,10 @@ def get_cluster_type_by_ticket(cls, ticket_type): REDIS_CLUSTER_PROXYS_UPGRADE = TicketEnumField("REDIS_CLUSTER_PROXYS_UPGRADE", _("Redis 集群proxys版本升级"), register_iam=False) # noqa REDIS_DIRTY_MACHINE_CLEAR = TicketEnumField("REDIS_DIRTY_MACHINE_CLEAR", _("Redis脏机清理"), register_iam=False) REDIS_CLUSTER_STORAGES_CLI_CONNS_KILL = TicketEnumField("REDIS_CLUSTER_STORAGES_CLI_CONNS_KILL", _("Redis 集群存储层cli连接kill"), register_iam=False) # noqa - REDIS_CLUSTER_RENAME_DOMAIN = TicketEnumField("REDIS_CLUSTER_RENAME_DOMAIN", _("Redis集群域名重命名")) + REDIS_CLUSTER_RENAME_DOMAIN = TicketEnumField("REDIS_CLUSTER_RENAME_DOMAIN", _("Redis集群域名重命名"), _("集群维护")) REDIS_CLUSTER_MAXMEMORY_SET = TicketEnumField("REDIS_CLUSTER_MAXMEMORY_SET", _("Redis 集群设置maxmemory")) # noqa REDIS_CLUSTER_LOAD_MODULES = TicketEnumField("REDIS_CLUSTER_LOAD_MODULES", _("Redis 集群加载modules")) # noqa + REDIS_TENDISPLUS_LIGHTNING_DATA= TicketEnumField("REDIS_TENDISPLUS_LIGHTNING_DATA", _("Tendisplus闪电导入数据"), _("集群维护")) # noqa # 大数据 KAFKA_APPLY = TicketEnumField("KAFKA_APPLY", _("Kafka 集群部署"), register_iam=False) From da0785abfeea8d88629c289e916c66146ec88e1b Mon Sep 17 00:00:00 2001 From: xiepaup Date: Fri, 20 Sep 2024 15:27:48 +0800 Subject: [PATCH 015/164] =?UTF-8?q?fix(dbm-services):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?Redis=E4=B8=BB=E4=BB=8E=E5=9F=9F=E5=90=8D=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20#7044?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_meta/api/dbha/apis.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dbm-ui/backend/db_meta/api/dbha/apis.py b/dbm-ui/backend/db_meta/api/dbha/apis.py index 0aead585df..c591f8e2ce 100644 --- a/dbm-ui/backend/db_meta/api/dbha/apis.py +++ b/dbm-ui/backend/db_meta/api/dbha/apis.py @@ -40,12 +40,14 @@ BKCity, Cluster, ClusterDBHAExt, + ClusterEntry, ProxyInstance, StorageInstance, StorageInstanceTuple, ) from backend.db_meta.request_validator import DBHASwapRequestSerializer, DBHAUpdateStatusRequestSerializer from backend.flow.utils.cc_manage import CcManage +from backend.flow.utils.dns_manage import DnsManage from backend.flow.utils.sqlserver.sqlserver_host import Host logger = logging.getLogger("root") @@ -314,6 +316,8 @@ def tendis_cluster_swap(payload: Dict, bk_cloud_id: int): # 1. master 故障,需要把master 的entry 转移到 slave ,重建热备的时候,再纠正slave域名 for bind_entry in ins1_obj.bind_entry.all(): entry_obj = cluster_obj.clusterentry_set.get(id=bind_entry.id) + if entry_obj.cluster_entry_type == ClusterEntryType.DNS.value: + switch_instance_domain(ins1_obj, ins2_obj, entry_obj) ins1_obj.bind_entry.remove(entry_obj) ins2_obj.bind_entry.add(entry_obj) # 2. slave 故障,需要把slave 的entry 转移到master,重建热备的时候,再纠正slave域名 // TODO(update_status.) @@ -348,6 +352,18 @@ def tendis_cluster_swap(payload: Dict, bk_cloud_id: int): swap_cc_svr_instance_role(ins1_obj, ins2_obj) +@transaction.atomic +def switch_instance_domain(ins1, ins2: StorageInstance, entry_obj: ClusterEntry): + dns_manage = DnsManage(bk_biz_id=ins1.bk_biz_id, bk_cloud_id=ins1.machine.bk_cloud_id) + old_instance = "{}#{}".format(ins1.machine.ip, ins1.port) + new_instance = "{}#{}".format(ins2.machine.ip, ins2.port) + logger.info("try update dns pointer {} from {} to {}".format(entry_obj.entry, ins1, ins2)) + if not dns_manage.update_domain( + old_instance=old_instance, new_instance=new_instance, update_domain_name=entry_obj.entry + ): + raise Exception("update domain {} failed ".format(entry_obj.domain)) + + @transaction.atomic def swap_ctl_role(payloads: List): DBHASwapRequestSerializer(data={"payloads": payloads}).is_valid(raise_exception=True) From 518849bb747f06165b55bec988e4b1a71009b625 Mon Sep 17 00:00:00 2001 From: hlinx <327159425@qq.com> Date: Thu, 19 Sep 2024 17:46:25 +0800 Subject: [PATCH 016/164] =?UTF-8?q?chore(frontend):=20ts=20=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E4=BC=98=E5=8C=96=20#7003?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/apply-items/CloudItem.vue | 20 +- .../cluster-details/common/useRenderGraph.tsx | 243 +- .../components/cluster-entry-config/Index.vue | 7 +- .../cluster-monitor/MonitorDashboard.vue | 30 - .../components/RenderTopoHost.vue | 15 +- .../src/components/permission/Dialog.vue | 106 - .../src/components/permission/Main.vue | 97 - dbm-ui/frontend/src/hooks/useCreateTicket.tsx | 75 + .../components/ModuleConfig.vue | 2 +- .../services/model/db-resource/DbResource.ts | 2 +- .../src/services/model/riak/riak-instance.ts | 98 + .../services/model/ticket/details/redis.ts | 3 +- .../details/sqlserver/authorizeRules.ts | 12 + .../model/ticket/details/sqlserver/index.ts | 1 + dbm-ui/frontend/src/services/redis/toolbox.ts | 234 -- .../src/services/source/bizSetting.ts | 10 + .../source/{cluster.ts => clusterEntry.ts} | 12 + .../frontend/src/services/source/clusters.ts | 144 - dbm-ui/frontend/src/services/source/cmdb.ts | 72 +- dbm-ui/frontend/src/services/source/common.ts | 130 - .../frontend/src/services/source/configs.ts | 139 +- dbm-ui/frontend/src/services/source/dbha.ts | 58 +- dbm-ui/frontend/src/services/source/dumper.ts | 2 +- dbm-ui/frontend/src/services/source/iam.ts | 37 +- .../src/services/source/influxdbGroup.ts | 44 +- dbm-ui/frontend/src/services/source/infras.ts | 33 +- .../frontend/src/services/source/ipchooser.ts | 89 +- .../src/services/source/mysqlCluster.ts | 9 - .../frontend/src/services/source/package.ts | 36 +- .../src/services/source/permission.ts | 28 +- .../frontend/src/services/source/profile.ts | 15 +- .../src/services/source/quickSearch.ts | 2 +- dbm-ui/frontend/src/services/source/redis.ts | 36 +- dbm-ui/frontend/src/services/source/report.ts | 2 +- dbm-ui/frontend/src/services/source/riak.ts | 41 +- dbm-ui/frontend/src/services/source/spider.ts | 77 +- .../src/services/source/sqlServerImport.ts | 26 - ...qlServerMigrate.ts => sqlserverMigrate.ts} | 0 .../src/services/source/sqlserverSqlImport.ts | 22 +- .../src/services/source/system-setting.ts | 16 - .../src/services/source/systemSettings.ts | 5 + .../frontend/src/services/source/tendbha.ts | 40 +- .../src/services/source/tendbsingle.ts | 42 +- .../src/services/types/baseResponse.ts | 19 - .../frontend/src/services/types/clusters.ts | 341 +-- dbm-ui/frontend/src/services/types/common.ts | 142 - dbm-ui/frontend/src/services/types/configs.ts | 228 -- .../src/services/types/eventSwitch.ts | 46 - dbm-ui/frontend/src/services/types/index.ts | 5 +- .../src/services/types/influxdbGroup.ts | 23 - dbm-ui/frontend/src/services/types/ip.ts | 132 - .../frontend/src/services/types/permission.ts | 86 +- .../src/services/types/resourceInstance.ts | 60 - .../src/services/types/resourceItem.ts | 74 - .../src/services/types/searchFilterItem.ts | 20 - .../src/services/types/staffSetting.ts | 23 - .../frontend/src/services/types/taskflow.ts | 108 +- dbm-ui/frontend/src/services/types/ticket.ts | 361 +-- .../src/services/types/versionFiles.ts | 97 - .../frontend/src/services/types/whitelist.ts | 31 - dbm-ui/frontend/src/types/auto-imports.d.ts | 1 - dbm-ui/frontend/src/types/index.d.ts | 6 - .../influxdb/apply/components/GroupItem.vue | 3 +- .../components/render-list/Index.vue | 3 +- .../components/detail/Index.vue | 6 +- .../components/detail/components/BaseInfo.vue | 4 +- .../components/variable-box/Index.vue | 2 +- .../components/detail/Index.vue | 6 +- .../components/detail/components/BaseInfo.vue | 4 +- .../cluster-oprations/ClusterPassword.vue | 10 +- .../data-check-repair/pages/page1/Index.vue | 16 +- .../redis/db-data-copy/pages/page1/Index.vue | 19 +- .../redis/db-structure/pages/page1/Index.vue | 3 +- .../list-ha/components/detail/BaseInfo.vue | 4 +- .../redis/list-ha/components/detail/Index.vue | 6 +- .../redis/list-ha/components/list/Index.vue | 9 +- .../redis/list/components/detail/BaseInfo.vue | 4 +- .../redis/list/components/detail/Index.vue | 8 +- .../redis/list/components/list/Index.vue | 2455 +++++++++-------- .../components/list/components/EntryPanel.vue | 2 +- .../proxy-scale-down/pages/page1/Index.vue | 3 +- .../pages/page1/Index.vue | 10 +- .../sqlserver/data-migrate-record/Index.vue | 2 +- .../components/RenderData/RenderNewSlave.vue | 2 +- .../list/components/list/Index.vue | 3 +- .../components/variable-box/Index.vue | 2 +- .../cluster-selector-table/Index.vue | 11 +- .../tendb-cluster/whitelist/Index.vue | 329 --- .../components/edit-rule/CustomRotate.vue | 4 +- .../components/edit-rule/SortTagInput.vue | 4 +- .../components/spec-form-item/SpecDevice.vue | 2 +- .../components/RenderManualInput.vue | 318 --- .../components/demand-factory/common/types.ts | 38 - .../demand-factory/components/DemandInfo.vue | 4 +- .../mongodb/script-execute/Index.vue | 3 +- .../spider/TargetClusterPreview.vue | 8 +- .../sqlserver/AuthorizeRules.vue | 5 +- .../common/hooks/useTargetClusterData.ts | 15 +- .../components/flow/components/MySqlFlows.vue | 8 +- .../version-files/list/components/types.ts | 20 +- 100 files changed, 2058 insertions(+), 5212 deletions(-) delete mode 100644 dbm-ui/frontend/src/components/permission/Dialog.vue delete mode 100644 dbm-ui/frontend/src/components/permission/Main.vue create mode 100644 dbm-ui/frontend/src/hooks/useCreateTicket.tsx create mode 100644 dbm-ui/frontend/src/services/model/riak/riak-instance.ts create mode 100644 dbm-ui/frontend/src/services/model/ticket/details/sqlserver/authorizeRules.ts delete mode 100644 dbm-ui/frontend/src/services/redis/toolbox.ts rename dbm-ui/frontend/src/services/source/{cluster.ts => clusterEntry.ts} (81%) delete mode 100644 dbm-ui/frontend/src/services/source/clusters.ts delete mode 100644 dbm-ui/frontend/src/services/source/common.ts delete mode 100644 dbm-ui/frontend/src/services/source/sqlServerImport.ts rename dbm-ui/frontend/src/services/source/{sqlServerMigrate.ts => sqlserverMigrate.ts} (100%) delete mode 100644 dbm-ui/frontend/src/services/source/system-setting.ts delete mode 100644 dbm-ui/frontend/src/services/types/baseResponse.ts delete mode 100644 dbm-ui/frontend/src/services/types/configs.ts delete mode 100644 dbm-ui/frontend/src/services/types/eventSwitch.ts delete mode 100644 dbm-ui/frontend/src/services/types/influxdbGroup.ts delete mode 100644 dbm-ui/frontend/src/services/types/ip.ts delete mode 100644 dbm-ui/frontend/src/services/types/resourceInstance.ts delete mode 100644 dbm-ui/frontend/src/services/types/resourceItem.ts delete mode 100644 dbm-ui/frontend/src/services/types/searchFilterItem.ts delete mode 100644 dbm-ui/frontend/src/services/types/staffSetting.ts delete mode 100644 dbm-ui/frontend/src/services/types/versionFiles.ts delete mode 100644 dbm-ui/frontend/src/services/types/whitelist.ts delete mode 100644 dbm-ui/frontend/src/views/db-manage/tendb-cluster/whitelist/Index.vue delete mode 100644 dbm-ui/frontend/src/views/temporary-paassword-modify/index/components/password-instance-selector/components/RenderManualInput.vue diff --git a/dbm-ui/frontend/src/components/apply-items/CloudItem.vue b/dbm-ui/frontend/src/components/apply-items/CloudItem.vue index c1593ea1ab..a6f4f45b21 100644 --- a/dbm-ui/frontend/src/components/apply-items/CloudItem.vue +++ b/dbm-ui/frontend/src/components/apply-items/CloudItem.vue @@ -36,20 +36,19 @@ diff --git a/dbm-ui/frontend/src/components/permission/Main.vue b/dbm-ui/frontend/src/components/permission/Main.vue deleted file mode 100644 index 97b8e337e1..0000000000 --- a/dbm-ui/frontend/src/components/permission/Main.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - diff --git a/dbm-ui/frontend/src/hooks/useCreateTicket.tsx b/dbm-ui/frontend/src/hooks/useCreateTicket.tsx new file mode 100644 index 0000000000..6a108b4e74 --- /dev/null +++ b/dbm-ui/frontend/src/hooks/useCreateTicket.tsx @@ -0,0 +1,75 @@ +import InfoBox from 'bkui-vue/lib/info-box'; +import { useI18n } from 'vue-i18n'; +import { useRouter } from 'vue-router'; + +import { createTicket } from '@services/source/ticket'; + +import { messageError, messageSuccess } from '@utils'; + +export const useCreateTicket = (params: Record) => { + const { t, locale } = useI18n(); + const router = useRouter(); + + createTicket(params) + .then(() => messageSuccess(t('单据创建成功'))) + .catch((e) => { + const { code, data } = e; + const duplicateCode = 8704005; + if (code === duplicateCode) { + const id = data.duplicate_ticket_id; + + InfoBox({ + title: t('是否继续提交单据'), + content: () => { + const route = router.resolve({ + name: 'bizTicketManage', + query: { + id, + }, + }); + + if (locale.value === 'en') { + return ( + + You have already submitted a + + {' '} + ticket[{id}]{' '} + + with the same target cluster, continue? + + ); + } + + return ( + + 你已提交过包含相同目标集群的 + + 单据[{id}] + + ,是否继续? + + ); + }, + confirmText: t('继续提单'), + cancelText: t('取消提单'), + onConfirm: async () => { + try { + await createTicket({ + ...params, + ignore_duplication: true, + }); + } catch (e: any) { + messageError(e?.message); + } + }, + }); + } + + messageError(e.message); + }); +}; diff --git a/dbm-ui/frontend/src/layout/components/database-manage/components/ModuleConfig.vue b/dbm-ui/frontend/src/layout/components/database-manage/components/ModuleConfig.vue index cca1f85183..687b808da2 100644 --- a/dbm-ui/frontend/src/layout/components/database-manage/components/ModuleConfig.vue +++ b/dbm-ui/frontend/src/layout/components/database-manage/components/ModuleConfig.vue @@ -99,7 +99,7 @@ import { useRequest } from 'vue-request'; import Vuedraggable from 'vuedraggable'; - import { getBizSettingList, updateBizSetting } from '@services/source/system-setting'; + import { getBizSettingList, updateBizSetting } from '@services/source/bizSetting'; import { messageSuccess } from '@utils'; diff --git a/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts b/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts index 0ffbaaffd9..7a703f2bc1 100644 --- a/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts +++ b/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts @@ -99,6 +99,6 @@ export default class DbResource { } get isAbnormal() { - return this.agent_status === 0 + return this.agent_status === 0; } } diff --git a/dbm-ui/frontend/src/services/model/riak/riak-instance.ts b/dbm-ui/frontend/src/services/model/riak/riak-instance.ts new file mode 100644 index 0000000000..026dcd553e --- /dev/null +++ b/dbm-ui/frontend/src/services/model/riak/riak-instance.ts @@ -0,0 +1,98 @@ +export default class RiakInstance { + bk_cloud_id: number; + bk_cloud_name: string; + bk_host_id: number; + cluster_id: number; + cluster_name: string; + cluster_type: string; + create_at: string; + db_module_id: number; + db_module_name: string; + host_info: { + alive: number; + biz: { + id: number; + name: string; + }; + cloud_area: { + id: number; + name: string; + }; + cloud_id: number; + host_id: number; + host_name: string; + ip: string; + ipv6: string; + meta: { + bk_biz_id: number; + scope_id: number; + scope_type: string; + }; + scope_id: string; + scope_type: string; + os_name: string; + bk_cpu: number; + bk_disk: number; + bk_mem: number; + os_type: string; + agent_id: number; + cpu: string; + cloud_vendor: string; + bk_idc_name: string; + }; + id: number; + instance_address: string; + ip: string; + master_domain: string; + port: number; + related_clusters: { + alias: string; + bk_biz_id: number; + bk_cloud_id: number; + cluster_name: string; + cluster_type: string; + creator: string; + db_module_id: number; + id: number; + major_version: string; + master_domain: string; + phase: string; + region: string; + status: string; + time_zone: string; + updater: string; + }[]; + role: string; + slave_domain: string; + spec_config: { + id: number; + }; + status: string; + version: string; + permission: Record; + + constructor(payload = {} as RiakInstance) { + this.bk_cloud_id = payload.bk_cloud_id; + this.bk_cloud_name = payload.bk_cloud_name; + this.bk_host_id = payload.bk_host_id; + this.cluster_id = payload.cluster_id; + this.cluster_name = payload.cluster_name; + this.cluster_type = payload.cluster_type; + this.create_at = payload.create_at; + this.db_module_id = payload.db_module_id; + this.db_module_name = payload.db_module_name; + this.host_info = payload.host_info; + this.id = payload.id; + this.instance_address = payload.instance_address; + this.ip = payload.ip; + this.master_domain = payload.master_domain; + this.port = payload.port; + this.related_clusters = payload.related_clusters || []; + this.role = payload.role; + this.slave_domain = payload.slave_domain; + this.spec_config = payload.spec_config; + this.status = payload.status; + this.version = payload.version; + this.permission = payload.permission; + } +} diff --git a/dbm-ui/frontend/src/services/model/ticket/details/redis.ts b/dbm-ui/frontend/src/services/model/ticket/details/redis.ts index 28c03a4d98..3e549d70bf 100644 --- a/dbm-ui/frontend/src/services/model/ticket/details/redis.ts +++ b/dbm-ui/frontend/src/services/model/ticket/details/redis.ts @@ -18,8 +18,7 @@ import { RepairAndVerifyModes, WriteModes, } from '@services/model/redis/redis-dst-history-job'; -import type { ExecuteModes, OnlineSwitchType, RepairModes } from '@services/types/common'; -import type { HostDetails } from '@services/types/ip'; +import type { ExecuteModes, HostDetails, OnlineSwitchType, RepairModes } from '@services/types'; import type { ClusterTypes } from '@common/const'; diff --git a/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/authorizeRules.ts b/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/authorizeRules.ts new file mode 100644 index 0000000000..93c03acf9c --- /dev/null +++ b/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/authorizeRules.ts @@ -0,0 +1,12 @@ +import type { DetailBase } from '../common'; + +export interface authorizeRules extends DetailBase { + authorize_data: { + user: string; + target_instances: string[]; + access_dbs: string[]; + cluster_type: string; + }[]; + authorize_uid: string; + excel_url: string; +} diff --git a/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/index.ts b/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/index.ts index eff8ac5f4b..cad9ce24d3 100644 --- a/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/index.ts +++ b/dbm-ui/frontend/src/services/model/ticket/details/sqlserver/index.ts @@ -1,4 +1,5 @@ export * from './addSlave'; +export * from './authorizeRules'; export * from './backupDb'; export * from './clearDbs'; export * from './dataMigrate'; diff --git a/dbm-ui/frontend/src/services/redis/toolbox.ts b/dbm-ui/frontend/src/services/redis/toolbox.ts deleted file mode 100644 index 1ffbb5081f..0000000000 --- a/dbm-ui/frontend/src/services/redis/toolbox.ts +++ /dev/null @@ -1,234 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 http from '@services/http'; -import RedisModel from '@services/model/redis/redis'; -import RedisClusterNodeByIpModel from '@services/model/redis/redis-cluster-node-by-ip'; -import RedisDSTHistoryJobModel from '@services/model/redis/redis-dst-history-job'; -import RedisDSTJobTaskModel from '@services/model/redis/redis-dst-job-task'; -import RedisHostModel from '@services/model/redis/redis-host'; -import RedisRollbackModel from '@services/model/redis/redis-rollback'; -import type { ResourceInstance } from '@services/types'; - -import { useGlobalBizs } from '@stores'; - -import type { ListBase } from '../types'; -import type { InstanceInfos } from '../types/clusters'; - -interface InstanceItem extends Omit { - spec_config: RedisClusterNodeByIpModel['spec_config']; -} - -interface MasterSlaveByIp { - cluster: { - bk_cloud_id: number; - cluster_type: string; - deploy_plan_id: number; - id: number; - immute_domain: string; - major_version: string; - name: string; - region: string; - }; - instances: { - bk_biz_id: number; - bk_cloud_id: number; - bk_host_id: number; - bk_instance_id: number; - instance: string; - ip: string; - name: string; - phase: string; - port: number; - status: string; - }[]; - master_ip: string; - slave_ip: string; -} - -// 根据cluster_id查询主从关系对 -export const queryMasterSlavePairs = (params: { cluster_id: number }) => { - const { currentBizId } = useGlobalBizs(); - return http.post< - { - master_ip: string; - slave_ip: string; - }[] - >(`/apis/redis/bizs/${currentBizId}/toolbox/query_master_slave_pairs/`, params); -}; - -// 查询集群下的主机列表(主从切换) -export const listClusterHostsMasterFailoverProxy = async (obj: { - bk_biz_id: number; - role?: string; - cluster_id?: number; - instance_address?: string; -}) => { - const params = { - ip: obj.instance_address, - cluster_id: obj.cluster_id, - role: obj.role, - }; - if (!obj.instance_address) { - delete params.ip; - } - if (!obj.role) { - delete params.role; - } - return http - .post(`/apis/redis/bizs/${obj.bk_biz_id}/toolbox/query_cluster_ips/`, params) - .then((data) => { - const filterArr = data.map((item) => new RedisHostModel(item)).filter((item) => item.isMaster); - const count = filterArr.length; - return { - count, - results: filterArr, - }; - }); -}; - -// 查询集群下的主机列表(重建从库) -export const listClusterHostsCreateSlaveProxy = async (obj: { - bk_biz_id: number; - role?: string; - cluster_id?: number; - instance_address?: string; -}) => { - const params = { - ip: obj.instance_address, - cluster_id: obj.cluster_id, - role: obj.role, - }; - if (!obj.instance_address) { - delete params.ip; - } - if (!obj.role) { - delete params.role; - } - return http - .post(`/apis/redis/bizs/${obj.bk_biz_id}/toolbox/query_cluster_ips/`, params) - .then((data) => { - const filterArr = data.map((item) => new RedisHostModel(item)).filter((item) => item.isSlaveFailover); - const count = filterArr.length; - return { - count, - results: filterArr, - }; - }); -}; - -// 根据masterIP查询集群、实例和slave -export const queryMasterSlaveByIp = (params: { ips: string[] }) => { - const { currentBizId } = useGlobalBizs(); - return http.post(`/apis/redis/bizs/${currentBizId}/toolbox/query_master_slave_by_ip/`, params); -}; - -// 获取集群列表 -export const listClusterList = (params: Record) => - http.get>(`/apis/redis/bizs/${params.bk_biz_id}/redis_resources/`, params).then((data) => ({ - ...data, - results: data.results.map((item) => new RedisModel(item)), - })); - -// 获取集群列表(主从切换) -export const listClustersMasterFailoverProxy = async (params: { bk_biz_id: number }) => - http - .get>(`/apis/redis/bizs/${params.bk_biz_id}/redis_resources/`, params) - .then((data) => data.results.map((item) => new RedisModel(item))); - -// 获取集群列表(重建从库) -export const listClustersCreateSlaveProxy = async (params: { bk_biz_id: number }) => - http - .get>(`/apis/redis/bizs/${params.bk_biz_id}/redis_resources/`, params) - .then((data) => - data.results - .map((item) => new RedisModel(item)) - .filter((item) => item.redis_slave.filter((slave) => slave.status !== 'running').length > 0), - ); - -/** - * 判断实例是否存在 - */ -export const checkInstances = (params: Record<'instance_addresses', Array> & { bizId: number }) => - http.post(`/apis/redis/bizs/${params.bizId}/instance/check_instances/`, params); - -// 构造实例列表 -export const getRollbackList = async ( - params: { - bk_biz_id: number; - limit?: number; - offset?: number; - temp_cluster_proxy?: string; // ip:port - } & Record, -) => - http.get>(`/apis/redis/bizs/${params.bk_biz_id}/rollback/`, params).then((res) => ({ - ...res, - results: res.results.map((item) => new RedisRollbackModel(item)), - })); - -// 获取DTS历史任务以及其对应task cnt -export const getRedisDTSHistoryJobs = (params: { - start_time?: string; - end_time?: string; - cluster_name?: string; - page?: number; - page_size?: number; -}) => { - const { currentBizId } = useGlobalBizs(); - return http.post<{ total_cnt: number; jobs: RedisDSTHistoryJobModel[] }>( - `/apis/redis/bizs/${currentBizId}/dts/history_jobs/`, - params, - ); -}; - -// 获取迁移任务task列表,失败的排在前面 -export const getRedisDTSJobTasks = (params: { bill_id: number; src_cluster: string; dst_cluster: string }) => { - const { currentBizId } = useGlobalBizs(); - return http - .post(`/apis/redis/bizs/${currentBizId}/dts/job_tasks/`, params) - .then((arr) => arr.map((item) => new RedisDSTJobTaskModel(item))); -}; - -// dts job批量断开同步 -export const setJobDisconnectSync = (params: { bill_id: number; src_cluster: string; dst_cluster: string }) => { - const { currentBizId } = useGlobalBizs(); - return http.post(`/apis/redis/bizs/${currentBizId}/dts/job_disconnect_sync/`, params); -}; - -// dts job 批量失败重试 -export const setJobTaskFailedRetry = (params: { task_ids: number[] }) => { - const { currentBizId } = useGlobalBizs(); - return http.post(`/apis/redis/bizs/${currentBizId}/dts/job_task_failed_retry/`, params); -}; - -// dts 外部redis连接行测试 -export const testRedisConnection = (params: { - data_copy_type: string; - infos: { - src_cluster: string; - src_cluster_password: string; - dst_cluster: string; - dst_cluster_password: string; - }[]; -}) => { - const { currentBizId } = useGlobalBizs(); - return http.post(`/apis/redis/bizs/${currentBizId}/dts/test_redis_connection/`, params); -}; - -/** - * 获取 redis 实例列表 - */ -export const getRedisInstances = (params: { bk_biz_id: number } & Record) => - http.get>( - `/apis/redis/bizs/${params.bk_biz_id}/redis_resources/list_instances/`, - params, - ); diff --git a/dbm-ui/frontend/src/services/source/bizSetting.ts b/dbm-ui/frontend/src/services/source/bizSetting.ts index 547d0a0314..765c8f1d32 100644 --- a/dbm-ui/frontend/src/services/source/bizSetting.ts +++ b/dbm-ui/frontend/src/services/source/bizSetting.ts @@ -27,3 +27,13 @@ export const create = function (params: { bk_biz_id: number; type: string; key: export const update = function (params: { id: number }) { return http.post(`${path}/`, params); }; + +// 业务设置列表键值映射表 +export const getBizSettingList = function (params: { bk_biz_id: number; key?: string }) { + return http.get>(`${path}/simple/`, params); +}; + +// 更新业务设置列表键值 +export const updateBizSetting = function (params: { bk_biz_id: number; key: string; value: any; value_type?: string }) { + return http.post(`${path}/update_settings/`, params); +}; diff --git a/dbm-ui/frontend/src/services/source/cluster.ts b/dbm-ui/frontend/src/services/source/clusterEntry.ts similarity index 81% rename from dbm-ui/frontend/src/services/source/cluster.ts rename to dbm-ui/frontend/src/services/source/clusterEntry.ts index c9f18859b0..807434d4cc 100644 --- a/dbm-ui/frontend/src/services/source/cluster.ts +++ b/dbm-ui/frontend/src/services/source/clusterEntry.ts @@ -41,3 +41,15 @@ export const getClusterEntries = (params: { }; }[] >('/apis/cluster_entry/get_cluster_entries/', params); + +/** + * 修改集群访问入口 + */ +export const updateClusterEntryConfig = (params: { + cluster_id: number; + cluster_entry_details: { + cluster_entry_type: string; + domain_name: string; + target_instances: string[]; + }[]; +}) => http.post<{ cluster_id?: number }>('/apis/cluster_entry/refresh_cluster_domain/', params); diff --git a/dbm-ui/frontend/src/services/source/clusters.ts b/dbm-ui/frontend/src/services/source/clusters.ts deleted file mode 100644 index 1a6232ee23..0000000000 --- a/dbm-ui/frontend/src/services/source/clusters.ts +++ /dev/null @@ -1,144 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 http from '../http'; -import type { HostNode, ListBase, ResourceInstance, ResourceItem, ResourceTopo } from '../types'; -import type { - ClusterPassword, - ClusterPasswordParams, - GetClusterHostNodesRequestParam, - GetResourcesParams, - InstanceDetails, - InstanceDetailsParams, - InstanceInfos, - MySQLClusterInfos, - ResourceParams, - ResourcesResult, - ResourceTopoParams, - TableFieldsItem, - TableFieldsParams, -} from '../types/clusters'; - -/** - * 查询表格信息 - */ -export const getTableFields = (params: TableFieldsParams) => - http.get(`/apis/mysql/bizs/${params.bk_biz_id}/${params.type}_resources/get_table_fields/`); - -/** - * 查询资源列表 - */ -export const getResources = (params: GetResourcesParams & { dbType: string }) => - http.get>(`/apis/${params.dbType}/bizs/${params.bk_biz_id}/${params.type}_resources/`, params); - -/** - * 获取集群详情 - */ -export const getResourceDetails = (params: ResourceParams & { dbType: string }) => - http.get(`/apis/${params.dbType}/bizs/${params.bk_biz_id}/${params.type}_resources/${params.id}/`); - -/** - * 获取集群实例列表 - */ -export const getResourceInstances = ( - params: { db_type: string; type?: string; bk_biz_id: number } & Record, -) => - http.get>( - `/apis/${params.db_type}/bizs/${params.bk_biz_id}/${params.type}_resources/list_instances/`, - params, - ); - -/** - * 获取集群实例详情 - */ -export const getResourceInstanceDetails = (params: InstanceDetailsParams & { dbType: string }) => - http.get( - `/apis/${params.dbType}/bizs/${params.bk_biz_id}/${params.type}_resources/retrieve_instance/`, - params, - ); - -/** - * 获取集群拓扑 - */ -export const getResourceTopo = (params: ResourceTopoParams & { dbType: string }) => - http.get( - `/apis/${params.dbType}/bizs/${params.bk_biz_id}/${params.type}_resources/${params.resource_id}/get_topo_graph/`, - ); - -/** - * 获取大数据集群拓扑 - */ -export const getBigdataResourceTopo = (params: ResourceTopoParams) => - http.get( - `/apis/bigdata/bizs/${params.bk_biz_id}/${params.type}/${params.type}_resources/${params.resource_id}/get_topo_graph/`, - ); - -/** - * 查询集群主机列表 - */ -export const getClusterHostNodes = (params: GetClusterHostNodesRequestParam) => - http.get( - `/apis/${params.db_type}/bizs/${params.bk_biz_id}/${params.db_type}_resources/${params.cluster_id}/get_nodes/`, - params, - ); - -/** - * 获取集群密码 - */ -export const getClusterPassword = (params: ClusterPasswordParams) => - http.get( - `/apis/${params.db_type}/bizs/${params.bk_biz_id}/${params.type}_resources/${params.cluster_id}/get_password/`, - ); - -/** - * 判断实例是否存在 - */ -export const checkInstances = (params: Record<'instance_addresses', Array> & { bizId: number }) => - http.post>(`/apis/mysql/bizs/${params.bizId}/instance/check_instances/`, params); - -/** - * 通过集群域名获取集群详情 - */ -export const getClusterInfoByDomains = ( - params: Record<'cluster_filters', Array<{ immute_domain: string }>> & { bizId: number }, -) => http.post(`/apis/mysql/bizs/${params.bizId}/cluster/query_clusters/`, params); - -/** - * 通过集群查询同机关联集群 - */ -export const findRelatedClustersByClusterIds = (params: Record<'cluster_ids', Array> & { bizId: number }) => - http.post< - Array<{ - cluster_id: number; - cluster_info: MySQLClusterInfos; - related_clusters: Array; - }> - >(`/apis/mysql/bizs/${params.bizId}/cluster/find_related_clusters_by_cluster_ids/`, params); - -/** - * 查询所有数据库的版本列表 - */ -export const getClusterTypeToVersions = () => - http.get>('/apis/version/cluster_type_to_versions/'); - -/** - * 修改集群访问入口 - */ -export const updateClusterEntryConfig = (params: { - cluster_id: number; - cluster_entry_details: { - cluster_entry_type: string; - domain_name: string; - target_instances: string[]; - }[]; -}) => http.post<{ cluster_id?: number }>('/apis/cluster_entry/refresh_cluster_domain/', params); diff --git a/dbm-ui/frontend/src/services/source/cmdb.ts b/dbm-ui/frontend/src/services/source/cmdb.ts index e0b3926689..8bf780fc94 100644 --- a/dbm-ui/frontend/src/services/source/cmdb.ts +++ b/dbm-ui/frontend/src/services/source/cmdb.ts @@ -41,43 +41,38 @@ export function getBizs(params = {} as { action: string }) { ); } -/** - * 创建模块返回结果 - */ -interface CreateModuleResult { - db_module_id: number; - db_module_name: string; - cluster_type: string; - bk_biz_id: number; - bk_set_id: number; - bk_modules: { - bk_module_name: string; - bk_module_id: string; - }[]; - name: string; -} - /** * 创建数据库模块 */ export function createModules(params: { db_module_name: string; cluster_type: string; biz_id: number }) { - return http.post(`${path}/${params.biz_id}/create_module/`, params); -} - -interface UserGroup { - id: string; - display_name: string; - logo: string; - type: string; - members: string[]; - disabled?: boolean; + return http.post<{ + db_module_id: number; + db_module_name: string; + cluster_type: string; + bk_biz_id: number; + bk_set_id: number; + bk_modules: { + bk_module_name: string; + bk_module_id: string; + }[]; + name: string; + }>(`${path}/${params.biz_id}/create_module/`, params); } /** * 查询 CC 角色对象 */ export function getUserGroupList(params: { bk_biz_id: number }) { - return http.get(`${path}/${params.bk_biz_id}/list_cc_obj_user/`); + return http.get< + { + id: string; + display_name: string; + logo: string; + type: string; + members: string[]; + disabled?: boolean; + }[] + >(`${path}/${params.bk_biz_id}/list_cc_obj_user/`); } /** @@ -117,28 +112,11 @@ export function getModules(params: { bk_biz_id: number; cluster_type: string }) >(`${path}/${params.bk_biz_id}/list_modules/`, params); } -/** - * 创建业务英文缩写参数 - */ -interface CreateAbbrParams { - db_app_abbr: string; -} - /** * 设置业务英文缩写 */ -export function createAppAbbr(params: CreateAbbrParams & { id: number }) { - return http.post(`${path}/${params.id}/set_db_app_abbr/`, params); -} - -// 更具模块 id 获取模块信息 -export function getModuleDetail(params: { module_id: number }) { +export function createAppAbbr(params: { db_app_abbr: string; id: number }) { return http.post<{ - buffer_percent: string; - charset: string; - db_version: string; - max_remain_mem_gb: string; - sync_type: string; - system_version: string; - }>(`apis/configs/get_module_by_id/`, params); + db_app_abbr: string; + }>(`${path}/${params.id}/set_db_app_abbr/`, params); } diff --git a/dbm-ui/frontend/src/services/source/common.ts b/dbm-ui/frontend/src/services/source/common.ts deleted file mode 100644 index dd966d119d..0000000000 --- a/dbm-ui/frontend/src/services/source/common.ts +++ /dev/null @@ -1,130 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 pinyin from 'tiny-pinyin'; - -import http from '../http'; -import type { BizItem, Permission } from '../types'; - -/** - * 校验资源权限参数 - */ -export interface IAMParams { - action_ids: Array; - resources: Array<{ type: string; id: string | number }>; -} - -/** - * 个人配置信息 - */ -export interface ProfileItem { - label: string; - values: any; -} - -/** - * 获取业务列表 - */ -export const getBizs = () => - http.get('/apis/cmdb/list_bizs/').then((res) => - res.map((item: BizItem) => { - const biz = { ...item }; - biz.display_name = `[${item.bk_biz_id}] ${item.name}`; - const parseName = pinyin.parse(item.name); - const names = []; - const heads = []; - for (const word of parseName) { - const { type, target } = word; - names.push(target); - heads.push(type === 2 ? target[0] : target); - } - biz.pinyin_head = heads.join(''); - biz.pinyin_name = names.join(''); - - return biz; - }), - ); - -/** - * 获取模型列表 - */ -export const getModules = (params: { bk_biz_id: number; cluster_type: string }) => { - const { cluster_type } = params; - return http.get< - { - bk_biz_id: number; - db_module_id: number; - name: string; - }[] - >(`/apis/cmdb/${params.bk_biz_id}/list_modules/`, { cluster_type }); -}; - -/** - * 获取人员列表 - */ -export const getUseList = (params: { limit?: number; offset?: number; fuzzy_lookups?: string }) => - http.get<{ count: number; results: { username: string; display_name: string }[] }>('/apis/users/list_users/', params); - -/** - * 个人配置列表 - */ -export const getProfile = () => - http.get<{ - profile: ProfileItem[]; - username: string; - is_manager: boolean; - }>('/apis/conf/profile/get_profile/'); - -/** - * 更新个人配置列表 - */ -export const upsertProfile = (params: { label: string; values: any }) => - http.post('/apis/conf/profile/upsert_profile/', params); - -/** - * 查询系统环境变量 - */ -export const getSystemEnviron = () => http.get>('/apis/conf/system_settings/environ/'); - -/** - * 退出登录 - */ -export const getLotout = () => http.get('/logout/'); - -/** - * 获取权限申请数据链接 - */ -export const getApplyDataLink = (params: IAMParams) => http.post('/apis/iam/get_apply_data/', params); - -/** - * 检查当前用户对该动作是否有权限 - */ -export const checkAuthAllowed = (params: IAMParams) => - http.post<{ action_id: string; is_allowed: boolean }[]>('/apis/iam/check_allowed/', params); - -/** - * 获取监控警告管理地址 - */ -export const getMonitorUrl = ( - params: Record & { cluster_type: string; cluster_id?: number; instance_id?: number }, -) => http.get<{ url: string }>('/apis/monitor/grafana/get_dashboard/', params); - -/** - * 获取项目版本 - */ -export const getProjectVersion = () => - http.get<{ - app_version: string; - chart_version: string; - version: string; - }>('/version/'); diff --git a/dbm-ui/frontend/src/services/source/configs.ts b/dbm-ui/frontend/src/services/source/configs.ts index c3aa29b673..90d91b39ac 100644 --- a/dbm-ui/frontend/src/services/source/configs.ts +++ b/dbm-ui/frontend/src/services/source/configs.ts @@ -36,20 +36,6 @@ interface ParameterConfigItem { leval_value?: string; } -/** - * 查询配置发布历史记录 | 查询配置发布记录详情 参数 - */ -interface ConfigVersionParams { - meta_cluster_type: string; - conf_type: string; - version: string; - bk_biz_id?: number; - level_name?: string; - level_value?: number; - level_info?: any; - revision?: string; -} - /** * 发布历史版本详情 */ @@ -87,20 +73,17 @@ interface ConfigVersionDetails { /** * 查询配置发布记录详情 */ -export function getConfigVersionDetails(params: ConfigVersionParams) { - return http.get(`${path}/get_config_version_detail/`, params); -} - -/** - * 配置基础信息 - */ -interface ConfigBaseDetails { - conf_items: ParameterConfigItem[]; +export function getConfigVersionDetails(params: { + meta_cluster_type: string; + conf_type: string; version: string; - name: string; - description: string; - updated_at?: string; - updated_by?: string; + bk_biz_id?: number; + level_name?: string; + level_value?: number; + level_info?: any; + revision?: string; +}) { + return http.get(`${path}/get_config_version_detail/`, params); } /** @@ -121,7 +104,14 @@ export function getLevelConfig( }, payload = {} as IRequestPayload, ) { - return http.post(`${path}/get_level_config/`, params, payload); + return http.post<{ + conf_items: ParameterConfigItem[]; + version: string; + name: string; + description: string; + updated_at?: string; + updated_by?: string; + }>(`${path}/get_level_config/`, params, payload); } /** * 查询平台配置详情 @@ -134,7 +124,14 @@ export function getConfigBaseDetails( }, payload = {} as IRequestPayload, ) { - return http.get(`${path}/get_platform_config/`, params, payload); + return http.get<{ + conf_items: ParameterConfigItem[]; + version: string; + name: string; + description: string; + updated_at?: string; + updated_by?: string; + }>(`${path}/get_platform_config/`, params, payload); } /** @@ -173,32 +170,36 @@ export function getConfigNames(params: { meta_cluster_type: string; conf_type: s return http.get(`${path}/list_config_names/`, params); } -/** - * 配置发布历史返回 - */ -interface ConfigVersionListResult { - bk_biz_id: number | string; - conf_file: string; - level_name: string; - level_value: number | string; - namespace: string; - published: string; - versions: { - conf_file: string; - created_at: string; - created_by: string; - description: string; - is_published: number; - revision: string; - rows_affected: number; - }[]; -} - /** * 查询配置发布历史记录 */ -export function getConfigVersionList(params: ConfigVersionParams) { - return http.get(`${path}/list_config_version_history/`, params); +export function getConfigVersionList(params: { + meta_cluster_type: string; + conf_type: string; + version: string; + bk_biz_id?: number; + level_name?: string; + level_value?: number; + level_info?: any; + revision?: string; +}) { + return http.get<{ + bk_biz_id: number | string; + conf_file: string; + level_name: string; + level_value: number | string; + namespace: string; + published: string; + versions: { + conf_file: string; + created_at: string; + created_by: string; + description: string; + is_published: number; + revision: string; + rows_affected: number; + }[]; + }>(`${path}/list_config_version_history/`, params); } /** @@ -249,9 +250,9 @@ export function saveModulesDeployInfo(params: { } /** - * 修改业务配置信息 + * 编辑层级(业务、模块、集群)配置 */ -interface BizConfDetailsUpdateParams { +export function updateBusinessConfig(params: { name: string; meta_cluster_type: string; conf_type: string; @@ -264,12 +265,7 @@ interface BizConfDetailsUpdateParams { confirm: number; publish_description?: string; level_info?: any; -} - -/** - * 编辑层级(业务、模块、集群)配置 - */ -export function updateBusinessConfig(params: BizConfDetailsUpdateParams) { +}) { return http.post< { name: string; @@ -281,9 +277,9 @@ export function updateBusinessConfig(params: BizConfDetailsUpdateParams) { } /** - * 编辑平台配置参数 + * 编辑平台配置 */ -interface PlatConfDetailsUpdateParams { +export function updatePlatformConfig(params: { conf_items: ParameterConfigItem[]; version: string; name: string; @@ -292,12 +288,7 @@ interface PlatConfDetailsUpdateParams { confirm: number; meta_cluster_type: string; publish_description?: string; -} - -/** - * 编辑平台配置 - */ -export function updatePlatformConfig(params: PlatConfDetailsUpdateParams) { +}) { return http.post<{ conf_file: string; conf_type: string; @@ -307,3 +298,15 @@ export function updatePlatformConfig(params: PlatConfDetailsUpdateParams) { revision: string; }>(`${path}/upsert_platform_config/`, params); } + +// 更具模块 id 获取模块信息 +export function getModuleDetail(params: { module_id: number }) { + return http.post<{ + buffer_percent: string; + charset: string; + db_version: string; + max_remain_mem_gb: string; + sync_type: string; + system_version: string; + }>(`${path}/get_module_by_id/`, params); +} diff --git a/dbm-ui/frontend/src/services/source/dbha.ts b/dbm-ui/frontend/src/services/source/dbha.ts index 3b5cb9a8c7..fb411f29d2 100644 --- a/dbm-ui/frontend/src/services/source/dbha.ts +++ b/dbm-ui/frontend/src/services/source/dbha.ts @@ -15,39 +15,39 @@ import http, { type IRequestPayload } from '../http'; const path = '/apis/event/dbha'; -interface EventSwtichItem { - app: string; - bk_biz_id: number; - bk_biz_name: string; - cloud: string; - cluster: string; - cluster_info: { - cluster_type: string; - id: number; - immute_domain: string; - }; - confirm_check_time: string; - confirm_result: string; - db_role: string; - db_type: string; - idc: string; - ip: string; - port: number; - remark: string; - slave_ip: string; - slave_port: number; - status: string; - switch_finished_time: string; - switch_result: string; - switch_start_time: string; - uid: number; -} - /** * DBHA切换事件列表 */ export function getEventSwitchList(params: Record, payload = {} as IRequestPayload) { - return http.get(`${path}/ls/`, params, payload); + return http.get< + { + app: string; + bk_biz_id: number; + bk_biz_name: string; + cloud: string; + cluster: string; + cluster_info: { + cluster_type: string; + id: number; + immute_domain: string; + }; + confirm_check_time: string; + confirm_result: string; + db_role: string; + db_type: string; + idc: string; + ip: string; + port: number; + remark: string; + slave_ip: string; + slave_port: number; + status: string; + switch_finished_time: string; + switch_result: string; + switch_start_time: string; + uid: number; + }[] + >(`${path}/ls/`, params, payload); } /** diff --git a/dbm-ui/frontend/src/services/source/dumper.ts b/dbm-ui/frontend/src/services/source/dumper.ts index e6d01bb7e9..cf9103b998 100644 --- a/dbm-ui/frontend/src/services/source/dumper.ts +++ b/dbm-ui/frontend/src/services/source/dumper.ts @@ -16,7 +16,7 @@ import DumperModel from '@services/model/dumper/dumper'; import { useGlobalBizs } from '@stores'; import http, { type IRequestPayload } from '../http'; -import type { ListBase } from '../types/common'; +import type { ListBase } from '../types'; const { currentBizId } = useGlobalBizs(); diff --git a/dbm-ui/frontend/src/services/source/iam.ts b/dbm-ui/frontend/src/services/source/iam.ts index 2eee4cd030..cd26b8343a 100644 --- a/dbm-ui/frontend/src/services/source/iam.ts +++ b/dbm-ui/frontend/src/services/source/iam.ts @@ -18,17 +18,12 @@ import http, { type IRequestPayload } from '../http'; const path = '/apis/iam'; /** - * 校验资源权限参数 + * 检查当前用户对该动作是否有权限 */ -interface IAMParams { +export function checkAuthAllowed(params: { action_ids: Array; resources?: Array<{ type: string; id?: string | number }>; -} - -/** - * 检查当前用户对该动作是否有权限 - */ -export function checkAuthAllowed(params: IAMParams) { +}) { return http.post< { action_id: string; @@ -40,24 +35,26 @@ export function checkAuthAllowed(params: IAMParams) { /** * 获取权限申请数据 */ -export function getApplyDataLink(params: IAMParams) { +export function getApplyDataLink(params: { + action_ids: Array; + resources?: Array<{ type: string; id?: string | number }>; +}) { return http.post(`${path}/get_apply_data/`, params).then((data) => new ApplyDataModel(data)); } -export function simpleCheckAllowed(params: { - action_id: string; - resource_id?: string | number; - bk_biz_id?: number; - is_raise_exception?: boolean; -}, payload = {} as IRequestPayload) { +export function simpleCheckAllowed( + params: { + action_id: string; + resource_id?: string | number; + bk_biz_id?: number; + is_raise_exception?: boolean; + }, + payload = {} as IRequestPayload, +) { return http.post(`${path}/simple_check_allowed/`, params, payload); } -export function simpleGetApplyData(params: { - action_id: string; - resource_id?: string | number; - bk_biz_id?: number; -}) { +export function simpleGetApplyData(params: { action_id: string; resource_id?: string | number; bk_biz_id?: number }) { return http .post(`${path}/simple_get_apply_data/`, { ...params, diff --git a/dbm-ui/frontend/src/services/source/influxdbGroup.ts b/dbm-ui/frontend/src/services/source/influxdbGroup.ts index 7a229b5ab0..71a601f366 100644 --- a/dbm-ui/frontend/src/services/source/influxdbGroup.ts +++ b/dbm-ui/frontend/src/services/source/influxdbGroup.ts @@ -16,17 +16,6 @@ import type { ListBase } from '../types'; const path = '/apis/group'; -interface InfluxDBGroupItem { - id: number; - creator: string; - create_at: string; - updater: string; - update_at: string; - bk_biz_id: number; - instance_count: number; - name: string; -} - /** * 分组列表 */ @@ -66,21 +55,48 @@ export function getGroupList(params: { bk_biz_id: number }) { * 创建分组 */ export function createGroup(params: { bk_biz_id: number; name: string }) { - return http.post(`${path}/`, params); + return http.post<{ + id: number; + creator: string; + create_at: string; + updater: string; + update_at: string; + bk_biz_id: number; + instance_count: number; + name: string; + }>(`${path}/`, params); } /** * 获取分组信息 */ export function getGroupInfo(params: { id: number }) { - return http.get(`${path}/${params.id}/`); + return http.get<{ + id: number; + creator: string; + create_at: string; + updater: string; + update_at: string; + bk_biz_id: number; + instance_count: number; + name: string; + }>(`${path}/${params.id}/`); } /** * 更新分组信息 */ export function updateGroupInfo(params: { id: number; bk_biz_id: number; name: string }) { - return http.put(`${path}/${params.id}/`, params); + return http.put<{ + id: number; + creator: string; + create_at: string; + updater: string; + update_at: string; + bk_biz_id: number; + instance_count: number; + name: string; + }>(`${path}/${params.id}/`, params); } /** diff --git a/dbm-ui/frontend/src/services/source/infras.ts b/dbm-ui/frontend/src/services/source/infras.ts index 8957694ce0..7974f14744 100644 --- a/dbm-ui/frontend/src/services/source/infras.ts +++ b/dbm-ui/frontend/src/services/source/infras.ts @@ -29,26 +29,29 @@ export function getInfrasCities() { >(`${path}/cities/`); } -/** - * 主机提交格式 - */ -interface HostSubmitParams { - ip: string; - bk_cloud_id: number; - bk_host_id: number; - bk_cpu?: number; - bk_mem?: number; - bk_disk?: number; - bk_biz_id: number; -} - /** * redis 容量列表 */ export function getCapSpecs(params: { nodes: { - master: Array; - slave: Array; + master: Array<{ + ip: string; + bk_cloud_id: number; + bk_host_id: number; + bk_cpu?: number; + bk_mem?: number; + bk_disk?: number; + bk_biz_id: number; + }>; + slave: Array<{ + ip: string; + bk_cloud_id: number; + bk_host_id: number; + bk_cpu?: number; + bk_mem?: number; + bk_disk?: number; + bk_biz_id: number; + }>; }; ip_source: string; cluster_type: string; diff --git a/dbm-ui/frontend/src/services/source/ipchooser.ts b/dbm-ui/frontend/src/services/source/ipchooser.ts index f71ad0e99b..d03977967c 100644 --- a/dbm-ui/frontend/src/services/source/ipchooser.ts +++ b/dbm-ui/frontend/src/services/source/ipchooser.ts @@ -14,12 +14,6 @@ import http from '../http'; import type { HostDetails } from '../types'; -interface IpScope { - scope_id: number; - scope_type: string; - bk_cloud_id?: number | string; -} - const path = '/apis/ipchooser'; /** @@ -30,7 +24,11 @@ export function checkHost(params: { mode?: string; ipv6_list?: string[]; key_list?: string[]; - scope_list?: IpScope[]; + scope_list?: { + scope_id: number; + scope_type: string; + bk_cloud_id?: number | string; + }[]; }) { return http.post(`${path}/host/check/`, params); } @@ -41,7 +39,11 @@ export function checkHost(params: { export function getHostDetails(params: { mode?: string; host_list: Array>; - scope_list: IpScope[]; + scope_list: { + scope_id: number; + scope_type: string; + bk_cloud_id?: number | string; + }[]; }) { return http.post(`${path}/host/details/`, params); } @@ -61,9 +63,9 @@ export function updateIpSelectorSettings(params: any) { } /** - * 获取主机信息参数 + * 根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息 */ -interface FetchHostInfosParams { +export function getHostIdInfos(params: { node_list: Array<{ instance_id: number; object_id: string; @@ -72,25 +74,37 @@ interface FetchHostInfosParams { page_size: number; start: number; mode?: string; -} - -/** - * 根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息 - */ -export function getHostIdInfos(params: FetchHostInfosParams) { +}) { return http.post(`${path}/topo/query_host_id_infos/`, params); } /** * 根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息 */ -export function getHosts(params: FetchHostInfosParams) { +export function getHosts(params: { + node_list: Array<{ + instance_id: number; + object_id: string; + meta: HostDetails['meta']; + }>; + page_size: number; + start: number; + mode?: string; +}) { return http.post(`${path}/topo/query_hosts/`, params); } /** * 批量获取含各节点主机数量的拓扑树 */ -export function getHostTopo(params: { mode?: string; all_scope: boolean; scope_list: IpScope[] }) { +export function getHostTopo(params: { + mode?: string; + all_scope: boolean; + scope_list: { + scope_id: number; + scope_type: string; + bk_cloud_id?: number | string; + }[]; +}) { return http.post(`${path}/topo/trees/`, params); } @@ -116,31 +130,28 @@ export function getHostTopoInfos(params: { }>(`${path}/topo/query_host_topo_infos/`, params); } -/** - * 管控区域基本信息 - */ -interface CloudAreaInfo { - bk_account_id: number; - bk_cloud_id: number; - bk_cloud_name: string; - bk_cloud_vendor: string; - bk_creator: string; - bk_last_editor: string; - bk_region: string; - bk_status: string; - bk_status_detail: string; - bk_supplier_account: string; - bk_vpc_id: string; - bk_vpc_name: string; - create_time: string; - last_time: string; -} - /** * 获取管控区域列表 */ export function getCloudList() { - return http.post(`${path}/settings/search_cloud_area/`); + return http.post< + { + bk_account_id: number; + bk_cloud_id: number; + bk_cloud_name: string; + bk_cloud_vendor: string; + bk_creator: string; + bk_last_editor: string; + bk_region: string; + bk_status: string; + bk_status_detail: string; + bk_supplier_account: string; + bk_vpc_id: string; + bk_vpc_name: string; + create_time: string; + last_time: string; + }[] + >(`${path}/settings/search_cloud_area/`); } /** diff --git a/dbm-ui/frontend/src/services/source/mysqlCluster.ts b/dbm-ui/frontend/src/services/source/mysqlCluster.ts index 28663b3a43..40f5e4a32f 100644 --- a/dbm-ui/frontend/src/services/source/mysqlCluster.ts +++ b/dbm-ui/frontend/src/services/source/mysqlCluster.ts @@ -109,12 +109,3 @@ export function queryClusters(params: { }) { return http.post(`${getRootPath()}/query_clusters/`, params); } - -/** - * 通过集群域名获取集群详情 - */ -export function getClusterInfoByDomains( - params: Record<'cluster_filters', Array<{ immute_domain: string }>> & { bizId: number }, -) { - return http.post(`${getRootPath()}/query_clusters/`, params); -} diff --git a/dbm-ui/frontend/src/services/source/package.ts b/dbm-ui/frontend/src/services/source/package.ts index de6528be2a..b21e17e119 100644 --- a/dbm-ui/frontend/src/services/source/package.ts +++ b/dbm-ui/frontend/src/services/source/package.ts @@ -45,9 +45,9 @@ export function getPackages( } /** - * 新建版本信息 + * 新建版本 */ -interface NewPackageParams { +export function createPackage(params: { name: string; version: string; pkg_type: string; @@ -57,13 +57,8 @@ interface NewPackageParams { md5: string; allow_biz_ids?: number[]; mode?: string; -} - -/** - * 新建版本 - */ -export function createPackage(params: NewPackageParams) { - return http.post(`${path}/`, params); +}) { + return http.post(`${path}/`, params); } /** @@ -76,14 +71,21 @@ export function deletePackage(params: { id: number }) { /** * 更新版本文件属性 */ -export function updatePackage( - params: Partial & { - id: number; - priority?: number; - enable?: boolean; - }, -) { - return http.patch(`${path}/${params.id}/`, params); +export function updatePackage(params: { + id: number; + priority?: number; + enable?: boolean; + name: string; + version: string; + pkg_type: string; + db_type: string; + path: string; + size: number; + md5: string; + allow_biz_ids?: number[]; + mode?: string; +}) { + return http.patch(`${path}/${params.id}/`, params); } /** diff --git a/dbm-ui/frontend/src/services/source/permission.ts b/dbm-ui/frontend/src/services/source/permission.ts index b1954ee921..697a4220b1 100644 --- a/dbm-ui/frontend/src/services/source/permission.ts +++ b/dbm-ui/frontend/src/services/source/permission.ts @@ -24,9 +24,7 @@ import type { CreateAccountParams, PasswordPolicy, PasswordStrength, - PermissionCloneRes, PermissionRule, - PermissionRulesParams, } from '../types/permission'; // 密码随机化周期 @@ -139,7 +137,19 @@ export const verifyPasswordStrength = (params: { password: string }) => /** * 查询账号规则列表 */ -export const getPermissionRules = (params: PermissionRulesParams, payload = {} as IRequestPayload) => +export const getPermissionRules = ( + params: { + limit?: number; + offset?: number; + bk_biz_id: number; + rule_ids?: string; + user?: string; + access_db?: string; + privilege?: string; + account_type?: AccountTypesValues; + }, + payload = {} as IRequestPayload, +) => http .get< ListBase @@ -222,4 +232,14 @@ export const precheckPermissionClone = (params: { clone_type: 'instance' | 'client'; clone_list: Array<{ source: string; target: string }>; clone_cluster_type: 'mysql' | 'tendbcluster'; -}) => http.post(`/apis/mysql/bizs/${params.bizId}/permission/clone/pre_check_clone/`, params); +}) => + http.post<{ + clone_data_list: Array<{ + message: string; + source: string; + target: Array | string; + }>; + clone_uid: string; + message: string; + pre_check: boolean; + }>(`/apis/mysql/bizs/${params.bizId}/permission/clone/pre_check_clone/`, params); diff --git a/dbm-ui/frontend/src/services/source/profile.ts b/dbm-ui/frontend/src/services/source/profile.ts index cb8c6a45e6..f70d93106a 100644 --- a/dbm-ui/frontend/src/services/source/profile.ts +++ b/dbm-ui/frontend/src/services/source/profile.ts @@ -15,14 +15,6 @@ import http from '../http'; const path = '/apis/conf/profile'; -/** - * 个人配置信息 - */ -interface ProfileItem { - label: string; - values: any; -} - /** * 个人配置列表 */ @@ -30,7 +22,10 @@ export function getProfile() { return http.get<{ global_manage: boolean; is_manager: boolean; - profile: ProfileItem[]; + profile: { + label: string; + values: any; + }[]; resource_manage: boolean; username: string; }>(`${path}/get_profile/`); @@ -39,6 +34,6 @@ export function getProfile() { /** * 更新个人配置列表 */ -export function upsertProfile(params: ProfileItem) { +export function upsertProfile(params: { label: string; values: any }) { return http.post(`${path}/upsert_profile/`, params); } diff --git a/dbm-ui/frontend/src/services/source/quickSearch.ts b/dbm-ui/frontend/src/services/source/quickSearch.ts index cf4efe7c07..58a4fc15b8 100644 --- a/dbm-ui/frontend/src/services/source/quickSearch.ts +++ b/dbm-ui/frontend/src/services/source/quickSearch.ts @@ -40,7 +40,7 @@ export function quickSearch(params: { machine: QuickSearchMachineModel[]; resource_pool: DbResourceModel[]; task: TaskFlowModel[]; - ticket: TicketModel[]; + ticket: TicketModel[]; }>('/apis/quick_search/search/', params) .then((res) => ({ cluster_domain: (res.cluster_domain || []).map((item) => new QuickSearchClusterDomainModel(item)), diff --git a/dbm-ui/frontend/src/services/source/redis.ts b/dbm-ui/frontend/src/services/source/redis.ts index 26f09e650f..19c79226fa 100644 --- a/dbm-ui/frontend/src/services/source/redis.ts +++ b/dbm-ui/frontend/src/services/source/redis.ts @@ -18,38 +18,6 @@ import RedisMachineModel from '@services/model/redis/redis-machine'; import http from '../http'; import type { HostNode, ListBase, ResourceTopo } from '../types'; -import type { ResourceRedisItem } from '../types/clusters'; - -interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - bk_idc_name: string; - bk_cloud_name: string; - cluster_id: number; - cluster_type: string; - cluster_type_display: string; - create_at: string; - db_version: string; - db_module_id: number; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - version?: string; -} const getRootPath = () => `/apis/redis/bizs/${window.PROJECT_CONFIG.BIZ_ID}/redis_resources`; @@ -142,14 +110,14 @@ export function retrieveRedisInstance(params: { instance_address: string; cluster_id?: number; }) { - return http.get(`${getRootPath()}/retrieve_instance/`, params); + return http.get(`${getRootPath()}/retrieve_instance/`, params); } /** * 获取集群详情 */ export function getRedisDetail(params: { id: number }) { - return http.get(`${getRootPath()}/${params.id}/`); + return http.get(`${getRootPath()}/${params.id}/`); } /** diff --git a/dbm-ui/frontend/src/services/source/report.ts b/dbm-ui/frontend/src/services/source/report.ts index f7364ab793..9888e3ec02 100644 --- a/dbm-ui/frontend/src/services/source/report.ts +++ b/dbm-ui/frontend/src/services/source/report.ts @@ -1,5 +1,5 @@ import http, { type IRequestPayload } from '../http'; -import type { ListBase } from '../types/common'; +import type { ListBase } from '../types'; interface IResult { results: Record[]; diff --git a/dbm-ui/frontend/src/services/source/riak.ts b/dbm-ui/frontend/src/services/source/riak.ts index 97ac65eca9..20de470872 100644 --- a/dbm-ui/frontend/src/services/source/riak.ts +++ b/dbm-ui/frontend/src/services/source/riak.ts @@ -12,12 +12,13 @@ */ import RiakModel from '@services/model/riak/riak'; +import RiakInstanceModel from '@services/model/riak/riak-instance'; import RiakNodeModel from '@services/model/riak/riak-node'; import { useGlobalBizs } from '@stores'; import http from '../http'; -import type { ListBase, ResourceInstance, ResourceTopo } from '../types'; +import type { ListBase, ResourceTopo } from '../types'; const { currentBizId } = useGlobalBizs(); @@ -49,41 +50,7 @@ export function getRiakInstanceList(params: { cluster_id: number; role: string; }) { - return http.get>(`${path}/list_instances/`, params); -} - -/** - * 集群实例详情 - */ -interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - cluster_id: number; - cluster_type: string; - create_at: string; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - db_module_id: number; - cluster_type_display: string; - bk_idc_name: string; - bk_cloud_name: string; - db_version: string; - version?: string; + return http.get>(`${path}/list_instances/`, params); } /** @@ -95,7 +62,7 @@ export function retrieveRiakInstance(params: { instance_address: string; cluster_id?: number; }) { - return http.get(`${path}/retrieve_instance/`, params); + return http.get(`${path}/retrieve_instance/`, params); } /** diff --git a/dbm-ui/frontend/src/services/source/spider.ts b/dbm-ui/frontend/src/services/source/spider.ts index f5694bfac5..b6ae99812e 100644 --- a/dbm-ui/frontend/src/services/source/spider.ts +++ b/dbm-ui/frontend/src/services/source/spider.ts @@ -17,7 +17,7 @@ import TendbClusterModel from '@services/model/spider/tendbCluster'; import TendbInstanceModel from '@services/model/spider/tendbInstance'; import http from '../http'; -import type { ListBase, ResourceInstance, ResourceItem, ResourceTopo } from '../types'; +import type { ListBase, ResourceTopo } from '../types'; const getRootPath = () => `/apis/mysql/bizs/${window.PROJECT_CONFIG.BIZ_ID}/spider_resources`; @@ -97,7 +97,7 @@ export function getResources(params: { cluster_ids?: number[] | number; dbType: string; }) { - return http.get>(`${getRootPath()}/`, params); + return http.get>(`${getRootPath()}/`, params); } /** @@ -111,7 +111,7 @@ export function getResourcesByBizId(params: { cluster_ids?: number[] | number; dbType: string; }) { - return http.get>(`/apis/mysql/bizs/${params.bk_biz_id}/spider_resources/`, params); + return http.get>(`/apis/mysql/bizs/${params.bk_biz_id}/spider_resources/`, params); } /** @@ -130,54 +130,10 @@ export function getSpiderTableFields() { * 获取集群实例列表 */ export function getSpiderInstanceList(params: Record) { - return http.get>(`${getRootPath()}/list_instances/`, params); -} - -/** - * 集群实例详情 - */ -interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - cluster_id: number; - cluster_type: string; - create_at: string; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - db_module_id: number; - cluster_type_display: string; - bk_idc_name: string; - bk_cloud_name: string; - db_version: string; - version?: string; -} - -/** - * 获取集群实例详情 - */ -export function retrieveSpiderInstance(params: { - bk_biz_id: number; - type: string; - instance_address: string; - cluster_id?: number; - dbType: string; -}) { - return http.get(`${getRootPath()}/retrieve_instance/`, params); + return http.get>(`${getRootPath()}/list_instances/`, params).then((res) => ({ + ...res, + results: res.results.map((data) => new TendbInstanceModel(data)), + })); } /** @@ -237,16 +193,6 @@ export function getSpiderMachineList(params: { export const getSpiderDetails = (params: { id: number }) => http.get(`${getRootPath()}/${params.id}/`); -/** - * 获取 spider 实例列表 - */ -export function getSpiderInstances(params: Record) { - return http.get>(`${getRootPath()}/list_instances/`, params).then((res) => ({ - ...res, - results: res.results.map((data) => new TendbInstanceModel(data)), - })); -} - /** * 获取 spider 实例详情 */ @@ -263,12 +209,3 @@ export const getList = function (params: Record) { export const getDetail = function (params: { id: number }) { return http.get(`${getRootPath()}/${params.id}/`).then((data) => new SpiderModel(data)); }; - -/** - * 获取集群实例列表 - */ -export const listSpiderResourceInstances = (params: { bk_biz_id: number } & Record) => - http.get>( - `/apis/mysql/bizs/${params.bk_biz_id}/spider_resources/list_instances/`, - params, - ); diff --git a/dbm-ui/frontend/src/services/source/sqlServerImport.ts b/dbm-ui/frontend/src/services/source/sqlServerImport.ts deleted file mode 100644 index d78c4db35e..0000000000 --- a/dbm-ui/frontend/src/services/source/sqlServerImport.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 http from '../http'; - -const getPath = () => `/apis/sqlserver/bizs/${window.PROJECT_CONFIG.BIZ_ID}`; - -export function uploadSql(params: FormData) { - return http.post< - { - raw_file_name: string; - sql_content: string; - sql_path: string; - }[] - >(`${getPath()}/sql_import/upload_sql/`, params); -} diff --git a/dbm-ui/frontend/src/services/source/sqlServerMigrate.ts b/dbm-ui/frontend/src/services/source/sqlserverMigrate.ts similarity index 100% rename from dbm-ui/frontend/src/services/source/sqlServerMigrate.ts rename to dbm-ui/frontend/src/services/source/sqlserverMigrate.ts diff --git a/dbm-ui/frontend/src/services/source/sqlserverSqlImport.ts b/dbm-ui/frontend/src/services/source/sqlserverSqlImport.ts index fdb516dfcf..358a33d397 100644 --- a/dbm-ui/frontend/src/services/source/sqlserverSqlImport.ts +++ b/dbm-ui/frontend/src/services/source/sqlserverSqlImport.ts @@ -2,19 +2,19 @@ import GrammarCheckModel from '@services/model/sql-import/grammar-check'; import http from '../http'; +const getPath = () => `/apis/sqlserver/bizs/${window.PROJECT_CONFIG.BIZ_ID}`; + /** * sql 语法检测 */ export function grammarCheck(params: FormData) { - return http - .post(`/apis/sqlserver/bizs/${window.PROJECT_CONFIG.BIZ_ID}/sql_import/grammar_check/`, params) - .then((data) => - Object.keys(data).reduce( - (result, key) => ({ - ...result, - [key]: new GrammarCheckModel(data[key]), - }), - {} as Record, - ), - ); + return http.post(`${getPath()}/sql_import/grammar_check/`, params).then((data) => + Object.keys(data).reduce( + (result, key) => ({ + ...result, + [key]: new GrammarCheckModel(data[key]), + }), + {} as Record, + ), + ); } diff --git a/dbm-ui/frontend/src/services/source/system-setting.ts b/dbm-ui/frontend/src/services/source/system-setting.ts deleted file mode 100644 index 36100e5eb8..0000000000 --- a/dbm-ui/frontend/src/services/source/system-setting.ts +++ /dev/null @@ -1,16 +0,0 @@ -import http from '../http'; - -// 查询机型类型 -export const getDeviceClassList = function () { - return http.get('/apis/conf/system_settings/device_classes/'); -}; - -// 业务设置列表键值映射表 -export const getBizSettingList = function (params: { bk_biz_id: number; key?: string }) { - return http.get>('/apis/conf/biz_settings/simple/', params); -}; - -// 更新业务设置列表键值 -export const updateBizSetting = function (params: { bk_biz_id: number; key: string; value: any; value_type?: string }) { - return http.post('/apis/conf/biz_settings/update_settings/', params); -}; diff --git a/dbm-ui/frontend/src/services/source/systemSettings.ts b/dbm-ui/frontend/src/services/source/systemSettings.ts index 210d6e7e09..0e80a8796d 100644 --- a/dbm-ui/frontend/src/services/source/systemSettings.ts +++ b/dbm-ui/frontend/src/services/source/systemSettings.ts @@ -42,3 +42,8 @@ export function getSystemEnviron() { ENABLE_EXTERNAL_PROXY: boolean; }>(`${path}/environ/`); } + +// 查询机型类型 +export const getDeviceClassList = function () { + return http.get(`${path}/device_classes/`); +}; diff --git a/dbm-ui/frontend/src/services/source/tendbha.ts b/dbm-ui/frontend/src/services/source/tendbha.ts index 2379f99c5a..02a9e71029 100644 --- a/dbm-ui/frontend/src/services/source/tendbha.ts +++ b/dbm-ui/frontend/src/services/source/tendbha.ts @@ -15,7 +15,7 @@ import TendbhaModel from '@services/model/mysql/tendbha'; import TendbhaInstanceModel from '@services/model/mysql/tendbha-instance'; import http from '../http'; -import type { ListBase, ResourceItem, ResourceTopo } from '../types'; +import type { ListBase, ResourceTopo } from '../types'; const getRootPath = () => `/apis/mysql/bizs/${window.PROJECT_CONFIG.BIZ_ID}/tendbha_resources`; @@ -112,40 +112,6 @@ export const getTendbhaInstanceList = function (params: Record & { })); }; -/** - * 集群实例详情 - */ -interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - cluster_id: number; - cluster_type: string; - create_at: string; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - db_module_id: number; - cluster_type_display: string; - bk_idc_name: string; - bk_cloud_name: string; - db_version: string; - version?: string; -} - /** * 获取集群实例详情 */ @@ -156,14 +122,14 @@ export function retrieveTendbhaInstance(params: { cluster_id?: number; dbType: string; }) { - return http.get(`${getRootPath()}/retrieve_instance/`, params); + return http.get(`${getRootPath()}/retrieve_instance/`, params); } /** * 获取集群详情 */ export function getTendbhaDetail(params: { id: number }) { - return http.get(`${getRootPath()}/${params.id}/`); + return http.get(`${getRootPath()}/${params.id}/`); } /** diff --git a/dbm-ui/frontend/src/services/source/tendbsingle.ts b/dbm-ui/frontend/src/services/source/tendbsingle.ts index cab56c7bb7..c8165af5f5 100644 --- a/dbm-ui/frontend/src/services/source/tendbsingle.ts +++ b/dbm-ui/frontend/src/services/source/tendbsingle.ts @@ -14,7 +14,7 @@ import TendbsingleInstanceModel from '@services/model/mysql/tendbha-instance'; import TendbsingleModel from '@services/model/mysql/tendbsingle'; import http from '../http'; -import type { ListBase, ResourceItem, ResourceTopo } from '../types'; +import type { ListBase, ResourceTopo } from '../types'; const getRootPath = () => `/apis/mysql/bizs/${window.PROJECT_CONFIG.BIZ_ID}/tendbsingle_resources`; @@ -44,7 +44,7 @@ export function getTendbsingleListByBizId(params: { offset?: number; cluster_ids?: number[] | number; }) { - return http.get>(`/apis/mysql/bizs/${params.bk_biz_id}/tendbsingle_resources/`, params); + return http.get>(`/apis/mysql/bizs/${params.bk_biz_id}/tendbsingle_resources/`, params); } /** @@ -69,40 +69,6 @@ export function getTendbsingleInstanceList(params: Record) { })); } -/** - * 集群实例详情 - */ -interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - cluster_id: number; - cluster_type: string; - create_at: string; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - db_module_id: number; - cluster_type_display: string; - bk_idc_name: string; - bk_cloud_name: string; - db_version: string; - version?: string; -} - /** * 获取集群实例详情 */ @@ -113,14 +79,14 @@ export function retrieveTendbsingleInstance(params: { cluster_id?: number; dbType: string; }) { - return http.get(`${getRootPath()}/retrieve_instance/`, params); + return http.get(`${getRootPath()}/retrieve_instance/`, params); } /** * 获取集群详情 */ export function getTendbsingleDetail(params: { id: number }) { - return http.get(`${getRootPath()}/${params.id}/`); + return http.get(`${getRootPath()}/${params.id}/`); } /** diff --git a/dbm-ui/frontend/src/services/types/baseResponse.ts b/dbm-ui/frontend/src/services/types/baseResponse.ts deleted file mode 100644 index 29722a485d..0000000000 --- a/dbm-ui/frontend/src/services/types/baseResponse.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -export interface BaseResponse { - code: number; - data: T; - message: string; - request_id: string; -} diff --git a/dbm-ui/frontend/src/services/types/clusters.ts b/dbm-ui/frontend/src/services/types/clusters.ts index 99bf1ef074..98656e2f53 100644 --- a/dbm-ui/frontend/src/services/types/clusters.ts +++ b/dbm-ui/frontend/src/services/types/clusters.ts @@ -11,304 +11,7 @@ * the specific language governing permissions and limitations under the License. */ -import type { HostDetails, ResourceItem } from '../types'; - -/** - * 用来获取集群节点的 keys - */ -export enum ClusterNodeKeys { - PROXY = 'proxy', - REDIS_MASTER = 'redis_master', - REDIS_SLAVE = 'redis_slave', -} -export type ClusterNodeKeyValues = `${ClusterNodeKeys}`; - -/** - * 查询资源列表参数 - */ -export interface GetResourcesParams { - bk_biz_id: number; - limit: number; - offset: number; - type: string; - cluster_ids?: number[] | number; -} - -/** - * 查询资源列表返回结果 - */ -export interface ResourcesResult { - count: number; - next: string; - previous: string; - results: T[]; -} - -/** - * redis 资源信息 - */ -export interface ResourceRedisItem { - bk_biz_id: number; - bk_biz_name: string; - bk_cloud_id: number; - bk_cloud_name: string; - cluster_alias: string; - cluster_name: string; - cluster_type: string; - create_at: string; - creator: string; - dns_to_clb: boolean; - update_at: string; - updater: string; - db_module_name: string; - id: number; - master_domain: string; - slave_domain: string[]; - phase: 'online' | 'offline'; - status: string; - cluster_entry: { - entry: string; - cluster_entry_type: string; - role: string; - }[]; - cluster_entry_details: { - cluster_entry_type: string; - entry: string; - role: string; - target_details: { - app: string; - bk_cloud_iduid: number; - dns_str: string; - domain_name: string; - domain_typeuid: number; - ip: string; - last_change_time: string; - manager: string; - port: number; - remark: string; - start_time: string; - status: string; - uid: number; - }[]; - }[]; - operations: Array<{ - cluster_id: number; - flow_id: number; - status: string; - ticket_id: number; - ticket_type: string; - title: string; - }>; - [ClusterNodeKeys.REDIS_MASTER]: ResourceItem['masters']; - [ClusterNodeKeys.PROXY]: ResourceItem['masters']; - [ClusterNodeKeys.REDIS_SLAVE]: ResourceItem['masters']; -} - -/** - * 查询资源表格列返回结果 - */ -export interface TableFieldsItem { - key: string; - name: string; -} - -/** - * 查询资源表格参数 - */ -export interface TableFieldsParams { - bk_biz_id: number; - type: string; -} - -/** - * 获取资源详情参数 - */ -export interface ResourceParams { - bk_biz_id: number; - id: number; - type: string; -} - -/** - * 获取资源实例列表参数 - */ -export interface ResourceInstancesParams { - bk_biz_id: number; - type: string; - db_type: string; - limit?: number; - offset?: number; - instance_address?: string; - domain?: string; - status?: string; - ip?: string; - port?: string; - cluster_id?: number; - role?: string; -} - -/** - * 资源实例信息 - */ -// export interface ResourceInstance { -// bk_cloud_id: number, -// bk_cloud_name: string, -// bk_host_id: number, -// cluster_id: number, -// cluster_name: string, -// cluster_type: string, -// create_at: string, -// db_module_id: number, -// host_info: HostDetails, -// id: number, -// instance_address: string, -// ip: string, -// master_domain: string, -// port: number, -// related_clusters?: { -// alias: string, -// bk_biz_id: number, -// bk_cloud_id: number, -// cluster_name: string, -// cluster_type: string, -// creator: string, -// db_module_id: number, -// id: number, -// major_version: string, -// master_domain: string, -// phase: string, -// region: string, -// status: string, -// time_zone: string -// updater: string, -// }[], -// role: string, -// slave_domain: string, -// spec_config: { -// id: number -// } -// status: string, -// version: string, -// } - -/** - * 获取集群拓扑参数 - */ -export interface ResourceTopoParams { - type: string; - bk_biz_id: number; - resource_id: number; -} - -export interface GetClusterHostNodesRequestParam { - db_type: string; - bk_biz_id: string; - cluster_id: string; -} - -/** - * 集群详情拓扑图 node - */ -export interface ResourceTopoNode { - node_id: string; - node_type: string; - url: string; -} - -/** - * 集群详情拓扑图 group - */ -export interface ResourceTopoGroup { - node_id: string; - group_name: string; - children_id: string[]; -} - -/** - * 集群详情拓扑图 line - */ -export interface ResourceTopoLine { - source: string; - source_type: string; - target: string; - target_type: string; - label: string; - label_name: string; -} - -/** - * 获取集群实例详情参数 - */ -export interface InstanceDetailsParams { - bk_biz_id: number; - type: string; - instance_address: string; - cluster_id?: number; -} - -/** - * 集群实例详情 - */ -export interface InstanceDetails { - bk_cloud_id: number; - bk_cpu: number; - bk_disk: number; - bk_host_id: number; - bk_host_innerip: string; - bk_mem: number; - bk_os_name: string; - cluster_id: number; - cluster_type: string; - create_at: string; - idc_city_id: string; - idc_city_name: string; - idc_id: number; - instance_address: string; - master_domain: string; - net_device_id: string; - rack: string; - rack_id: number; - role: string; - slave_domain: string; - status: string; - sub_zone: string; - db_module_id: number; - cluster_type_display: string; - bk_idc_name: string; - bk_cloud_name: string; - db_version: string; - version?: string; -} - -/** - * 查询主机节点列表参数 - */ -export interface ClusterNodesParams { - bk_biz_id: number; - cluster_id: number; - db_type: string; - type: string; - role: string; - keyword?: string; -} - -/** - * 获取集群密码参数 - */ -export interface ClusterPasswordParams { - bk_biz_id: number; - cluster_id: number; - db_type: string; - type: string; -} -/** - * 集群密码 - */ -export interface ClusterPassword { - cluster_name: string; - domain: string; - password: string; -} +import type { HostDetails } from '../types'; /** * 实例详细信息(包含主机、集群) @@ -360,45 +63,3 @@ export interface InstanceInfos { }; status: 'running' | 'unavailable'; } - -/** - * mysql 工具箱集群信息 - */ -export interface MySQLClusterInfos { - alias: string; - bk_biz_id: number; - bk_cloud_id: number; - cluster_name: string; - cluster_type: string; - creator: string; - db_module_id: number; - db_module_name: string; - id: number; - instance_count: number; - major_version: string; - master_domain: string; - masters: { - bk_biz_id: number; - bk_cloud_id: number; - bk_host_id: number; - bk_instance_id: number; - instance: string; - ip: string; - name: string; - phase: string; - port: number; - spec_config: { - id: number; - }; - status: string; - }[]; - name: string; - phase: string; - proxies: MySQLClusterInfos['masters']; - region: string; - repeaters: string[]; - slaves: MySQLClusterInfos['masters']; - status: string; - time_zone: string; - updater: string; -} diff --git a/dbm-ui/frontend/src/services/types/common.ts b/dbm-ui/frontend/src/services/types/common.ts index a98f8faab7..360ff3529e 100644 --- a/dbm-ui/frontend/src/services/types/common.ts +++ b/dbm-ui/frontend/src/services/types/common.ts @@ -19,148 +19,6 @@ export interface BaseResponse { request_id: string; } -/** - * 列表基础类型 - */ -export interface ListBase { - count: number; - next: string; - previous: string; - results: T; -} - -/** - * 业务信息 - */ -export interface BizItem { - bk_biz_id: number; - english_name: string; - display_name: string; - pinyin_name: string; - pinyin_head: string; - name: string; - permission: { - db_manage: boolean; - }; -} - -/** - * 模块信息 - */ -export interface ModuleItem { - bk_biz_id: number; - db_module_id: number; - name: string; -} - -/** - * 获取模块参数 - */ -export interface GetModulesParams { - bk_biz_id: number; - cluster_type: string; -} - -/** - * 获取人员列表参数 - */ -export interface GetUsesParams { - limit?: number; - offset?: number; - fuzzy_lookups?: string; -} - -/** - * 个人配置信息 - */ -export interface ProfileItem { - label: string; - values: any; -} - -/** - * 个人配置信息返回结果 - */ -export interface ProfileResult { - profile: ProfileItem[]; - username: string; - is_manager: boolean; -} - -/** - * 无权限返回 - */ -export interface Permission { - apply_url: string; - permission: { - actions: PermissionAction[]; - system_id: string; - system_name: string; - }; -} -export interface PermissionAction { - id: string; - name: string; - related_resource_types: PermissionRelated[]; -} -export interface PermissionRelated { - instances: PermissionRelatedInstance[][]; - system_id: string; - system_name: string; - type: string; - type_name: string; -} -export interface PermissionRelatedInstance { - id: string; - name: string; - type: string; - type_name: string; -} - -/** - * 节点详情 - */ -export interface HostNode { - bk_os_name: string; - bk_host_id: number; - bk_cloud_id: number; - bk_host_innerip_v6: string; - bk_host_name: string; - bk_os_type: number | string; - bk_host_innerip: string; - status: number; - bk_agent_id: string; - bk_cloud_name: string; - bk_cloud_vendor: null; - bk_cpu: number; - bk_mem: number; - instance_num: number; -} - -/** - * 用于提交的节点数据 - */ -export interface HostNodeForSubmit { - bk_host_id?: number; - ip: string; -} - -/** - * 搜索过滤返回结果 - */ -export interface SearchFilterItem { - id: number | string; - name: string; -} - -/** - * 校验资源权限参数 - */ -export interface IAMParams { - action_ids: Array; - resources: Array<{ type: string; id: string | number }>; -} - export enum OnlineSwitchType { USER_CONFIRM = 'user_confirm', NO_CONFIRM = 'no_confirm', diff --git a/dbm-ui/frontend/src/services/types/configs.ts b/dbm-ui/frontend/src/services/types/configs.ts deleted file mode 100644 index 43755efb08..0000000000 --- a/dbm-ui/frontend/src/services/types/configs.ts +++ /dev/null @@ -1,228 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -/** - * 查询平台配置列表参数 - */ -export interface PlatConfListParams { - meta_cluster_type: string; - conf_type: string; -} - -/** - * 查询平台配置详情参数 - */ -export interface PlatConfDetailsParams { - meta_cluster_type: string; - conf_type: string; - version: string; -} - -/** - * 修改平台配置信息 - */ -export interface PlatConfDetailsUpdateParams { - conf_items: ParameterConfigItem[]; - version: string; - name: string; - description: string; - conf_type: string; - confirm: number; - meta_cluster_type: string; - publish_description?: string; -} - -/** - * 配置列表项 - */ -export interface ConfigListItem { - name: string; - updated_at: string; - updated_by: string; - version: string; -} - -/** - * 配置基础信息 - */ -export interface ConfigBaseDetails { - conf_items: ParameterConfigItem[]; - version: string; - name: string; - description: string; - updated_at?: string; - updated_by?: string; -} - -/** - * 参数配置项 - */ -export interface ParameterConfigItem { - conf_name: string; - conf_name_lc?: string; - description: string; - flag_disable: number; - flag_locked: number; - need_restart: number; - value_allowed: string; - op_type: string; - value_default?: string; - value_type?: string; - value_type_sub?: string; - conf_value?: string; - extra_info?: string; - level_name?: string; - leval_value?: string; -} - -/** - * 保存并发布返回信息 - */ -export interface ConfigSaveResult { - conf_file: string; - conf_type: string; - file_id: number; - is_published: number; - namespace: string; - revision: string; -} - -/** - * 查询配置发布历史记录 | 查询配置发布记录详情 参数 - */ -export interface ConfigVersionParams { - meta_cluster_type: string; - conf_type: string; - version: string; - bk_biz_id?: number; - level_name?: string; - level_value?: number; - level_info?: any; - revision?: string; -} - -/** - * 配置发布历史返回 - */ -export interface ConfigVersionListResult { - bk_biz_id: number | string; - conf_file: string; - level_name: string; - level_value: number | string; - namespace: string; - published: string; - versions: ConfigVersionItem[]; -} - -/** - * 发布历史版本信息 - */ -export interface ConfigVersionItem { - conf_file: string; - created_at: string; - created_by: string; - description: string; - is_published: number; - revision: string; - rows_affected: number; -} - -/** - * 发布历史版本详情 - */ -export interface ConfigVersionDetails { - configs: ConfigVersionDiffItem[]; - configs_diff: ConfigVersionDiffItem[]; - content: string; - created_at: string; - created_by: string; - description: string; - id: number; - is_published: number; - pre_revision: string; - revision: string; - name: string; - version: string; - rows_affected: number; - publish_description: string; - updated_at: string; - updated_by: string; -} - -/** - * 发布历史版本详情配置Diff信息 - */ -export interface ConfigVersionDiffItem { - conf_name: string; - conf_value: string; - description: string; - extra_info: string; - flag_disable: number; - flag_locked: number; - level_name: string; - level_value: string; - op_type: string; - need_restart: number; - value_allowed: string; -} - -/** - * 获取查询层级(业务、模块、集群)配置详情参数 - */ -export interface GetLevelConfigParams { - conf_type: string; - meta_cluster_type: string; - version?: string; - bk_biz_id?: number; - level_name?: string; - level_value?: number; - level_info?: { - module?: string; - app?: string; - }; -} - -/** - * 查询业务配置列表参数 - */ -export interface BizConfListParams { - meta_cluster_type: string; - conf_type: string; - bk_biz_id: number; -} - -/** - * 修改业务配置信息 - */ -export interface BizConfDetailsUpdateParams { - meta_cluster_type: string; - conf_type: string; - bk_biz_id: number; - version: string; - level_name: string; - level_value: number; - conf_items: ParameterConfigItem[]; - description: string; - confirm: number; - publish_description?: string; - level_info?: any; -} - -/** - * 获取业务拓扑树参数 - */ -export interface BizConfTopoTreeParams { - cluster_type: string; - db_type: string; - bk_biz_id: number; -} diff --git a/dbm-ui/frontend/src/services/types/eventSwitch.ts b/dbm-ui/frontend/src/services/types/eventSwitch.ts deleted file mode 100644 index e261869d0c..0000000000 --- a/dbm-ui/frontend/src/services/types/eventSwitch.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -export interface EventSwtichItem { - app: string; - bk_biz_id: number; - bk_biz_name: string; - cloud: string; - cluster: string; - cluster_info: { - cluster_type: string; - id: number; - immute_domain: string; - }; - confirm_check_time: string; - confirm_result: string; - db_role: string; - db_type: string; - idc: string; - ip: string; - port: number; - remark: string; - slave_ip: string; - slave_port: number; - status: string; - switch_finished_time: string; - switch_result: string; - switch_start_time: string; - uid: number; -} - -export interface EventSwitchLogItem { - levelname: string; - message: string; - timestamp: number; -} diff --git a/dbm-ui/frontend/src/services/types/index.ts b/dbm-ui/frontend/src/services/types/index.ts index f404253e62..53c3732a77 100644 --- a/dbm-ui/frontend/src/services/types/index.ts +++ b/dbm-ui/frontend/src/services/types/index.ts @@ -11,14 +11,11 @@ * the specific language governing permissions and limitations under the License. */ -export * from './baseResponse'; export * from './bizItem'; export * from './clusters'; +export * from './common'; export * from './hostDetails'; export * from './hostNode'; export * from './listBase'; export * from './permission'; -export * from './resourceInstance'; -export * from './resourceItem'; export * from './resourceTopo'; -export * from './searchFilterItem'; diff --git a/dbm-ui/frontend/src/services/types/influxdbGroup.ts b/dbm-ui/frontend/src/services/types/influxdbGroup.ts deleted file mode 100644 index 366456eef7..0000000000 --- a/dbm-ui/frontend/src/services/types/influxdbGroup.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -export interface InfluxDBGroupItem { - id: number; - creator: string; - create_at: string; - updater: string; - update_at: string; - bk_biz_id: number; - instance_count: number; - name: string; -} diff --git a/dbm-ui/frontend/src/services/types/ip.ts b/dbm-ui/frontend/src/services/types/ip.ts deleted file mode 100644 index c937c6ba84..0000000000 --- a/dbm-ui/frontend/src/services/types/ip.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -export interface IpScope { - scope_id: number; - scope_type: string; - bk_cloud_id?: number | string; -} - -/** - * 校验手动 IP 信息参数 - */ -export interface CheckIpParams { - mode?: string; - ip_list: string[]; - ipv6_list?: string[]; - key_list?: string[]; - scope_list: IpScope[]; -} - -export interface HostMeta { - bk_biz_id: number; - scope_id: number; - scope_type: string; -} - -/** - * 获取主机详情参数 - */ -export interface FetchHostDetailsParams { - mode?: string; - host_list: Array>; - scope_list: IpScope[]; -} - -/** - * 获取主机信息参数 - */ -export interface FetchHostInfosParams { - node_list: Array<{ instance_id: number; object_id: string; meta: HostMeta }>; - page_size: number; - start: number; - mode?: string; -} - -/** - * 获取主机拓扑参数 - */ -export interface FetchHostTopoParams { - mode?: string; - all_scope: boolean; - scope_list: IpScope[]; -} - -/** - * 主机详情 - */ -export interface HostDetails { - alive: number; - biz: { id: number; name: string }; - cloud_area: { id: number; name: string }; - cloud_id: number; - host_id: number; - host_name?: string; - ip: string; - ipv6: string; - meta: HostMeta; - scope_id: string; - scope_type: string; - os_name: string; - bk_cpu?: number; - bk_disk?: number; - bk_mem?: number; - os_type: string; - agent_id: number; - cpu: string; - cloud_vendor: string; - bk_idc_name?: string; -} - -/** - * 主机提交格式 - */ -export interface HostSubmitParams { - ip: string; - bk_cloud_id: number; - bk_host_id: number; - bk_cpu?: number; - bk_mem?: number; - bk_disk?: number; - bk_biz_id: number; -} - -/** - * 主机拓扑信息 - */ -export interface HostTopoInfo { - bk_cloud_id: number; - bk_host_id: number; - ip: string; - topo: string[]; -} - -/** - * 管控区域基本信息 - */ -export interface CloudAreaInfo { - bk_account_id: number; - bk_cloud_id: number; - bk_cloud_name: string; - bk_cloud_vendor: string; - bk_creator: string; - bk_last_editor: string; - bk_region: string; - bk_status: string; - bk_status_detail: string; - bk_supplier_account: string; - bk_vpc_id: string; - bk_vpc_name: string; - create_time: string; - last_time: string; -} diff --git a/dbm-ui/frontend/src/services/types/permission.ts b/dbm-ui/frontend/src/services/types/permission.ts index a588a03801..0b3d40278c 100644 --- a/dbm-ui/frontend/src/services/types/permission.ts +++ b/dbm-ui/frontend/src/services/types/permission.ts @@ -13,48 +13,7 @@ import type { AccountTypesValues } from '@common/const'; -import type { ListBase } from './listBase'; - -/** - * 无权限返回 - */ -export interface Permission { - apply_url: string; - permission: { - actions: { - id: string; - name: string; - related_resource_types: { - instances: { - id: string; - name: string; - type: string; - type_name: string; - }[][]; - system_id: string; - system_name: string; - type: string; - type_name: string; - }[]; - }[]; - system_id: string; - system_name: string; - }; -} - -/** - * 查询账号规则列表参数 - */ -export interface PermissionRulesParams { - limit?: number; - offset?: number; - bk_biz_id: number; - rule_ids?: string; - user?: string; - access_db?: string; - privilege?: string; - account_type?: AccountTypesValues; -} +import type { ListBase } from './index'; /** * 查询账号规则列表返回结果 @@ -133,7 +92,14 @@ export interface PasswordPolicy { name: string; rule: { include_rule: PasswordPolicyIncludeRule; - exclude_continuous_rule: PasswordPolicyExcludeContinuousRule; + exclude_continuous_rule: { + limit: number; + letters: boolean; + numbers: boolean; + repeats: boolean; + symbols: boolean; + keyboards: boolean; + }; max_length: number; min_length: number; }; @@ -151,16 +117,6 @@ export interface PasswordPolicyIncludeRule { uppercase: boolean; } -// 密码策略 exclude_continuous_rule -export interface PasswordPolicyExcludeContinuousRule { - limit: number; - letters: boolean; - numbers: boolean; - repeats: boolean; - symbols: boolean; - keyboards: boolean; -} - // 密码策略 include_rule export interface PasswordPolicyIncludeRule { numbers: boolean; @@ -169,16 +125,6 @@ export interface PasswordPolicyIncludeRule { uppercase: boolean; } -// 密码策略 exclude_continuous_rule -export interface PasswordPolicyExcludeContinuousRule { - limit: number; - letters: boolean; - numbers: boolean; - repeats: boolean; - symbols: boolean; - keyboards: boolean; -} - /** * 新增账号规则 */ @@ -225,17 +171,3 @@ export interface AuthorizePreCheckResult { task_index: number; authorize_data_list: AuthorizePreCheckData[]; } - -/** - * 实例权限克隆 - */ -export interface PermissionCloneRes { - clone_data_list: Array<{ - message: string; - source: string; - target: Array | string; - }>; - clone_uid: string; - message: string; - pre_check: boolean; -} diff --git a/dbm-ui/frontend/src/services/types/resourceInstance.ts b/dbm-ui/frontend/src/services/types/resourceInstance.ts deleted file mode 100644 index 789d6430b7..0000000000 --- a/dbm-ui/frontend/src/services/types/resourceInstance.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 type { HostDetails } from '../types'; - -/** - * 资源实例信息 - */ -export interface ResourceInstance { - bk_cloud_id: number; - bk_cloud_name: string; - bk_host_id: number; - cluster_id: number; - cluster_name: string; - cluster_type: string; - create_at: string; - db_module_id: number; - db_module_name: string; - host_info: HostDetails; - id: number; - instance_address: string; - ip: string; - master_domain: string; - port: number; - related_clusters?: { - alias: string; - bk_biz_id: number; - bk_cloud_id: number; - cluster_name: string; - cluster_type: string; - creator: string; - db_module_id: number; - id: number; - major_version: string; - master_domain: string; - phase: string; - region: string; - status: string; - time_zone: string; - updater: string; - }[]; - role: string; - slave_domain: string; - spec_config: { - id: number; - }; - status: string; - version: string; - permission: Record; -} diff --git a/dbm-ui/frontend/src/services/types/resourceItem.ts b/dbm-ui/frontend/src/services/types/resourceItem.ts deleted file mode 100644 index 77028a166e..0000000000 --- a/dbm-ui/frontend/src/services/types/resourceItem.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 { PipelineStatus } from '@common/const'; - -/** - * mysql 资源信息 - */ -export interface ResourceItem { - bk_cloud_id: number; - cluster_entry_details: { - cluster_entry_type: string; - entry: string; - role: string; - target_details: { - app: string; - bk_cloud_iduid: number; - dns_str: string; - domain_name: string; - domain_typeuid: number; - ip: string; - last_change_time: string; - manager: string; - port: number; - remark: string; - start_time: string; - status: string; - uid: number; - }[]; - }[]; - cluster_name: string; - cluster_type: string; - create_at: string; - creator: string; - db_module_name: string; - db_module_id: number; - id: number; - master_domain: string; - masters: { - bk_biz_id: number; - bk_cloud_id: number; - bk_host_id: number; - bk_instance_id: number; - ip: string; - name: string; - instance: string; - port: number; - status: 'running' | 'unavailable'; - }[]; - operations: Array<{ - cluster_id: number; - flow_id: number; - status: PipelineStatus; - ticket_id: number; - ticket_type: string; - title: string; - }>; - phase: 'online' | 'offline'; - proxies?: ResourceItem['masters']; - slaves?: ResourceItem['masters']; - slave_domain: string; - status: 'normal' | 'abnormal'; - isMaster: boolean; -} diff --git a/dbm-ui/frontend/src/services/types/searchFilterItem.ts b/dbm-ui/frontend/src/services/types/searchFilterItem.ts deleted file mode 100644 index 169f644b61..0000000000 --- a/dbm-ui/frontend/src/services/types/searchFilterItem.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -/** - * 搜索过滤返回结果 - */ -export interface SearchFilterItem { - id: number | string; - name: string; -} diff --git a/dbm-ui/frontend/src/services/types/staffSetting.ts b/dbm-ui/frontend/src/services/types/staffSetting.ts deleted file mode 100644 index 6839040369..0000000000 --- a/dbm-ui/frontend/src/services/types/staffSetting.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -export interface AdminItem { - db_type: string; - users: string[]; - db_type_display: string; -} - -export interface UpdateAdminsParams { - bk_biz_id: number; - db_admins: AdminItem[]; -} diff --git a/dbm-ui/frontend/src/services/types/taskflow.ts b/dbm-ui/frontend/src/services/types/taskflow.ts index 550af6aa73..8f880ee7a1 100644 --- a/dbm-ui/frontend/src/services/types/taskflow.ts +++ b/dbm-ui/frontend/src/services/types/taskflow.ts @@ -13,33 +13,6 @@ import type { TicketTypesStrings } from '@common/const'; -/** - * 查询任务列表参数 - */ -export interface GetTaskflowParams { - bk_biz_id: number; - limit: number; - offset: number; - root_id?: string; - uid?: number; - status?: string; - status__in?: string; - ticket_type?: string; - ticket_type__in?: string; - created_at__gte?: string; - created_at__lte?: string; -} - -/** - * 任务列表返回结果 - */ -export interface TaskflowResult { - count: number; - next: string; - previous: string; - results: TaskflowItem[]; -} - /** * 任务列表项 */ @@ -84,20 +57,20 @@ export type FlowStatus = 'FINISHED' | 'RUNNING' | 'FAILED' | 'READY' | 'CREATED' * 任务流程节点数据 */ export interface FlowItem { - id: string, - name: string | null, - incoming: string | string[], - outgoing: string | string[], - type: FlowType, - started_at: number, - updated_at: number, - error_ignorable?: boolean, - optional?: boolean, - retryable?: boolean, - skippable?: boolean, - status?: FlowStatus, - timeout?: number, - created_at?: number, + id: string; + name: string | null; + incoming: string | string[]; + outgoing: string | string[]; + type: FlowType; + started_at: number; + updated_at: number; + error_ignorable?: boolean; + optional?: boolean; + retryable?: boolean; + skippable?: boolean; + status?: FlowStatus; + timeout?: number; + created_at?: number; component?: { code: string; }; @@ -127,56 +100,3 @@ export interface FlowsData { activities: { [key: string]: FlowItem }; flow_info: TaskflowItem; } - -/** - * 节点重试信息 - */ -export interface RetryNodeItem { - started_time: string; - version: string; - cost_time: number; -} - -/** - * 获取节点日志参数 - */ -export interface GetNodeLogParams { - root_id: string; - node_id: string; - version_id: string; -} - -/** - * 获取节点日志 - */ -export interface NodeLog { - timestamp: number; - message: string; - levelname: string; -} - -/** - * 结果文件列表信息 - */ -export interface KeyFileItem { - name: string; - size: number; - size_display: string; - domain: string; - created_time: string; - cluster_alias: string; - path: string; - cluster_id: number; - files: KeyFile[]; -} - -/** - * 结果文件信息 - */ -export interface KeyFile { - size: string; - name: string; - md5: string; - full_path: string; - created_time: string; -} diff --git a/dbm-ui/frontend/src/services/types/ticket.ts b/dbm-ui/frontend/src/services/types/ticket.ts index 8b231f8b4e..23d46ef585 100644 --- a/dbm-ui/frontend/src/services/types/ticket.ts +++ b/dbm-ui/frontend/src/services/types/ticket.ts @@ -10,57 +10,12 @@ * on 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 type { MySQLImportSQLFileDetails } from '@services/model/ticket/details/mysql'; + import { TicketTypes } from '@common/const'; import type { IHostTableData } from '@components/cluster-common/big-data-host-table/HdfsHostTable.vue'; -/** - * 获取单据列表过滤参数 - */ -export interface GetTicketParams { - bk_biz_id?: number; - ticket_type?: string; - status?: string; - limit?: number; - offset?: number; -} - -/** - * 单据列表项 - */ -export interface TicketItem { - db_app_abbr: string; - bk_biz_id: number; - bk_biz_name: string; - cost_time: number; - create_at: string; - creator: string; - details: any; - id: number; - remark: string; - status: string; - status_display: string; - ticket_type: string; - ticket_type_display: string; - update_at: string; - updater: string; - is_reviewed: boolean; - related_object: { - title: string; - objects: string[]; - }; -} - -/** - * 单据列表返回结果 - */ -export interface TicketResult { - count: number; - next: string; - previous: string; - results: TicketItem[]; -} - /** * 单据详情 */ @@ -141,30 +96,6 @@ export interface FlowItemTodo { url: string; } -export interface ConfItems { - conf_name: string; - conf_value: string; - op_type: string; -} - -/** - * 获取单据详情节点列表参数 - */ -export interface TicketNodesParams { - bk_biz_id: number; - id: number; - role: string; - keyword?: string; -} - -/** - * mysql-查询账号参数 - */ -export interface MysqlQueryAccountParams { - user: string; - access_dbs: string[]; -} - /** * es - 单据详情 */ @@ -285,38 +216,6 @@ export interface clustersItems { }; } -/** - * MySQL 库表备份 - */ -export interface MySQLTableBackupDetails { - clusters: clustersItems; - infos: { - backup_on: string; - cluster_id: number; - db_patterns: []; - ignore_dbs: []; - ignore_tables: []; - table_patterns: []; - force: boolean; - }[]; -} - -/** - * MySQL 主从清档 - */ -export interface MySQLHATruncateDetails { - clusters: clustersItems; - infos: { - cluster_id: number; - db_patterns: []; - ignore_dbs: []; - ignore_tables: []; - table_patterns: []; - force: boolean; - truncate_data_type: string; - }[]; -} - export interface MysqlIpItem { bk_biz_id: number; bk_cloud_id: number; @@ -325,206 +224,6 @@ export interface MysqlIpItem { port?: number; } -/** - * MySQL 克隆主从 - */ -export interface MySQLMigrateDetails { - clusters: clustersItems; - infos: { - cluster_ids: number[]; - new_master: MysqlIpItem; - new_slave: MysqlIpItem; - }[]; -} - -/** - * MySQL 主从互换 - */ -export interface MySQLMasterSlaveDetails { - clusters: clustersItems; - infos: { - cluster_ids: number[]; - master_ip: MysqlIpItem; - slave_ip: MysqlIpItem; - }[]; -} - -/** - * MySQL 新增 Proxy - */ -export interface MySQLProxyAddDetails { - clusters: clustersItems; - infos: { - cluster_ids: number[]; - new_proxy: MysqlIpItem; - }[]; -} - -/** - * MySQL 主故障切换 - */ -export interface MySQLMasterFailDetails { - clusters: clustersItems; - infos: { - cluster_ids: number[]; - master_ip: MysqlIpItem; - slave_ip: MysqlIpItem; - }[]; -} - -/** - * MySQL SQL变更执行 - */ -export interface MySQLImportSQLFileDetails { - uid: string; - path: string; - backup: { - backup_on: string; - db_patterns: string[]; - table_patterns: string[]; - }[]; - charset: string; - root_id: string; - bk_biz_id: number; - created_by: string; - cluster_ids: number[]; - clusters: clustersItems; - ticket_mode: { - mode: string; - trigger_time: string; - }; - ticket_type: string; - execute_objects: { - dbnames: string[]; - sql_file: string; - ignore_dbnames: string[]; - }[]; - execute_db_infos: { - dbnames: string[]; - ignore_dbnames: string[]; - }[]; - execute_sql_files: string[]; - grammar_check_info: Record< - string, - { - highrisk_warnings: { - command_type: string; - line: number; - sqltext: string; - warn_info: string; - }[]; - } - >; - import_mode: string; - semantic_node_id: string; -} - -/** - * MySQL 闪回 - */ -export interface MySQLFlashback { - clusters: clustersItems; - infos: { - cluster_id: number; - databases: []; - databases_ignore: []; - end_time: string; - mysqlbinlog_rollback: string; - recored_file: string; - start_time: string; - tables: []; - tables_ignore: []; - }[]; -} - -/** - * MySql 定点回档 - */ -export interface MySQLRollbackDetails { - clusters: clustersItems; - infos: { - backup_source: string; - backupid: string; - cluster_id: number; - databases: string[]; - databases_ignore: string[]; - rollback_ip: string; - rollback_time: string; - tables: string[]; - tables_ignore: string[]; - backupinfo: { - backup_id: string; - mysql_host: string; - mysql_port: number; - mysql_role: string; - backup_time: string; - backup_type: string; - master_host: string; - master_port: number; - }; - }[]; -} - -/** - * MySQL SLAVE重建 - */ -export interface MySQLRestoreSlaveDetails { - clusters: clustersItems; - infos: { - backup_source: string; - cluster_ids: number[]; - new_slave: MysqlIpItem; - old_slave: MysqlIpItem; - }[]; -} - -/** - * MySQL 全库备份 - */ -export interface MySQLFullBackupDetails { - clusters: clustersItems; - infos: { - backup_type: string; - clusters: { - backup_local: string; - cluster_id: number; - }[]; - file_tag: string; - online: boolean; - }; -} - -/** - * MySQL 校验 - */ -export interface MySQLChecksumDetails { - clusters: clustersItems; - data_repair: { - is_repair: boolean; - mode: string; - }; - infos: { - cluster_id: number; - db_patterns: string[]; - ignore_dbs: string[]; - ignore_tables: string[]; - master: { - id: number; - ip: string; - port: number; - }; - slaves: { - id: number; - ip: string; - port: number; - }[]; - table_patterns: string[]; - }[]; - is_sync_non_innodb: boolean; - runtime_hour: number; - timing: string; -} - /** * 大数据替换 */ @@ -566,16 +265,6 @@ export interface BigDataCapacityDetails { }; } -// Redis 提交单据 -export interface SubmitTicket> { - bk_biz_id: number; - ticket_type: T; - details: { - ip_source?: 'resource_pool'; - infos: U; - }; -} - export interface SpecInfo { spec_id: number; spec_name: string; @@ -867,49 +556,3 @@ export interface SpiderPartitionManageDetails { }; }; } - -export interface MysqlOpenAreaDetails { - cluster_id: number; - clusters: { - [key: string]: { - alias: string; - bk_biz_id: number; - bk_cloud_id: number; - cluster_type: string; - cluster_type_name: string; - creator: string; - db_module_id: number; - disaster_tolerance_level: string; - id: number; - immute_domain: string; - major_version: string; - name: string; - phase: string; - region: string; - status: string; - tag: string[]; - time_zone: string; - updater: string; - }; - }; - config_data: { - cluster_id: number; - execute_objects: { - data_tblist: string[]; - schema_tblist: string[]; - source_db: string; - target_db: string; - }[]; - }[]; - force: boolean; - rules_set: { - account_rules: { - bk_biz_id: number; - dbname: string; - }[]; - cluster_type: string; - source_ips: string[]; - target_instances: string[]; - user: string; - }[]; -} diff --git a/dbm-ui/frontend/src/services/types/versionFiles.ts b/dbm-ui/frontend/src/services/types/versionFiles.ts deleted file mode 100644 index fcd9b4382d..0000000000 --- a/dbm-ui/frontend/src/services/types/versionFiles.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -/** - * 查询版本列表参数 - */ -export interface GetPackagesParams { - pkg_type: string; - db_type: string; - keyword: string; - limit: number; - offset: number; -} - -/** - * 查询版本列表返回结果 - */ -export interface PackagesResult { - count: number; - next: string; - previous: string; - results: PackageItem[]; -} - -/** - * 版本信息 - */ -export interface PackageItem { - allow_biz_ids: number[]; - create_at: string; - creator: string; - enable: boolean; - id: number; - md5: string; - mode: string; - name: string; - path: string; - pkg_type: string; - priority: number; - size: number; - update_at: string; - updater: string; - version: string; -} - -/** - * 新建版本信息 - */ -export interface NewPackageParams { - name: string; - version: string; - pkg_type: string; - db_type: string; - path: string; - size: number; - md5: string; - allow_biz_ids?: number[]; - mode?: string; -} - -/** - * 获取数据库版本列表 - */ -export interface GetVersionsParams { - query_key: string; - db_type?: string; -} - -/** - * 文件上传参数 - */ -export interface UploadParams { - file: any; - version: string; - pkg_type: string; - db_type: string; -} - -/** - * 文件上传返回结果 - */ -export interface UploadResult { - md5: string; - name: string; - path: string; - size: number; -} diff --git a/dbm-ui/frontend/src/services/types/whitelist.ts b/dbm-ui/frontend/src/services/types/whitelist.ts deleted file mode 100644 index 4debd2ce5f..0000000000 --- a/dbm-ui/frontend/src/services/types/whitelist.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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. - */ - -// 编辑、新建参数 -export interface WhitelistOperationData { - bk_biz_id: number; - ips: string[]; - remark: string; -} - -export interface WhitelistItem { - ips: string[]; - is_global: boolean; - remark: string; - bk_biz_id: number; - create_at: string; - creator: string; - id: number; - update_at: string; - updater: string; -} diff --git a/dbm-ui/frontend/src/types/auto-imports.d.ts b/dbm-ui/frontend/src/types/auto-imports.d.ts index 6bc2ae2a45..79be9ca2a4 100644 --- a/dbm-ui/frontend/src/types/auto-imports.d.ts +++ b/dbm-ui/frontend/src/types/auto-imports.d.ts @@ -3,7 +3,6 @@ // @ts-nocheck // noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import -// biome-ignore lint: disable export {} declare global { const EffectScope: (typeof import('vue'))['EffectScope']; diff --git a/dbm-ui/frontend/src/types/index.d.ts b/dbm-ui/frontend/src/types/index.d.ts index 034a27a186..6f7becffba 100644 --- a/dbm-ui/frontend/src/types/index.d.ts +++ b/dbm-ui/frontend/src/types/index.d.ts @@ -14,8 +14,6 @@ import type { TablePropTypes } from 'bkui-vue/lib/table/props'; import type { Router } from 'vue-router'; -import type { Permission } from '@services/types'; - declare global { interface Window { changeConfirm: boolean | 'popover'; @@ -24,10 +22,6 @@ declare global { hideLogin: () => void; isShow: boolean; }; - permission: { - show: (permission: Permission) => void; - isShow: boolean; - }; } interface Element { _bk_overflow_tips_: any; diff --git a/dbm-ui/frontend/src/views/db-manage/influxdb/apply/components/GroupItem.vue b/dbm-ui/frontend/src/views/db-manage/influxdb/apply/components/GroupItem.vue index 90f4b00256..2b33964edc 100644 --- a/dbm-ui/frontend/src/views/db-manage/influxdb/apply/components/GroupItem.vue +++ b/dbm-ui/frontend/src/views/db-manage/influxdb/apply/components/GroupItem.vue @@ -91,7 +91,6 @@ import { useI18n } from 'vue-i18n'; import { createGroup, getGroupList } from '@services/source/influxdbGroup'; - import type { InfluxDBGroupItem } from '@services/types/influxdbGroup'; import { nameRegx } from '@common/regex'; @@ -119,7 +118,7 @@ let isInit = true; const localGroupId = ref(''); - const groupList = shallowRef>([]); + const groupList = shallowRef['results']>([]); const isLoading = ref(false); watch( diff --git a/dbm-ui/frontend/src/views/db-manage/influxdb/instance-list/components/render-list/Index.vue b/dbm-ui/frontend/src/views/db-manage/influxdb/instance-list/components/render-list/Index.vue index 65f29fcd12..b1ff8d5294 100644 --- a/dbm-ui/frontend/src/views/db-manage/influxdb/instance-list/components/render-list/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/influxdb/instance-list/components/render-list/Index.vue @@ -158,7 +158,6 @@ import { moveInstancesToGroup } from '@services/source/influxdbGroup'; import { createTicket } from '@services/source/ticket'; import { getUserList } from '@services/source/user'; - import type { InfluxDBGroupItem } from '@services/types/influxdbGroup'; import { useCopy, useLinkQueryColumnSerach, useTableSettings, useTicketMessage } from '@hooks'; @@ -184,6 +183,8 @@ import ClusterReplace from './components/Replace.vue'; + type InfluxDBGroupItem = ServiceReturnType['results'][number]; + const route = useRoute(); const router = useRouter(); const ticketMessage = useTicketMessage(); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/Index.vue index 220afeda3c..42679a1e9c 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/Index.vue @@ -59,9 +59,9 @@ import { useI18n } from 'vue-i18n'; import { useRequest } from 'vue-request'; + import TendbhaModel from '@services/model/mysql/tendbha'; import { getMonitorUrls } from '@services/source/monitorGrafana'; import { getTendbhaDetail } from '@services/source/tendbha'; - import type { ResourceItem } from '@services/types'; import { useGlobalBizs } from '@stores'; @@ -90,7 +90,7 @@ const { currentBizId } = useGlobalBizs(); const activePanelKey = ref('topo'); - const data = ref(); + const data = ref(); const monitorPanelList = ref([]); @@ -101,7 +101,7 @@ const { loading: isLoading, run: fetchResourceDetails } = useRequest(getTendbhaDetail, { manual: true, - onSuccess(result: ResourceItem) { + onSuccess(result: TendbhaModel) { data.value = result; }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/components/BaseInfo.vue b/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/components/BaseInfo.vue index 8827bd73ae..37330d6383 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/components/BaseInfo.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/ha-cluster-list/components/detail/components/BaseInfo.vue @@ -21,12 +21,12 @@ diff --git a/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/CustomRotate.vue b/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/CustomRotate.vue index 8afbe59ccc..aa5d728e4f 100644 --- a/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/CustomRotate.vue +++ b/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/CustomRotate.vue @@ -35,7 +35,7 @@ import type { DutyCustomItem } from '@services/model/monitor/duty-rule'; import DutyRuleModel from '@services/model/monitor/duty-rule'; - import { getUseList } from '@services/source/common'; + import { getUserList } from '@services/source/user'; import { getDiffDays, random } from '@utils'; @@ -175,7 +175,7 @@ }, ])); - useRequest(getUseList, { + useRequest(getUserList, { onSuccess: (res) => { const list = res.results.map(item => ({ label: item.username, value: item.username })); contactList.value = list; diff --git a/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/SortTagInput.vue b/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/SortTagInput.vue index 882e075d37..068b804fdc 100644 --- a/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/SortTagInput.vue +++ b/dbm-ui/frontend/src/views/duty-rule-manage/index/components/edit-rule/SortTagInput.vue @@ -64,7 +64,7 @@ - - diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts index 4220060ec9..dddce5a077 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts @@ -11,8 +11,6 @@ * the specific language governing permissions and limitations under the License. */ import type { SpecInfo } from '@services/model/ticket/details/common'; -import type { MySQLExportData } from '@services/model/ticket/details/mysql'; -import type { clustersItems } from '@services/types/ticket'; import { ClusterTypes } from '@common/const'; @@ -129,30 +127,6 @@ export interface DetailsSqlserver { start_mssql_port: number; } -// Sqlserver 数据库备份 -export interface SqlserverDbBackup { - backup_place: string; - backup_type: string; - clusters: Record; - file_tag: string; - infos: { - backup_dbs: string[]; - cluster_id: number; - }[]; -} - -// Sqlserver 账号授权 -export interface SqlserverAuthorizeRules { - authorize_data?: { - user: string; - target_instances: string[]; - access_dbs: string[]; - cluster_type: string; - }[]; - authorize_uid: string; - excel_url?: string; -} - // spider 迁移主从 export interface SpiderMigrateCluster { infos: { @@ -291,15 +265,3 @@ export interface RedisHaApply { backend_group: SpecInfo; }; } - -export type TicketDetailTypes = - | DetailsMongoDBReplicaSet - | DetailsMongoDBSharedCluster - | MongoDBAuthorizeRules - | DetailsSqlserver - | SqlserverDbBackup - | SqlserverAuthorizeRules - | SpiderMigrateCluster - | SpiderMigrateCluster - | RedisHaApply - | MySQLExportData; diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/components/DemandInfo.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/components/DemandInfo.vue index 885d7422e4..c384212943 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/components/DemandInfo.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/components/DemandInfo.vue @@ -35,13 +35,11 @@ - - - const props = withDefaults(defineProps(), { + - + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mongodb/components/MongoConfigSpec.vue b/dbm-ui/frontend/src/views/db-manage/mongodb/components/MongoConfigSpec.vue index bb748949e2..7f5f4f5050 100644 --- a/dbm-ui/frontend/src/views/db-manage/mongodb/components/MongoConfigSpec.vue +++ b/dbm-ui/frontend/src/views/db-manage/mongodb/components/MongoConfigSpec.vue @@ -163,10 +163,12 @@ v-model={modelValue.value.spec_id} label={data.spec_id} key={index} - class="spec-radio"> + class="spec-radio" + onClick={(event: Event) => handleRowClick(event, data)}>
+ v-overflow-tips + onClick={(event: Event) => event.stopPropagation()}> {data.spec_name}
diff --git a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/Index.vue index 73715300c8..47d95c9673 100644 --- a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/Index.vue @@ -66,6 +66,7 @@ import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; + import RedisModel from '@services/model/redis/redis'; import { getRedisList } from '@services/source/redis'; import { createTicket } from '@services/source/ticket'; @@ -75,13 +76,11 @@ import { ClusterTypes, TicketTypes } from '@common/const'; - import ClusterSelector from '@components/cluster-selector/Index.vue'; + import ClusterSelector, { type TabItem } from '@components/cluster-selector/Index.vue'; import RenderData from './components/Index.vue'; import RenderDataRow, { createRowData, type IDataRow, type InfoItem } from './components/Row.vue'; - type RedisModel = ServiceReturnType['results'][number]; - const router = useRouter(); const { currentBizId } = useGlobalBizs(); const { t } = useI18n(); @@ -120,7 +119,7 @@ ...params, }), }, - }; + } as unknown as Record; // 检测列表是否为空 const checkListEmpty = (list: Array) => { @@ -139,15 +138,20 @@ currentSepc: data.cluster_spec.spec_name, clusterId: data.id, bkCloudId: data.bk_cloud_id, - cluster_type_name: data.cluster_type_name, + clusterTypeName: data.cluster_type_name, + clusterStats: data.cluster_stats, shardNum: data.cluster_shard_num, groupNum: data.machine_pair_cnt, + machineCount: data.redis_master.length, version: data.major_version, clusterType: data.cluster_spec.spec_cluster_type, currentCapacity: { used: 1, total: data.cluster_capacity, }, + spec: data.cluster_spec, + targetShardNum: 0, + targetGroupNum: 0, }); // 批量选择 diff --git a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/ClusterDeployPlan.vue b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/ClusterDeployPlan.vue new file mode 100644 index 0000000000..82424bd9e2 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/ClusterDeployPlan.vue @@ -0,0 +1,725 @@ + + + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Index.vue b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Index.vue index 6e77186235..749a3b61cf 100644 --- a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Index.vue @@ -18,7 +18,7 @@ - {{ $t('目标集群') }} + {{ t('目标集群') }} @@ -93,6 +70,8 @@ + diff --git a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/RenderTargetVersion.vue b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/RenderTargetVersion.vue new file mode 100644 index 0000000000..ffd5fe24e8 --- /dev/null +++ b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/RenderTargetVersion.vue @@ -0,0 +1,163 @@ + + + + diff --git a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Row.vue b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Row.vue index 386e4e87a7..1ddd1ba757 100644 --- a/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/redis/capacity-change/pages/page1/components/Row.vue @@ -22,45 +22,32 @@ + :placeholder="t('选择集群后自动生成')" /> - - - - - - - + - + + :data="data" + :is-loading="data.isLoading" + :placeholder="t('选择集群后自动生成')"> + - - - + :row-data="data" + :target-version="localTargetVersion" /> + + diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/redis/ClusterCapacityUpdate.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/redis/ClusterCapacityUpdate.vue index bb86fb3e12..4e396eb160 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/redis/ClusterCapacityUpdate.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/redis/ClusterCapacityUpdate.vue @@ -12,34 +12,73 @@ --> + + From 34796bd6c76864398452e93a1428c62eb0d7719d Mon Sep 17 00:00:00 2001 From: Austin <1344583166@qq.com> Date: Fri, 20 Sep 2024 17:17:07 +0800 Subject: [PATCH 022/164] =?UTF-8?q?fix(frontend):=20mysql=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=A0=A1=E9=AA=8C=E4=B8=8E=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BC=BA=E5=A4=B1=E8=A1=A5=E9=BD=90=20#7056?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/db-manage/mysql/checksum/pages/page1/Index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/checksum/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/checksum/pages/page1/Index.vue index 6ca49853c7..fd1e6d5b1d 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/checksum/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/checksum/pages/page1/Index.vue @@ -178,7 +178,7 @@ const { t } = useI18n(); const globalBizsStore = useGlobalBizs(); const router = useRouter(); - const formatDateToUTC = useTimeZoneFormat(); + const { format: formatDateToUTC } = useTimeZoneFormat(); // 单据克隆 useTicketCloneInfo({ From cbbe8aa9ba5c768c7cea333888d985016a818da4 Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Thu, 19 Sep 2024 18:47:41 +0800 Subject: [PATCH 023/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=9A=8F=E6=9C=BA=E8=B4=A6=E5=8F=B7=E5=AF=B9=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E8=8A=82=E7=82=B9=E5=88=A4=E6=96=AD=E5=A4=B1=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20#7002?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/collections/sqlserver/create_random_job_user.py | 2 +- dbm-ui/backend/flow/utils/sqlserver/validate.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py b/dbm-ui/backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py index eb25e889bc..8b30bcc14d 100644 --- a/dbm-ui/backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py +++ b/dbm-ui/backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py @@ -60,7 +60,7 @@ def _add_job_user( inst_status = storages.get( machine__ip=info["address"].split(":")[0], port=int(info["address"].split(":")[1]) - ) + ).status if inst_status == InstanceStatus.UNAVAILABLE: # 如果实例的状态本身是unavailable,则失败可以忽略 self.log_warning(f"the instance [{info['address']}] is already unavailable, ignore") diff --git a/dbm-ui/backend/flow/utils/sqlserver/validate.py b/dbm-ui/backend/flow/utils/sqlserver/validate.py index d9ce1d5fac..cbcab8c6ca 100644 --- a/dbm-ui/backend/flow/utils/sqlserver/validate.py +++ b/dbm-ui/backend/flow/utils/sqlserver/validate.py @@ -20,7 +20,7 @@ class SqlserverInstance: """ sqlserver实例信息基类 - @attributes ip 实例ip,ipv4格式 + @attributes host 实例ip,ipv4格式 @attributes port 实例端口 @attributes bk_cloud_id 机器所在云区域 @attributes is_new 是否是这次加入的 From 73276af788fa5835d16b83f0f951a84fe00bb038 Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Fri, 20 Sep 2024 12:30:37 +0800 Subject: [PATCH 024/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dsqlserver?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=B0=8F=E9=97=AE=E9=A2=98=20#7002?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/components/sysinit/sysinit.go | 2 +- .../db-tools/dbactuator/pkg/core/cst/const.go | 2 ++ .../pkg/core/staticembed/monitor_dbm.sql | 17 ++++++++++------- .../db_services/sqlserver/rollback/handlers.py | 6 +++--- .../builders/sqlserver/sqlserver_rollback.py | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sysinit/sysinit.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sysinit/sysinit.go index 67b7b1e48d..e03b6541b5 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sysinit/sysinit.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sysinit/sysinit.go @@ -83,7 +83,7 @@ func (s *SysInitParam) PreCheck() error { if err != nil { return err } - if mem.Total < 2*1024*1024*2024 { + if mem.Total < 2*1024*1024*1024 { return fmt.Errorf("system memory does not exceed 2GB") } logger.Info("System memory exceed 2GB, pass") diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go index 241dc2cd95..755180d621 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go @@ -277,6 +277,8 @@ var ( END CREATE USER ['+@username+'] FOR LOGIN ['+@username+'] EXEC sp_addrolemember N''db_datareader'', N'''+@username+''' + USE [master] + GRANT VIEW ANY DEFINITION TO ['+@username+'] USE [Monitor] IF EXISTS (SELECT * FROM sys.sysusers WHERE name = '''+@username+''') BEGIN diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql index d32508c700..eded78544b 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql @@ -3036,12 +3036,6 @@ BEGIN @SHRINK_SIZE BIGINT, @ERROR_MESSAGE VARCHAR(4000) - IF @BACKUP_ID='' - BEGIN - SET @BACKUP_ID=CONVERT(VARCHAR(36),NEWID()) - END - - --获取备份配置数据 SELECT @APP = APP, @FULL_BACKUP_PATH = FULL_BACKUP_PATH, @@ -3074,7 +3068,16 @@ BEGIN @SHRINK_SIZE=ISNULL(SHRINK_SIZE,200) FROM DBO.APP_SETTING - IF @DATA_SCHEMA_GRANT<>'ALL' + IF @BACKUP_ID='' + BEGIN + SET @BACKUP_ID=CONVERT(VARCHAR(36),NEWID()) + END + ELSE + BEGIN + SET @DATA_SCHEMA_GRANT='all' + END + + IF @DATA_SCHEMA_GRANT<>'all' return IF @BACKUP_FILETAG<>'' diff --git a/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py b/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py index fb4ca6d900..ca77a2a314 100644 --- a/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py +++ b/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py @@ -40,10 +40,10 @@ def query_binlogs(self, start_time: datetime, end_time: datetime, dbname: str): @param end_time: 查询结束时间 @param dbname: 查询db """ - # 单独获取最后一个binlog + # 单独获取最后一个binlog, 加1秒为了保证获取比时间点大于的日志备份 last_binlogs = self._get_log_from_bklog( collector="mssql_binlog_result", - start_time=end_time, + start_time=end_time + timedelta(seconds=1), end_time=end_time + timedelta(days=BACKUP_LOG_RANGE_DAYS), query_string=f"""cluster_id: {self.cluster.id} AND dbname: "{dbname}" """, size=1, @@ -55,7 +55,7 @@ def query_binlogs(self, start_time: datetime, end_time: datetime, dbname: str): binlogs = self._get_log_from_bklog( collector="mssql_binlog_result", start_time=start_time, - end_time=end_time, + end_time=end_time + timedelta(seconds=1), query_string=f"""cluster_id: {self.cluster.id} AND dbname: "{dbname}" """, ) # TODO: binlog是否需要聚合 or 转义 diff --git a/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_rollback.py b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_rollback.py index 763bb1677c..255856a988 100644 --- a/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_rollback.py +++ b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_rollback.py @@ -110,7 +110,7 @@ def format_ticket_data(self): # 获取最近的一次日志备份记录的时间点 last_time = str2datetime(SQLServerRollbackHandler(cluster_id).query_last_log_time(current_time)) # 如果最近一次日志备份记录的时间大于等于回滚时间 则不需要备份 - if last_time >= restore_time: + if last_time > restore_time: continue backup_dbs = ClusterServiceHandler(self.ticket.bk_biz_id).get_dbs_for_drs( From f2e3b94abd745e26e3d42635feea252126b5298a Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Mon, 23 Sep 2024 11:00:32 +0800 Subject: [PATCH 025/164] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4sqlserver?= =?UTF-8?q?=E7=9A=84=E5=91=8A=E8=AD=A6=E4=BA=8B=E4=BB=B6=E7=BA=A7=E5=88=AB?= =?UTF-8?q?=20#7066?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...74\202\345\270\270\343\200\220Alwayson\343\200\221.json" | 6 +++--- ...74\272\345\244\261\343\200\220Alwayson\343\200\221.json" | 6 +++--- dbm-ui/backend/db_services/sqlserver/rollback/handlers.py | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" index 3d08fc85b6..51b2ab4711 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\345\220\214\346\255\245\347\212\266\346\200\201\345\274\202\345\270\270\343\200\220Alwayson\343\200\221.json" @@ -49,7 +49,7 @@ "algorithms": [ { "type": "Threshold", - "level": 1, + "level": 2, "config": [ [ { @@ -66,7 +66,7 @@ ], "detects": [ { - "level": 1, + "level": 2, "expression": "", "trigger_config": { "count": 3, @@ -254,7 +254,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_alwayson_status)", - "version": 2, + "version": 3, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" index 0dd1927e7c..df01eaacb0 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" @@ -49,7 +49,7 @@ "algorithms": [ { "type": "Threshold", - "level": 1, + "level": 2, "config": [ [ { @@ -66,7 +66,7 @@ ], "detects": [ { - "level": 1, + "level": 2, "expression": "", "trigger_config": { "count": 3, @@ -249,7 +249,7 @@ }, "is_enabled": true, "monitor_indicator": "MAX(mssql_alwayson_deploy)", - "version": 2, + "version": 3, "alert_source": "time_series", "custom_conditions": [], "export_at": "2024-04-02T16:01:58+08:00" diff --git a/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py b/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py index ca77a2a314..269014af96 100644 --- a/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py +++ b/dbm-ui/backend/db_services/sqlserver/rollback/handlers.py @@ -160,6 +160,7 @@ def query_dbs_by_backup_log( def query_last_log_time(self, query_time: datetime): """ 查询集群的最近一次上报的备份时间 + 拿最新的一条备份记录的备份开始时间的作为判断依据 """ last_binlogs = self._get_log_from_bklog( collector="mssql_binlog_result", @@ -172,7 +173,7 @@ def query_last_log_time(self, query_time: datetime): if not last_binlogs: raise Exception(_("集群【{}】最近的{}天里找不到日志备份").format(self.cluster.name, BACKUP_LOG_RANGE_DAYS)) - return last_binlogs[0]["backup_end_time"] + return last_binlogs[0]["backup_task_start_time"] @staticmethod def check_binlog_lsn_continuity(backup_logs: List[Dict], full_backup_info: Dict) -> (List[Dict], List[str]): From 759fb92406e4359870c4bcb9725c709ce83810ff Mon Sep 17 00:00:00 2001 From: OMG-By <504094596@qq.com> Date: Wed, 11 Sep 2024 17:59:04 +0800 Subject: [PATCH 026/164] =?UTF-8?q?fix(redis):=20rediscluster=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=98=E6=9B=B4bug=20#6788?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bamboo/scene/redis/redis_backend_scale.py | 6 +-- .../flow/utils/redis/redis_act_playload.py | 46 ++++++++----------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py index 990c6a1c67..e79dade3e4 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py @@ -192,7 +192,7 @@ def generate_sync_relation(self, act_kwargs, master_ips, slave_ips, ins_num, sup """ 计算新老实例对应关系 可能一对多,也可能多对一 - 20250806 需要兼容本地扩缩容场景:多余的实例数,可能是在老机器上 + 20240806 需要兼容本地扩缩容场景:多余的实例数,可能是在老机器上 - master_ips: 新机器master列表 - slave_ips: 新机器slave列表 - ins_num: 单台机器部署的最小实例数(有可能+1) @@ -472,8 +472,6 @@ def redis_backend_scale_flow(self): redis_sync_sub_pipelines = [] for sync_params in sync_relations: - if act_kwargs.cluster["cluster_type"] == ClusterType.TendisTwemproxyRedisInstance: - pass sub_builder = RedisMakeSyncAtomJob(self.root_id, self.data, act_kwargs, sync_params) redis_sync_sub_pipelines.append(sub_builder) sub_pipeline.add_parallel_sub_pipeline(sub_flow_list=redis_sync_sub_pipelines) @@ -490,8 +488,6 @@ def redis_backend_scale_flow(self): redis_sync_sub_pipelines = [] for sync_params in sync_relations2: - if act_kwargs.cluster["cluster_type"] == ClusterType.TendisTwemproxyRedisInstance: - pass sub_builder = RedisMakeSyncAtomJob(self.root_id, self.data, act_kwargs, sync_params) redis_sync_sub_pipelines.append(sub_builder) sub_pipeline.add_parallel_sub_pipeline(sub_flow_list=redis_sync_sub_pipelines) diff --git a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py index bb9eb4e94b..c13fea6684 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py +++ b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py @@ -997,14 +997,13 @@ def redis_flush_data_payload(self, **kwargs) -> dict: ip = kwargs["ip"] params = kwargs["params"] domain_name = params.get("domain_name", self.cluster.get("domain_name", "")) - db_version = params.get("db_version", self.cluster.get("db_version", "")) cluster_type = params.get("cluster_type", self.cluster.get("cluster_type", "")) ports = params.get("ports", self.cluster.get(ip, [])) force = params.get("force", self.cluster.get("force", False)) db_list = params.get("db_list", self.cluster.get("db_list", [0])) flushall = params.get("flushall", self.cluster.get("flushall", True)) - redis_config = self.__get_cluster_config(domain_name, db_version, ConfigTypeEnum.DBConf) + passwd_ret = PayloadHandler.redis_get_password_by_domain(domain_name) return { "db_type": DBActuatorTypeEnum.Redis.value, "action": DBActuatorTypeEnum.Redis.value + "_" + RedisActuatorActionEnum.FlushData.value, @@ -1013,7 +1012,7 @@ def redis_flush_data_payload(self, **kwargs) -> dict: "db_type": cluster_type, "ports": ports, "is_force": force, - "password": redis_config["requirepass"], + "password": passwd_ret.get("redis_password"), "db_list": db_list, "is_flush_all": flushall, }, @@ -1561,22 +1560,16 @@ def redis__switch_4_scene(self, **kwargs) -> dict: "switch_condition":{}, } """ - params, proxy_version = kwargs["params"], "" + params = kwargs["params"] self.namespace = params["cluster_type"] cluster_meta = nosqlcomm.other.get_cluster_detail(cluster_id=params["cluster_id"])[0] if self.namespace == ClusterType.RedisInstance.value: - cluster_config = self.__get_cluster_config( - params["immute_domain"], params.get("db_version", ""), ConfigTypeEnum.DBConf - ) - cluster_meta["storage_pass"] = cluster_config["requirepass"] + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) + cluster_meta["storage_pass"] = passwd_ret.get("redis_password") else: - if is_twemproxy_proxy_type(self.namespace): - proxy_version = ConfigFileEnum.Twemproxy - elif is_predixy_proxy_type(self.namespace): - proxy_version = ConfigFileEnum.Predixy - proxy_config = self.__get_cluster_config(params["immute_domain"], proxy_version, ConfigTypeEnum.ProxyConf) - cluster_meta["proxy_pass"] = proxy_config["password"] - cluster_meta["storage_pass"] = proxy_config["redis_password"] + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) + cluster_meta["proxy_pass"] = passwd_ret.get("redis_proxy_password") + cluster_meta["storage_pass"] = passwd_ret.get("redis_password") logger.info("switch cluster {}, switch infos : {}".format(params["immute_domain"], params["switch_info"])) return { @@ -1767,18 +1760,17 @@ def redis_tendisssd_dr_restore_4_scene(self, **kwargs) -> dict: """ params = kwargs["params"] self.namespace = params["cluster_type"] - proxy_config = self.__get_cluster_config(params["immute_domain"], self.proxy_version, ConfigTypeEnum.ProxyConf) - + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) return { "db_type": DBActuatorTypeEnum.Redis.value, "action": DBActuatorTypeEnum.TendisSSD.value + "_" + RedisActuatorActionEnum.DR_RESTORE.value, "payload": { "master_ip": params["master_ip"], "master_ports": params["master_ports"], - "master_auth": proxy_config["redis_password"], + "master_auth": passwd_ret.get("redis_password"), "slave_ip": params["slave_ip"], "slave_ports": params["slave_ports"], - "slave_password": proxy_config["redis_password"], + "slave_password": passwd_ret.get("redis_password"), "task_dir": "/data/dbbak", "backup_dir": "/data/dbbak", }, @@ -1853,7 +1845,7 @@ def rollback_clustermeet_payload(self, **kwargs) -> dict: 数据构造 rediscluster 集群建立 """ params = kwargs["params"] - redis_config = self.__get_cluster_config(params["immute_domain"], params["db_version"], ConfigTypeEnum.DBConf) + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) bacth_pairs = [] for instance in params["all_instance"]: ip, port = instance.split(":") @@ -1866,7 +1858,7 @@ def rollback_clustermeet_payload(self, **kwargs) -> dict: "db_type": DBActuatorTypeEnum.Redis.value, "action": RedisActuatorActionEnum.CLUSTER_MEET.value, "payload": { - "password": redis_config["requirepass"], + "password": passwd_ret.get("redis_password"), "slots_auto_assign": True, "replica_pairs": bacth_pairs, }, @@ -1898,7 +1890,7 @@ def clustermeet_check_payload(self, **kwargs) -> dict: 数据构造 rediscluster meet建立集群关系并检查集群状态 """ params = kwargs["params"] - redis_config = self.__get_cluster_config(params["immute_domain"], params["db_version"], ConfigTypeEnum.DBConf) + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) bacth_pairs = [] for instance in params["all_instance"]: ip, port = instance.split(IP_PORT_DIVIDER) @@ -1912,7 +1904,7 @@ def clustermeet_check_payload(self, **kwargs) -> dict: "db_type": DBActuatorTypeEnum.Redis.value, "action": RedisActuatorActionEnum.CLUSTER_MEET_CHECK.value, "payload": { - "password": redis_config["requirepass"], + "password": passwd_ret.get("redis_password"), "replica_pairs": bacth_pairs, }, } @@ -1934,7 +1926,7 @@ def redis_cluster_meet_4_scene(self, **kwargs) -> dict: } """ params = kwargs["params"] - redis_config = self.__get_cluster_config(params["immute_domain"], params["db_version"], ConfigTypeEnum.DBConf) + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) cluster = Cluster.objects.get(immute_domain=params["immute_domain"]) cluster_info = metaApi.cluster.nosqlcomm.get_cluster_detail(cluster.id)[0] bacth_pairs = [] @@ -1950,7 +1942,7 @@ def redis_cluster_meet_4_scene(self, **kwargs) -> dict: "db_type": DBActuatorTypeEnum.Redis.value, "action": RedisActuatorActionEnum.CLUSTER_MEET.value, "payload": { - "password": redis_config["requirepass"], + "password": passwd_ret.get("redis_password"), "replica_pairs": bacth_pairs, "slots_auto_assign": False, "use_for_expansion": False, @@ -1966,7 +1958,7 @@ def redis_cluster_forget_4_scene(self, **kwargs) -> dict: } """ params = kwargs["params"] - redis_config = self.__get_cluster_config(params["immute_domain"], params["db_version"], ConfigTypeEnum.DBConf) + passwd_ret = PayloadHandler.redis_get_password_by_domain(params["immute_domain"]) cluster = Cluster.objects.get(immute_domain=params["immute_domain"]) cluster_info = metaApi.cluster.nosqlcomm.get_cluster_detail(cluster.id)[0] @@ -1975,7 +1967,7 @@ def redis_cluster_forget_4_scene(self, **kwargs) -> dict: "action": DBActuatorTypeEnum.Redis.value + "_" + RedisActuatorActionEnum.ClusterForget.value, "payload": { "cluster_meta": { - "storage_pass": redis_config["requirepass"], + "storage_pass": passwd_ret.get("redis_password"), "immute_domain": cluster_info["immute_domain"], "cluster_type": cluster_info["cluster_type"], "redis_master_set": cluster_info["redis_master_set"], From 84b8377d2c6b24e2b3a07afd0ada2ed253fa92a9 Mon Sep 17 00:00:00 2001 From: yuanruji Date: Fri, 20 Sep 2024 16:40:20 +0800 Subject: [PATCH 027/164] =?UTF-8?q?fix(dbm-services):=20=E4=BB=8E=E5=BA=93?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=9F=9F=E5=90=8D=E5=88=87=E6=8D=A2=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=20#7052?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/db_meta/api/cluster/tendbha/switch_storage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py index f18a701f91..0df679223a 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbha/switch_storage.py @@ -63,6 +63,6 @@ def change_storage_cluster_entry(cluster_id: int, slave_ip: str, new_slave_ip: s cluster = Cluster.objects.get(id=cluster_id) slave_storage = cluster.storageinstance_set.get(machine__ip=slave_ip) new_slave_storage = cluster.storageinstance_set.get(machine__ip=new_slave_ip) - slave_bind_entry = slave_storage.bind_entry.get() - slave_bind_entry.storageinstance_set.remove(slave_storage) - slave_bind_entry.storageinstance_set.add(new_slave_storage) + for be in slave_storage.bind_entry.all(): + be.storageinstance_set.remove(slave_storage) + be.storageinstance_set.add(new_slave_storage) From c08da3a05f1227eb4ff66602e4aec4ebdb58a97d Mon Sep 17 00:00:00 2001 From: yuanruji Date: Thu, 19 Sep 2024 14:50:48 +0800 Subject: [PATCH 028/164] =?UTF-8?q?refactor(dbm-services):=20=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E6=89=A7=E8=A1=8C=E8=AE=B0=E5=BD=95=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E8=BF=87=E7=A8=8B=20#6995?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db-simulation/app/service/kubernets.go | 2 +- .../app/service/kubernets_test.go | 2 +- .../app/service/simulation_task.go | 43 +++++++++++++++---- .../mysql/db-simulation/app/syntax/syntax.go | 6 +-- .../mysql/db-simulation/handler/handler.go | 2 +- .../db-simulation/handler/syntax_check.go | 6 ++- 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/dbm-services/mysql/db-simulation/app/service/kubernets.go b/dbm-services/mysql/db-simulation/app/service/kubernets.go index 5f46a54527..ad62ec1d5e 100644 --- a/dbm-services/mysql/db-simulation/app/service/kubernets.go +++ b/dbm-services/mysql/db-simulation/app/service/kubernets.go @@ -483,7 +483,7 @@ func (k *DbPodSets) executeInPod(cmd, container string, extMap map[string]string for sc.Scan() { if !noLogger { // 此方案打印的日志会在前端展示 - xlogger.Info(sc.Text()) + xlogger.Info("%s", sc.Text()) } else { logger.Info(sc.Text()) } diff --git a/dbm-services/mysql/db-simulation/app/service/kubernets_test.go b/dbm-services/mysql/db-simulation/app/service/kubernets_test.go index 241ed5ef4b..3df549628e 100644 --- a/dbm-services/mysql/db-simulation/app/service/kubernets_test.go +++ b/dbm-services/mysql/db-simulation/app/service/kubernets_test.go @@ -18,7 +18,7 @@ func TestCreateClusterPod(t *testing.T) { ps.TdbCtlImage = config.GAppConfig.Image.TdbCtlImg ps.SpiderImage = config.GAppConfig.Image.SpiderImg if err := ps.CreateClusterPod(); err != nil { - t.Fatalf(err.Error()) + t.Fatalf("%s", err.Error()) return } t.Log("ending..") diff --git a/dbm-services/mysql/db-simulation/app/service/simulation_task.go b/dbm-services/mysql/db-simulation/app/service/simulation_task.go index 0e143d69a3..b68cf6e3a4 100644 --- a/dbm-services/mysql/db-simulation/app/service/simulation_task.go +++ b/dbm-services/mysql/db-simulation/app/service/simulation_task.go @@ -217,16 +217,14 @@ func (t *SimulationTask) SimulationRun(containerName string, xlogger *logger.Log // 关闭协程 defer func() { ticker.Stop(); doneChan <- struct{}{} }() model.UpdatePhase(t.TaskId, t.MySQLVersion, model.PhaseLoadSchema) - stdout, stderr, err := t.DbPodSets.executeInPod(t.getLoadSchemaSQLCmd(t.Path, t.SchemaSQLFile), - containerName, - t.getExtmap(t.SchemaSQLFile), true) - sstdout += stdout.String() + "\n" - sstderr += stderr.String() + "\n" + // Load schema SQL + sstdout, sstderr, err = t.loadSchemaSQL(containerName) if err != nil { - logger.Error("load database schema sql failed %v", err) - return sstdout, sstderr, err + xlogger.Error("Failed to load schema SQL: %v", err) + return sstdout, sstderr, fmt.Errorf("failed to load schema SQL: %w", err) } - xlogger.Info(stdout.String(), stderr.String()) + xlogger.Info("Schema SQL loaded successfully") + xlogger.Info(sstdout, sstderr) // load real databases if err = t.getDbsExcludeSysDb(); err != nil { logger.Error("getDbsExcludeSysDb faiked %v", err) @@ -249,6 +247,35 @@ func (t *SimulationTask) SimulationRun(containerName string, xlogger *logger.Log return sstdout, sstderr, nil } +func (t *SimulationTask) loadSchemaSQL(containerName string) (sstdout, sstderr string, + err error) { + defer func() { + if err != nil { + errx := model.DB.Create(&model.TbSqlFileSimulationInfo{ + TaskId: t.TaskId, + BillTaskId: t.Uid, + LineId: 0, + FileNameHash: fmt.Sprintf("%x", sha256.Sum256([]byte(t.SchemaSQLFile))), + FileName: t.SchemaSQLFile, + MySQLVersion: t.MySQLVersion, + Status: model.TaskFailed, + ErrMsg: "导入表结构失败," + err.Error(), + CreateTime: time.Now(), + UpdateTime: time.Now(), + }).Error + if errx != nil { + logger.Warn("create exeute schema sqlfile simulation record failed %v", errx) + } + } + }() + stdout, stderr, err := t.DbPodSets.executeInPod(t.getLoadSchemaSQLCmd(t.Path, t.SchemaSQLFile), + containerName, + t.getExtmap(t.SchemaSQLFile), true) + sstdout += stdout.String() + "\n" + sstderr += stderr.String() + "\n" + return sstdout, sstderr, err +} + func (t *SimulationTask) executeOneObject(e ExcuteSQLFileObj, containerName string, xlogger *logger.Logger) (sstdout, sstderr string, err error) { defer func() { diff --git a/dbm-services/mysql/db-simulation/app/syntax/syntax.go b/dbm-services/mysql/db-simulation/app/syntax/syntax.go index 66f9751b1f..2f9c76645c 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/syntax.go +++ b/dbm-services/mysql/db-simulation/app/syntax/syntax.go @@ -111,10 +111,6 @@ type RiskInfo struct { const DdlMapFileSubffix = ".tbl.map" // Do 运行语法检查 For SQL 文件 -// -// @receiver tf -// @return result -// @return err func (tf *TmysqlParseFile) Do(dbtype string, versions []string) (result map[string]*CheckInfo, err error) { logger.Info("doing....") tf.result = make(map[string]*CheckInfo) @@ -313,7 +309,7 @@ func (t *TmysqlParse) getCommand(filename, version string) (cmd string) { outputFileName := getSQLParseResultFile(filename, version) out = path.Join(t.tmpWorkdir, outputFileName) - cmd = fmt.Sprintf(`%s --sql-file=%s --output-path=%s --print-query-mode=2 --output-format='JSON_LINE_PER_OBJECT'`, + cmd = fmt.Sprintf(`%s --sql-file=%s --output-path=%s --print-query-mode=2 --output-format='JSON_LINE_PER_OBJECT' --sql-mode='' `, t.TmysqlParseBinPath, in, out) if lo.IsNotEmpty(version) { diff --git a/dbm-services/mysql/db-simulation/handler/handler.go b/dbm-services/mysql/db-simulation/handler/handler.go index d451abf7ff..813102608a 100644 --- a/dbm-services/mysql/db-simulation/handler/handler.go +++ b/dbm-services/mysql/db-simulation/handler/handler.go @@ -101,7 +101,7 @@ func QueryTask(c *gin.Context) { switch task.Status { case model.TaskFailed: allSuccessful = false - SendResponse(c, fmt.Errorf(task.SysErrMsg), map[string]interface{}{ + SendResponse(c, fmt.Errorf("%s", task.SysErrMsg), map[string]interface{}{ "simulation_version": task.MySQLVersion, "stdout": task.Stdout, "stderr": task.Stderr, diff --git a/dbm-services/mysql/db-simulation/handler/syntax_check.go b/dbm-services/mysql/db-simulation/handler/syntax_check.go index d2198f4b97..2060aadb46 100644 --- a/dbm-services/mysql/db-simulation/handler/syntax_check.go +++ b/dbm-services/mysql/db-simulation/handler/syntax_check.go @@ -37,7 +37,11 @@ func init() { } workdir = strings.TrimSpace(viper.GetString("workdir")) if workdir == "" { - workdir = "/tmp" + if cmutil.FileExists("/tmp") { + workdir = "/tmp" + return + } + workdir = "/" } } From 737ea5b59b2647bea8a0d7c5f0a3e71a91671b3f Mon Sep 17 00:00:00 2001 From: yuanruji Date: Mon, 23 Sep 2024 10:54:39 +0800 Subject: [PATCH 029/164] =?UTF-8?q?fix(backend):=20mysql=E9=85=8D=E7=BD=AE?= =?UTF-8?q?log=5Ferror=5Fverbosity=E8=BD=AC=E6=88=90=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=EF=BC=8C=E5=90=A6=E5=88=99=E4=BC=9A=E5=8F=8D=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=A4=B1=E8=B4=A5=20#7068?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/utils/mysql/mysql_act_playload.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py index b9faa88f29..24fa33ce10 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py @@ -137,12 +137,33 @@ def deal_mysql_config(self, db_version: str, origin_configs: dict, init_configs: if "log_warnings" in cfg["mysqld"]: value = cfg["mysqld"]["log_warnings"] if value == "0": - cfg["mysqld"]["log_error_verbosity"] = 1 + cfg["mysqld"]["log_error_verbosity"] = "1" elif value == "1": - cfg["mysqld"]["log_error_verbosity"] = 2 + cfg["mysqld"]["log_error_verbosity"] = "2" else: - cfg["mysqld"]["log_error_verbosity"] = 3 + cfg["mysqld"]["log_error_verbosity"] = "3" del cfg["mysqld"]["log_warnings"] + # mysql8.0 无法识别这些参数 + for key in [ + "innodb_file_format", + "query_cache_size", + "query_cache_type", + "show_compatibility_56", + "query_response_time_stats", + "userstat", + ]: + if key in cfg["mysqld"]: + del cfg["mysqld"][key] + if "thread_handling" in cfg["mysqld"]: + val = cfg["mysqld"]["thread_handling"] + # thread_handling = 2 是tmysql参数。社区版本和txsql 都不能识别 + if val == "1": + cfg["mysqld"]["thread_handling"] = "no-threads" + elif val == "2": + cfg["mysqld"]["thread_handling"] = "one-thread-per-connection" + elif val == "3": + cfg["mysqld"]["thread_handling"] = "loaded-dynamically" + # 这里应该是社区版本等非Tendb数据库的版本需要处理的参数 # 介质管理暂未记录介质来源属性 if db_version >= "8.0.30": From acd4dbcaa21d09e8b3294a40ed7b2bd3297d82df Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Mon, 2 Sep 2024 15:36:15 +0800 Subject: [PATCH 030/164] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0sqlserver?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E8=87=AA=E6=84=88=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=20#6578?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cluster/sqlserverha/handler.py | 15 +++++ ...\347\250\213\345\255\230\346\264\273.json" | 3 +- .../bamboo/scene/sqlserver/common_sub_flow.py | 26 ++++++++ .../sqlserver/sqlserver_inst_modify_status.py | 63 ++++++++++++++++++ .../flow/engine/controller/sqlserver.py | 6 ++ .../flow/utils/sqlserver/sqlserver_db_meta.py | 9 +++ .../sqlserver_build_db_sync_for_autofix.py | 6 +- .../sqlserver_service_down_for_autofix.py | 66 +++++++++++++++++++ dbm-ui/backend/ticket/constants.py | 1 + 9 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/sqlserver_inst_modify_status.py create mode 100644 dbm-ui/backend/ticket/builders/sqlserver/sqlserver_service_down_for_autofix.py diff --git a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py index 20c1a34e75..435527633f 100644 --- a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py @@ -422,3 +422,18 @@ def get_remote_address(self) -> StorageInstance: return StorageInstance.objects.get( cluster=self.cluster, instance_inner_role=InstanceInnerRole.MASTER.value ).ip_port + + @classmethod + @transaction.atomic + def modify_status( + cls, + cluster_id: int, + ip_list: list, + ): + cluster = Cluster.objects.get(id=cluster_id) + if cluster.is_dbha_disabled() or cluster.cluster_type == ClusterType.SqlserverSingle: + # 对未接入dbha的主从集群做处理 + # 获取对单节点集群做处理 + StorageInstance.objects.filter(cluster=cluster, machine__ip__in=ip_list).update( + status=InstanceStatus.UNAVAILABLE + ) diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" index 5b8d9b2ad9..65333359c8 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\350\277\233\347\250\213\345\255\230\346\264\273.json" @@ -236,7 +236,8 @@ }, "labels": [ "DBM", - "DBM_SQLSERVER" + "DBM_SQLSERVER", + "NEED_AUTOFIX/SQLSERVER_MODIFY_STATUS" ], "app": "", "path": "", diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py index 557eca10d9..14fd24f175 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py @@ -24,8 +24,10 @@ SqlserverBackupFileTagEnum, SqlserverBackupJobExecMode, SqlserverBackupMode, + SqlserverCleanMode, SqlserverRestoreMode, SqlserverSyncMode, + SqlserverSyncModeMaps, SqlserverVersion, ) from backend.flow.engine.bamboo.scene.common.builder import SubBuilder @@ -459,6 +461,12 @@ def sync_dbs_for_cluster_sub_flow( "target_backup_dir": backup_path, "is_set_full_model": True, "job_id": f"restore_dr_{root_id}_{master_instance.port}", + "clean_dbs": sync_dbs, + "clean_mode": SqlserverCleanMode.DROP_DBS.value, + "clean_tables": ["*"], + "ignore_clean_tables": [], + "sync_mode": SqlserverSyncModeMaps[cluster_sync_mode], + "slaves": [], } # 声明子流程 @@ -483,6 +491,24 @@ def sync_dbs_for_cluster_sub_flow( ), ), ) + # 清理从库对应的数据库 + acts_list = [] + for slave in sync_slaves: + acts_list.append( + { + "act_name": _("清理slave实例数据库[{}]".format(slave.ip)), + "act_component_code": SqlserverActuatorScriptComponent.code, + "kwargs": asdict( + ExecActuatorKwargs( + exec_ips=[slave], + get_payload_func=SqlserverActPayload.get_clean_dbs_payload.__name__, + custom_params={"is_force": True}, + ) + ), + } + ) + sub_pipeline.add_parallel_acts(acts_list=acts_list) + # 执行备份 sub_pipeline.add_act( act_name=_("执行数据库备份"), diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/sqlserver_inst_modify_status.py b/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/sqlserver_inst_modify_status.py new file mode 100644 index 0000000000..1938430014 --- /dev/null +++ b/dbm-ui/backend/flow/engine/bamboo/scene/sqlserver/sqlserver_inst_modify_status.py @@ -0,0 +1,63 @@ +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 copy +import logging.config +from dataclasses import asdict + +from django.utils.translation import ugettext as _ + +from backend.db_meta.models import Cluster +from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder +from backend.flow.engine.bamboo.scene.sqlserver.base_flow import BaseFlow +from backend.flow.plugins.components.collections.sqlserver.sqlserver_db_meta import SqlserverDBMetaComponent +from backend.flow.utils.sqlserver.sqlserver_act_dataclass import DBMetaOPKwargs +from backend.flow.utils.sqlserver.sqlserver_db_meta import SqlserverDBMeta + +logger = logging.getLogger("flow") + + +class SqlserverModifyStatusFlow(BaseFlow): + """ + 构建Sqlserver的数据库建立同步的流程类 + 兼容跨云集群的执行 + """ + + def run_flow(self): + """ + 定义Sqlserver的修改故障实例状态的执行流程,支持多集群并发执行 + """ + # 定义主流程 + main_pipeline = Builder(root_id=self.root_id, data=self.data) + sub_pipelines = [] + + for info in self.data["infos"]: + cluster = Cluster.objects.get(id=info["cluster_id"]) + sub_flow_context = copy.deepcopy(self.data) + sub_flow_context.pop("infos") + sub_flow_context.update(info) + + # 声明子流程 + sub_pipeline = SubBuilder(root_id=self.root_id, data=copy.deepcopy(sub_flow_context)) + + sub_pipeline.add_act( + act_name=_("修改故障实例状态【未接入DBHA】"), + act_component_code=SqlserverDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=SqlserverDBMeta.modify_status_for_not_joined_dbha.__name__, + ) + ), + ) + + sub_pipelines.append(sub_pipeline.build_sub_process(sub_name=_("{}修改故障实例状态".format(cluster.name)))) + + # 内部检测sub_pipelines是否为空 + main_pipeline.add_parallel_sub_pipeline(sub_flow_list=sub_pipelines) + main_pipeline.run_pipeline() diff --git a/dbm-ui/backend/flow/engine/controller/sqlserver.py b/dbm-ui/backend/flow/engine/controller/sqlserver.py index 57cc2740d3..9ef566d319 100644 --- a/dbm-ui/backend/flow/engine/controller/sqlserver.py +++ b/dbm-ui/backend/flow/engine/controller/sqlserver.py @@ -20,6 +20,7 @@ from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_db_construct import SqlserverDataConstruct from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_dts import SqlserverDTSFlow from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_ha_deploy import SqlserverHAApplyFlow +from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_inst_modify_status import SqlserverModifyStatusFlow from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_master_slave_failover import SqlserverFailOverFlow from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_master_slave_switch import SqlserverSwitchFlow from backend.flow.engine.bamboo.scene.sqlserver.sqlserver_rename_dbs import SqlserverRenameDBSFlow @@ -117,3 +118,8 @@ def authorize(self): def sqlserver_standardization_scene(self): flow = SqlserverStandardizationFlow(root_id=self.root_id, data=self.ticket_data) flow.run_flow() + + def sqlserver_modify_inst_status_scene(self): + # 实例告警自愈触发单据 + flow = SqlserverModifyStatusFlow(root_id=self.root_id, data=self.ticket_data) + flow.run_flow() diff --git a/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py b/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py index 641813af50..57dfe79a0a 100644 --- a/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py +++ b/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py @@ -197,3 +197,12 @@ def update_dts_status(self): ) # 任务结束后变更状态 SqlserverDtsInfo.objects.filter(id=self.global_data["dts_id"]).update(status=status) + + def modify_status_for_not_joined_dbha(self): + """ + 对未接入DBHA的主从集群,如果实例出现故障主动修改实例的状态 + """ + SqlserverHAClusterHandler.modify_status( + cluster_id=int(self.global_data["cluster_id"]), + ip_list=self.global_data["ip_list"], + ) diff --git a/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py index dd9fd4eda0..4f87ccd0e3 100644 --- a/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py +++ b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py @@ -49,15 +49,15 @@ def validate(self, attrs): return attrs -class SQLServerClearFlowParamBuilder(builders.FlowParamBuilder): +class SQLServerBuildDBSyncParamBuilder(builders.FlowParamBuilder): controller = SqlserverController.ha_build_db_sync_scene @builders.BuilderFactory.register(TicketType.SQLSERVER_BUILD_DB_SYNC, is_apply=False) -class SQLServerClearFlowBuilder(BaseSQLServerTicketFlowBuilder): +class SQLServerBuildDBSyncBuilder(BaseSQLServerTicketFlowBuilder): serializer = SQLServerBuildDBSyncForSerializer alarm_transform_serializer = SQLServerBuildDBSyncForAutofixSerializer - inner_flow_builder = SQLServerClearFlowParamBuilder + inner_flow_builder = SQLServerBuildDBSyncParamBuilder inner_flow_name = _("SQLServer 同步数据") retry_type = FlowRetryType.MANUAL_RETRY default_need_itsm = False diff --git a/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_service_down_for_autofix.py b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_service_down_for_autofix.py new file mode 100644 index 0000000000..229f99f87b --- /dev/null +++ b/dbm-ui/backend/ticket/builders/sqlserver/sqlserver_service_down_for_autofix.py @@ -0,0 +1,66 @@ +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 logging.config + +from django.utils.translation import ugettext_lazy as _ +from rest_framework import serializers + +from backend.db_meta.models import Cluster +from backend.db_monitor.serializers import AlarmCallBackDataSerializer +from backend.flow.engine.controller.sqlserver import SqlserverController +from backend.ticket import builders +from backend.ticket.builders.sqlserver.base import BaseSQLServerTicketFlowBuilder, SQLServerBaseOperateDetailSerializer +from backend.ticket.constants import FlowRetryType, TicketType + +logger = logging.getLogger("flow") + + +class SQLServerDownForAutoFixSerializer(AlarmCallBackDataSerializer): + """ + 接收sqlserver_service状态告警事件,处理自愈逻辑 + 目前会对未接入dbha的实例,修复实例状态 + """ + + def to_internal_value(self, data): + data = super().to_internal_value(data) + dimensions = data["callback_message"]["event"]["dimensions"] + cluster = Cluster.objects.get(immute_domain=dimensions["cluster_domain"]) + ip = dimensions["instance"].split("-")[0] + ticket_detail = {"infos": [{"cluster_id": cluster.id, "ip_list": [ip]}]} + return ticket_detail + + +class SQLServerModifyInstStatusSerializer(SQLServerBaseOperateDetailSerializer): + class ModifyInstStatusSerializer(serializers.Serializer): + cluster_id = serializers.IntegerField(help_text=_("集群ID")) + ip_list = serializers.ListField(help_text=_("待修改主机ip"), required=True) + + infos = serializers.ListSerializer(help_text=_("实例修改列表"), child=ModifyInstStatusSerializer()) + + def validate(self, attrs): + """验证库表数据库的数据""" + super().validate(attrs) + return attrs + + +class SQLServerModifyInstStatusParamBuilder(builders.FlowParamBuilder): + controller = SqlserverController.sqlserver_modify_inst_status_scene + + +@builders.BuilderFactory.register(TicketType.SQLSERVER_MODIFY_STATUS, is_apply=False) +class SQLServerModifyInstStatusBuilder(BaseSQLServerTicketFlowBuilder): + serializer = SQLServerModifyInstStatusSerializer + alarm_transform_serializer = SQLServerDownForAutoFixSerializer + inner_flow_builder = SQLServerModifyInstStatusParamBuilder + inner_flow_name = _("SQLServer 修改故障实例状态") + retry_type = FlowRetryType.MANUAL_RETRY + default_need_itsm = False + default_need_manual_confirm = False diff --git a/dbm-ui/backend/ticket/constants.py b/dbm-ui/backend/ticket/constants.py index b23ddd8afe..6ea512b818 100644 --- a/dbm-ui/backend/ticket/constants.py +++ b/dbm-ui/backend/ticket/constants.py @@ -287,6 +287,7 @@ def get_cluster_type_by_ticket(cls, ticket_type): SQLSERVER_AUTHORIZE_RULES = TicketEnumField("SQLSERVER_AUTHORIZE_RULES", _("SQLServer 集群授权"), _("权限管理")) SQLSERVER_EXCEL_AUTHORIZE_RULES = TicketEnumField("SQLSERVER_EXCEL_AUTHORIZE_RULES", _("SQLServer EXCEL授权"), _("权限管理")) # noqa SQLSERVER_BUILD_DB_SYNC = TicketEnumField("SQLSERVER_BUILD_DB_SYNC", _("SQLServer DB建立同步"), register_iam=False) + SQLSERVER_MODIFY_STATUS = TicketEnumField("SQLSERVER_MODIFY_STATUS", _("SQLServer 修改故障实例状态"), register_iam=False) # REDIS REDIS_PLUGIN_CREATE_CLB = TicketEnumField("REDIS_PLUGIN_CREATE_CLB", _("Redis 创建CLB"), _("集群管理")) From c347f3d42eadeba87b2dfd6b8646d1d5c29d1c9c Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 13 Sep 2024 20:56:41 +0800 Subject: [PATCH 031/164] =?UTF-8?q?fix(backend):=20=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E8=A1=A5=E5=85=85=20#6943?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/flow/utils/redis/redis_db_meta.py | 4 +- dbm-ui/backend/iam_app/dataclass/actions.py | 14 +- dbm-ui/locale/en/LC_MESSAGES/django.mo | Bin 248340 -> 521687 bytes dbm-ui/locale/en/LC_MESSAGES/django.po | 35215 +++++++++++----- dbm-ui/locale/zh_hans/LC_MESSAGES/django.mo | Bin 226513 -> 473357 bytes dbm-ui/locale/zh_hans/LC_MESSAGES/django.po | 34841 ++++++++++----- 6 files changed, 50953 insertions(+), 19121 deletions(-) diff --git a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py index 118fd3f65a..2941d7634d 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py +++ b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py @@ -1801,7 +1801,7 @@ def update_cluster_entry(self) -> bool: cluster_entry.storageinstance_set.add(*storageinstances) cluster_entry.save() logger.info( - _("redis集群:%s cluster_type:%s 新增 %s cluster_entry").format( + _("redis集群:{} cluster_type:{} 新增 {} cluster_entry").format( cluster.immute_domain, cluster.cluster_type, nodes_domain ) ) @@ -1811,7 +1811,7 @@ def update_cluster_entry(self) -> bool: cluster_entry.storageinstance_set.add(*storageinstances) cluster_entry.save() logger.info( - _("redis集群:%s cluster_type:%s 更新 cluster_entry:%s").format( + _("redis集群:{} cluster_type:{} 更新 cluster_entry:{}").format( cluster.immute_domain, cluster.cluster_type, cluster_entry.entry ) ) diff --git a/dbm-ui/backend/iam_app/dataclass/actions.py b/dbm-ui/backend/iam_app/dataclass/actions.py index 0dd4657fbe..167b5fd0fe 100644 --- a/dbm-ui/backend/iam_app/dataclass/actions.py +++ b/dbm-ui/backend/iam_app/dataclass/actions.py @@ -136,7 +136,7 @@ class ActionEnum: related_actions=[], related_resource_types=[], group=_("全局设置"), - subgroup=_(""), + subgroup="", hidden=True, ) @@ -181,7 +181,7 @@ class ActionEnum: related_actions=[], related_resource_types=[], group=_("资源管理"), - subgroup=_(""), + subgroup="", hidden=True, ) @@ -1727,7 +1727,7 @@ class ActionEnum: related_actions=[], related_resource_types=[ResourceEnum.BUSINESS, ResourceEnum.DBTYPE], group=_("业务配置"), - subgroup=_(""), + subgroup="", ) GLOBAL_DBA_ADMINISTRATOR_EDIT = ActionMeta( @@ -1738,7 +1738,7 @@ class ActionEnum: related_actions=[GLOBAL_MANAGE.id], related_resource_types=[ResourceEnum.DBTYPE], group=_("全局设置"), - subgroup=_(""), + subgroup="", hidden=True, ) @@ -1774,7 +1774,7 @@ class ActionEnum: related_actions=[GLOBAL_MANAGE.id], related_resource_types=[], group=_("全局设置"), - subgroup=_(""), + subgroup="", hidden=True, ) @@ -1870,7 +1870,7 @@ class ActionEnum: related_actions=[DB_MANAGE.id], related_resource_types=[ResourceEnum.BUSINESS], group=_("业务配置"), - subgroup=_(""), + subgroup="", common_labels=[CommonActionLabel.BIZ_MAINTAIN], ) @@ -1882,7 +1882,7 @@ class ActionEnum: related_actions=[GLOBAL_MANAGE.id], related_resource_types=[], group=_("全局设置"), - subgroup=_(""), + subgroup="", hidden=True, ) diff --git a/dbm-ui/locale/en/LC_MESSAGES/django.mo b/dbm-ui/locale/en/LC_MESSAGES/django.mo index 658e0ae6f6a90a22544083d5d62e1b291db0edb1..1776b4a1ad94bd5c1b6af0c2f5e936d593b0c890 100644 GIT binary patch literal 521687 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�jiH>p!DiO^}VBU1k~r{eB)lI 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 J=_{|niC)gJ%= diff --git a/dbm-ui/locale/en/LC_MESSAGES/django.po b/dbm-ui/locale/en/LC_MESSAGES/django.po index b464b2b608..ad5e1166d0 100644 --- a/dbm-ui/locale/en/LC_MESSAGES/django.po +++ b/dbm-ui/locale/en/LC_MESSAGES/django.po @@ -2,12 +2,11 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. - msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-20 15:58+0800\n" +"POT-Creation-Date: 2024-09-13 20:40+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,113 +16,155 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: backend/bk_web/handlers.py:37 -msgid "部分列表元素的参数不合法,请检查" -msgstr "The parameters of some list elements are invalid, please check" +#: backend/bk_dataview/grafana/views.py:209 +#: backend/db_monitor/models/dashboard.py:29 +msgid "集群监控视图" +msgstr "Cluster monitoring view" + +#: backend/bk_web/exceptions.py:19 +msgid "外部路由转发异常" +msgstr "External route forwarding exception" + +#: backend/bk_web/exceptions.py:24 +msgid "外部用户不存在" +msgstr "External user does not exist" + +#: backend/bk_web/exceptions.py:29 +msgid "转发路由非法" +msgstr "Illegal forwarding route" -#: backend/bk_web/handlers.py:65 +#: backend/bk_web/handlers.py:41 msgid "捕获未处理异常, 请求URL->{}, 请求方法->{} 请求参数->{}" msgstr "" "Catch unhandled exception, request URL->{}, request method->{} request " "parameter->{}" -#: backend/bk_web/handlers.py:84 +#: backend/bk_web/handlers.py:61 msgid "用户未登录或登录态失效,请重新登录" msgstr "" "The user is not logged in or the login status is invalid, please log in again" -#: backend/bk_web/handlers.py:97 +#: backend/bk_web/handlers.py:74 #, python-brace-format msgid "【APP 自定义异常】{message}, code={code}, args={args}" msgstr "【APP custom exception】{message}, code={code}, args={args}" -#: backend/bk_web/handlers.py:113 +#: backend/bk_web/handlers.py:90 msgid "捕获未处理异常, 请求URL->[{}], 请求方法->[{}] 请求参数->[{}]" msgstr "" "Catch unhandled exception, request URL->[{}], request method->[{}] " "request parameter->[{}]" -#: backend/bk_web/handlers.py:117 +#: backend/bk_web/handlers.py:94 #, python-brace-format msgid "系统错误,请联系管理员({error})" msgstr "System error, please contact administrator({error})" -#: backend/bk_web/models.py:20 -#: backend/db_proxy/views/redis_dts/serializers.py:22 -#: backend/db_services/bigdata/influxdb/query.py:34 -#: backend/db_services/bigdata/influxdb/query.py:35 -#: backend/db_services/bigdata/resources/query.py:46 -#: backend/db_services/bigdata/resources/query.py:47 -#: backend/db_services/mysql/resources/spider/query.py:45 -#: backend/db_services/mysql/resources/tendbha/query.py:46 -#: backend/db_services/mysql/resources/tendbsingle/query.py:42 -#: backend/db_services/redis/resources/redis_cluster/query.py:61 -#: backend/db_services/redis_dts/serializers.py:17 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:66 +#: backend/bk_web/middleware.py:137 +msgid "外部请求失败,错误原因:{}" +msgstr "External request failed, error reason: {}" + +#: backend/bk_web/middleware.py:168 +msgid "单据类型[{}]非法,未开通白名单" +msgstr "The document type [{}] is illegal and the whitelist has not been activated." + +#: backend/bk_web/middleware.py:202 +msgid "路由{}非法,未开通白名单" +msgstr "Route {} is illegal and the whitelist is not activated." + +#: backend/bk_web/models.py:22 backend/db_monitor/views/policy.py:49 +#: backend/db_services/bigdata/influxdb/query.py:36 +#: backend/db_services/bigdata/influxdb/query.py:37 +#: backend/db_services/bigdata/resources/query.py:44 +#: backend/db_services/bigdata/resources/query.py:45 +#: backend/db_services/mongodb/resources/query.py:37 +#: backend/db_services/mysql/resources/tendbcluster/query.py:49 +#: backend/db_services/mysql/resources/tendbha/query.py:41 +#: backend/db_services/mysql/resources/tendbsingle/query.py:36 +#: backend/db_services/redis/resources/redis_cluster/query.py:65 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:37 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:34 msgid "创建人" msgstr "founder" -#: backend/bk_web/models.py:21 backend/core/encrypt/models.py:25 -#: backend/core/storages/models.py:28 backend/core/storages/models.py:47 -#: backend/db_services/bigdata/influxdb/query.py:36 -#: backend/db_services/bigdata/resources/query.py:48 -#: backend/db_services/mysql/permission/db_account/serializers.py:88 -#: backend/db_services/mysql/permission/db_account/serializers.py:98 -#: backend/db_services/mysql/resources/spider/query.py:46 -#: backend/db_services/mysql/resources/tendbha/query.py:47 -#: backend/db_services/mysql/resources/tendbsingle/query.py:43 -#: backend/db_services/mysql/sql_import/serializers.py:143 -#: backend/db_services/redis/resources/redis_cluster/query.py:62 -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:19 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:57 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:70 -#: backend/flow/models.py:45 backend/ticket/models/ticket.py:43 +#: backend/bk_web/models.py:23 backend/core/storages/models.py:28 +#: backend/core/storages/models.py:47 backend/db_package/models.py:42 +#: backend/db_services/bigdata/influxdb/query.py:38 +#: backend/db_services/bigdata/resources/query.py:46 +#: backend/db_services/dbpermission/db_account/serializers.py:89 +#: backend/db_services/dbpermission/db_account/serializers.py:98 +#: backend/db_services/mysql/resources/tendbcluster/query.py:50 +#: backend/db_services/mysql/resources/tendbha/query.py:42 +#: backend/db_services/mysql/resources/tendbsingle/query.py:37 +#: backend/db_services/mysql/sql_import/serializers.py:164 +#: backend/db_services/redis/autofix/models.py:92 +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:19 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:91 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:75 +#: backend/db_services/redis/resources/redis_cluster/query.py:66 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:38 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:35 +#: backend/flow/models.py:49 backend/ticket/models/ticket.py:44 msgid "创建时间" msgstr "creation time" -#: backend/bk_web/models.py:22 +#: backend/bk_web/models.py:24 msgid "修改人" msgstr "Edited by" -#: backend/bk_web/models.py:23 backend/core/encrypt/models.py:24 -#: backend/core/storages/models.py:27 backend/core/storages/models.py:46 -#: backend/db_services/bigdata/influxdb/query.py:38 -#: backend/db_services/bigdata/resources/query.py:50 +#: backend/bk_web/models.py:25 backend/core/storages/models.py:27 +#: backend/core/storages/models.py:46 backend/db_package/models.py:43 +#: backend/db_services/bigdata/influxdb/query.py:40 +#: backend/db_services/bigdata/resources/query.py:48 #: backend/db_services/dbconfig/serializers.py:66 -#: backend/db_services/redis/resources/redis_cluster/query.py:64 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:58 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:71 -#: backend/flow/models.py:47 backend/ticket/models/ticket.py:44 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:28 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:23 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:92 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:76 +#: backend/db_services/redis/resources/redis_cluster/query.py:68 +#: backend/flow/models.py:51 backend/ticket/models/ticket.py:45 msgid "更新时间" msgstr "update time" -#: backend/components/base.py:158 +#: backend/bk_web/models.py:34 +msgid "外部用户名" +msgstr "external username" + +#: backend/bk_web/models.py:35 +msgid "内部用户名" +msgstr "internal username" + +#: backend/bk_web/models.py:43 +msgid "外部用户{}没有注册到DBM平台,请联系管理员注册" +msgstr "External user {} has not registered to the DBM platform, please contact the administrator to register." + +#: backend/components/base.py:175 #, python-brace-format msgid "请求已达到最大重试次数{max_retry_times}" msgstr "" "The request has reached the maximum number of retries {max_retry_times}" -#: backend/components/base.py:199 -msgid "{}-接口调用异常" -msgstr "{} - interface call exception" +#: backend/components/base.py:214 +msgid "{}-接口调用异常: {}" +msgstr "{}-Interface call exception: {}" -#: backend/components/base.py:217 +#: backend/components/base.py:245 #, python-brace-format msgid "[{module}]API请求异常:({error_message})" msgstr "[{module}] API request exception: ({error_message})" -#: backend/components/base.py:279 +#: backend/components/base.py:303 msgid "返回数据格式不正确,结果格式非json." msgstr "" "The format of the returned data is incorrect, and the result format is not " "json." -#: backend/components/base.py:347 +#: backend/components/base.py:375 #, python-brace-format msgid "[BKAPI] {info}" msgstr "[BKAPI] {info}" -#: backend/components/base.py:446 +#: backend/components/base.py:501 #, python-brace-format msgid "异常请求方式,{method}" msgstr "Abnormal request method, {method}" @@ -132,31 +173,35 @@ msgstr "Abnormal request method, {method}" msgid "请求[{}]失败:{}" msgstr "Request failed:{}" -#: backend/components/bklog/client.py:19 +#: backend/components/bklog/client.py:18 msgid "蓝鲸日志平台" msgstr "Blue Whale Log Platform" -#: backend/components/bklog/client.py:27 +#: backend/components/bklog/client.py:26 msgid "查询索引" msgstr "query index" -#: backend/components/bklog/client.py:34 +#: backend/components/bklog/client.py:31 msgid "简易创建采集配置" msgstr "Easy creation of acquisition configurations" -#: backend/components/bklog/client.py:43 +#: backend/components/bklog/client.py:38 msgid "简易更新采集配置" msgstr "Easy update of acquisition configurations" -#: backend/components/bklog/client.py:50 +#: backend/components/bklog/client.py:43 msgid "创建采集项的前置检查" msgstr "Pre check before create collection" -#: backend/components/bklog/client.py:57 +#: backend/components/bklog/client.py:48 msgid "获取采集项列表" msgstr "Get a list of collection items" -#: backend/components/bkmonitorv3/client.py:23 +#: backend/components/bklog/client.py:53 +msgid "查询索引集列表" +msgstr "Query index set list" + +#: backend/components/bkmonitorv3/client.py:19 msgid "监控" msgstr "monitor" @@ -164,214 +209,377 @@ msgstr "monitor" msgid "获取 data id" msgstr "get data id" -#: backend/components/bkmonitorv3/client.py:38 +#: backend/components/bkmonitorv3/client.py:36 msgid "保存通知组" msgstr "save notification group" -#: backend/components/bkmonitorv3/client.py:45 +#: backend/components/bkmonitorv3/client.py:41 msgid "获取业务下自定义事件列表" msgstr "Get a list of custom events under business" -#: backend/components/bkmonitorv3/client.py:52 +#: backend/components/bkmonitorv3/client.py:46 msgid "获取自定义指标列表" msgstr "Get a list of custom indicators" -#: backend/components/bkmonitorv3/client.py:59 +#: backend/components/bkmonitorv3/client.py:51 msgid "获取自定义指标详情" msgstr "Get custom indicator details" -#: backend/components/bkmonitorv3/client.py:66 +#: backend/components/bkmonitorv3/client.py:56 msgid "获取业自定义事件详情" msgstr "Get industry custom event details" -#: backend/components/bkmonitorv3/client.py:73 +#: backend/components/bkmonitorv3/client.py:61 msgid "创建自定义指标" msgstr "Create custom metrics" -#: backend/components/bkmonitorv3/client.py:80 +#: backend/components/bkmonitorv3/client.py:66 msgid "创建自定义事件" msgstr "Create custom events" -#: backend/components/bkmonitorv3/client.py:87 +#: backend/components/bkmonitorv3/client.py:71 msgid "保存告警策略" msgstr "Save alert policy" -#: backend/components/bkmonitorv3/client.py:94 +#: backend/components/bkmonitorv3/client.py:76 +msgid "启停告警策略" +msgstr "Start and stop alarm strategy" + +#: backend/components/bkmonitorv3/client.py:81 +msgid "批量更新策略局部配置" +msgstr "Batch update policy local configuration" + +#: backend/components/bkmonitorv3/client.py:86 +msgid "删除告警策略" +msgstr "Delete alert policy" + +#: backend/components/bkmonitorv3/client.py:91 msgid "查询告警策略" msgstr "Querying the Alarm Policy" -#: backend/components/bkmonitorv3/client.py:101 +#: backend/components/bkmonitorv3/client.py:96 msgid "保存采集策略" msgstr "Save collection strategy" -#: backend/components/bkmonitorv3/client.py:108 +#: backend/components/bkmonitorv3/client.py:101 msgid "查询采集策略" msgstr "Query collection strategy" -#: backend/components/bkmonitorv3/client.py:115 +#: backend/components/bkmonitorv3/client.py:106 msgid "查询采集配置列表" msgstr "Query the collection configuration list" -#: backend/components/bkmonitorv3/client.py:122 +#: backend/components/bkmonitorv3/client.py:111 msgid "查询采集策略详情" msgstr "Querying Collection Policy Details" -#: backend/components/cc/client.py:19 backend/iam_app/handlers/permission.py:89 +#: backend/components/bkmonitorv3/client.py:116 +msgid "查询用户组列表" +msgstr "Query user group list" + +#: backend/components/bkmonitorv3/client.py:121 +msgid "查询用户组详情" +msgstr "Query user group details" + +#: backend/components/bkmonitorv3/client.py:126 +msgid "删除用户组" +msgstr "Delete user group" + +#: backend/components/bkmonitorv3/client.py:131 +msgid "保存用户组" +msgstr "Save user group" + +#: backend/components/bkmonitorv3/client.py:136 +msgid "保存轮值规则" +msgstr "Save rotation rules" + +#: backend/components/bkmonitorv3/client.py:141 +#: backend/db_monitor/views/duty_rule.py:34 +msgid "查询轮值规则列表" +msgstr "Query the list of rotation rules" + +#: backend/components/bkmonitorv3/client.py:146 +#: backend/db_monitor/views/duty_rule.py:60 +msgid "删除轮值规则" +msgstr "Delete rotation rules" + +#: backend/components/bkmonitorv3/client.py:151 +msgid "保存分派组" +msgstr "save dispatch group" + +#: backend/components/bkmonitorv3/client.py:156 +msgid "查询分派组" +msgstr "Query dispatch group" + +#: backend/components/bkmonitorv3/client.py:161 +msgid "删除分派组" +msgstr "Delete a dispatch group" + +#: backend/components/bkmonitorv3/client.py:166 +msgid "查询事件" +msgstr "Query events" + +#: backend/components/bkmonitorv3/client.py:171 +msgid "统一查询时序数据" +msgstr "Unified query of time series data" + +#: backend/components/bkmonitorv3/client.py:176 +msgid "获取自定义上报的 proxy 主机信息" +msgstr "Get custom reported proxy host information" + +#: backend/components/bknodeman/client.py:19 +msgid "节点管理" +msgstr "Node management" + +#: backend/components/bknodeman/client.py:31 +msgid "插件操作任务" +msgstr "Plug-in operation tasks" + +#: backend/components/bknodeman/client.py:35 +msgid "查询任务详情" +msgstr "Query task details" + +#: backend/components/bknodeman/client.py:38 +msgid "查询agent状态" +msgstr "Query agent status" + +#: backend/components/cc/client.py:19 backend/iam_app/handlers/permission.py:97 msgid "配置平台" msgstr "Configure the platform" -#: backend/components/cc/client.py:27 +#: backend/components/cc/client.py:32 msgid "没有业务信息的主机查询" msgstr "Host query without business information" -#: backend/components/cc/client.py:34 +#: backend/components/cc/client.py:35 msgid "查询业务" msgstr "Query business" -#: backend/components/cc/client.py:41 +#: backend/components/cc/client.py:40 msgid "查询模块" msgstr "query module" -#: backend/components/cc/client.py:48 +#: backend/components/cc/client.py:45 msgid "创建集群" msgstr "create cluster" -#: backend/components/cc/client.py:55 +#: backend/components/cc/client.py:50 msgid "查询集群" msgstr "query cluster" -#: backend/components/cc/client.py:62 +#: backend/components/cc/client.py:55 msgid "创建模块" msgstr "create module" -#: backend/components/cc/client.py:69 backend/components/cc/client.py:237 +#: backend/components/cc/client.py:60 backend/components/cc/client.py:190 msgid "删除模块" msgstr "delete module" -#: backend/components/cc/client.py:76 +#: backend/components/cc/client.py:65 msgid "跨业务转移主机" msgstr "Transfer hosts across businesses" -#: backend/components/cc/client.py:83 +#: backend/components/cc/client.py:70 msgid "业务内主机转移模块" msgstr "Intra-business host transfer module" -#: backend/components/cc/client.py:87 +#: backend/components/cc/client.py:72 msgid "修改业务" msgstr "modify business" -#: backend/components/cc/client.py:91 +#: backend/components/cc/client.py:73 msgid "修改主机" msgstr "modify host" -#: backend/components/cc/client.py:95 +#: backend/components/cc/client.py:75 msgid "批量修改主机" msgstr "Modify hosts in batches" -#: backend/components/cc/client.py:103 +#: backend/components/cc/client.py:80 msgid "创建自定义字段" msgstr "Create custom fields" -#: backend/components/cc/client.py:111 +#: backend/components/cc/client.py:83 msgid "获取模型属性" msgstr "Get model properties" -#: backend/components/cc/client.py:119 +#: backend/components/cc/client.py:88 msgid "创建模型属性" msgstr "Create model properties" -#: backend/components/cc/client.py:127 +#: backend/components/cc/client.py:93 msgid "主机移动到空闲机模块" msgstr "The host moves to the idle machine module" -#: backend/components/cc/client.py:135 +#: backend/components/cc/client.py:98 msgid "主机移动到待回收模块" msgstr "The host moves to the module to be recycled" -#: backend/components/cc/client.py:143 +#: backend/components/cc/client.py:101 msgid "查询业务实例拓扑" msgstr "Querying the Topology of a Service Instance" -#: backend/components/cc/client.py:151 +#: backend/components/cc/client.py:106 msgid "查询业务下的主机" msgstr "Query the host under business" -#: backend/components/cc/client.py:159 +#: backend/components/cc/client.py:111 msgid "查询业务下的主机和拓扑信息" msgstr "Query host and topology information under business" -#: backend/components/cc/client.py:166 +#: backend/components/cc/client.py:114 msgid "查询业务的空闲机/故障机/待回收模块" msgstr "" "Query the idle machine/failure machine/module to be recycled of the business" -#: backend/components/cc/client.py:173 +#: backend/components/cc/client.py:119 msgid "获取主机与拓扑的关系" msgstr "Get the relationship between the host and the topology" -#: backend/components/cc/client.py:182 +#: backend/components/cc/client.py:125 msgid "查询云区域" msgstr "Query cloud region" -#: backend/components/cc/client.py:189 +#: backend/components/cc/client.py:130 msgid "查询主机及其对应拓扑" msgstr "Query hosts and their corresponding topology" -#: backend/components/cc/client.py:197 +#: backend/components/cc/client.py:135 msgid "创建服务实例" msgstr "Create a service instance" -#: backend/components/cc/client.py:205 +#: backend/components/cc/client.py:140 msgid "查询服务实例详细信息" msgstr "Query service instance details" -#: backend/components/cc/client.py:213 +#: backend/components/cc/client.py:145 msgid "直接通过bk_host_id查询服务实例详细信息" msgstr "Query service instance details directly through bk_host_id" -#: backend/components/cc/client.py:221 +#: backend/components/cc/client.py:150 +msgid "获取服务实例详细信息" +msgstr "Get service instance details" + +#: backend/components/cc/client.py:155 msgid "服务实例添加标签" msgstr "Service instance tagging" -#: backend/components/cc/client.py:229 +#: backend/components/cc/client.py:160 +msgid "从服务实例移除标签" +msgstr "Remove tags from service instance" + +#: backend/components/cc/client.py:165 msgid "删除服务实例" msgstr "delete service instance" -#: backend/components/cc/client.py:245 +#: backend/components/cc/client.py:170 +msgid "创建实例进程" +msgstr "Create instance process" + +#: backend/components/cc/client.py:175 +msgid "删除实例进程" +msgstr "Delete instance process" + +#: backend/components/cc/client.py:180 +msgid "查询实例进程列表" +msgstr "Query instance process list" + +#: backend/components/cc/client.py:185 +msgid "更新实例进程" +msgstr "Update instance process" + +#: backend/components/cc/client.py:195 msgid "根据条件查询业务下的模块" msgstr "Query the modules under the business according to the conditions" -#: backend/components/cc/client.py:253 +#: backend/components/cc/client.py:200 msgid "根据模块ID查询主机和模块的关系" msgstr "" "Query the relationship between the host and the module according to the " "module ID" -#: backend/components/cc/client.py:261 +#: backend/components/cc/client.py:205 msgid "查询主机业务关系信息" msgstr "Query host business relationship information" -#: backend/components/cmsi/client.py:19 +#: backend/components/cc/client.py:210 +msgid "批量查询某业务的模块详情" +msgstr "Query module details of a business in batches" + +#: backend/components/celery_service/client.py:19 +msgid "周期任务服务" +msgstr "Periodic task service" + +#: backend/components/celery_service/client.py:27 +msgid "获取API列表" +msgstr "Get API list" + +#: backend/components/celery_service/client.py:32 +msgid "获取周期任务的注册列表" +msgstr "Get the registration list of periodic tasks" + +#: backend/components/celery_service/client.py:37 +msgid "查询异步会话" +msgstr "Query asynchronous session" + +#: backend/components/celery_service/client.py:42 +msgid "结束异步会话" +msgstr "End asynchronous session" + +#: backend/components/cmsi/client.py:21 msgid "消息管理" msgstr "message management" -#: backend/components/cmsi/client.py:27 +#: backend/components/cmsi/client.py:25 backend/db_monitor/mock_data.py:19 +msgid "短信" +msgstr "Short message" + +#: backend/components/cmsi/client.py:26 backend/db_monitor/mock_data.py:17 +msgid "微信" +msgstr "WeChat" + +#: backend/components/cmsi/client.py:27 backend/db_monitor/mock_data.py:18 +msgid "邮件" +msgstr "mail" + +#: backend/components/cmsi/client.py:28 backend/db_monitor/mock_data.py:20 +msgid "语音" +msgstr "voice" + +#: backend/components/cmsi/client.py:29 backend/db_monitor/mock_data.py:16 +msgid "企业微信" +msgstr "Enterprise WeChat" + +#: backend/components/cmsi/client.py:30 +msgid "企业微信机器人" +msgstr "Enterprise WeChat robot" + +#: backend/components/cmsi/client.py:32 +msgid "未知" +msgstr "unknown" + +#: backend/components/cmsi/client.py:38 msgid "通用消息发送" msgstr "General Messaging" -#: backend/components/constants.py:20 +#: backend/components/cmsi/client.py:43 +#: backend/db_monitor/views/notice_group.py:129 +msgid "查询通知类型" +msgstr "Query notification type" + +#: backend/components/constants.py:21 msgid "服务器证书文件" msgstr "server certificate file" -#: backend/components/constants.py:21 +#: backend/components/constants.py:22 msgid "服务器私钥" msgstr "server private key" -#: backend/components/constants.py:22 +#: backend/components/constants.py:23 msgid "客户端证书文件" msgstr "client certificate file" -#: backend/components/constants.py:23 +#: backend/components/constants.py:24 msgid "客户端私钥" msgstr "client private key" @@ -379,47 +587,47 @@ msgstr "client private key" msgid "名字服务" msgstr "name service" -#: backend/components/db_name_service/client.py:27 +#: backend/components/db_name_service/client.py:26 msgid "创建clb并绑定后端主机" msgstr "Create clb and bind backend host" -#: backend/components/db_name_service/client.py:34 +#: backend/components/db_name_service/client.py:31 msgid "clb解绑部分后端主机" msgstr "clb unbinds some backend hosts" -#: backend/components/db_name_service/client.py:41 +#: backend/components/db_name_service/client.py:36 msgid "clb新增绑定部分后端主机" msgstr "CLB newly added some back-end hosts" -#: backend/components/db_name_service/client.py:48 +#: backend/components/db_name_service/client.py:41 msgid "获取已绑定clb的后端主机私网IP" msgstr "Obtain the private network IP of the backend host bound to clb" -#: backend/components/db_name_service/client.py:55 +#: backend/components/db_name_service/client.py:46 msgid "通过IP查询该IP是否已经被clb绑定了" msgstr "Query whether the IP has been bound by clb through IP" -#: backend/components/db_name_service/client.py:62 +#: backend/components/db_name_service/client.py:51 msgid "解绑后端主机并删除clb" msgstr "Unbind the backend host and delete clb" -#: backend/components/db_name_service/client.py:69 +#: backend/components/db_name_service/client.py:56 msgid "创建北极星服务和别名并绑定后端主机" msgstr "Create Polaris service and alias and bind backend host" -#: backend/components/db_name_service/client.py:76 +#: backend/components/db_name_service/client.py:61 msgid "北极星解绑部分后端主机" msgstr "Polaris unbinds some back-end hosts" -#: backend/components/db_name_service/client.py:83 +#: backend/components/db_name_service/client.py:66 msgid "北极星新增绑定部分后端主机" msgstr "Polaris newly added some back-end hosts" -#: backend/components/db_name_service/client.py:90 +#: backend/components/db_name_service/client.py:71 msgid "获取北极星已绑定的后端主机信息" msgstr "Get the backend host information bound by Polaris" -#: backend/components/db_name_service/client.py:97 +#: backend/components/db_name_service/client.py:76 msgid "解绑后端主机并删除别名和北极星服务" msgstr "Unbind the backend host and delete the alias and Polaris service" @@ -427,289 +635,369 @@ msgstr "Unbind the backend host and delete the alias and Polaris service" msgid "DB 远程服务" msgstr "DB remote service" -#: backend/components/db_remote_service/client.py:37 +#: backend/components/db_remote_service/client.py:39 msgid "DB 远程执行" msgstr "DB remote execution" -#: backend/components/db_remote_service/client.py:46 +#: backend/components/db_remote_service/client.py:49 msgid "DB PROXY远程执行" msgstr "DB PROXY remote execution" -#: backend/components/db_remote_service/client.py:55 +#: backend/components/db_remote_service/client.py:59 msgid "redis 远程执行" msgstr "Redis remote execution" -#: backend/components/db_remote_service/client.py:64 +#: backend/components/db_remote_service/client.py:68 msgid "twemproxy 远程执行" msgstr "twemproxy remote execution" +#: backend/components/db_remote_service/client.py:77 +msgid "sqlserver 远程执行" +msgstr "sqlserver remote execution" + +#: backend/components/db_remote_service/client.py:86 +msgid "webconsole 远程执行(只读账号)" +msgstr "webconsole remote execution (read-only account)" + #: backend/components/dbconfig/client.py:20 msgid "DB配置系统" msgstr "DB configuration system" -#: backend/components/dbconfig/client.py:28 +#: backend/components/dbconfig/client.py:27 msgid "新增平台级配置文件" msgstr "Add platform-level configuration files" -#: backend/components/dbconfig/client.py:35 +#: backend/components/dbconfig/client.py:32 msgid "查询配置文件列表" msgstr "Query the list of configuration files" -#: backend/components/dbconfig/client.py:42 +#: backend/components/dbconfig/client.py:37 msgid "编辑平台级配置" msgstr "Edit platform-level configuration" -#: backend/components/dbconfig/client.py:49 +#: backend/components/dbconfig/client.py:42 msgid "查询公共配置项列表" msgstr "Query the list of public configuration items" -#: backend/components/dbconfig/client.py:56 +#: backend/components/dbconfig/client.py:47 msgid "查询定义的配置名列表" msgstr "Query the list of defined configuration names" -#: backend/components/dbconfig/client.py:63 +#: backend/components/dbconfig/client.py:52 msgid "查询配置项列表" msgstr "Query the list of configuration items" -#: backend/components/dbconfig/client.py:72 +#: backend/components/dbconfig/client.py:59 msgid "保存不可变配置(如字符集等)" msgstr "Save immutable configuration (such as charset, etc.)" -#: backend/components/dbconfig/client.py:79 +#: backend/components/dbconfig/client.py:64 msgid "编辑发布层级(业务、集群、模块)配置" msgstr "Edit release level (business, cluster, module) configuration" -#: backend/components/dbconfig/client.py:86 +#: backend/components/dbconfig/client.py:69 msgid "批量获取多个对象的某一配置项" msgstr "Get a configuration item of multiple objects in batches" -#: backend/components/dbconfig/client.py:93 +#: backend/components/dbconfig/client.py:74 msgid "查询历史配置版本名列表" msgstr "Query the list of historical configuration version names" -#: backend/components/dbconfig/client.py:100 +#: backend/components/dbconfig/client.py:79 msgid "查询版本详细信息" msgstr "Query version details" -#: backend/components/dbconfig/client.py:107 +#: backend/components/dbconfig/client.py:84 msgid "查询实例配置文件模版" msgstr "Query instance configuration file template" -#: backend/components/dbconfig/constants.py:20 +#: backend/components/dbconfig/constants.py:21 msgid "平台层级" msgstr "platform level" -#: backend/components/dbconfig/constants.py:21 +#: backend/components/dbconfig/constants.py:22 msgid "业务层级" msgstr "business level" -#: backend/components/dbconfig/constants.py:22 +#: backend/components/dbconfig/constants.py:23 msgid "模块层级" msgstr "module level" -#: backend/components/dbconfig/constants.py:23 +#: backend/components/dbconfig/constants.py:24 msgid "集群层级" msgstr "cluster level" -#: backend/components/dbconfig/constants.py:24 +#: backend/components/dbconfig/constants.py:25 msgid "实例层级" msgstr "instance level" -#: backend/components/dbconfig/constants.py:30 +#: backend/components/dbconfig/constants.py:31 msgid "部署配置" msgstr "deployment configuration" -#: backend/components/dbconfig/constants.py:31 +#: backend/components/dbconfig/constants.py:32 +#: backend/iam_app/dataclass/actions.py:208 +#: backend/iam_app/dataclass/actions.py:220 +#: backend/iam_app/dataclass/actions.py:232 +#: backend/iam_app/dataclass/actions.py:244 +#: backend/iam_app/dataclass/actions.py:256 +#: backend/iam_app/dataclass/actions.py:1718 msgid "数据库配置" msgstr "database configuration" -#: backend/components/dbconfig/constants.py:32 +#: backend/components/dbconfig/constants.py:33 msgid "备份配置" msgstr "backup configuration" -#: backend/components/dbconfig/constants.py:33 +#: backend/components/dbconfig/constants.py:34 msgid "Proxy配置" msgstr "Proxy configuration" -#: backend/components/dbconfig/constants.py:39 +#: backend/components/dbconfig/constants.py:40 msgid "新增" msgstr "Add" -#: backend/components/dbconfig/constants.py:40 -#: backend/db_services/mysql/permission/constants.py:24 +#: backend/components/dbconfig/constants.py:41 +#: backend/db_services/dbpermission/constants.py:34 msgid "更新" msgstr "renew" -#: backend/components/dbconfig/constants.py:41 -#: backend/db_services/mysql/permission/constants.py:25 +#: backend/components/dbconfig/constants.py:42 +#: backend/db_services/dbpermission/constants.py:35 backend/flow/consts.py:1368 msgid "删除" msgstr "delete" -#: backend/components/dbconfig/constants.py:47 +#: backend/components/dbconfig/constants.py:48 msgid "仅保存" msgstr "save only" -#: backend/components/dbconfig/constants.py:48 +#: backend/components/dbconfig/constants.py:49 msgid "生成并保存" msgstr "generate and save" -#: backend/components/dbconfig/constants.py:49 +#: backend/components/dbconfig/constants.py:50 msgid "保存并发布" msgstr "save and publish" -#: backend/components/dbconfig/constants.py:50 +#: backend/components/dbconfig/constants.py:51 msgid "生成并发布" msgstr "generate and publish" -#: backend/components/dbconfig/constants.py:56 +#: backend/components/dbconfig/constants.py:57 msgid "列表" msgstr "the list" -#: backend/components/dbconfig/constants.py:57 +#: backend/components/dbconfig/constants.py:58 msgid "字典" msgstr "dictionary" -#: backend/components/dbconfig/constants.py:58 +#: backend/components/dbconfig/constants.py:59 msgid "分级字典" msgstr "Grading Dictionary" +#: backend/components/dbconsole/client.py:21 +msgid "DBConsole" +msgstr "DBConsole" + #: backend/components/dbresource/client.py:19 msgid "资源池 服务" msgstr "resource pool service" -#: backend/components/dbresource/client.py:27 -#: backend/db_services/dbresource/views/resource.py:122 +#: backend/components/dbresource/client.py:26 +#: backend/db_services/dbresource/views/resource.py:182 msgid "资源导入" msgstr "resource import" -#: backend/components/dbresource/client.py:34 -#: backend/db_services/dbresource/views/resource.py:65 +#: backend/components/dbresource/client.py:31 +#: backend/db_services/dbresource/views/resource.py:94 msgid "资源池资源列表" msgstr "resource list" +#: backend/components/dbresource/client.py:36 +msgid "资源池全部资源列表" +msgstr "List of all resources in the resource pool" + #: backend/components/dbresource/client.py:41 msgid "资源池资源申请" msgstr "Resource pool resource application" -#: backend/components/dbresource/client.py:48 -#: backend/db_services/dbresource/views/resource.py:192 +#: backend/components/dbresource/client.py:46 +#: backend/db_services/dbresource/views/resource.py:256 msgid "获取挂载点" msgstr "Get the mount point" -#: backend/components/dbresource/client.py:55 -#: backend/db_services/dbresource/views/resource.py:200 +#: backend/components/dbresource/client.py:51 +#: backend/db_services/dbresource/views/resource.py:265 msgid "获取磁盘类型" msgstr "Get disk type" -#: backend/components/dbresource/client.py:62 -#: backend/db_services/dbresource/views/resource.py:208 +#: backend/components/dbresource/client.py:56 +#: backend/db_services/dbresource/views/resource.py:282 msgid "根据逻辑城市查询园区" msgstr "Query parks based on logical cities" -#: backend/components/dbresource/client.py:69 +#: backend/components/dbresource/client.py:61 msgid "资源申请预占用" msgstr "Resource application pre-occupancy" -#: backend/components/dbresource/client.py:76 +#: backend/components/dbresource/client.py:66 msgid "资源申请确认" msgstr "Resource Application Confirmation" -#: backend/components/dbresource/client.py:83 -#: backend/db_services/dbresource/views/resource.py:248 +#: backend/components/dbresource/client.py:71 +#: backend/db_services/dbresource/views/resource.py:322 msgid "资源删除" msgstr "resource deletion" -#: backend/components/dbresource/client.py:90 -#: backend/db_services/dbresource/views/resource.py:258 +#: backend/components/dbresource/client.py:76 +#: backend/db_services/dbresource/views/resource.py:347 msgid "资源更新" msgstr "Resource update" -#: backend/components/dbresource/client.py:97 +#: backend/components/dbresource/client.py:81 +msgid "资源批量更新" +msgstr "Resource batch update" + +#: backend/components/dbresource/client.py:86 msgid "获取机型List" msgstr "Get Model List" -#: backend/components/dbresource/client.py:104 +#: backend/components/dbresource/client.py:91 msgid "获取操作记录" msgstr "Get operation records" -#: backend/components/gcs_dns/client.py:19 -msgid "GCSDNS域名管理" -msgstr "GCSDNS domain name management" +#: backend/components/dbresource/client.py:96 +msgid "创建导入操作记录" +msgstr "Create import operation record" + +#: backend/components/dbresource/client.py:101 +msgid "预申请获取资源数量" +msgstr "Quantity of resources obtained by pre-application" -#: backend/components/gcs_dns/client.py:27 +#: backend/components/dns/client.py:19 +msgid "DNS域名管理" +msgstr "DNS domain name management" + +#: backend/components/dns/client.py:26 msgid "获取域名映射关系" msgstr "Get domain name mapping relationship" -#: backend/components/gcs_dns/client.py:34 +#: backend/components/dns/client.py:31 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:56 msgid "删除域名映射" msgstr "delete domain mapping" -#: backend/components/gcs_dns/client.py:41 +#: backend/components/dns/client.py:36 msgid "更新域名映射关系" msgstr "Update domain name mapping relationship" -#: backend/components/gcs_dns/client.py:48 +#: backend/components/dns/client.py:41 msgid "新增域名映射关系" msgstr "Add domain name mapping relationship" -#: backend/components/gcs_dns/client.py:55 +#: backend/components/dns/client.py:46 msgid "批量更新域名映射关系" msgstr "Batch update domain name mapping relationship" -#: backend/components/gcs_dns/client.py:62 +#: backend/components/dns/client.py:51 msgid "获取所有ip、域名关系" msgstr "Get all ip, domain name relationship" +#: backend/components/dns/client.py:56 +msgid "更新域名所属业务关系" +msgstr "Update the business relationship to which the domain name belongs" + +#: backend/components/gcs/client.py:19 backend/components/gcs/client.py:35 +msgid "Gcs平台" +msgstr "Gcs platform" + +#: backend/components/gcs/client.py:24 +msgid "gcs授权接口(mysql和spider)" +msgstr "gcs authorization interface (mysql and spider)" + +#: backend/components/gcs/client.py:30 +msgid "查询gcs作业执行状态" +msgstr "Query gcs job execution status" + +#: backend/components/gcs/client.py:42 +msgid "直接授权接口" +msgstr "direct authorization interface" + #: backend/components/gse/client.py:19 msgid "管控平台" msgstr "Control platform" -#: backend/components/gse/client.py:27 -msgid "Agent在线状态查询" -msgstr "Agent Online Status Query" +#: backend/components/gse/client.py:26 +msgid "Agent在线状态查询 - 1.0" +msgstr "Agent online status query-1.0" + +#: backend/components/gse/client.py:32 +msgid "查询Agent状态列表信息 - 2.0" +msgstr "Query Agent status list information-2.0" #: backend/components/hadb/client.py:19 msgid "HADB 服务" msgstr "HADB service" -#: backend/components/hadb/client.py:27 +#: backend/components/hadb/client.py:26 msgid "上报和查询ha的探测切换日志" msgstr "Report and query ha detection switch log" -#: backend/components/hadb/client.py:34 +#: backend/components/hadb/client.py:31 msgid "上报和查询数据库实例的状态" msgstr "Report and query the status of the database instance" -#: backend/components/hadb/client.py:41 +#: backend/components/hadb/client.py:36 msgid "上报和查询ha服务的状态" msgstr "Report and query the status of the ha service" -#: backend/components/hadb/client.py:48 +#: backend/components/hadb/client.py:41 msgid "查询和上报切换队列" msgstr "Query and report switching queue" -#: backend/components/hadb/client.py:55 +#: backend/components/hadb/client.py:46 msgid "查询切换详情" msgstr "Query switching details" +#: backend/components/hadb/client.py:51 +msgid "DBHA切换屏蔽配置" +msgstr "DBHA switch shielding configuration" + #: backend/components/itsm/client.py:19 msgid "ITSM流程管理" msgstr "ITSM process management" -#: backend/components/itsm/client.py:27 backend/ticket/views.py:199 -#: backend/ticket/views.py:201 +#: backend/components/itsm/client.py:26 +#: backend/db_services/redis/autofix/enums.py:38 backend/ticket/views.py:278 +#: backend/ticket/views.py:279 msgid "创建单据" msgstr "Create ticket" +#: backend/components/itsm/client.py:31 +msgid "单据状态查询" +msgstr "Document status query" + +#: backend/components/itsm/client.py:33 +msgid "处理单据节点" +msgstr "Process document node" + #: backend/components/itsm/client.py:34 +msgid "处理单据" +msgstr "Processing documents" + +#: backend/components/itsm/client.py:35 +msgid "单据详情查询" +msgstr "Document details query" + +#: backend/components/itsm/client.py:39 msgid "审批结果查询" msgstr "Approval result query" -#: backend/components/itsm/client.py:41 +#: backend/components/itsm/client.py:44 msgid "单据日志查询" msgstr "Ticket log query" -#: backend/components/itsm/client.py:48 +#: backend/components/itsm/client.py:49 msgid "服务目录查询" msgstr "Service Directory Inquiry" @@ -717,31 +1005,31 @@ msgstr "Service Directory Inquiry" msgid "服务列表查询" msgstr "Service List Query" -#: backend/components/itsm/client.py:58 +#: backend/components/itsm/client.py:55 msgid "创建服务目录" msgstr "Create a service catalog" -#: backend/components/itsm/client.py:61 +#: backend/components/itsm/client.py:57 msgid "导入服务" msgstr "import service" -#: backend/components/itsm/client.py:64 +#: backend/components/itsm/client.py:58 msgid "更新服务" msgstr "update service" -#: backend/components/itsm/constants.py:18 backend/ticket/constants.py:52 +#: backend/components/itsm/constants.py:19 backend/ticket/constants.py:54 msgid "处理中" msgstr "Processing" -#: backend/components/itsm/constants.py:19 +#: backend/components/itsm/constants.py:20 msgid "已结束" msgstr "over" -#: backend/components/itsm/constants.py:20 +#: backend/components/itsm/constants.py:21 msgid "已撤单" msgstr "Canceled" -#: backend/components/itsm/constants.py:21 +#: backend/components/itsm/constants.py:22 msgid "被终止" msgstr "terminated" @@ -749,224 +1037,328 @@ msgstr "terminated" msgid "作业平台" msgstr "Working platform" -#: backend/components/job/client.py:27 +#: backend/components/job/client.py:26 msgid "快速执行脚本" msgstr "Execute scripts quickly" -#: backend/components/job/client.py:34 +#: backend/components/job/client.py:31 msgid "快速分发文件" msgstr "Distribute files quickly" -#: backend/components/job/client.py:41 +#: backend/components/job/client.py:36 msgid "快速分发配置" msgstr "Quick distribution configuration" -#: backend/components/job/client.py:48 +#: backend/components/job/client.py:41 msgid "查询作业执行状态" msgstr "Query job execution status" -#: backend/components/job/client.py:55 +#: backend/components/job/client.py:46 msgid "根据作业实例ID查询作业执行日志" msgstr "Query job execution logs based on the job instance ID" -#: backend/components/job/client.py:62 +#: backend/components/job/client.py:51 msgid "根据ip列表批量查询作业执行日志" msgstr "Query job execution logs in batches based on the IP list" -#: backend/components/job/client.py:69 +#: backend/components/job/client.py:56 msgid "新建凭据" msgstr "Create new credentials" -#: backend/components/job/client.py:76 +#: backend/components/job/client.py:61 msgid "新建文件源" msgstr "new file source" +#: backend/components/job/client.py:66 +#: backend/components/mysql_priv_manager/client.py:65 +#: backend/db_services/dbpermission/db_account/views.py:84 +msgid "创建账号" +msgstr "Create an account" + +#: backend/components/job/client.py:71 +#: backend/components/mysql_priv_manager/client.py:80 +msgid "查询账号列表" +msgstr "Query account list" + #: backend/components/mysql_backup/client.py:18 -#: backend/components/mysql_backup/client.py:34 +#: backend/components/mysql_backup/client.py:30 msgid "备份文件下载" msgstr "Backup file download" -#: backend/components/mysql_backup/client.py:26 +#: backend/components/mysql_backup/client.py:25 msgid "获取备份" msgstr "get backup" -#: backend/components/mysql_backup/client.py:42 +#: backend/components/mysql_backup/client.py:36 backend/ticket/views.py:266 msgid "查询单据状态" msgstr "Query ticket status" +#: backend/components/mysql_backup/client.py:41 +msgid "backup_client下载,同步任务" +msgstr "backup_client download, synchronization task" + #: backend/components/mysql_partition/client.py:18 -#: backend/db_services/partition/constants.py:13 +#: backend/db_services/partition/constants.py:15 +#: backend/iam_app/dataclass/actions.py:451 +#: backend/iam_app/dataclass/actions.py:463 +#: backend/iam_app/dataclass/actions.py:475 +#: backend/iam_app/dataclass/actions.py:487 +#: backend/iam_app/dataclass/actions.py:830 +#: backend/iam_app/dataclass/actions.py:842 +#: backend/iam_app/dataclass/actions.py:854 +#: backend/iam_app/dataclass/actions.py:866 backend/ticket/constants.py:188 +#: backend/ticket/constants.py:211 msgid "分区管理" msgstr "Partition management" -#: backend/components/mysql_partition/client.py:26 +#: backend/components/mysql_partition/client.py:25 msgid "获取分区语句" msgstr "get partition statement" -#: backend/components/mysql_partition/client.py:34 +#: backend/components/mysql_partition/client.py:30 msgid "添加分区配置" msgstr "Add partition configuration" -#: backend/components/mysql_partition/client.py:42 +#: backend/components/mysql_partition/client.py:35 msgid "删除分区配置" msgstr "Delete partition configuration" -#: backend/components/mysql_partition/client.py:50 +#: backend/components/mysql_partition/client.py:40 +msgid "cluster_del_conf" +msgstr "cluster_del_conf" + +#: backend/components/mysql_partition/client.py:45 msgid "修改分区配置" msgstr "Modify partition configuration" -#: backend/components/mysql_partition/client.py:58 +#: backend/components/mysql_partition/client.py:50 msgid "查询分区配置" msgstr "Query partition configuration" -#: backend/components/mysql_partition/client.py:66 +#: backend/components/mysql_partition/client.py:55 msgid "启用分区" msgstr "enable partition" -#: backend/components/mysql_partition/client.py:74 +#: backend/components/mysql_partition/client.py:60 +#: backend/components/mysql_partition/client.py:65 +#: backend/components/mysql_partition/client.py:70 msgid "禁用分区" msgstr "disable partition" -#: backend/components/mysql_partition/client.py:82 +#: backend/components/mysql_partition/client.py:75 msgid "查询分区日志" msgstr "Query partition logs" -#: backend/components/mysql_priv_manager/client.py:20 -msgid "MySQL权限管理" -msgstr "MySQL permission management" +#: backend/components/mysql_partition/client.py:80 +msgid "创建分区操作日志" +msgstr "Create partition operation log" + +#: backend/components/mysql_partition/client.py:85 +msgid "获取巡检日志" +msgstr "Get inspection log" + +#: backend/components/mysql_priv_manager/client.py:19 +msgid "DB权限管理" +msgstr "DB permission management" #: backend/components/mysql_priv_manager/client.py:29 msgid "帐号规则详情" msgstr "Account Rules Details" -#: backend/components/mysql_priv_manager/client.py:36 +#: backend/components/mysql_priv_manager/client.py:34 msgid "帐号规则清单" msgstr "List of account rules" -#: backend/components/mysql_priv_manager/client.py:43 +#: backend/components/mysql_priv_manager/client.py:39 +msgid "添加帐号规则前置检查" +msgstr "Add account rule pre-check" + +#: backend/components/mysql_priv_manager/client.py:44 msgid "添加帐号规则" msgstr "Add Account Rules" -#: backend/components/mysql_priv_manager/client.py:50 +#: backend/components/mysql_priv_manager/client.py:49 msgid "删除帐号规则" msgstr "delete account rule" -#: backend/components/mysql_priv_manager/client.py:57 +#: backend/components/mysql_priv_manager/client.py:54 msgid "修改帐号规则" msgstr "Modify Account Rules" -#: backend/components/mysql_priv_manager/client.py:65 +#: backend/components/mysql_priv_manager/client.py:60 msgid "请求公钥" msgstr "request public key" -#: backend/components/mysql_priv_manager/client.py:72 -#: backend/db_services/mysql/permission/db_account/views.py:61 -msgid "创建账号" -msgstr "Create an account" - -#: backend/components/mysql_priv_manager/client.py:79 -#: backend/db_services/mysql/permission/db_account/views.py:68 +#: backend/components/mysql_priv_manager/client.py:70 +#: backend/db_services/dbpermission/db_account/views.py:96 msgid "删除账号" msgstr "delete account" -#: backend/components/mysql_priv_manager/client.py:86 -#: backend/db_services/mysql/permission/db_account/views.py:75 -msgid "修改密码" -msgstr "change Password" +#: backend/components/mysql_priv_manager/client.py:75 +msgid "修改账号的密码" +msgstr "Change account password" -#: backend/components/mysql_priv_manager/client.py:95 +#: backend/components/mysql_priv_manager/client.py:87 msgid "前置检查授权数据" msgstr "Pre-check authorization data" -#: backend/components/mysql_priv_manager/client.py:102 +#: backend/components/mysql_priv_manager/client.py:92 msgid "添加授权" msgstr "Add authorization" -#: backend/components/mysql_priv_manager/client.py:109 +#: backend/components/mysql_priv_manager/client.py:97 msgid "查询现网授权记录" msgstr "Query the Authorization Record of the Live Network" -#: backend/components/mysql_priv_manager/client.py:118 +#: backend/components/mysql_priv_manager/client.py:104 msgid "实例间权限克隆" msgstr "Inter-instance privilege cloning" -#: backend/components/mysql_priv_manager/client.py:125 +#: backend/components/mysql_priv_manager/client.py:109 msgid "实例间权限克隆前置检查" msgstr "Inter-instance permission cloning pre-check" -#: backend/components/mysql_priv_manager/client.py:132 +#: backend/components/mysql_priv_manager/client.py:114 msgid "客户端权限克隆" msgstr "Client Permission Clone" -#: backend/components/mysql_priv_manager/client.py:139 +#: backend/components/mysql_priv_manager/client.py:119 msgid "客户端权限克隆前置检查" msgstr "Client permission clone pre-check" -#: backend/components/mysql_priv_manager/client.py:146 +#: backend/components/mysql_priv_manager/client.py:124 msgid "mysql实例创建临时账号(切换专属接口)" msgstr "" "Mysql instance creates a temporary account (switching the dedicated " "interface)" +#: backend/components/mysql_priv_manager/client.py:129 +msgid "新增或者修改实例中管理用户的密码" +msgstr "Add or modify the password of the administrative user in the instance" + +#: backend/components/mysql_priv_manager/client.py:134 +msgid "获取密码" +msgstr "Get password" + +#: backend/components/mysql_priv_manager/client.py:139 +msgid "新增或者修改密码" +msgstr "Add or change password" + +#: backend/components/mysql_priv_manager/client.py:144 +msgid "生成随机字符串" +msgstr "Generate random string" + +#: backend/components/mysql_priv_manager/client.py:149 +msgid "获取安全规则" +msgstr "Get security rules" + +#: backend/components/mysql_priv_manager/client.py:154 +msgid "添加安全规则" +msgstr "Add security rules" + +#: backend/components/mysql_priv_manager/client.py:159 +msgid "修改安全规则" +msgstr "Modify security rules" + +#: backend/components/mysql_priv_manager/client.py:164 +msgid "删除安全规则" +msgstr "Delete security rules" + +#: backend/components/mysql_priv_manager/client.py:169 +msgid "获取不参与随机化的业务" +msgstr "Get services that do not participate in randomization" + +#: backend/components/mysql_priv_manager/client.py:174 +msgid "修改不参与随机化的业务" +msgstr "Modify businesses that do not participate in randomization" + +#: backend/components/mysql_priv_manager/client.py:179 +msgid "校验密码强度" +msgstr "Verify password strength" + +#: backend/components/mysql_priv_manager/client.py:184 +msgid "获取mysql ADMIN的密码——mysql专用" +msgstr "Get the password of mysql ADMIN - dedicated to mysql" + +#: backend/components/mysql_priv_manager/client.py:189 +msgid "删除实例密码记录" +msgstr "Delete instance password record" + +#: backend/components/mysql_priv_manager/client.py:194 +msgid "查询账号和密码信息" +msgstr "Query account and password information" + +#: backend/components/mysql_priv_manager/client.py:199 +msgid "从某个业务克隆账号和账号规则到其他业务" +msgstr "Clone accounts and account rules from one business to other businesses" + #: backend/components/proxy_api.py:35 msgid "ProxyApi 必须传入 bk_cloud_id 参数" msgstr "ProxyApi must pass in the bk_cloud_id parameter" -#: backend/components/sops/client.py:24 +#: backend/components/proxy_api.py:68 +msgid "必须在请求体中传入 url 参数" +msgstr "URL parameters must be passed in the request body" + +#: backend/components/scr/client.py:19 +msgid "Scr平台" +msgstr "Scr platform" + +#: backend/components/scr/client.py:27 +msgid "scr平台通用查询接口)" +msgstr "scr platform general query interface)" + +#: backend/components/sops/client.py:20 msgid "标准运维" msgstr "Standard operation and maintenance" -#: backend/components/sops/client.py:33 +#: backend/components/sops/client.py:28 msgid "通过业务流程模版创建任务" msgstr "Create tasks from business process templates" -#: backend/components/sops/client.py:40 +#: backend/components/sops/client.py:33 msgid "启动任务" msgstr "start task" -#: backend/components/sops/client.py:47 +#: backend/components/sops/client.py:38 msgid "查询任务状态" msgstr "Query task status" -#: backend/components/sops/client.py:54 -msgid "查询任务详情" -msgstr "Query task details" - -#: backend/components/sops/client.py:61 -msgid "查询任务Node详情" -msgstr "Querying Task Node Details" +#: backend/components/sops/client.py:43 +msgid "查询任务节点执行详情" +msgstr "Query task node execution details" -#: backend/components/sql_import/client.py:20 -msgid "SQL语句导入" -msgstr "SQL statement import" +#: backend/components/sql_import/client.py:19 +msgid "SQL模拟执行" +msgstr "SQL simulation execution" -#: backend/components/sql_import/client.py:28 -#: backend/db_services/mysql/sql_import/views.py:67 +#: backend/components/sql_import/client.py:26 +#: backend/db_services/mysql/sql_import/views.py:77 msgid "sql语法检查" msgstr "sql syntax check" -#: backend/components/sql_import/client.py:34 -msgid "SQL模拟执行" -msgstr "SQL simulation execution" - -#: backend/components/sql_import/client.py:42 -#: backend/components/sql_import/client.py:58 +#: backend/components/sql_import/client.py:31 +#: backend/components/sql_import/client.py:41 msgid "容器化SQL模拟执行" msgstr "Containerized SQL simulation execution" -#: backend/components/sql_import/client.py:50 +#: backend/components/sql_import/client.py:36 msgid "查询模拟执行任务状态也" msgstr "Querying the simulated execution task status is also" +#: backend/components/sql_import/client.py:46 +msgid "查询语义执行结果" +msgstr "Query semantic execution results" + #: backend/components/usermanage/client.py:19 msgid "用户管理模块" msgstr "User Management Module" -#: backend/components/usermanage/client.py:27 +#: backend/components/usermanage/client.py:26 msgid "获取所有用户" msgstr "get all users" -#: backend/components/usermanage/client.py:35 +#: backend/components/usermanage/client.py:32 msgid "获取单个用户" msgstr "get a single user" @@ -976,188 +1368,530 @@ msgstr "" "The data returned by the interface is empty, please check whether the " "interface data is normal" -#: backend/configuration/apps.py:30 +#: backend/configuration/apps.py:32 backend/dbm_init/apps.py:26 msgid "初始化配置异常,错误信息:{}" msgstr "Initial configuration exception, error message: {}" -#: backend/configuration/constants.py:21 -#: backend/db_services/mysql/permission/constants.py:47 -#: backend/flow/consts.py:246 +#: backend/configuration/constants.py:30 +msgid "默认密码策略" +msgstr "Default password policy" + +#: backend/configuration/constants.py:31 +msgid "redis密码策略" +msgstr "redis password policy" + +#: backend/configuration/constants.py:39 backend/flow/consts.py:1064 +msgid "tdbctl" +msgstr "tdbctl" + +#: backend/configuration/constants.py:40 +#: backend/db_meta/enums/machine_type.py:17 backend/flow/consts.py:354 +#: backend/flow/consts.py:1063 +msgid "spider" +msgstr "spider" + +#: backend/configuration/constants.py:41 +#: backend/db_meta/enums/access_layer.py:18 backend/ticket/constants.py:23 +msgid "storage" +msgstr "storage" + +#: backend/configuration/constants.py:50 +msgid "同城同subzone跨交换机跨机架" +msgstr "In the same city, in the same subzone, across switches and across racks" + +#: backend/configuration/constants.py:51 +msgid "同城同subzone" +msgstr "Same city, same subzone" + +#: backend/configuration/constants.py:52 +msgid "CROS_SUBZONE" +msgstr "CROS_SUBZONE" + +#: backend/configuration/constants.py:53 +msgid "跨机架" +msgstr "Across racks" + +#: backend/configuration/constants.py:54 +msgid "NONE" +msgstr "NONE" + +#: backend/configuration/constants.py:55 +msgid "每个subzone尽量均匀分布" +msgstr "Try to distribute each subzone evenly as much as possible" + +#: backend/configuration/constants.py:59 +#: backend/db_services/dbpermission/constants.py:97 +#: backend/db_services/mysql/permission/constants.py:20 +#: backend/flow/consts.py:333 backend/iam_app/dataclass/actions.py:267 +#: backend/iam_app/dataclass/actions.py:279 +#: backend/iam_app/dataclass/actions.py:319 +#: backend/iam_app/dataclass/actions.py:335 +#: backend/iam_app/dataclass/actions.py:346 +#: backend/iam_app/dataclass/actions.py:358 +#: backend/iam_app/dataclass/actions.py:370 +#: backend/iam_app/dataclass/actions.py:382 +#: backend/iam_app/dataclass/actions.py:394 +#: backend/iam_app/dataclass/actions.py:406 +#: backend/iam_app/dataclass/actions.py:418 +#: backend/iam_app/dataclass/actions.py:430 +#: backend/iam_app/dataclass/actions.py:450 +#: backend/iam_app/dataclass/actions.py:462 +#: backend/iam_app/dataclass/actions.py:474 +#: backend/iam_app/dataclass/actions.py:486 +#: backend/iam_app/dataclass/actions.py:498 +#: backend/iam_app/dataclass/actions.py:510 +#: backend/iam_app/dataclass/actions.py:522 +#: backend/iam_app/dataclass/actions.py:534 +#: backend/iam_app/dataclass/actions.py:546 +#: backend/iam_app/dataclass/actions.py:558 +#: backend/iam_app/dataclass/actions.py:570 +#: backend/iam_app/dataclass/actions.py:582 +#: backend/iam_app/dataclass/actions.py:594 +#: backend/iam_app/dataclass/actions.py:606 +#: backend/iam_app/dataclass/actions.py:618 msgid "MySQL" msgstr "MySQL" -#: backend/configuration/constants.py:22 -msgid "TendbCluster" -msgstr "Tendbcluster" - -#: backend/configuration/constants.py:23 +#: backend/configuration/constants.py:60 +#: backend/iam_app/dataclass/actions.py:630 +#: backend/iam_app/dataclass/actions.py:662 +#: backend/iam_app/dataclass/actions.py:678 +#: backend/iam_app/dataclass/actions.py:689 +#: backend/iam_app/dataclass/actions.py:701 +#: backend/iam_app/dataclass/actions.py:713 +#: backend/iam_app/dataclass/actions.py:725 +#: backend/iam_app/dataclass/actions.py:737 +#: backend/iam_app/dataclass/actions.py:747 +#: backend/iam_app/dataclass/actions.py:757 +#: backend/iam_app/dataclass/actions.py:769 +#: backend/iam_app/dataclass/actions.py:781 +#: backend/iam_app/dataclass/actions.py:793 +#: backend/iam_app/dataclass/actions.py:805 +#: backend/iam_app/dataclass/actions.py:817 +#: backend/iam_app/dataclass/actions.py:829 +#: backend/iam_app/dataclass/actions.py:841 +#: backend/iam_app/dataclass/actions.py:853 +#: backend/iam_app/dataclass/actions.py:865 +#: backend/iam_app/dataclass/actions.py:886 +#: backend/iam_app/dataclass/actions.py:899 +msgid "TenDBCluster" +msgstr "TenDB Cluster" + +#: backend/configuration/constants.py:61 +#: backend/db_meta/enums/cluster_type.py:26 +#: backend/iam_app/dataclass/actions.py:911 +#: backend/iam_app/dataclass/actions.py:927 +#: backend/iam_app/dataclass/actions.py:943 +#: backend/iam_app/dataclass/actions.py:964 msgid "Redis" msgstr "Redis" -#: backend/configuration/constants.py:24 backend/flow/consts.py:130 +#: backend/configuration/constants.py:62 +#: backend/db_services/dbpermission/constants.py:99 +#: backend/iam_app/dataclass/actions.py:1281 +#: backend/iam_app/dataclass/actions.py:1293 +#: backend/iam_app/dataclass/actions.py:1305 +#: backend/iam_app/dataclass/actions.py:1316 +#: backend/iam_app/dataclass/actions.py:1327 +#: backend/iam_app/dataclass/actions.py:1339 +#: backend/iam_app/dataclass/actions.py:1351 +#: backend/iam_app/dataclass/actions.py:1363 +#: backend/iam_app/dataclass/actions.py:1375 +msgid "MongoDB" +msgstr "MongoDB" + +#: backend/configuration/constants.py:63 backend/flow/consts.py:197 +#: backend/iam_app/dataclass/actions.py:1104 +#: backend/iam_app/dataclass/actions.py:1116 +#: backend/iam_app/dataclass/actions.py:1136 msgid "Kafka" msgstr "Kafka" -#: backend/configuration/constants.py:25 +#: backend/configuration/constants.py:64 +#: backend/iam_app/dataclass/actions.py:1156 +#: backend/iam_app/dataclass/actions.py:1168 +#: backend/iam_app/dataclass/actions.py:1180 msgid "HDFS" msgstr "HDFS" -#: backend/configuration/constants.py:26 +#: backend/configuration/constants.py:65 msgid "ElasticSearch" msgstr "ElasticSearch" -#: backend/configuration/constants.py:27 backend/flow/consts.py:132 +#: backend/configuration/constants.py:66 backend/flow/consts.py:199 +#: backend/iam_app/dataclass/actions.py:1200 +#: backend/iam_app/dataclass/actions.py:1212 +#: backend/iam_app/dataclass/actions.py:1224 msgid "Pulsar" msgstr "Pulsar" -#: backend/configuration/constants.py:28 +#: backend/configuration/constants.py:67 msgid "InfluxDB" msgstr "InfluxDB" -#: backend/configuration/constants.py:29 +#: backend/configuration/constants.py:68 +#: backend/db_meta/enums/instance_role.py:81 backend/flow/consts.py:202 +#: backend/iam_app/dataclass/actions.py:1245 +#: backend/iam_app/dataclass/actions.py:1257 +#: backend/iam_app/dataclass/actions.py:1269 msgid "Riak" msgstr "Ripple" -#: backend/configuration/constants.py:32 +#: backend/configuration/constants.py:69 +#: backend/db_services/dbpermission/constants.py:100 +#: backend/iam_app/dataclass/actions.py:1386 +#: backend/iam_app/dataclass/actions.py:1398 +#: backend/iam_app/dataclass/actions.py:1409 +#: backend/iam_app/dataclass/actions.py:1420 +#: backend/iam_app/dataclass/actions.py:1431 +#: backend/iam_app/dataclass/actions.py:1443 +#: backend/iam_app/dataclass/actions.py:1455 +#: backend/iam_app/dataclass/actions.py:1467 +#: backend/iam_app/dataclass/actions.py:1479 +#: backend/iam_app/dataclass/actions.py:1491 +msgid "SQLServer" +msgstr "SQLServer" + +#: backend/configuration/constants.py:70 backend/flow/consts.py:204 +#: backend/iam_app/dataclass/actions.py:1068 +#: backend/iam_app/dataclass/actions.py:1080 +#: backend/iam_app/dataclass/actions.py:1092 +msgid "Doris" +msgstr "Doris" + +#: backend/configuration/constants.py:71 backend/flow/consts.py:205 +msgid "Vm" +msgstr "Vm" + +#: backend/configuration/constants.py:74 msgid "Cloud" msgstr "Cloud" -#: backend/configuration/constants.py:81 -msgid "请补充:指定云区域的proxy信息" -msgstr "Please add: the proxy information of the specified cloud area" +#: backend/configuration/constants.py:77 +#: backend/db_meta/enums/cluster_type.py:24 +#: backend/db_meta/enums/machine_type.py:65 +msgid "TBinlogDumper" +msgstr "TBinlogDumper" #: backend/configuration/constants.py:83 -msgid "请补充:自定义指标-数据ID" -msgstr "Please add: custom indicator - data ID" +msgid "DBM系统的管理集群拓扑" +msgstr "Management cluster topology of DBM system" #: backend/configuration/constants.py:84 -msgid "请补充:自定义指标-Token" -msgstr "Please add: custom indicator-Token" +msgid "DBM_SSL" +msgstr "DBM_SSL" -#: backend/configuration/constants.py:87 -msgid "请补充:自定义事件-数据ID" -msgstr "Please add: Custom Event - Data ID" +#: backend/configuration/constants.py:85 backend/configuration/constants.py:187 +msgid "监控数据源token" +msgstr "Monitoring data source token" -#: backend/configuration/constants.py:88 -msgid "请补充:自定义事件-Token" -msgstr "Please add: Custom Event-Token" +#: backend/configuration/constants.py:86 +msgid "mysql/redis-监控自定义上报: dataid/token" +msgstr "mysql/redis-monitoring custom reporting: dataid/token" + +#: backend/configuration/constants.py:87 backend/configuration/constants.py:189 +msgid "业务空闲模块ID" +msgstr "Business idle module ID" + +#: backend/configuration/constants.py:89 backend/configuration/constants.py:190 +msgid "独立托管机器的业务列表" +msgstr "Business List of Independently Hosted Machines" + +#: backend/configuration/constants.py:90 backend/configuration/constants.py:191 +msgid "默认的规格参数偏移量" +msgstr "Default specification parameter offset" + +#: backend/configuration/constants.py:91 +msgid "机型列表" +msgstr "Model list" + +#: backend/configuration/constants.py:92 +#: backend/iam_app/dataclass/actions.py:1891 +msgid "轮值通知设置" +msgstr "Rotation notification settings" + +#: backend/configuration/constants.py:93 backend/configuration/constants.py:193 +msgid "具备迁移权限的人员名单" +msgstr "List of people with migration permissions" #: backend/configuration/constants.py:94 -msgid "主从高可用-主域名配置" -msgstr "Master-slave high availability - master domain name configuration" +msgid "全业务通用配置信息" +msgstr "Common configuration information for all services" #: backend/configuration/constants.py:95 -msgid "主从高可用-从域名配置" -msgstr "Master-slave high availability-slave domain name configuration" +msgid "容灾要求(各个环境可能不同,比如SG为空)" +msgstr "Disaster recovery requirements (each environment may be different, for example, SG is empty)" -#: backend/configuration/constants.py:96 -msgid "单节点-域名配置" -msgstr "standalone-domain name configuration" +#: backend/configuration/constants.py:96 backend/configuration/constants.py:196 +msgid "系统消息通知方式" +msgstr "System message notification method" -#: backend/configuration/constants.py:97 -msgid "端口默认值-Proxy起始端口" -msgstr "Port default value - Proxy start port" - -#: backend/configuration/constants.py:98 -msgid "端口默认值-MySQL起始端口" -msgstr "Port default value - MySQL start port" +#: backend/configuration/constants.py:97 backend/configuration/constants.py:197 +msgid "补全proxy的集群域名列表" +msgstr "Complete the proxy’s cluster domain name list" #: backend/configuration/constants.py:99 -msgid "监控数据源token" -msgstr "Monitoring data source token" +msgid "DBM的流程服务ID" +msgstr "DBM process service ID" #: backend/configuration/constants.py:100 -msgid "监控数据源上报配置" -msgstr "Monitoring data source reporting configuration" +msgid "ITSM审批意见key" +msgstr "ITSM approval opinion key" #: backend/configuration/constants.py:101 -msgid "业务空闲模块ID" -msgstr "Business idle module ID" +msgid "ITSM备注key" +msgstr "ITSM note key" + +#: backend/configuration/constants.py:107 +msgid "开区模板的渲染变量" +msgstr "Rendering variables for open area templates" + +#: backend/configuration/constants.py:108 +msgid "独立托管机器的数据库类型" +msgstr "Database type for independent hosting machine" + +#: backend/configuration/constants.py:110 +msgid "是否跳过语义检查" +msgstr "Whether to skip semantic checking" + +#: backend/configuration/constants.py:141 +msgid "请补充:自定义指标-数据ID" +msgstr "Please add: custom indicator - data ID" + +#: backend/configuration/constants.py:142 +msgid "请补充:自定义指标-Token" +msgstr "Please add: custom indicator-Token" + +#: backend/configuration/constants.py:145 +msgid "请补充:自定义事件-数据ID" +msgstr "Please add: Custom Event - Data ID" + +#: backend/configuration/constants.py:146 +msgid "请补充:自定义事件-Token" +msgstr "Please add: Custom Event-Token" + +#: backend/configuration/constants.py:188 +msgid "监控数据源上报配置" +msgstr "Monitoring data source reporting configuration" + +#: backend/configuration/constants.py:192 +msgid "默认通知配置" +msgstr "Default notification configuration" + +#: backend/configuration/constants.py:194 +msgid "默认的全业务配置信息" +msgstr "Default full-service configuration information" + +#: backend/configuration/constants.py:195 +msgid "环境的容灾要求" +msgstr "Environmental disaster recovery requirements" + +#: backend/configuration/exceptions.py:23 +#: backend/configuration/exceptions.py:24 +msgid "密码策略相关异常" +msgstr "Password policy related exceptions" + +#: backend/configuration/handlers/password.py:98 +msgid "目前暂未支持{}类型的查询" +msgstr "{} type queries are currently not supported." + +#: backend/configuration/handlers/password.py:113 +msgid "请保证查询的实例输入格式合法,格式为[CLOUD_ID:]IP:PORT" +msgstr "Please ensure that the query instance input format is legal, the format is [CLOUD_ID:]IP:PORT" + +#: backend/configuration/handlers/password.py:171 +msgid "请保证修改密码的实例属于同一DB组件" +msgstr "Please ensure that the instance where the password is changed belongs to the same DB component" + +#: backend/configuration/handlers/password.py:218 +msgid "{}-{}不存在相应的password角色" +msgstr "{}-{} does not have a corresponding password role" #: backend/configuration/models/dba.py:21 #: backend/configuration/models/ip_whitelist.py:25 -#: backend/configuration/serializers.py:41 -#: backend/configuration/serializers.py:50 -#: backend/configuration/serializers.py:76 -#: backend/configuration/serializers.py:92 backend/core/storages/models.py:19 -#: backend/db_event/serializers.py:47 backend/db_event/serializers.py:61 -#: backend/db_meta/models/app.py:36 backend/db_meta/models/group.py:22 -#: backend/db_monitor/serializers.py:21 backend/db_proxy/models.py:127 -#: backend/db_proxy/views/db_meta/serializers.py:95 -#: backend/db_proxy/views/db_meta/serializers.py:105 +#: backend/configuration/models/system.py:123 +#: backend/configuration/serializers.py:47 +#: backend/configuration/serializers.py:57 +#: backend/configuration/serializers.py:69 +#: backend/configuration/serializers.py:78 +#: backend/configuration/serializers.py:96 +#: backend/configuration/serializers.py:197 +#: backend/configuration/serializers.py:213 backend/core/storages/models.py:19 +#: backend/db_dirty/models.py:25 backend/db_event/serializers.py:47 +#: backend/db_event/serializers.py:61 backend/db_meta/models/app.py:26 +#: backend/db_meta/models/group.py:22 backend/db_monitor/serializers.py:31 +#: backend/db_monitor/serializers.py:181 backend/db_monitor/serializers.py:218 +#: backend/db_monitor/views/policy.py:54 backend/db_proxy/models.py:150 +#: backend/db_proxy/views/db_meta/serializers.py:108 +#: backend/db_proxy/views/db_meta/serializers.py:118 +#: backend/db_proxy/views/db_meta/serializers.py:132 #: backend/db_proxy/views/dbconfig/serializers.py:21 -#: backend/db_services/cmdb/serializers.py:18 -#: backend/db_services/cmdb/serializers.py:25 -#: backend/db_services/cmdb/serializers.py:44 +#: backend/db_proxy/views/dumper/serializers.py:30 +#: backend/db_services/bigdata/resources/serializers.py:18 +#: backend/db_services/cmdb/serializers.py:36 +#: backend/db_services/cmdb/serializers.py:43 +#: backend/db_services/cmdb/serializers.py:74 +#: backend/db_services/dbbase/cluster/serializers.py:54 +#: backend/db_services/dbbase/instances/yasg_slz.py:18 +#: backend/db_services/dbbase/serializers.py:29 +#: backend/db_services/dbbase/serializers.py:38 +#: backend/db_services/dbbase/serializers.py:62 +#: backend/db_services/dbbase/serializers.py:78 +#: backend/db_services/dbbase/serializers.py:94 #: backend/db_services/dbconfig/serializers.py:74 #: backend/db_services/dbconfig/serializers.py:86 +#: backend/db_services/dbpermission/db_account/serializers.py:85 +#: backend/db_services/dbpermission/db_account/serializers.py:94 +#: backend/db_services/dbresource/serializers.py:375 #: backend/db_services/ipchooser/serializers/topo_sers.py:70 -#: backend/db_services/mysql/cluster/serializers.py:60 -#: backend/db_services/mysql/permission/db_account/serializers.py:84 -#: backend/db_services/mysql/permission/db_account/serializers.py:94 -#: backend/db_services/partition/serializers.py:20 -#: backend/db_services/partition/serializers.py:31 -#: backend/db_services/partition/serializers.py:37 -#: backend/db_services/partition/serializers.py:96 backend/flow/models.py:19 -#: backend/ticket/builders/common/base.py:32 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:65 -#: backend/ticket/models/ticket.py:86 backend/ticket/serializers.py:197 +#: backend/db_services/meta_import/serializers.py:71 +#: backend/db_services/meta_import/serializers.py:79 +#: backend/db_services/meta_import/serializers.py:127 +#: backend/db_services/mysql/cluster/serializers.py:31 +#: backend/db_services/mysql/open_area/filters.py:20 +#: backend/db_services/mysql/open_area/models.py:21 +#: backend/db_services/partition/serializers.py:25 +#: backend/db_services/partition/serializers.py:98 +#: backend/db_services/plugin/bf/serializers.py:18 +#: backend/db_services/plugin/mysql/authorize/serializers.py:17 +#: backend/db_services/redis/autofix/models.py:35 +#: backend/db_services/redis/autofix/models.py:51 +#: backend/db_services/redis/autofix/models.py:80 backend/flow/models.py:20 +#: backend/iam_app/serializers.py:31 backend/ticket/builders/common/base.py:103 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:27 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:32 +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:28 +#: backend/ticket/builders/mysql/mysql_openarea.py:37 +#: backend/ticket/builders/mysql/mysql_openarea.py:39 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:24 +#: backend/ticket/builders/spider/metadata_import.py:32 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:28 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:24 +#: backend/ticket/builders/tendbsingle/metadata_import.py:31 +#: backend/ticket/builders/tendbsingle/standardize.py:26 +#: backend/ticket/models/ticket.py:86 backend/ticket/models/ticket.py:235 +#: backend/ticket/serializers.py:250 backend/ticket/serializers.py:290 +#: backend/ticket/serializers.py:301 msgid "业务ID" msgstr "Business ID" #: backend/configuration/models/dba.py:22 -#: backend/configuration/serializers.py:45 backend/db_monitor/models.py:31 +#: backend/configuration/serializers.py:73 +#: backend/db_monitor/models/alarm.py:60 backend/db_monitor/models/alarm.py:245 +#: backend/db_monitor/serializers.py:217 backend/db_package/serializers.py:51 +#: backend/db_services/quick_search/serializers.py:23 msgid "数据库类型" msgstr "database type" #: backend/configuration/models/dba.py:23 -#: backend/configuration/serializers.py:46 backend/db_monitor/models.py:32 -#: backend/db_services/user/views.py:26 +#: backend/configuration/serializers.py:74 backend/db_services/user/views.py:28 msgid "人员列表" msgstr "personnel list" #: backend/configuration/models/dba.py:26 -#: backend/configuration/models/dba.py:27 -msgid "DBA人员设置" -msgstr "DBA personnel settings" +msgid "DBA人员设置(DBAdministrator)" +msgstr "DBA personnel settings (DBAdministrator)" + +#: backend/configuration/models/function_controller.py:20 +msgid "大数据" +msgstr "big data" + +#: backend/configuration/models/function_controller.py:21 +#: backend/iam_app/dataclass/actions.py:69 backend/ticket/constants.py:119 +msgid "工具箱" +msgstr "toolbox" + +#: backend/configuration/models/function_controller.py:22 +msgid "TenDBCluster 工具箱" +msgstr "TenDBCluster Toolbox" + +#: backend/configuration/models/function_controller.py:23 +msgid "Sqlserver 工具箱" +msgstr "Sqlserver toolbox" + +#: backend/configuration/models/function_controller.py:24 +msgid "插件服务" +msgstr "Plug-in service" + +#: backend/configuration/models/function_controller.py:25 +msgid "监控告警" +msgstr "Monitor alarms" + +#: backend/configuration/models/function_controller.py:101 +msgid "功能名称" +msgstr "Function name" + +#: backend/configuration/models/function_controller.py:102 +msgid "是否开启" +msgstr "Whether to turn on" + +#: backend/configuration/models/function_controller.py:103 +#: backend/db_periodic_task/models.py:35 +msgid "是否冻结" +msgstr "Whether to freeze" + +#: backend/configuration/models/function_controller.py:103 +msgid "人工冻结此开关,将不受更新影响" +msgstr "Manually freezing this switch will not be affected by updates" + +#: backend/configuration/models/function_controller.py:104 +msgid "父功能名称" +msgstr "Parent function name" + +#: backend/configuration/models/function_controller.py:107 +msgid "功能控制器(FunctionController)" +msgstr "FunctionController" #: backend/configuration/models/ip_whitelist.py:26 -#: backend/configuration/serializers.py:77 backend/ticket/models/ticket.py:100 -#: backend/ticket/serializers.py:68 +#: backend/configuration/serializers.py:198 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:90 +#: backend/ticket/filters.py:20 backend/ticket/models/ticket.py:100 +#: backend/ticket/serializers.py:86 msgid "备注" msgstr "Remark" #: backend/configuration/models/ip_whitelist.py:27 -#: backend/configuration/serializers.py:78 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:36 +#: backend/configuration/serializers.py:199 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:61 msgid "ip列表" msgstr "ip list" #: backend/configuration/models/ip_whitelist.py:30 -#: backend/configuration/models/ip_whitelist.py:31 -#: backend/configuration/views/ip_whitelist.py:31 -msgid "IP白名单" -msgstr "IP whitelist" - -#: backend/configuration/models/password_policy.py:22 -#: backend/configuration/serializers.py:55 -#: backend/configuration/serializers.py:72 +msgid "IP白名单(IPWhitelist)" +msgstr "IP Whitelist (IPWhitelist)" + +#: backend/configuration/models/password_policy.py:24 +#: backend/configuration/serializers.py:193 +#: backend/db_services/dbpermission/db_account/serializers.py:26 +#: backend/db_services/dbpermission/db_account/serializers.py:69 +#: backend/db_services/dbpermission/db_account/serializers.py:105 +#: backend/db_services/dbpermission/db_account/serializers.py:120 +#: backend/db_services/dbpermission/db_account/serializers.py:172 +#: backend/db_services/dbpermission/db_account/serializers.py:187 msgid "账号类型" msgstr "account type" -#: backend/configuration/models/password_policy.py:23 #: backend/configuration/models/password_policy.py:26 -#: backend/configuration/serializers.py:56 -#: backend/configuration/views/password_policy.py:22 +#: backend/configuration/serializers.py:157 +#: backend/configuration/views/password_policy.py:39 msgid "密码安全策略" msgstr "Password Security Policy" -#: backend/configuration/models/profile.py:19 backend/version_log/models.py:42 +#: backend/configuration/models/password_policy.py:29 +msgid "密码安全策略(PasswordPolicy)" +msgstr "Password security policy (PasswordPolicy)" + +#: backend/configuration/models/profile.py:19 +#: backend/db_services/mysql/permission/authorize/serializers.py:29 +#: backend/db_services/plugin/bf/serializers.py:22 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:33 +#: backend/version_log/models.py:42 msgid "用户名" msgstr "username" #: backend/configuration/models/profile.py:20 -#: backend/db_services/dbresource/serializers.py:47 +#: backend/db_monitor/serializers.py:234 +#: backend/db_services/dbresource/serializers.py:55 msgid "标签" msgstr "Label" @@ -1165,59 +1899,398 @@ msgstr "Label" msgid "配置值" msgstr "configuration value" -#: backend/configuration/models/system.py:29 -msgid "DBM的流程服务ID" -msgstr "DBM process service ID" +#: backend/configuration/models/profile.py:24 +msgid "个人偏好(Profile)" +msgstr "Personal preferences (Profile)" -#: backend/configuration/models/system.py:33 backend/ticket/serializers.py:213 +#: backend/configuration/models/system.py:30 +#: backend/db_report/views/dbmon_heartbeat_view.py:58 +#: backend/db_services/plugin/mysql/authorize/serializers.py:28 +#: backend/ticket/serializers.py:270 msgid "类型" msgstr "type" -#: backend/configuration/models/system.py:34 +#: backend/configuration/models/system.py:31 msgid "关键字唯一标识" msgstr "Keyword Unique Identifier" -#: backend/configuration/models/system.py:35 +#: backend/configuration/models/system.py:32 msgid "系统设置值" msgstr "system settings" -#: backend/configuration/models/system.py:36 +#: backend/configuration/models/system.py:33 #: backend/db_services/dbconfig/serializers.py:31 #: backend/db_services/dbconfig/serializers.py:82 -#: backend/db_services/dbresource/filters.py:20 +#: backend/db_services/dbresource/filters.py:21 #: backend/flow/plugins/components/collections/common/pause.py:71 msgid "描述" msgstr "describe" -#: backend/configuration/models/system.py:39 -#: backend/configuration/models/system.py:40 -#: backend/configuration/views/system.py:24 -#: backend/configuration/views/system.py:44 -#: backend/configuration/views/system.py:54 -msgid "系统设置" -msgstr "system settings" +#: backend/configuration/models/system.py:70 +msgid "系统配置(SystemSettings)" +msgstr "System Settings" + +#: backend/configuration/models/system.py:133 +msgid "业务配置(BizSettings)" +msgstr "Business configuration (BizSettings)" + +#: backend/configuration/serializers.py:48 +#: backend/db_services/taskflow/serializers.py:61 +msgid "查询key" +msgstr "Query key" + +#: backend/configuration/serializers.py:58 +msgid "更新key" +msgstr "Update key" + +#: backend/configuration/serializers.py:59 +msgid "更新value" +msgstr "update value" + +#: backend/configuration/serializers.py:60 +msgid "value类型" +msgstr "value type" + +#: backend/configuration/serializers.py:84 +msgid "分钟" +msgstr "minute" + +#: backend/configuration/serializers.py:85 +msgid "小时" +msgstr "Hour" + +#: backend/configuration/serializers.py:86 +msgid "每周几天(eg: 1,4,5 表示一周的周一,周四,周五)" +msgstr "Days of the week (eg: 1,4,5 means Monday, Thursday, Friday)" + +#: backend/configuration/serializers.py:87 +msgid "每月几天(eg: 1, 11, 13 表示每月的1号,11号,13号)" +msgstr "Days of the month (eg: 1, 11, 13 means the 1st, 11th, and 13th of each month)" + +#: backend/configuration/serializers.py:89 +msgid "crontab表达式" +msgstr "crontab expression" + +#: backend/configuration/serializers.py:93 +#: backend/configuration/serializers.py:217 backend/db_dirty/serializers.py:26 +#: backend/db_proxy/views/dbpriv/serializers.py:31 +#: backend/db_services/mongodb/restore/serializers.py:36 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:66 +msgid "分页限制" +msgstr "paging limit" + +#: backend/configuration/serializers.py:94 +#: backend/configuration/serializers.py:218 backend/db_dirty/serializers.py:27 +#: backend/db_proxy/views/dbpriv/serializers.py:32 +#: backend/db_services/mongodb/restore/serializers.py:37 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:67 +msgid "分页起始" +msgstr "Page break start" + +#: backend/configuration/serializers.py:97 backend/db_event/serializers.py:51 +#: backend/db_event/serializers.py:66 +#: backend/db_proxy/views/dbpriv/serializers.py:33 +#: backend/db_services/partition/serializers.py:117 +#: backend/db_services/redis/redis_dts/serializers.py:27 +#: backend/ticket/builders/mysql/mysql_data_repair.py:34 +#: backend/ticket/builders/mysql/mysql_flashback.py:34 +#: backend/ticket/serializers.py:136 +msgid "开始时间" +msgstr "Starting time" + +#: backend/configuration/serializers.py:98 backend/db_event/serializers.py:52 +#: backend/db_event/serializers.py:53 backend/db_event/serializers.py:67 +#: backend/db_proxy/views/dbpriv/serializers.py:34 +#: backend/db_services/partition/serializers.py:118 +#: backend/db_services/redis/redis_dts/serializers.py:28 +#: backend/db_services/sqlserver/rollback/serializers.py:37 +#: backend/ticket/builders/mysql/mysql_data_repair.py:35 +#: backend/ticket/builders/mysql/mysql_flashback.py:35 +#: backend/ticket/serializers.py:137 +msgid "结束时间" +msgstr "End Time" + +#: backend/configuration/serializers.py:99 +msgid "过滤的实例列表(通过,分割,实例格式为--cloud:ip:port)" +msgstr "Filtered instance list (split by, instance format is --cloud:ip:port)" + +#: backend/configuration/serializers.py:101 +#: backend/db_monitor/views/policy.py:50 +#: backend/db_proxy/views/redis_dts/serializers.py:42 +#: backend/db_proxy/views/redis_dts/serializers.py:51 +#: backend/db_proxy/views/redis_dts/serializers.py:60 +#: backend/db_proxy/views/redis_dts/serializers.py:70 +msgid "db类型" +msgstr "db type" + +#: backend/configuration/serializers.py:112 +#: backend/db_proxy/views/dbpriv/serializers.py:21 +msgid "实例ip" +msgstr "instance ip" + +#: backend/configuration/serializers.py:113 +#: backend/db_proxy/views/dbpriv/serializers.py:22 +msgid "实例port" +msgstr "Instance port" + +#: backend/configuration/serializers.py:114 backend/db_proxy/models.py:151 +#: backend/db_proxy/views/cloud/serializers.py:19 +#: backend/db_proxy/views/jobapi/serializers.py:19 +#: backend/db_proxy/views/jobapi/serializers.py:58 +#: backend/db_proxy/views/jobapi/serializers.py:68 +#: backend/db_proxy/views/redis_dts/serializers.py:40 +#: backend/db_proxy/views/redis_dts/serializers.py:49 +#: backend/db_proxy/views/redis_dts/serializers.py:58 +#: backend/db_proxy/views/redis_dts/serializers.py:67 +#: backend/db_services/dbbase/cluster/serializers.py:37 +#: backend/db_services/dbbase/resources/serializers.py:138 +#: backend/db_services/dbresource/serializers.py:59 +#: backend/db_services/dbresource/serializers.py:376 +#: backend/db_services/ipchooser/serializers/base.py:33 +#: backend/db_services/mysql/permission/clone/models.py:28 +#: backend/db_services/mysql/permission/clone/serializers.py:25 +#: backend/db_services/partition/serializers.py:151 +#: backend/db_services/redis/autofix/models.py:34 +#: backend/db_services/redis/autofix/models.py:50 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:17 +#: backend/ticket/builders/cloud/dbha_add.py:27 +#: backend/ticket/builders/cloud/dbha_reduce.py:29 +#: backend/ticket/builders/cloud/dbha_reload.py:27 +#: backend/ticket/builders/cloud/dbha_replace.py:27 +#: backend/ticket/builders/cloud/dns_add.py:27 +#: backend/ticket/builders/cloud/dns_reduce.py:28 +#: backend/ticket/builders/cloud/dns_reload.py:27 +#: backend/ticket/builders/cloud/dns_replace.py:27 +#: backend/ticket/builders/cloud/drs_add.py:27 +#: backend/ticket/builders/cloud/drs_reduce.py:28 +#: backend/ticket/builders/cloud/drs_reload.py:27 +#: backend/ticket/builders/cloud/drs_replace.py:27 +#: backend/ticket/builders/cloud/nginx_reload.py:26 +#: backend/ticket/builders/cloud/nginx_replace.py:31 +#: backend/ticket/builders/cloud/redis_dts_add.py:27 +#: backend/ticket/builders/cloud/redis_dts_reduce.py:27 +#: backend/ticket/builders/cloud/service_apply.py:43 +#: backend/ticket/builders/common/base.py:100 +#: backend/ticket/builders/common/bigdata.py:124 +#: backend/ticket/builders/common/bigdata.py:227 +#: backend/ticket/builders/common/bigdata.py:305 +#: backend/ticket/builders/influxdb/influxdb_apply.py:43 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:31 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:26 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:32 +#: backend/ticket/builders/mysql/mysql_partition.py:48 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:25 +#: backend/ticket/builders/mysql/mysql_single_apply.py:46 +#: backend/ticket/builders/redis/redis_cluster_apply.py:27 +#: backend/ticket/builders/redis/redis_instance_apply.py:34 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:30 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:38 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:35 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:31 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:35 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:32 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:43 +#: backend/ticket/builders/riak/riak_apply.py:27 +#: backend/ticket/builders/riak/riak_migrate.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:45 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:23 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:30 +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:25 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:32 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:26 +#: backend/ticket/serializers.py:336 +msgid "云区域ID" +msgstr "Cloud Region ID" + +#: backend/configuration/serializers.py:115 +#: backend/db_package/serializers.py:47 backend/db_proxy/models.py:149 +#: backend/db_proxy/views/db_meta/serializers.py:34 +#: backend/db_report/models/checksum_check_report.py:23 +#: backend/db_report/views/mysqlbackup_check_view.py:58 +#: backend/db_report/views/redis_dbmeta_check_view.py:57 +#: backend/db_report/views/redisbackup_check_view.py:62 +#: backend/db_services/bigdata/resources/query.py:40 +#: backend/db_services/cmdb/serializers.py:49 +#: backend/db_services/cmdb/serializers.py:54 +#: backend/db_services/dbbase/resources/query.py:86 +#: backend/db_services/dbbase/resources/query.py:162 +#: backend/db_services/dbbase/resources/serializers.py:35 +#: backend/db_services/dbbase/resources/serializers.py:105 +#: backend/db_services/dbbase/resources/serializers.py:134 +#: backend/db_services/dbbase/serializers.py:27 +#: backend/db_services/dbbase/serializers.py:95 +#: backend/db_services/dbconfig/serializers.py:20 +#: backend/db_services/dbpermission/db_authorize/serializers.py:29 +#: backend/db_services/dbpermission/db_authorize/serializers.py:50 +#: backend/db_services/dbresource/serializers.py:321 +#: backend/db_services/dbresource/serializers.py:343 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:26 +#: backend/db_services/mongodb/restore/serializers.py:22 +#: backend/db_services/mongodb/restore/serializers.py:39 +#: backend/db_services/mysql/cluster/serializers.py:34 +#: backend/db_services/mysql/open_area/filters.py:21 +#: backend/db_services/mysql/permission/clone/serializers.py:33 +#: backend/db_services/mysql/permission/clone/serializers.py:88 +#: backend/db_services/mysql/sql_import/serializers.py:35 +#: backend/db_services/mysql/sql_import/serializers.py:177 +#: backend/db_services/mysql/sql_import/serializers.py:213 +#: backend/db_services/partition/serializers.py:26 +#: backend/db_services/partition/serializers.py:97 +#: backend/db_services/partition/serializers.py:115 +#: backend/db_services/redis/autofix/models.py:37 +#: backend/db_services/redis/autofix/models.py:53 +#: backend/db_services/redis/autofix/models.py:82 +#: backend/db_services/redis/resources/redis_cluster/query.py:60 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:16 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:26 +#: backend/ticket/builders/mongodb/mongo_backup.py:34 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:40 +#: backend/ticket/builders/mongodb/mongo_restore.py:44 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:35 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:32 +#: backend/ticket/builders/mysql/mysql_openarea.py:45 +#: backend/ticket/builders/redis/redis_cluster_apply.py:37 +#: backend/ticket/builders/redis/redis_instance_apply.py:44 +msgid "集群类型" +msgstr "cluster type" + +#: backend/configuration/serializers.py:116 backend/db_event/serializers.py:50 +#: backend/db_services/bigdata/resources/serializers.py:20 +#: backend/db_services/dbbase/resources/query.py:156 +msgid "实例角色" +msgstr "instance role" + +#: backend/configuration/serializers.py:118 +msgid "密码到期小时" +msgstr "Password expiry hour" + +#: backend/configuration/serializers.py:119 +#: backend/db_services/mysql/permission/authorize/serializers.py:30 +msgid "密码" +msgstr "password" + +#: backend/configuration/serializers.py:120 +msgid "实例信息" +msgstr "Instance information" + +#: backend/configuration/serializers.py:126 +msgid "修改密码中不允许包含单引号,双引号和反引号" +msgstr "Single quotes, double quotes and backticks are not allowed in the modified password." + +#: backend/configuration/serializers.py:131 +msgid "一次只允许修改同种集群类型的密码" +msgstr "Only passwords of the same cluster type are allowed to be modified at one time" + +#: backend/configuration/serializers.py:139 +msgid "是否包含数字" +msgstr "Does it contain numbers?" + +#: backend/configuration/serializers.py:140 +msgid "是否包含特殊符号" +msgstr "Does it contain special symbols?" + +#: backend/configuration/serializers.py:141 +msgid "是否包含小写字符" +msgstr "Whether it contains lowercase characters" + +#: backend/configuration/serializers.py:142 +msgid "是否包含大写字符" +msgstr "Contains uppercase characters" + +#: backend/configuration/serializers.py:145 +msgid "最大连续长度" +msgstr "Maximum continuous length" + +#: backend/configuration/serializers.py:146 +msgid "是否限制连续字母" +msgstr "Whether to limit consecutive letters" + +#: backend/configuration/serializers.py:147 +msgid "是否限制连续数字" +msgstr "Whether to limit consecutive numbers" + +#: backend/configuration/serializers.py:148 +msgid "是否限制连续重复字符" +msgstr "Whether to limit consecutive repeated characters" + +#: backend/configuration/serializers.py:149 +msgid "是否限制连续特殊字符" +msgstr "Whether to limit consecutive special characters" + +#: backend/configuration/serializers.py:150 +msgid "是否限制连续键盘序" +msgstr "Whether to limit consecutive keyboard sequences" -#: backend/configuration/serializers.py:64 +#: backend/configuration/serializers.py:152 +msgid "最大长度" +msgstr "maximum length" + +#: backend/configuration/serializers.py:153 +msgid "最小长度" +msgstr "minimum length" + +#: backend/configuration/serializers.py:154 +msgid "包含规则" +msgstr "include rules" + +#: backend/configuration/serializers.py:155 +msgid "排除连续性规则" +msgstr "exclude continuity rules" + +#: backend/configuration/serializers.py:158 +msgid "密码安全规则策略名称" +msgstr "Password security rule policy name" + +#: backend/configuration/serializers.py:159 +msgid "密码安全规则策略id" +msgstr "Password security rule policy id" + +#: backend/configuration/serializers.py:167 msgid "密码最小长度不能大于最大长度" msgstr "The minimum password length cannot be greater than the maximum length" -#: backend/configuration/serializers.py:66 +#: backend/configuration/serializers.py:169 msgid "请确保密码长度范围为整型" msgstr "Please ensure that the password length range is an integer" -#: backend/configuration/serializers.py:88 +#: backend/configuration/serializers.py:176 +msgid "密码类型" +msgstr "Password type" + +#: backend/configuration/serializers.py:184 +msgid "待校验密码" +msgstr "password to be verified" + +#: backend/configuration/serializers.py:209 msgid "id列表" msgstr "list of ids" -#: backend/configuration/serializers.py:93 +#: backend/configuration/serializers.py:214 msgid "代过滤IP" msgstr "Generation filter IP" -#: backend/configuration/serializers.py:94 +#: backend/configuration/serializers.py:215 msgid "待过滤白名单ID" msgstr "Whitelist ID to be filtered" -#: backend/configuration/views/dba.py:21 +#: backend/configuration/serializers.py:222 +msgid "排期表通知" +msgstr "Schedule notification" + +#: backend/configuration/serializers.py:223 +msgid "个人轮值通知" +msgstr "Personal duty notification" + +#: backend/configuration/tasks/password.py:45 +#: backend/flow/plugins/components/collections/mysql/randomize_admin_password.py:51 +msgid "「接口modify_mysql_admin_password返回结果异常」{}" +msgstr "Interface modify_mysql_admin_password returns abnormal result{}" + +#: backend/configuration/tasks/password.py:48 +msgid "「接口modify_mysql_admin_password调用异常」{}" +msgstr "Interface modify_mysql_admin_password call exception{}" + +#: backend/configuration/views/dba.py:23 msgid "DBA人员" msgstr "DBA personnel" @@ -1229,43 +2302,84 @@ msgstr "Query the list of DBA personnel" msgid "更新DBA人员" msgstr "Update DBA staff" -#: backend/configuration/views/ip_whitelist.py:57 -#: backend/configuration/views/ip_whitelist.py:58 +#: backend/configuration/views/function_controller.py:20 +#: backend/configuration/views/function_controller.py:33 +msgid "功能开关" +msgstr "Function switch" + +#: backend/configuration/views/function_controller.py:32 +msgid "功能开关列表" +msgstr "Function switch list" + +#: backend/configuration/views/ip_whitelist.py:37 +msgid "IP白名单" +msgstr "IP whitelist" + +#: backend/configuration/views/ip_whitelist.py:83 +msgid "无法同时删除不同业务下的IP白名单" +msgstr "IP whitelists under different services cannot be deleted at the same time" + +#: backend/configuration/views/ip_whitelist.py:108 +#: backend/configuration/views/ip_whitelist.py:109 msgid "IP白名单详情" msgstr "IP whitelist details" -#: backend/configuration/views/ip_whitelist.py:66 +#: backend/configuration/views/ip_whitelist.py:117 msgid "IP白名单列表" msgstr "IP Whitelist" -#: backend/configuration/views/ip_whitelist.py:78 -#: backend/configuration/views/ip_whitelist.py:80 +#: backend/configuration/views/ip_whitelist.py:135 +#: backend/configuration/views/ip_whitelist.py:137 msgid "创建IP白名单" msgstr "Create an IP whitelist" -#: backend/configuration/views/ip_whitelist.py:87 -#: backend/configuration/views/ip_whitelist.py:89 -#: backend/configuration/views/ip_whitelist.py:98 +#: backend/configuration/views/ip_whitelist.py:144 +#: backend/configuration/views/ip_whitelist.py:146 +#: backend/configuration/views/ip_whitelist.py:155 msgid "更新IP白名单" msgstr "Update IP whitelist" -#: backend/configuration/views/ip_whitelist.py:96 +#: backend/configuration/views/ip_whitelist.py:153 msgid "删除IP白名单" msgstr "delete IP whitelist" -#: backend/configuration/views/ip_whitelist.py:105 +#: backend/configuration/views/ip_whitelist.py:162 msgid "批量删除IP白名单" msgstr "batch delete IP whitelist" -#: backend/configuration/views/password_policy.py:33 +#: backend/configuration/views/password_policy.py:55 msgid "查询密码安全策略" msgstr "Query Password Security Policy" -#: backend/configuration/views/password_policy.py:46 +#: backend/configuration/views/password_policy.py:66 msgid "更新密码安全策略" msgstr "Update Password Security Policy" -#: backend/configuration/views/profile.py:20 +#: backend/configuration/views/password_policy.py:77 +msgid "校验密码强度规则" +msgstr "Check password strength rules" + +#: backend/configuration/views/password_policy.py:88 +msgid "获取符合密码强度的字符串" +msgstr "Get a string that matches the password strength" + +#: backend/configuration/views/password_policy.py:100 +msgid "更新密码随机化周期" +msgstr "Update password randomization period" + +#: backend/configuration/views/password_policy.py:113 +msgid "查询密码随机化周期" +msgstr "Query the password randomization period" + +#: backend/configuration/views/password_policy.py:131 +msgid "查询生效实例密码(admin)" +msgstr "Query the effective instance password (admin)" + +#: backend/configuration/views/password_policy.py:144 +msgid "修改db实例密码(admin)" +msgstr "Modify db instance password (admin)" + +#: backend/configuration/views/profile.py:22 msgid "个人配置" msgstr "personal configuration" @@ -1273,57 +2387,106 @@ msgstr "personal configuration" msgid "查询个人配置列表" msgstr "query personal configuration" -#: backend/configuration/views/profile.py:42 +#: backend/configuration/views/profile.py:46 msgid "新增/更新个人配置" msgstr "update or create personal configuration" -#: backend/configuration/views/system.py:43 -msgid "系统设置列表" +#: backend/configuration/views/system.py:35 +msgid "系统设置" msgstr "system settings" -#: backend/configuration/views/system.py:51 -msgid "系统设置键值映射表" -msgstr "System settings key-value mapping table" +#: backend/configuration/views/system.py:49 +#: backend/db_services/ipchooser/views.py:207 +msgid "查询磁盘类型" +msgstr "Query disk type" + +#: backend/configuration/views/system.py:57 +msgid "查询机型类型" +msgstr "Query model type" #: backend/configuration/views/system.py:65 +msgid "查询轮值通知配置" +msgstr "Query rotation notification configuration" + +#: backend/configuration/views/system.py:73 +msgid "更新轮值通知配置" +msgstr "Update rotation notification configuration" + +#: backend/configuration/views/system.py:83 msgid "查询环境变量" msgstr "Query environment variables" -#: backend/core/encrypt/constants.py:26 +#: backend/configuration/views/system.py:112 +msgid "查询敏感环境变量" +msgstr "Query sensitive environment variables" + +#: backend/configuration/views/system.py:138 +msgid "业务设置列表" +msgstr "Business settings list" + +#: backend/configuration/views/system.py:139 +msgid "业务设置" +msgstr "business settings" + +#: backend/configuration/views/system.py:146 +msgid "业务设置列表键值映射表" +msgstr "Business settings list key-value mapping table" + +#: backend/configuration/views/system.py:168 +msgid "更新业务设置列表键值" +msgstr "Update business settings list key value" + +#: backend/core/encrypt/constants.py:27 msgid "PKCS1" msgstr "PKCS1" -#: backend/core/encrypt/constants.py:27 +#: backend/core/encrypt/constants.py:28 msgid "PKCS1_OAEP" msgstr "PKCS1_OAEP" -#: backend/core/encrypt/constants.py:33 +#: backend/core/encrypt/constants.py:34 msgid "私钥对象" msgstr "private key object" -#: backend/core/encrypt/constants.py:34 +#: backend/core/encrypt/constants.py:35 msgid "公钥对象" msgstr "public key object" -#: backend/core/encrypt/constants.py:40 +#: backend/core/encrypt/constants.py:41 msgid "私钥" msgstr "private key" -#: backend/core/encrypt/constants.py:41 +#: backend/core/encrypt/constants.py:42 msgid "公钥" msgstr "public key" -#: backend/core/encrypt/constants.py:50 -msgid "MySQL的RSA秘钥" -msgstr "MySQL RSA key" - #: backend/core/encrypt/constants.py:51 -msgid "透传接口的RSA秘钥" -msgstr "RSA key of the transparent interface" +msgid "平台密码的非对称秘钥" +msgstr "Asymmetric key for platform password" #: backend/core/encrypt/constants.py:52 -msgid "云区域服务的RSA秘钥" -msgstr "RSA key of the cloud zone service" +msgid "透传接口的非对称秘钥" +msgstr "Asymmetric secret key for transparent transmission interface" + +#: backend/core/encrypt/constants.py:53 +msgid "云区域服务的非对称秘钥" +msgstr "Asymmetric key for cloud zone service" + +#: backend/core/encrypt/constants.py:63 +msgid "RSA" +msgstr "RSA" + +#: backend/core/encrypt/constants.py:64 +msgid "SM2" +msgstr "SM2" + +#: backend/core/encrypt/constants.py:70 +msgid "AES" +msgstr "AES" + +#: backend/core/encrypt/constants.py:71 +msgid "SM4" +msgstr "SM4" #: backend/core/encrypt/exceptions.py:19 msgid "密码加密失败" @@ -1333,43 +2496,39 @@ msgstr "Password encryption failed" msgid "密码解密失败" msgstr "Password decryption failed" -#: backend/core/encrypt/handlers.py:162 -msgid "密码加密失败: {}" -msgstr "Password encryption failed: {}" - -#: backend/core/encrypt/handlers.py:181 -msgid "密码解密失败: {}" -msgstr "Password decryption failed: {}" - -#: backend/core/encrypt/models.py:19 backend/core/encrypt/serializers.py:23 +#: backend/core/encrypt/models.py:20 backend/core/encrypt/serializers.py:23 msgid "密钥名称" msgstr "key name" -#: backend/core/encrypt/models.py:20 +#: backend/core/encrypt/models.py:21 msgid "密钥类型" msgstr "key type" -#: backend/core/encrypt/models.py:21 +#: backend/core/encrypt/models.py:22 +msgid "非对称加密算法" +msgstr "asymmetric encryption algorithm" + +#: backend/core/encrypt/models.py:24 msgid "密钥描述" msgstr "key description" -#: backend/core/encrypt/models.py:22 +#: backend/core/encrypt/models.py:25 msgid "密钥内容" msgstr "key content" #: backend/core/encrypt/models.py:28 backend/core/encrypt/models.py:29 -msgid "RSA密钥" -msgstr "RSA key" +msgid "非对称密钥" +msgstr "asymmetric key" #: backend/core/encrypt/serializers.py:20 msgid "密钥名称列表" msgstr "list of key names" -#: backend/core/encrypt/views.py:21 -msgid "RSA秘钥" -msgstr "RSA key" +#: backend/core/encrypt/views.py:22 +msgid "秘钥管理" +msgstr "Key management" -#: backend/core/encrypt/views.py:29 +#: backend/core/encrypt/views.py:30 msgid "查询公钥列表" msgstr "Query the list of public keys" @@ -1414,7 +2573,7 @@ msgstr "public repository" msgid "私有仓库" msgstr "private warehouse" -#: backend/core/storages/constants.py:31 backend/flow/consts.py:241 +#: backend/core/storages/constants.py:31 backend/flow/consts.py:328 msgid "服务器文件" msgstr "server file" @@ -1464,6 +2623,7 @@ msgid "storage_type must be one of {choices}" msgstr "storage_type must be one of {choices}" #: backend/core/storages/file_source.py:35 +#, python-brace-format msgid "DBM[biz-{bk_biz_id}]{storage_type_alias}文件凭证" msgstr "DBM[biz:{bk_biz_id}]{storage_type_alias} file credentials" @@ -1476,7 +2636,7 @@ msgstr "" #: backend/core/storages/file_source.py:147 msgid "DBM{storage_type_alias}文件源" -msgstr "DBM[biz:{bk_biz_id}]{storage_type_alias} file source" +msgstr "DBM{storage_type_alias} file source" #: backend/core/storages/file_source.py:204 #, python-brace-format @@ -1529,28 +2689,61 @@ msgstr "File source access parameters" msgid "作业平台文件源" msgstr "Operating platform file source" -#: backend/core/storages/serializers.py:17 -#: backend/db_services/taskflow/serializers.py:62 +#: backend/core/storages/serializers.py:19 +#: backend/db_services/taskflow/serializers.py:72 msgid "文件路径列表" msgstr "list of file paths" -#: backend/core/storages/serializers.py:21 -#: backend/db_proxy/views/jobapi/serializers.py:66 +#: backend/core/storages/serializers.py:23 +#: backend/core/storages/serializers.py:32 +#: backend/db_proxy/views/jobapi/serializers.py:63 msgid "文件路径" msgstr "file path" -#: backend/core/storages/views.py:25 +#: backend/core/storages/serializers.py:27 +msgid "临时下载的token" +msgstr "Temporarily downloaded token" + +#: backend/core/storages/serializers.py:28 +msgid "是否强制下载" +msgstr "Whether to force download" + +#: backend/core/storages/serializers.py:44 +msgid "目标目录列表" +msgstr "target directory listing" + +#: backend/core/storages/serializers.py:45 +msgid "是否下载" +msgstr "Whether to download" + +#: backend/core/storages/views.py:37 msgid "批量获取文件内容" msgstr "Get file content in batches" -#: backend/core/storages/views.py:32 +#: backend/core/storages/views.py:45 +msgid "批量下载文件" +msgstr "Download files in batches" + +#: backend/core/storages/views.py:53 +msgid "临时下载文件" +msgstr "Temporarily download files" + +#: backend/core/storages/views.py:67 msgid "获取文件内容" msgstr "get file content" -#: backend/core/storages/views.py:38 +#: backend/core/storages/views.py:73 msgid "删除文件" msgstr "Delete Files" +#: backend/core/storages/views.py:80 +msgid "获取临时凭证" +msgstr "Get temporary credentials" + +#: backend/core/storages/views.py:91 +msgid "指定目录下载(返回下载链接)" +msgstr "Specify directory to download (return to download link)" + #: backend/core/translation/exceptions.py:19 msgid "翻译目录未找到" msgstr "Translation directory not found" @@ -1563,6 +2756,139 @@ msgstr "There are untranslated files/code fragments" msgid "存在包含特定翻译语言的f-string" msgstr "There is an f-string containing the specific translation language" +#: backend/db_dirty/constants.py:14 backend/iam_app/dataclass/actions.py:1528 +msgid "污点池" +msgstr "taint pool" + +#: backend/db_dirty/filters.py:24 +#: backend/db_services/mysql/open_area/filters.py:22 +#: backend/db_services/mysql/sql_import/serializers.py:94 +#: backend/db_services/mysql/sql_import/serializers.py:127 +#: backend/flow/models.py:23 backend/ticket/models/ticket.py:88 +#: backend/ticket/models/ticket.py:238 backend/ticket/serializers.py:83 +#: backend/ticket/serializers.py:292 backend/ticket/serializers.py:306 +#: backend/ticket/serializers.py:324 +msgid "单据类型" +msgstr "Ticket Type" + +#: backend/db_dirty/filters.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:86 +#: backend/db_services/mysql/permission/clone/serializers.py:131 +#: backend/db_services/mysql/permission/constants.py:34 +#: backend/db_services/redis/autofix/models.py:40 +#: backend/db_services/redis/redis_dts/serializers.py:34 +#: backend/db_services/sqlserver/data_migrate/serializers.py:22 +#: backend/db_services/sqlserver/data_migrate/serializers.py:39 +#: backend/flow/models.py:21 backend/flow/models.py:41 +#: backend/ticket/serializers.py:81 +msgid "单据ID" +msgstr "Ticket ID" + +#: backend/db_dirty/filters.py:26 +#: backend/db_proxy/views/redis_dts/serializers.py:22 +#: backend/db_proxy/views/redis_dts/serializers.py:28 +#: backend/db_proxy/views/redis_dts/serializers.py:74 +#: backend/db_proxy/views/redis_dts/serializers.py:80 +#: backend/db_services/plugin/mysql/authorize/serializers.py:43 +#: backend/db_services/plugin/mysql/authorize/serializers.py:51 +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:28 +msgid "任务ID" +msgstr "task ID" + +#: backend/db_dirty/filters.py:27 +#: backend/db_services/dbresource/serializers.py:205 +#: backend/db_services/partition/serializers.py:99 +msgid "操作者" +msgstr "operator" + +#: backend/db_dirty/filters.py:28 +msgid "过滤IP" +msgstr "Filter IP" + +#: backend/db_dirty/handlers.py:262 +msgid "【污点池】主机列表:{} 将从污点池挪出" +msgstr "[Taint Pool] Host list: {} will be moved from the taint pool" + +#: backend/db_dirty/handlers.py:267 +msgid "【污点池】单据-{}:任务-{}执行失败,主机列表:{}挪到污点池" +msgstr "[Taint Pool] Document-{}: Task-{} failed to execute, host list: {} moved to the taint pool" + +#: backend/db_dirty/models.py:26 +#: backend/db_services/dbbase/cluster/serializers.py:39 +#: backend/db_services/dbbase/resources/serializers.py:130 +#: backend/db_services/ipchooser/serializers/topo_sers.py:78 +#: backend/db_services/plugin/bf/serializers.py:19 +#: backend/ticket/builders/common/base.py:102 +#: backend/ticket/builders/common/bigdata.py:226 +#: backend/ticket/builders/common/bigdata.py:304 +msgid "主机ID" +msgstr "host ID" + +#: backend/db_dirty/models.py:27 +msgid "主机云区域" +msgstr "Host cloud area" + +#: backend/db_dirty/models.py:28 +#: backend/db_proxy/views/dumper/serializers.py:21 +#: backend/db_services/plugin/bf/serializers.py:20 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:26 +msgid "主机IP" +msgstr "Host IP" + +#: backend/db_dirty/models.py:29 +msgid "关联任务" +msgstr "Associated tasks" + +#: backend/db_dirty/models.py:30 +msgid "关联单据" +msgstr "Related documents" + +#: backend/db_dirty/models.py:33 +msgid "污点池机器(DirtyMachine)" +msgstr "DirtyMachine" + +#: backend/db_dirty/serializers.py:20 +msgid "过滤的主机IP列表,以逗号分隔" +msgstr "List of host IPs to filter, comma separated" + +#: backend/db_dirty/serializers.py:21 +msgid "过滤的单据ID" +msgstr "Filtered document ID" + +#: backend/db_dirty/serializers.py:22 +msgid "过滤的任务ID" +msgstr "Filtered task ID" + +#: backend/db_dirty/serializers.py:23 +msgid "过滤的单据类型" +msgstr "Filtered document types" + +#: backend/db_dirty/serializers.py:24 +#: backend/db_services/plugin/mysql/authorize/serializers.py:22 +#: backend/ticket/builders/mysql/mysql_openarea.py:40 +msgid "操作人" +msgstr "operator" + +#: backend/db_dirty/serializers.py:42 +msgid "待转移的主机ID列表" +msgstr "List of host IDs to be transferred" + +#: backend/db_dirty/serializers.py:46 +msgid "待删除的污点池记录主机ID" +msgstr "The host ID of the taint pool record to be deleted" + +#: backend/db_dirty/views.py:45 +msgid "查询污点池列表" +msgstr "Query the taint pool list" + +#: backend/db_dirty/views.py:83 +msgid "将污点池主机转移至待回收模块" +msgstr "Transfer the taint pool host to the module to be recycled" + +#: backend/db_dirty/views.py:99 +msgid "删除污点池记录" +msgstr "Delete taint pool records" + #: backend/db_event/serializers.py:19 msgid "事件ID" msgstr "event ID" @@ -1584,131 +2910,139 @@ msgid "日志列表" msgstr "log list" #: backend/db_event/serializers.py:45 -#: backend/db_meta/api/storage_instance/apis.py:165 -#: backend/db_services/dbbase/resources/constants.py:19 -#: backend/db_services/ipchooser/constants.py:82 +#: backend/db_report/views/checksum_check_report_view.py:58 +#: backend/db_services/dbbase/resources/constants.py:20 +#: backend/db_services/ipchooser/constants.py:118 #: backend/db_services/ipchooser/mock_data.py:43 #: backend/db_services/ipchooser/mock_data.py:62 -#: backend/db_services/ipchooser/mock_data.py:98 backend/ticket/handler.py:52 +#: backend/db_services/ipchooser/mock_data.py:98 backend/ticket/handler.py:78 msgid "集群" msgstr "cluster" #: backend/db_event/serializers.py:48 -#: backend/db_proxy/views/db_meta/serializers.py:52 +#: backend/db_proxy/views/db_meta/serializers.py:65 +#: backend/db_services/mysql/dumper/filters.py:40 msgid "实例IP" msgstr "Instance IP" #: backend/db_event/serializers.py:49 -#: backend/db_services/dbresource/serializers.py:203 +#: backend/db_report/views/meta_check_view.py:62 +#: backend/db_services/dbresource/serializers.py:334 +#: backend/db_services/redis/autofix/models.py:55 msgid "实例类型" msgstr "instance type" -#: backend/db_event/serializers.py:50 -msgid "实例角色" -msgstr "instance role" - -#: backend/db_event/serializers.py:51 backend/db_event/serializers.py:66 -#: backend/db_proxy/views/redis_dts/serializers.py:23 -#: backend/db_services/redis_dts/serializers.py:18 -#: backend/ticket/builders/mysql/mysql_data_repair.py:36 -#: backend/ticket/builders/mysql/mysql_flashback.py:28 -#: backend/ticket/serializers.py:111 -msgid "开始时间" -msgstr "Starting time" - -#: backend/db_event/serializers.py:52 backend/db_event/serializers.py:53 -#: backend/db_event/serializers.py:67 -#: backend/db_proxy/views/redis_dts/serializers.py:24 -#: backend/db_services/redis_dts/serializers.py:19 -#: backend/ticket/builders/mysql/mysql_data_repair.py:37 -#: backend/ticket/builders/mysql/mysql_flashback.py:29 -#: backend/ticket/serializers.py:112 -msgid "结束时间" -msgstr "End Time" - -#: backend/db_event/views/dbha.py:24 +#: backend/db_event/views/dbha.py:27 msgid "DBHA事件" msgstr "DBHA event" -#: backend/db_event/views/dbha.py:32 +#: backend/db_event/views/dbha.py:42 msgid "DBHA切换事件列表" msgstr "DBHA switching event list" -#: backend/db_event/views/dbha.py:71 +#: backend/db_event/views/dbha.py:86 msgid "DBHA切换事件详情(日志)" msgstr "Details of DBHA switchover events (logs)" -#: backend/db_meta/api/cluster/base/graph.py:107 +#: backend/db_meta/api/cluster/base/graph.py:127 +#: backend/db_proxy/views/db_meta/serializers.py:149 +#: backend/iam_app/dataclass/actions.py:900 backend/ticket/constants.py:225 +#: backend/ticket/constants.py:226 msgid "访问入口" msgstr "access entrance" -#: backend/db_meta/api/cluster/base/graph.py:117 +#: backend/db_meta/api/cluster/base/graph.py:137 msgid "node" msgstr "node" -#: backend/db_meta/api/cluster/base/graph.py:118 +#: backend/db_meta/api/cluster/base/graph.py:138 msgid "group" msgstr "group" -#: backend/db_meta/api/cluster/base/graph.py:122 +#: backend/db_meta/api/cluster/base/graph.py:142 msgid "同步" msgstr "Synchronize" -#: backend/db_meta/api/cluster/base/graph.py:123 +#: backend/db_meta/api/cluster/base/graph.py:143 msgid "访问" msgstr "access" -#: backend/db_meta/api/cluster/base/graph.py:124 +#: backend/db_meta/api/cluster/base/graph.py:144 msgid "域名绑定" msgstr "domain binding" -#: backend/db_meta/api/cluster/base/graph.py:125 +#: backend/db_meta/api/cluster/base/graph.py:145 msgid "读写" msgstr "read and write" -#: backend/db_meta/api/cluster/base/graph.py:157 +#: backend/db_meta/api/cluster/base/graph.py:177 msgid "同步到其他集群" msgstr "Sync to other clusters" -#: backend/db_meta/api/cluster/base/graph.py:158 +#: backend/db_meta/api/cluster/base/graph.py:178 msgid "从其他集群同步" msgstr "Synchronize from other clusters" -#: backend/db_meta/api/cluster/base/graph.py:159 +#: backend/db_meta/api/cluster/base/graph.py:179 msgid "访问其他集群" msgstr "Access other clusters" -#: backend/db_meta/api/cluster/base/graph.py:160 +#: backend/db_meta/api/cluster/base/graph.py:180 msgid "从其他集群访问" msgstr "Access from other clusters" -#: backend/db_meta/api/cluster/es/detail.py:27 -msgid "Client 节点" -msgstr "Client node" +#: backend/db_meta/api/cluster/doris/detail.py:27 +msgid "Follower 节点" +msgstr "Follower node" -#: backend/db_meta/api/cluster/es/detail.py:32 -msgid "Master 节点" -msgstr "Master Node" +#: backend/db_meta/api/cluster/doris/detail.py:32 +msgid "Observer 节点" +msgstr "Observer node" +#: backend/db_meta/api/cluster/doris/detail.py:35 #: backend/db_meta/api/cluster/es/detail.py:35 -#: backend/db_services/bigdata/es/query.py:35 +#: backend/db_meta/enums/instance_role.py:38 +#: backend/db_meta/enums/instance_role.py:62 +#: backend/db_services/bigdata/doris/query.py:37 +#: backend/db_services/bigdata/es/query.py:36 msgid "热节点" msgstr "hot node" +#: backend/db_meta/api/cluster/doris/detail.py:38 #: backend/db_meta/api/cluster/es/detail.py:38 -#: backend/db_services/bigdata/es/query.py:36 +#: backend/db_meta/enums/instance_role.py:39 +#: backend/db_meta/enums/instance_role.py:63 +#: backend/db_services/bigdata/doris/query.py:38 +#: backend/db_services/bigdata/es/query.py:37 msgid "冷节点" msgstr "cold node" +#: backend/db_meta/api/cluster/es/detail.py:27 +#: backend/db_meta/enums/instance_role.py:41 +msgid "Client 节点" +msgstr "Client node" + +#: backend/db_meta/api/cluster/es/detail.py:32 +#: backend/db_meta/api/cluster/redisinstance/detail.py:26 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:28 +#: backend/db_meta/enums/instance_role.py:40 +msgid "Master 节点" +msgstr "Master Node" + #: backend/db_meta/api/cluster/hdfs/create.py:33 #: backend/db_meta/api/cluster/kafka/create.py:38 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:59 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:65 -#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:34 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:52 +#: backend/db_meta/api/cluster/sqlserversingle/create_cluster.py:34 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:60 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:52 +#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:33 msgid "集群名 {} 在 bk_biz_id:{} db_module_id:{} 已存在" msgstr "The cluster name {} already exists in bk_biz_id:{} db_module_id:{}" -#: backend/db_meta/api/cluster/hdfs/destroy.py:38 +#: backend/db_meta/api/cluster/hdfs/destroy.py:37 +#: backend/db_meta/api/cluster/influxdb/destroy.py:39 +#: backend/db_meta/api/cluster/influxdb/replace.py:51 +#: backend/db_meta/api/cluster/kafka/destroy.py:37 msgid "将主机{}转移到待回收模块" msgstr "Move host {} to the module to be recycled" @@ -1723,6 +3057,7 @@ msgstr "DataNode node" #: backend/db_meta/api/cluster/hdfs/detail.py:35 #: backend/db_meta/api/cluster/kafka/detail.py:30 #: backend/db_meta/api/cluster/pulsar/detail.py:30 +#: backend/db_meta/api/cluster/vm/detail.py:30 msgid "Zookeeper 节点" msgstr "zookeeper node" @@ -1730,73 +3065,82 @@ msgstr "zookeeper node" msgid "Journal 节点" msgstr "journal node node" -#: backend/db_meta/api/cluster/influxdb/destroy.py:42 -#: backend/db_meta/api/cluster/influxdb/replace.py:54 -#: backend/db_meta/api/cluster/kafka/destroy.py:39 -#: backend/db_meta/api/cluster/kafka/replace.py:51 -msgid "将主机{}转移到待回收" -msgstr "Move host {} to the module to be recycled" - #: backend/db_meta/api/cluster/kafka/create.py:42 -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:260 -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:264 -#: backend/db_meta/api/cluster/riak/create.py:34 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:63 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:69 -#: backend/db_meta/api/cluster/tendbcluster/create_slave_cluster.py:30 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:69 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:73 -#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:37 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:142 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:279 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:283 +#: backend/db_meta/api/cluster/rediscluster/create.py:170 +#: backend/db_meta/api/cluster/riak/create.py:35 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:56 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:60 +#: backend/db_meta/api/cluster/sqlserversingle/create_cluster.py:37 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:64 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:70 +#: backend/db_meta/api/cluster/tendbcluster/create_slave_cluster.py:28 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:56 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:60 +#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:36 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:170 msgid "域名 {} 已存在" msgstr "The domain name {} already exists" #: backend/db_meta/api/cluster/kafka/detail.py:27 #: backend/db_meta/api/cluster/pulsar/detail.py:27 +#: backend/db_meta/api/cluster/vm/detail.py:27 msgid "Broker 节点" msgstr "broker node" -#: backend/db_meta/api/cluster/mongocluster/detail.py:35 +#: backend/db_meta/api/cluster/kafka/replace.py:50 +#: backend/db_meta/api/cluster/vm/replace.py:50 +msgid "将主机{}转移到待回收" +msgstr "Move host {} to the module to be recycled" + +#: backend/db_meta/api/cluster/mongocluster/detail.py:45 msgid "Mongos 节点" msgstr "Mongos nodes" -#: backend/db_meta/api/cluster/mongocluster/detail.py:52 +#: backend/db_meta/api/cluster/mongocluster/detail.py:54 msgid "ConfigServer 节点" msgstr "ConfigServer node" -#: backend/db_meta/api/cluster/mongocluster/detail.py:69 -msgid "Shard 节点" -msgstr "Shard node" +#: backend/db_meta/api/cluster/mongocluster/detail.py:67 +msgid "分片{} 节点" +msgstr "shard{}node" + +#: backend/db_meta/api/cluster/mongorepset/detail.py:28 +msgid "M1 Primary 节点" +msgstr "M1 Primary node" -#: backend/db_meta/api/cluster/mongocluster/detail.py:72 -#: backend/db_meta/api/cluster/mongorepset/detail.py:44 +#: backend/db_meta/api/cluster/mongorepset/detail.py:45 +msgid "{} 节点" +msgstr "{} node" + +#: backend/db_meta/api/cluster/mongorepset/detail.py:53 msgid "Backup 节点" msgstr "Backup node" -#: backend/db_meta/api/cluster/mongorepset/detail.py:41 -msgid "提供服务 节点" -msgstr "Provide service node" - -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:113 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:110 msgid "{} 实例未分片规则" msgstr "{} Instance unsharded rules" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:256 -#: backend/db_meta/api/cluster/riak/create.py:31 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:275 +#: backend/db_meta/api/cluster/riak/create.py:32 msgid "集群名 {} 在 bk_biz_id:{} 已存在" msgstr "The cluster name {} already exists in bk_biz_id:{}" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:271 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:149 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:290 +#: backend/db_meta/api/cluster/rediscluster/create.py:177 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:177 msgid "proxy {} 已属于其他集群" msgstr "proxy {} already belongs to another cluster" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:277 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:155 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:297 +#: backend/db_meta/api/cluster/rediscluster/create.py:183 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:183 msgid "storage {} 已属于其他集群" msgstr "storage {} already belongs to another cluster" #: backend/db_meta/api/cluster/nosqlcomm/decommission.py:43 +#: backend/flow/plugins/components/collections/mongodb/mongo_shutdown_meta.py:51 msgid "{} 存在不是本集群的实例下架列表" msgstr "{} There is an instance removal list that is not in this cluster" @@ -1806,20 +3150,24 @@ msgstr "" "Non-cluster unshelf mode, it is not allowed to directly unshelf all " "instances {}" -#: backend/db_meta/api/cluster/nosqlcomm/decommission.py:107 +#: backend/db_meta/api/cluster/nosqlcomm/decommission.py:111 msgid "非集群下架单,不允许直接下架状态为RUNNING状态实例 {}" msgstr "" "Non-cluster unshelf order, it is not allowed to directly unshelf the " "instance whose state is RUNNING {}" -#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:57 +#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:54 +#: backend/db_meta/api/cluster/rediscluster/detail.py:50 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:43 #: backend/db_meta/api/cluster/tendbcluster/detail.py:64 #: backend/db_meta/api/cluster/tendbha/detail.py:50 #: backend/db_meta/api/cluster/tendispluscluster/detail.py:50 msgid "访问入口(从)" msgstr "access entry (from)" -#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:92 +#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:89 +#: backend/db_meta/api/cluster/rediscluster/detail.py:85 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:32 #: backend/db_meta/api/cluster/tendbcluster/detail.py:57 #: backend/db_meta/api/cluster/tendbha/detail.py:84 #: backend/db_meta/api/cluster/tendispluscluster/detail.py:85 @@ -1827,11 +3175,31 @@ msgid "访问入口(主)" msgstr "access entrance (main)" #: backend/db_meta/api/cluster/pulsar/detail.py:33 +#: backend/db_meta/api/cluster/vm/detail.py:33 msgid "Bookkeeper 节点" msgstr "Bookkeeper node" -#: backend/db_meta/api/cluster/tendbcluster/decommission.py:80 -#: backend/db_meta/api/cluster/tendbha/decommission.py:79 +#: backend/db_meta/api/cluster/rediscluster/create.py:188 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:188 +msgid "proxy {} 未注册" +msgstr "proxy {} unregistered" + +#: backend/db_meta/api/cluster/rediscluster/create.py:192 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:192 +msgid "storage {} 未注册" +msgstr "storage {} is not registered" + +#: backend/db_meta/api/cluster/redisinstance/detail.py:31 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:39 +msgid "Slave 节点" +msgstr "Slave node" + +#: backend/db_meta/api/cluster/riak/detail.py:24 +msgid "Riak 节点" +msgstr "Riak node" + +#: backend/db_meta/api/cluster/tendbcluster/decommission.py:86 +#: backend/db_meta/api/cluster/tendbha/decommission.py:90 msgid "{} 与 {} 的 {} 有同步关系" msgstr "{} has a synchronous relationship with {} of {}" @@ -1851,652 +3219,609 @@ msgstr "Spider Slave" msgid "spider_slave_entry_bind" msgstr "spider_slave_entry_bind" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:68 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:73 msgid "RemoteDB" msgstr "RemoteDB" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:72 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:77 msgid "RemoteDR" msgstr "RemoteDR" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:77 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:85 msgid "Spider 运维节点" msgstr "Spider operation and maintenance node" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:84 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:91 msgid "controller_group" msgstr "controller_group" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:84 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:91 msgid "中控节点" msgstr "Control Node" -#: backend/db_meta/api/cluster/tendispluscluster/create.py:160 -msgid "proxy {} 未注册" -msgstr "proxy {} unregistered" - -#: backend/db_meta/api/cluster/tendispluscluster/create.py:164 -msgid "storage {} 未注册" -msgstr "storage {} is not registered" +#: backend/db_meta/api/cluster/tendbcluster/handler.py:314 +msgid "集群{}不具有该角色「{}」的实例" +msgstr "Cluster {} does not have an instance of the role {}" -#: backend/db_meta/api/dbha/apis.py:137 +#: backend/db_meta/api/dbha/apis.py:205 msgid "实例ip={}, port={}不存在,请检查输入参数或相关数据" msgstr "" "The instance ip={}, port={} does not exist, please check the input " "parameters or related data" -#: backend/db_meta/api/proxy_instance/apis.py:98 -msgid "proxy {} 在集群里边" -msgstr "proxy {} in the cluster" - -#: backend/db_meta/api/proxy_instance/apis.py:102 -msgid "proxy {} 不存在" -msgstr "proxy {} does not exist" - -#: backend/db_meta/api/storage_instance/apis.py:161 -#: backend/db_services/dbbase/resources/serializers.py:49 -#: backend/ticket/builders/es/es_apply.py:29 -#: backend/ticket/builders/influxdb/influxdb_apply.py:33 -#: backend/ticket/builders/kafka/kafka_apply.py:81 -#: backend/ticket/builders/pulsar/pulsar_apply.py:33 -msgid "端口" -msgstr "port" - -#: backend/db_meta/api/storage_instance/apis.py:162 -#: backend/db_meta/models/machine.py:25 -msgid "IP 地址" -msgstr "IP address" - -#: backend/db_meta/api/storage_instance/apis.py:163 -msgid "DB 模块 ID" -msgstr "DB module ID" - -#: backend/db_meta/api/storage_instance/apis.py:164 -#: backend/db_services/ipchooser/serializers/base.py:32 -#: backend/db_services/ipchooser/serializers/base.py:41 -msgid "业务 ID" -msgstr "Business ID" - -#: backend/db_meta/api/storage_instance/apis.py:166 -msgid "拓扑层级" -msgstr "topology level" - -#: backend/db_meta/api/storage_instance/apis.py:167 -msgid "机器类型" -msgstr "machine type" - -#: backend/db_meta/api/storage_instance/apis.py:168 -#: backend/db_services/dbbase/resources/serializers.py:71 -#: backend/db_services/dbbase/resources/serializers.py:84 -#: backend/ticket/serializers.py:198 -msgid "角色" -msgstr "Role" - -#: backend/db_meta/api/storage_instance/apis.py:169 -msgid "系统角色" -msgstr "system role" - -#: backend/db_meta/api/storage_instance/apis.py:170 -#: backend/db_meta/models/spec.py:73 backend/db_proxy/models.py:126 -#: backend/db_services/bigdata/resources/query.py:42 -#: backend/db_services/cmdb/serializers.py:31 -#: backend/db_services/cmdb/serializers.py:36 -#: backend/db_services/dbconfig/serializers.py:20 -#: backend/db_services/mysql/cluster/serializers.py:63 -#: backend/db_services/mysql/permission/authorize/serializers.py:30 -#: backend/db_services/mysql/permission/authorize/serializers.py:51 -#: backend/db_services/partition/serializers.py:21 -#: backend/db_services/partition/serializers.py:32 -#: backend/db_services/partition/serializers.py:39 -#: backend/db_services/partition/serializers.py:77 -#: backend/db_services/partition/serializers.py:90 -#: backend/db_services/partition/serializers.py:95 -#: backend/db_services/redis/resources/redis_cluster/query.py:56 -#: backend/ticket/builders/redis/redis_cluster_apply.py:36 -msgid "集群类型" -msgstr "cluster type" - -#: backend/db_meta/api/storage_instance/apis.py:171 -#: backend/db_services/bigdata/influxdb/serializers.py:19 -#: backend/db_services/dbbase/resources/serializers.py:70 -#: backend/ticket/serializers.py:67 backend/ticket/serializers.py:208 -msgid "状态" -msgstr "state" - -#: backend/db_meta/api/storage_instance/apis.py:172 -msgid "同步后继" -msgstr "sync successor" - -#: backend/db_meta/api/storage_instance/apis.py:173 -msgid "同步上联" -msgstr "sync uplink" - -#: backend/db_meta/api/storage_instance/apis.py:174 -msgid "绑定入口" -msgstr "binding entry" - -#: backend/db_meta/api/storage_instance/apis.py:175 -msgid "接入层列表" -msgstr "access layer list" - -#: backend/db_meta/api/storage_instance/apis.py:176 -msgid "IDC 城市 ID" -msgstr "IDC City ID" - -#: backend/db_meta/api/storage_instance/apis.py:177 -#: backend/db_meta/models/city_map.py:36 -msgid "IDC 城市名" -msgstr "IDC city name" - -#: backend/db_meta/api/storage_instance/apis.py:178 -msgid "逻辑城市 ID" -msgstr "Logical City ID" - -#: backend/db_meta/api/storage_instance/apis.py:179 -msgid "逻辑城市名" -msgstr "logical city name" - -#: backend/db_meta/api/storage_instance/apis.py:180 -#: backend/db_meta/models/machine.py:36 -msgid "操作系统" -msgstr "operating system" - -#: backend/db_meta/api/storage_instance/apis.py:181 -#: backend/db_meta/models/machine.py:37 -msgid "区域" -msgstr "area" - -#: backend/db_meta/api/storage_instance/apis.py:182 -#: backend/db_meta/models/machine.py:38 -msgid "区域 ID" -msgstr "area ID" - -#: backend/db_meta/api/storage_instance/apis.py:183 -#: backend/db_meta/models/machine.py:39 -msgid "子 Zone" -msgstr "Child Zone" - -#: backend/db_meta/api/storage_instance/apis.py:184 -#: backend/db_meta/models/machine.py:40 -msgid "子 Zone ID" -msgstr "Child Zone ID" - -#: backend/db_meta/api/storage_instance/apis.py:185 -#: backend/db_meta/models/machine.py:41 -msgid "机架" -msgstr "frame" - -#: backend/db_meta/api/storage_instance/apis.py:186 -#: backend/db_meta/models/machine.py:42 -msgid "机架 ID" -msgstr "Rack ID" - -#: backend/db_meta/api/storage_instance/apis.py:187 -#: backend/db_meta/models/machine.py:43 -msgid "标准设备类型" -msgstr "Standard Equipment Type" - -#: backend/db_meta/api/storage_instance/apis.py:188 -#: backend/db_meta/models/machine.py:44 -msgid "机房" -msgstr "engine room" - -#: backend/db_meta/api/storage_instance/apis.py:189 -#: backend/db_meta/models/machine.py:45 -msgid "机房 ID" -msgstr "computer room ID" - -#: backend/db_meta/api/storage_instance/apis.py:190 -#: backend/db_meta/models/cluster.py:50 backend/db_meta/models/machine.py:46 -#: backend/db_proxy/models.py:28 backend/db_proxy/models.py:47 -#: backend/db_services/ipchooser/serializers/base.py:90 -msgid "云区域 ID" -msgstr "Cloud Region ID" - -#: backend/db_meta/api/storage_instance/apis.py:191 -msgid "网络设备 ID" -msgstr "network device ID" - -#: backend/db_meta/enums/access_layer.py:16 -#: backend/db_meta/enums/machine_type.py:18 backend/flow/consts.py:253 -#: backend/flow/consts.py:541 backend/ticket/builders/common/constants.py:62 -#: backend/ticket/constants.py:23 +#: backend/db_meta/enums/access_layer.py:17 +#: backend/db_meta/enums/machine_type.py:19 backend/flow/consts.py:340 +#: backend/flow/consts.py:796 backend/flow/consts.py:1137 +#: backend/ticket/builders/common/constants.py:79 +#: backend/ticket/constants.py:24 msgid "proxy" msgstr "proxy" -#: backend/db_meta/enums/access_layer.py:17 backend/ticket/constants.py:22 -msgid "storage" -msgstr "storage" - -#: backend/db_meta/enums/access_layer.py:18 +#: backend/db_meta/enums/access_layer.py:19 msgid "config" msgstr "config" -#: backend/db_meta/enums/cluster_entry_role.py:17 +#: backend/db_meta/enums/cluster_entry_role.py:18 msgid "master_entry" msgstr "master_entry" -#: backend/db_meta/enums/cluster_entry_role.py:18 +#: backend/db_meta/enums/cluster_entry_role.py:19 msgid "slave_entry" msgstr "slave_entry" -#: backend/db_meta/enums/cluster_entry_type.py:16 +#: backend/db_meta/enums/cluster_entry_role.py:20 +msgid "proxy_entry" +msgstr "proxy_entry" + +#: backend/db_meta/enums/cluster_entry_role.py:21 +msgid "node_entry" +msgstr "node_entry" + +#: backend/db_meta/enums/cluster_entry_type.py:17 msgid "dns" msgstr "dns" -#: backend/db_meta/enums/cluster_entry_type.py:17 +#: backend/db_meta/enums/cluster_entry_type.py:18 backend/flow/consts.py:1083 msgid "clb" msgstr "clb" -#: backend/db_meta/enums/cluster_entry_type.py:18 +#: backend/db_meta/enums/cluster_entry_type.py:19 msgid "polaris" msgstr "polaris" -#: backend/db_meta/enums/cluster_phase.py:17 -#: backend/db_meta/enums/instance_phase.py:17 -msgid "online" -msgstr "online" +#: backend/db_meta/enums/cluster_entry_type.py:20 +msgid "clbDns" +msgstr "clbDns" #: backend/db_meta/enums/cluster_phase.py:18 #: backend/db_meta/enums/instance_phase.py:18 -msgid "offline" -msgstr "offline" +msgid "正常" +msgstr "normal" + +#: backend/db_meta/enums/cluster_phase.py:19 +msgid "禁用" +msgstr "Disable" -#: backend/db_meta/enums/cluster_phase.py:21 -#: backend/db_meta/enums/instance_phase.py:21 -msgid "destroy" +#: backend/db_meta/enums/cluster_phase.py:22 +#: backend/db_meta/enums/instance_phase.py:22 +msgid "销毁" msgstr "destroy" -#: backend/db_meta/enums/cluster_status.py:19 +#: backend/db_meta/enums/cluster_phase.py:25 +msgid "scr/gcs迁移中" +msgstr "scr/gcs migrating" + +#: backend/db_meta/enums/cluster_status.py:20 msgid "normal" msgstr "normal" -#: backend/db_meta/enums/cluster_status.py:20 backend/flow/consts.py:451 -msgid "ABNORMAL" -msgstr "ABNORMAL" - -#: backend/db_meta/enums/cluster_type.py:16 -msgid "tendbsingle" -msgstr "tendbsingle" +#: backend/db_meta/enums/cluster_status.py:21 +msgid "abnormal" +msgstr "abnormal" -#: backend/db_meta/enums/cluster_type.py:17 -msgid "tendbha" -msgstr "tendbha" - -#: backend/db_meta/enums/cluster_type.py:18 backend/flow/consts.py:134 -msgid "tendbcluster" -msgstr "tendbcluster" +#: backend/db_meta/enums/cluster_status.py:23 backend/db_meta/enums/comm.py:36 +msgid "temporary" +msgstr "temporary" #: backend/db_meta/enums/cluster_type.py:20 +msgid "MySQL单节点集群" +msgstr "MySQL single node cluster" + #: backend/db_meta/enums/cluster_type.py:21 -msgid "Redis集群" -msgstr "Redis cluster" +msgid "MySQL高可用集群" +msgstr "MySQL high availability cluster" #: backend/db_meta/enums/cluster_type.py:22 +#: backend/iam_app/dataclass/resources.py:354 +msgid "TendbCluster集群" +msgstr "TendbCluster cluster" + +#: backend/db_meta/enums/cluster_type.py:27 +#: backend/db_meta/enums/cluster_type.py:35 +msgid "RedisCluster集群" +msgstr "RedisCluster cluster" + +#: backend/db_meta/enums/cluster_type.py:28 +#: backend/db_meta/enums/cluster_type.py:39 msgid "Tendisplus存储版集群" msgstr "Tendisplus storage cluster" -#: backend/db_meta/enums/cluster_type.py:23 +#: backend/db_meta/enums/cluster_type.py:29 +#: backend/db_meta/enums/cluster_type.py:40 msgid "TendisCache集群" msgstr "TendisCache cluster" -#: backend/db_meta/enums/cluster_type.py:24 +#: backend/db_meta/enums/cluster_type.py:30 +#: backend/db_meta/enums/cluster_type.py:41 msgid "TendisSSD集群" msgstr "TendisSSD cluster" -#: backend/db_meta/enums/cluster_type.py:25 +#: backend/db_meta/enums/cluster_type.py:31 msgid "Tendis存储版集群" msgstr "Tendis Storage Edition Cluster" -#: backend/db_meta/enums/cluster_type.py:26 +#: backend/db_meta/enums/cluster_type.py:32 msgid "RedisCache主从版" msgstr "RedisCache master-slave version" -#: backend/db_meta/enums/cluster_type.py:27 +#: backend/db_meta/enums/cluster_type.py:33 msgid "TendisSSD主从版" msgstr "TendispSSD master-slave version" -#: backend/db_meta/enums/cluster_type.py:28 +#: backend/db_meta/enums/cluster_type.py:34 msgid "Tendisplus主从版" msgstr "Tendisplus master-slave version" -#: backend/db_meta/enums/cluster_type.py:29 -msgid "RedisCluster集群" -msgstr "RedisCluster cluster" - -#: backend/db_meta/enums/cluster_type.py:30 +#: backend/db_meta/enums/cluster_type.py:36 msgid "TendisplusCluster集群" msgstr "TendisplusCluster cluster" -#: backend/db_meta/enums/cluster_type.py:32 +#: backend/db_meta/enums/cluster_type.py:43 +#: backend/iam_app/dataclass/resources.py:370 msgid "ES集群" msgstr "ES cluster" -#: backend/db_meta/enums/cluster_type.py:33 +#: backend/db_meta/enums/cluster_type.py:44 +#: backend/iam_app/dataclass/resources.py:386 msgid "Kafka集群" msgstr "Kafka cluster" -#: backend/db_meta/enums/cluster_type.py:34 +#: backend/db_meta/enums/cluster_type.py:45 msgid "Hdfs集群" msgstr "Hdfs cluster" -#: backend/db_meta/enums/cluster_type.py:35 +#: backend/db_meta/enums/cluster_type.py:46 msgid "Influxdb实例" msgstr "InfluxDB instance" -#: backend/db_meta/enums/cluster_type.py:36 +#: backend/db_meta/enums/cluster_type.py:47 +#: backend/iam_app/dataclass/resources.py:402 msgid "Pulsar集群" msgstr "Pulsar cluster" -#: backend/db_meta/enums/cluster_type.py:38 +#: backend/db_meta/enums/cluster_type.py:48 +msgid "Doris集群" +msgstr "Doris cluster" + +#: backend/db_meta/enums/cluster_type.py:49 +msgid "vm集群" +msgstr "vm cluster" + +#: backend/db_meta/enums/cluster_type.py:51 +msgid "redis监控" +msgstr "redis monitoring" + +#: backend/db_meta/enums/cluster_type.py:53 msgid "Mongo副本集" msgstr "Mongo replica set" -#: backend/db_meta/enums/cluster_type.py:39 +#: backend/db_meta/enums/cluster_type.py:54 msgid "Mongo分片集群" msgstr "Mongo shard cluster" -#: backend/db_meta/enums/cluster_type.py:41 +#: backend/db_meta/enums/cluster_type.py:56 +#: backend/iam_app/dataclass/resources.py:410 msgid "Riak集群" msgstr "Riak cluster" -#: backend/db_meta/enums/comm.py:17 backend/flow/consts.py:676 +#: backend/db_meta/enums/cluster_type.py:58 +msgid "sqlserver单节点版" +msgstr "sqlserver single node version" + +#: backend/db_meta/enums/cluster_type.py:59 +msgid "sqlserver主从版" +msgstr "sqlserver master-slave version" + +#: backend/db_meta/enums/comm.py:18 backend/flow/consts.py:955 +msgid "ms" +msgstr "ms" + +#: backend/db_meta/enums/comm.py:19 msgid "sms" msgstr "sms" -#: backend/db_meta/enums/comm.py:18 backend/flow/consts.py:675 +#: backend/db_meta/enums/comm.py:20 backend/flow/consts.py:956 msgid "mms" msgstr "mms" -#: backend/db_meta/enums/comm.py:22 backend/db_meta/enums/machine_type.py:24 -#: backend/flow/consts.py:176 backend/flow/consts.py:254 +#: backend/db_meta/enums/comm.py:24 backend/db_meta/enums/machine_type.py:25 +#: backend/flow/consts.py:252 backend/flow/consts.py:341 +#: backend/flow/consts.py:1139 msgid "redis" msgstr "redis" -#: backend/db_meta/enums/comm.py:23 backend/db_meta/enums/machine_type.py:40 +#: backend/db_meta/enums/comm.py:25 backend/db_meta/enums/machine_type.py:41 +#: backend/flow/consts.py:288 msgid "mongodb" msgstr "mongodb" -#: backend/db_meta/enums/instance_inner_role.py:16 backend/flow/consts.py:542 -#: backend/flow/consts.py:554 backend/ticket/builders/common/constants.py:41 -#: backend/ticket/builders/common/constants.py:60 +#: backend/db_meta/enums/comm.py:29 backend/db_monitor/constants.py:51 +#: backend/db_monitor/constants.py:61 +msgid "custom" +msgstr "custom" + +#: backend/db_meta/enums/comm.py:30 +msgid "system" +msgstr "system" + +#: backend/db_meta/enums/comm.py:42 backend/db_meta/enums/instance_role.py:33 +msgid "Proxy" +msgstr "Proxy" + +#: backend/db_meta/enums/comm.py:43 +msgid "Backend" +msgstr "Backend" + +#: backend/db_meta/enums/extra_process_type.py:17 backend/flow/consts.py:357 +#: backend/flow/consts.py:1138 +msgid "tbinlogdumper" +msgstr "tbinlogdumper" + +#: backend/db_meta/enums/instance_inner_role.py:17 backend/flow/consts.py:797 +#: backend/flow/consts.py:810 backend/ticket/builders/common/constants.py:52 +#: backend/ticket/builders/common/constants.py:77 msgid "master" msgstr "master" -#: backend/db_meta/enums/instance_inner_role.py:17 backend/flow/consts.py:543 -#: backend/ticket/builders/common/constants.py:61 +#: backend/db_meta/enums/instance_inner_role.py:18 backend/flow/consts.py:798 +#: backend/ticket/builders/common/constants.py:78 msgid "slave" msgstr "slave" -#: backend/db_meta/enums/instance_inner_role.py:18 +#: backend/db_meta/enums/instance_inner_role.py:19 msgid "repeater" msgstr "repeater" -#: backend/db_meta/enums/instance_inner_role.py:19 -#: backend/db_meta/enums/instance_role.py:18 +#: backend/db_meta/enums/instance_inner_role.py:20 +#: backend/db_meta/enums/instance_role.py:20 msgid "orphan" msgstr "orphan" -#: backend/db_meta/enums/instance_role.py:21 -msgid "backend_master" -msgstr "backend_master" +#: backend/db_meta/enums/instance_phase.py:19 +msgid "下架" +msgstr "Removed from shelves" -#: backend/db_meta/enums/instance_role.py:22 -msgid "backend_repeater" -msgstr "backend_repeater" +#: backend/db_meta/enums/instance_phase.py:24 +msgid " scr/gcs迁移中" +msgstr "scr/gcs migrating" #: backend/db_meta/enums/instance_role.py:23 -msgid "backend_slave" -msgstr "backend_slave" - -#: backend/db_meta/enums/instance_role.py:26 -msgid "remote_master" -msgstr "remote_master" - -#: backend/db_meta/enums/instance_role.py:27 -msgid "remote_repeater" -msgstr "remote_repeater" - -#: backend/db_meta/enums/instance_role.py:28 -msgid "remote_slave" -msgstr "remote_slave" - -#: backend/db_meta/enums/instance_role.py:30 -msgid "redis_proxy" -msgstr "redis_proxy" - -#: backend/db_meta/enums/instance_role.py:31 -msgid "redis_master" -msgstr "redis_master" - -#: backend/db_meta/enums/instance_role.py:32 -msgid "redis_slave" -msgstr "redis_slave" - #: backend/db_meta/enums/instance_role.py:34 -msgid "es_datanode_hot" -msgstr "es_datanode_hot" +msgid "Master" +msgstr "Master" +#: backend/db_meta/enums/instance_role.py:24 +msgid "Repeater" +msgstr "Repeater" + +#: backend/db_meta/enums/instance_role.py:25 #: backend/db_meta/enums/instance_role.py:35 -msgid "es_datanode_cold" -msgstr "es_datanode_cold" +msgid "Slave" +msgstr "Slave" -#: backend/db_meta/enums/instance_role.py:36 -#: backend/db_meta/enums/machine_type.py:30 -msgid "es_master" -msgstr "is_master" +#: backend/db_meta/enums/instance_role.py:28 +msgid "Remote Master" +msgstr "Remote Master" -#: backend/db_meta/enums/instance_role.py:37 -#: backend/db_meta/enums/machine_type.py:31 -msgid "es_client" -msgstr "es_client" +#: backend/db_meta/enums/instance_role.py:29 +msgid "Remote Repeater" +msgstr "Remote Repeater" -#: backend/db_meta/enums/instance_role.py:39 -#: backend/db_meta/enums/machine_type.py:33 backend/flow/consts.py:609 -#: backend/ticket/builders/common/constants.py:51 -#: backend/ticket/builders/common/constants.py:56 -msgid "broker" -msgstr "broker" +#: backend/db_meta/enums/instance_role.py:30 +msgid "Remote Slave" +msgstr "Remote Slave" -#: backend/db_meta/enums/instance_role.py:40 -#: backend/db_meta/enums/machine_type.py:34 backend/flow/consts.py:603 -#: backend/flow/consts.py:610 backend/ticket/builders/common/constants.py:47 -#: backend/ticket/builders/common/constants.py:50 -#: backend/ticket/builders/common/constants.py:55 -msgid "zookeeper" -msgstr "zookeeper" +#: backend/db_meta/enums/instance_role.py:44 +#: backend/db_meta/enums/instance_role.py:59 +msgid "Broker" +msgstr "Broker" -#: backend/db_meta/enums/instance_role.py:42 -msgid "hdfs_namenode" -msgstr "hdfs_namenode" +#: backend/db_meta/enums/instance_role.py:45 +#: backend/db_meta/enums/instance_role.py:49 +#: backend/db_meta/enums/instance_role.py:58 +msgid "Zookeeper" +msgstr "Zookeeper" -#: backend/db_meta/enums/instance_role.py:43 -msgid "hdfs_zookeeper" -msgstr "hdfs_zookeeper" +#: backend/db_meta/enums/instance_role.py:48 +msgid "NameNode" +msgstr "NameNode" -#: backend/db_meta/enums/instance_role.py:44 -msgid "hdfs_journalnode" -msgstr "hdfs_journalnode" +#: backend/db_meta/enums/instance_role.py:50 +msgid "Journalnode" +msgstr "Journalnode" -#: backend/db_meta/enums/instance_role.py:45 -#: backend/db_meta/enums/machine_type.py:37 -msgid "hdfs_datanode" -msgstr "hdfs_datanode" +#: backend/db_meta/enums/instance_role.py:51 +msgid "DataNode" +msgstr "DataNode" -#: backend/db_meta/enums/instance_role.py:47 -#: backend/db_meta/enums/machine_type.py:42 backend/flow/consts.py:189 -#: backend/flow/consts.py:262 +#: backend/db_meta/enums/instance_role.py:54 +#: backend/db_meta/enums/machine_type.py:44 backend/flow/consts.py:267 +#: backend/flow/consts.py:351 msgid "influxdb" msgstr "InfluxDB" -#: backend/db_meta/enums/instance_role.py:49 -#: backend/db_meta/enums/machine_type.py:45 -msgid "pulsar_bookkeeper" -msgstr "pulsar_bookkeeper" +#: backend/db_meta/enums/instance_role.py:57 +msgid "Bookkeeper" +msgstr "Bookkeeper" -#: backend/db_meta/enums/instance_role.py:50 -#: backend/db_meta/enums/machine_type.py:44 -msgid "pulsar_zookeeper" -msgstr "pulsar_zookeeper" +#: backend/db_meta/enums/instance_role.py:64 +msgid "Follower" +msgstr "Follower" -#: backend/db_meta/enums/instance_role.py:51 -#: backend/db_meta/enums/machine_type.py:46 -msgid "pulsar_broker" -msgstr "pulsar_broker" +#: backend/db_meta/enums/instance_role.py:65 +msgid "Observer" +msgstr "Observer" -#: backend/db_meta/enums/instance_role.py:53 +#: backend/db_meta/enums/instance_role.py:68 msgid "mongo_m1" msgstr "mongo_m1" -#: backend/db_meta/enums/instance_role.py:54 +#: backend/db_meta/enums/instance_role.py:69 msgid "mongo_m2" msgstr "mongo_m2" -#: backend/db_meta/enums/instance_role.py:55 +#: backend/db_meta/enums/instance_role.py:70 msgid "mongo_m3" msgstr "mongo_m3" -#: backend/db_meta/enums/instance_role.py:56 +#: backend/db_meta/enums/instance_role.py:71 msgid "mongo_m4" msgstr "mongo_m4" -#: backend/db_meta/enums/instance_role.py:57 +#: backend/db_meta/enums/instance_role.py:72 msgid "mongo_m5" msgstr "mongo_m5" -#: backend/db_meta/enums/instance_role.py:58 +#: backend/db_meta/enums/instance_role.py:73 msgid "mongo_m6" msgstr "mongo_m6" -#: backend/db_meta/enums/instance_role.py:59 +#: backend/db_meta/enums/instance_role.py:74 msgid "mongo_m7" msgstr "mongo_m7" -#: backend/db_meta/enums/instance_role.py:60 +#: backend/db_meta/enums/instance_role.py:75 msgid "mongo_m8" msgstr "mongo_m8" -#: backend/db_meta/enums/instance_role.py:61 +#: backend/db_meta/enums/instance_role.py:76 msgid "mongo_m9" msgstr "mongo_m9" -#: backend/db_meta/enums/instance_role.py:62 +#: backend/db_meta/enums/instance_role.py:77 msgid "mongo_m10" msgstr "mongo_m10" -#: backend/db_meta/enums/instance_role.py:63 +#: backend/db_meta/enums/instance_role.py:78 msgid "mongo_backup" msgstr "mongo_backup" -#: backend/db_meta/enums/instance_role.py:65 -msgid "riak_node" -msgstr "riak_node" +#: backend/db_meta/enums/instance_role.py:84 +#: backend/db_meta/enums/machine_type.py:59 backend/flow/consts.py:1509 +msgid "vmstorage" +msgstr "vmstorage" -#: backend/db_meta/enums/instance_role.py:70 +#: backend/db_meta/enums/instance_role.py:85 +#: backend/db_meta/enums/machine_type.py:60 backend/flow/consts.py:1507 +msgid "vminsert" +msgstr "vminced" + +#: backend/db_meta/enums/instance_role.py:86 +#: backend/db_meta/enums/machine_type.py:61 backend/flow/consts.py:1508 +msgid "vmselect" +msgstr "vmselect" + +#: backend/db_meta/enums/instance_role.py:87 +#: backend/db_meta/enums/machine_type.py:62 backend/flow/consts.py:1506 +msgid "vmauth" +msgstr "vmauth" + +#: backend/db_meta/enums/instance_role.py:92 msgid "spider_master" msgstr "spider_master" -#: backend/db_meta/enums/instance_role.py:72 +#: backend/db_meta/enums/instance_role.py:94 msgid "spider_slave" msgstr "spider_slave" -#: backend/db_meta/enums/instance_role.py:74 +#: backend/db_meta/enums/instance_role.py:96 backend/flow/consts.py:1079 msgid "spider_mnt" msgstr "spider_mnt" -#: backend/db_meta/enums/instance_status.py:16 backend/db_proxy/constants.py:35 -#: backend/flow/consts.py:464 +#: backend/db_meta/enums/instance_role.py:97 +msgid "spider_slave_mnt" +msgstr "spider_slave_mnt" + +#: backend/db_meta/enums/instance_role.py:99 +msgid "spider_ctl" +msgstr "spider_ctl" + +#: backend/db_meta/enums/instance_status.py:17 backend/db_proxy/constants.py:42 +#: backend/flow/consts.py:687 msgid "running" msgstr "running" -#: backend/db_meta/enums/instance_status.py:17 backend/db_proxy/constants.py:36 -#: backend/flow/consts.py:466 +#: backend/db_meta/enums/instance_status.py:18 backend/db_proxy/constants.py:43 +#: backend/flow/consts.py:689 msgid "unavailable" msgstr "unavailable" -#: backend/db_meta/enums/instance_status.py:18 backend/db_proxy/constants.py:37 +#: backend/db_meta/enums/instance_status.py:19 backend/db_proxy/constants.py:44 msgid "restoring" msgstr "restoring" -#: backend/db_meta/enums/machine_type.py:16 backend/flow/consts.py:265 -#: backend/flow/consts.py:748 -msgid "spider" -msgstr "spider" - -#: backend/db_meta/enums/machine_type.py:17 +#: backend/db_meta/enums/machine_type.py:18 backend/flow/consts.py:1078 msgid "remote" msgstr "remote" -#: backend/db_meta/enums/machine_type.py:19 +#: backend/db_meta/enums/machine_type.py:20 msgid "backend" msgstr "backend" -#: backend/db_meta/enums/machine_type.py:20 backend/db_monitor/constants.py:28 +#: backend/db_meta/enums/machine_type.py:21 backend/db_monitor/constants.py:31 msgid "single" msgstr "single" -#: backend/db_meta/enums/machine_type.py:22 backend/flow/consts.py:183 -#: backend/flow/consts.py:257 +#: backend/db_meta/enums/machine_type.py:23 backend/flow/consts.py:261 +#: backend/flow/consts.py:346 msgid "predixy" msgstr "predixy" -#: backend/db_meta/enums/machine_type.py:23 backend/flow/consts.py:182 -#: backend/flow/consts.py:256 +#: backend/db_meta/enums/machine_type.py:24 backend/flow/consts.py:260 +#: backend/flow/consts.py:345 msgid "twemproxy" msgstr "twemproxy" -#: backend/db_meta/enums/machine_type.py:25 +#: backend/db_meta/enums/machine_type.py:26 msgid "tendiscache" msgstr "tend to cache" -#: backend/db_meta/enums/machine_type.py:26 backend/flow/consts.py:178 +#: backend/db_meta/enums/machine_type.py:27 backend/flow/consts.py:254 +#: backend/flow/consts.py:344 msgid "tendisssd" msgstr "tendisssd" -#: backend/db_meta/enums/machine_type.py:27 backend/flow/consts.py:177 +#: backend/db_meta/enums/machine_type.py:28 backend/flow/consts.py:253 +#: backend/flow/consts.py:343 msgid "tendisplus" msgstr "tend more" -#: backend/db_meta/enums/machine_type.py:29 +#: backend/db_meta/enums/machine_type.py:30 msgid "es_datanode" msgstr "en_datanode" -#: backend/db_meta/enums/machine_type.py:36 +#: backend/db_meta/enums/machine_type.py:31 +msgid "es_master" +msgstr "is_master" + +#: backend/db_meta/enums/machine_type.py:32 +msgid "es_client" +msgstr "es_client" + +#: backend/db_meta/enums/machine_type.py:34 backend/flow/consts.py:865 +#: backend/flow/consts.py:1055 backend/ticket/builders/common/constants.py:62 +#: backend/ticket/builders/common/constants.py:67 +msgid "broker" +msgstr "broker" + +#: backend/db_meta/enums/machine_type.py:35 backend/flow/consts.py:859 +#: backend/flow/consts.py:866 backend/flow/consts.py:1054 +#: backend/ticket/builders/common/constants.py:58 +#: backend/ticket/builders/common/constants.py:61 +#: backend/ticket/builders/common/constants.py:66 +msgid "zookeeper" +msgstr "zookeeper" + +#: backend/db_meta/enums/machine_type.py:37 msgid "hdfs_master" msgstr "hdfs_master" -#: backend/db_meta/enums/machine_type.py:39 +#: backend/db_meta/enums/machine_type.py:38 +msgid "hdfs_datanode" +msgstr "hdfs_datanode" + +#: backend/db_meta/enums/machine_type.py:40 backend/flow/consts.py:1189 +#: backend/flow/consts.py:1431 backend/flow/consts.py:1461 msgid "mongos" msgstr "mongos" -#: backend/db_meta/enums/machine_type.py:41 +#: backend/db_meta/enums/machine_type.py:42 msgid "mongo_config" msgstr "mongo_config" -#: backend/db_meta/enums/machine_type.py:48 backend/flow/consts.py:204 -#: backend/flow/consts.py:267 +#: backend/db_meta/enums/machine_type.py:46 +msgid "pulsar_zookeeper" +msgstr "pulsar_zookeeper" + +#: backend/db_meta/enums/machine_type.py:47 +msgid "pulsar_bookkeeper" +msgstr "pulsar_bookkeeper" + +#: backend/db_meta/enums/machine_type.py:48 +msgid "pulsar_broker" +msgstr "pulsar_broker" + +#: backend/db_meta/enums/machine_type.py:50 backend/flow/consts.py:282 +#: backend/flow/consts.py:356 msgid "riak" msgstr "ripple" +#: backend/db_meta/enums/machine_type.py:52 +msgid "doris_backend" +msgstr "doris_backend" + +#: backend/db_meta/enums/machine_type.py:53 +msgid "doris_follower" +msgstr "doris_follower" + +#: backend/db_meta/enums/machine_type.py:54 +msgid "doris_observer" +msgstr "doris_observer" + +#: backend/db_meta/enums/machine_type.py:56 +msgid "sqlserver_single" +msgstr "sqlserver_single" + +#: backend/db_meta/enums/machine_type.py:57 +msgid "sqlserver_ha" +msgstr "sqlserver_ha" + #: backend/db_meta/exceptions.py:18 msgid "DBMeta模块异常" msgstr "DBMeta module exception" #: backend/db_meta/exceptions.py:23 backend/db_meta/exceptions.py:101 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:23 #: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:23 #: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:22 #: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:22 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:22 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:22 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:23 msgid "通用异常" msgstr "generic exception" #: backend/db_meta/exceptions.py:24 backend/db_meta/exceptions.py:102 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:24 #: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:24 #: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:35 #: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:24 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:35 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:23 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:29 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:47 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:53 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:59 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:65 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:24 #, python-brace-format msgid "{message}" msgstr "{message}" @@ -2506,8 +3831,8 @@ msgid "新建TenDBHA前置检查异常" msgstr "New TenDBHA pre-check exception" #: backend/db_meta/exceptions.py:30 backend/db_meta/exceptions.py:66 -#: backend/db_services/redis_dts/exceptions.py:24 -#: backend/db_services/redis_dts/exceptions.py:30 +#: backend/db_services/redis/redis_dts/exceptions.py:24 +#: backend/db_services/redis/redis_dts/exceptions.py:30 #: backend/flow/engine/exceptions.py:33 #: backend/flow/utils/mysql/db_table_filter/exception.py:24 #, python-brace-format @@ -2611,12 +3936,33 @@ msgid "集群访问入口 {entry} 不存在" msgstr "Cluster access entry {entry} does not exist" #: backend/db_meta/exceptions.py:107 +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:57 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:94 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:67 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:84 +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:69 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:70 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:63 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:53 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:40 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:72 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:86 +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:117 +#: backend/flow/plugins/components/collections/common/drop_random_job_user.py:151 +#: backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py:82 +#: backend/flow/plugins/components/collections/sqlserver/drop_random_job_user.py:67 msgid "集群不存在" msgstr "cluster does not exist" #: backend/db_meta/exceptions.py:108 +#, python-brace-format msgid "集群类型:{cluster_type}, ID:{cluster_id}, 域名:{immute_domain} 不存在" -msgstr "Cluster type: {cluster_type}, ID: {cluster_id}, immute_domain:{immute_domain} does not exist" +msgstr "" +"Cluster type: {cluster_type}, ID: {cluster_id}, immute_domain:" +"{immute_domain} does not exist" #: backend/db_meta/exceptions.py:113 msgid "实例不存在" @@ -2632,26 +3978,33 @@ msgid "执行互斥" msgstr "execute mutex" #: backend/db_meta/exceptions.py:120 +#, python-brace-format msgid "" "操作{ticket_type}与集群{cluster_id}正在运行的动作{active_ticket_type}存在互" "斥/重复操作" -msgstr "The action {ticket_type} and the action {active_ticket_type} that the cluster {cluster_id} is running are mutually exclusive/duplicate" +msgstr "" +"The action {ticket_type} and the action {active_ticket_type} that the " +"cluster {cluster_id} is running are mutually exclusive/duplicate" #: backend/db_meta/exceptions.py:125 msgid "主库不存在" msgstr "The master does not exist" #: backend/db_meta/exceptions.py:126 +#, python-brace-format msgid "集群类型:{cluster_type}, ID:{cluster_id} 主库不存在" -msgstr "Cluster type: {cluster_type}, ID: {cluster_id} master database does not exist" +msgstr "" +"Cluster type: {cluster_type}, ID: {cluster_id} master database does not exist" #: backend/db_meta/exceptions.py:131 msgid "集群不支持分片" msgstr "Cluster does not support sharding" #: backend/db_meta/exceptions.py:132 +#, python-brace-format msgid "集群类型:{cluster_type}, ID:{cluster_id} 没有数据分片逻辑" -msgstr "Cluster type: {cluster_type}, ID: {cluster_id} without data sharding logic" +msgstr "" +"Cluster type: {cluster_type}, ID: {cluster_id} without data sharding logic" #: backend/db_meta/exceptions.py:137 msgid "无效中控主节点" @@ -2666,31 +4019,24 @@ msgid "集群 proxy 无附加信息" msgstr "Cluster proxy No additional information" #: backend/db_meta/exceptions.py:144 +#, python-brace-format msgid "集群类型:{cluster_type} proxy 无附加信息" msgstr "Cluster type: {cluster_type} proxy No additional information" #: backend/db_meta/exceptions.py:149 -msgid "部署方案不匹配" -msgstr "Deployment scheme does not match" - -#: backend/db_meta/exceptions.py:150 -msgid "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" -msgstr "Cluster type: {cluster_type} and deployment plan: {deploy_plan_class} do not match" - -#: backend/db_meta/exceptions.py:155 msgid "部署方案使用中" msgstr "The deployment plan is in use" -#: backend/db_meta/exceptions.py:156 +#: backend/db_meta/exceptions.py:150 #, python-brace-format msgid "部署方案:{name} 被 {ref_cnt} 个集群引用" msgstr "Deployment scheme: {name} is referenced by {ref_cnt} clusters" -#: backend/db_meta/exceptions.py:161 +#: backend/db_meta/exceptions.py:155 msgid "访问入口请求转发和IP绑定混用" msgstr "Access entry request forwarding and IP binding are mixed" -#: backend/db_meta/exceptions.py:162 +#: backend/db_meta/exceptions.py:156 #, python-brace-format msgid "" "访问入口 {entry} 绑定到 {bind_cnt} 台机器, 转发到 {forward_to} 不能同时存在" @@ -2698,142 +4044,244 @@ msgstr "" "The access entry {entry} is bound to {bind_cnt} machines, forwarded to " "{forward_to} cannot exist at the same time" -#: backend/db_meta/exceptions.py:167 +#: backend/db_meta/exceptions.py:161 msgid "访问入口未绑定" msgstr "Access entry is not bound" -#: backend/db_meta/exceptions.py:168 +#: backend/db_meta/exceptions.py:162 +#, python-brace-format msgid "访问入口 {entry} 未绑定到 IP" msgstr "The access entry {entry} is not bound to an IP" -#: backend/db_meta/models/app.py:29 -msgid "业务的 cmdb id" -msgstr "business cmdb id" - -#: backend/db_meta/models/app.py:30 -msgid "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" -msgstr "" -"The business needs to add a new set under the dba business, and the set id " -"needs to be recorded" - -#: backend/db_meta/models/app.py:37 backend/db_services/cmdb/serializers.py:20 +#: backend/db_meta/models/app.py:27 backend/db_services/cmdb/serializers.py:38 msgid "业务英文名" msgstr "Business English name" -#: backend/db_meta/models/app.py:38 +#: backend/db_meta/models/app.py:28 msgid "业务中文名" msgstr "Business Chinese name" -#: backend/db_meta/models/app.py:39 +#: backend/db_meta/models/app.py:29 msgid "语言" msgstr "language" -#: backend/db_meta/models/app.py:40 +#: backend/db_meta/models/app.py:30 msgid "时区" msgstr "Time zone" -#: backend/db_meta/models/app.py:41 +#: backend/db_meta/models/app.py:31 backend/db_monitor/mock_data.py:25 msgid "运维人员" msgstr "Operation and maintenance personnel" -#: backend/db_meta/models/app.py:44 backend/db_meta/models/app.py:45 -msgid "CMDB业务信息缓存表" -msgstr "CMDB business information cache table" +#: backend/db_meta/models/app.py:34 +msgid "CMDB业务信息缓存表(AppCache)" +msgstr "CMDB business information cache table (AppCache)" -#: backend/db_meta/models/cluster.py:41 +#: backend/db_meta/models/city_map.py:30 +msgid "逻辑城市表(LogicalCity)" +msgstr "Logical City Table (LogicalCity)" + +#: backend/db_meta/models/city_map.py:39 +msgid "IDC 城市名" +msgstr "IDC city name" + +#: backend/db_meta/models/city_map.py:46 +msgid "蓝鲸城市表(BKCity)" +msgstr "Blue Whale City List (BKCity)" + +#: backend/db_meta/models/cluster.py:56 msgid "集群英文名" msgstr "Cluster English name" -#: backend/db_meta/models/cluster.py:42 -#: backend/db_services/bigdata/resources/query.py:41 -#: backend/db_services/redis/resources/redis_cluster/query.py:55 +#: backend/db_meta/models/cluster.py:57 +#: backend/db_services/bigdata/resources/query.py:39 +#: backend/db_services/dbbase/resources/query.py:85 +#: backend/db_services/dbbase/resources/query.py:161 +#: backend/db_services/redis/resources/redis_cluster/query.py:59 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:28 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:37 msgid "集群别名" msgstr "cluster alias" -#: backend/db_meta/models/cluster.py:47 +#: backend/db_meta/models/cluster.py:62 +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:13 msgid "主版本号" msgstr "major version number" -#: backend/db_meta/models/cluster.py:51 +#: backend/db_meta/models/cluster.py:65 backend/db_meta/models/machine.py:48 +#: backend/db_proxy/models.py:29 backend/db_proxy/models.py:48 +#: backend/db_services/dbbase/resources/query.py:153 +#: backend/db_services/ipchooser/serializers/base.py:90 +#: backend/db_services/redis/autofix/models.py:24 +msgid "云区域 ID" +msgstr "Cloud Region ID" + +#: backend/db_meta/models/cluster.py:66 +#: backend/db_services/dbbase/resources/query.py:90 msgid "地域" msgstr "region" -#: backend/db_meta/models/cluster.py:52 +#: backend/db_meta/models/cluster.py:68 +msgid "容灾要求" +msgstr "Disaster recovery requirements" + +#: backend/db_meta/models/cluster.py:70 msgid "集群所在的时区" msgstr "The time zone in which the cluster is located" -#: backend/db_meta/models/cluster.py:53 -msgid "部署方法ID" -msgstr "Deployment Method ID" +#: backend/db_meta/models/cluster.py:75 +msgid "集群(Cluster)" +msgstr "Cluster" -#: backend/db_meta/models/cluster.py:95 -msgid "当前操作「{}」与集群{}的操作「{}」存在执行互斥" -msgstr "" -"Execution mutual exclusion exists between the current operation {} and the " -"operation {} of the cluster {}" +#: backend/db_meta/models/cluster.py:150 +msgid "当前操作「{}」与集群(id:{})的操作「{}」存在执行互斥" +msgstr "The current operation {} and the operation {} of the cluster (id: {}) are mutually exclusive." -#: backend/db_meta/models/cluster.py:103 +#: backend/db_meta/models/cluster.py:158 msgid "集群运行状态异常,请检查!" msgstr "The cluster running status is abnormal, please check!" -#: backend/db_meta/models/cluster.py:106 +#: backend/db_meta/models/cluster.py:161 msgid "集群已被禁用,请先启用!" msgstr "The cluster has been disabled, please enable it first!" -#: backend/db_meta/models/cluster.py:152 -msgid "{} 未实现 status flag" -msgstr "{} unimplemented status flag" +#: backend/db_meta/models/cluster.py:231 +msgid "{} 未实现 status flag, 认为实例异常会导致集群异常" +msgstr "{} The status flag is not implemented. It is believed that instance exceptions will cause cluster exceptions." -#: backend/db_meta/models/cluster.py:172 +#: backend/db_meta/models/cluster.py:252 msgid "{} 未实现 main_storage_instance" msgstr "{} main_storage_instance is not implemented" -#: backend/db_meta/models/cluster.py:196 +#: backend/db_meta/models/cluster.py:300 +msgid "无法访问集群[]的访问端口,请检查实例信息" +msgstr "Unable to access the access port of cluster [], please check the instance information" + +#: backend/db_meta/models/cluster.py:362 msgid "{} 类型集群没有中控节点" msgstr "{} type cluster has no central control node" -#: backend/db_meta/models/cluster.py:216 -msgid "find primary show slave status failed: {}" -msgstr "find primary show slave status failed: {}" +#: backend/db_meta/models/cluster.py:382 backend/db_meta/models/cluster.py:465 +msgid "get primary failed: {}" +msgstr "get primary failed: {}" + +#: backend/db_meta/models/cluster.py:440 +msgid "集群id:{} {} 类型集群没有中控节点" +msgstr "Cluster id: {} {} type cluster does not have a central control node" + +#: backend/db_meta/models/cluster.py:484 +msgid "屏蔽开始时间" +msgstr "Blocking start time" + +#: backend/db_meta/models/cluster.py:485 +msgid "屏蔽结束时间" +msgstr "Block end time" -#: backend/db_meta/models/cluster_monitor.py:204 -#: backend/db_meta/models/cluster_monitor.py:205 -msgid "业务监控拓扑" -msgstr "Business Monitoring Topology" +#: backend/db_meta/models/cluster_entry.py:54 +msgid "集群访问入口(ClusterEntry)" +msgstr "Cluster access entry (ClusterEntry)" -#: backend/db_meta/models/cluster_monitor.py:217 +#: backend/db_meta/models/cluster_monitor.py:149 +#: backend/db_meta/models/cluster_monitor.py:150 +msgid "业务监控拓扑(AppMonitorTopo)" +msgstr "Business monitoring topology (AppMonitorTopo)" + +#: backend/db_meta/models/cluster_monitor.py:277 msgid "实例ID,兼容单实例存储组件influxdb" msgstr "" "Instance ID, compatible with single instance storage component influxdb" -#: backend/db_meta/models/cluster_monitor.py:223 -#: backend/db_meta/models/cluster_monitor.py:224 -msgid "CMDB模块映射" -msgstr "CMDB module mapping" +#: backend/db_meta/models/cluster_monitor.py:283 +#: backend/db_meta/models/cluster_monitor.py:284 +msgid "CMDB模块映射(ClusterMonitorTopo)" +msgstr "CMDB module mapping (ClusterMonitorTopo)" + +#: backend/db_meta/models/cluster_monitor.py:295 +#: backend/db_meta/models/cluster_monitor.py:296 +msgid "同步失败的IP(SyncFailedMachine)" +msgstr "IP that failed to synchronize (SyncFailedMachine)" + +#: backend/db_meta/models/db_module.py:31 +msgid "dbmodule 别名,用于生成域名" +msgstr "dbmodule alias, used to generate domain names" + +#: backend/db_meta/models/db_module.py:36 +msgid "DB模块(DBModule)" +msgstr "DB module (DBModule)" + +#: backend/db_meta/models/extra_process.py:32 +#: backend/db_meta/models/sqlserver_dts.py:54 +#: backend/db_services/mysql/dumper/models.py:26 +msgid "关联的业务id,对应cmdb" +msgstr "Associated business id, corresponding to cmdb" + +#: backend/db_meta/models/extra_process.py:33 +msgid "关联的cluster_id" +msgstr "associated cluster_id" + +#: backend/db_meta/models/extra_process.py:34 +msgid "云区域 ID,对应cmdb" +msgstr "Cloud area ID, corresponding to cmdb" + +#: backend/db_meta/models/extra_process.py:35 +msgid "服务实例id,对应cmdb" +msgstr "Service instance id, corresponding to cmdb" + +#: backend/db_meta/models/extra_process.py:36 +#: backend/db_meta/models/machine.py:30 +msgid "IP 地址" +msgstr "IP address" + +#: backend/db_meta/models/extra_process.py:38 +msgid "进程类型" +msgstr "process type" + +#: backend/db_meta/models/extra_process.py:40 +#: backend/db_meta/models/instance.py:140 +#: backend/db_meta/models/instance.py:188 backend/db_package/models.py:28 +#: backend/ticket/builders/common/bigdata.py:122 +#: backend/ticket/builders/influxdb/influxdb_apply.py:37 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:41 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:38 +#: backend/ticket/builders/redis/redis_cluster_apply.py:38 +#: backend/ticket/builders/redis/redis_instance_apply.py:43 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:46 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:53 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:56 +msgid "版本号" +msgstr "version number" + +#: backend/db_meta/models/extra_process.py:41 +msgid "进程监听端口" +msgstr "Process listening port" -#: backend/db_meta/models/cluster_monitor.py:234 -#: backend/db_meta/models/cluster_monitor.py:235 -msgid "同步失败的IP" -msgstr "Sync failed IP" +#: backend/db_meta/models/extra_process.py:43 +msgid "进程的定制化属性" +msgstr "Process customization properties" + +#: backend/db_meta/models/extra_process.py:46 +msgid "附属进程实例(ExtraProcessInstance)" +msgstr "Additional process instance (ExtraProcessInstance)" #: backend/db_meta/models/group.py:23 msgid "分组名" msgstr "group name" #: backend/db_meta/models/group.py:26 backend/db_meta/models/group.py:27 -msgid "分组表" -msgstr "group table" +msgid "分组表(Group)" +msgstr "Group table (Group)" #: backend/db_meta/models/group.py:34 #: backend/db_services/bigdata/influxdb/serializers.py:20 -#: backend/ticket/builders/influxdb/influxdb_apply.py:34 +#: backend/ticket/builders/influxdb/influxdb_apply.py:40 msgid "分组ID" msgstr "Group ID" #: backend/db_meta/models/group.py:35 -#: backend/ticket/builders/common/bigdata.py:209 -#: backend/ticket/builders/common/bigdata.py:275 -#: backend/ticket/models/ticket.py:300 backend/ticket/serializers.py:225 +#: backend/db_services/dbresource/serializers.py:333 +#: backend/ticket/builders/common/bigdata.py:225 +#: backend/ticket/builders/common/bigdata.py:303 +#: backend/ticket/models/ticket.py:395 backend/ticket/serializers.py:282 msgid "实例ID" msgstr "Instance ID" @@ -2841,284 +4289,1066 @@ msgstr "Instance ID" msgid "分组和实例关系绑定表" msgstr "Grouping and instance relationship binding tables" -#: backend/db_meta/models/instance.py:52 +#: backend/db_meta/models/instance.py:82 msgid "实例结构和状态变更中,请稍后!" msgstr "Instance structure and state changes, please wait!" -#: backend/db_meta/models/instance.py:55 +#: backend/db_meta/models/instance.py:85 msgid "实例运行状态异常,请检查!" msgstr "The running status of the instance is abnormal, please check!" -#: backend/db_meta/models/instance.py:83 backend/db_meta/models/instance.py:156 -#: backend/db_package/models.py:26 -#: backend/ticket/builders/common/bigdata.py:115 -#: backend/ticket/builders/influxdb/influxdb_apply.py:31 -#: backend/ticket/builders/redis/redis_cluster_apply.py:37 -msgid "版本号" -msgstr "version number" - -#: backend/db_meta/models/instance.py:100 -#: backend/db_meta/models/instance.py:174 +#: backend/db_meta/models/instance.py:157 +#: backend/db_meta/models/instance.py:207 msgid "实例所在的时区" msgstr "The time zone where the instance is located" -#: backend/db_meta/models/instance.py:101 -#: backend/db_meta/models/instance.py:175 +#: backend/db_meta/models/instance.py:158 +#: backend/db_meta/models/instance.py:208 msgid "对应在cc的服务实例的id" msgstr "The id corresponding to the service instance in cc" -#: backend/db_meta/models/instance.py:102 +#: backend/db_meta/models/instance.py:159 msgid "多 slave 的备选标志" msgstr "Alternate flag for multiple slaves" -#: backend/db_meta/models/machine.py:48 +#: backend/db_meta/models/instance.py:162 +msgid "存储实例(StorageInstance)" +msgstr "StorageInstance" + +#: backend/db_meta/models/instance.py:211 +msgid "代理实例(ProxyInstance)" +msgstr "ProxyInstance" + +#: backend/db_meta/models/machine.py:38 +msgid "操作系统" +msgstr "operating system" + +#: backend/db_meta/models/machine.py:39 +msgid "区域" +msgstr "area" + +#: backend/db_meta/models/machine.py:40 +msgid "区域 ID" +msgstr "area ID" + +#: backend/db_meta/models/machine.py:41 +msgid "子 Zone" +msgstr "Child Zone" + +#: backend/db_meta/models/machine.py:42 +msgid "子 Zone ID" +msgstr "Child Zone ID" + +#: backend/db_meta/models/machine.py:43 +msgid "机架" +msgstr "frame" + +#: backend/db_meta/models/machine.py:44 +msgid "机架 ID" +msgstr "Rack ID" + +#: backend/db_meta/models/machine.py:45 +msgid "标准设备类型" +msgstr "Standard Equipment Type" + +#: backend/db_meta/models/machine.py:46 +#: backend/db_services/dbbase/resources/query.py:158 +msgid "机房" +msgstr "engine room" + +#: backend/db_meta/models/machine.py:47 +msgid "机房 ID" +msgstr "computer room ID" + +#: backend/db_meta/models/machine.py:49 +msgid "Agent ID" +msgstr "Agent ID" + +#: backend/db_meta/models/machine.py:51 msgid "虚拟规格ID" msgstr "Virtual Spec ID" -#: backend/db_meta/models/machine.py:49 +#: backend/db_meta/models/machine.py:52 msgid "当前的虚拟规格配置" msgstr "Current virtual specification configuration" -#: backend/db_meta/models/spec.py:26 +#: backend/db_meta/models/machine.py:53 +msgid "机器采集的系统信息" +msgstr "System information collected by the machine" + +#: backend/db_meta/models/machine.py:57 +msgid "机器主机(Machine)" +msgstr "Machine host (Machine)" + +#: backend/db_meta/models/spec.py:35 msgid "虚拟规格名称" msgstr "virtual specification name" -#: backend/db_meta/models/spec.py:28 +#: backend/db_meta/models/spec.py:37 msgid "集群类型:MySQL、Proxy、Spider" msgstr "Cluster type: MySQL, Proxy, Spider" -#: backend/db_meta/models/spec.py:30 +#: backend/db_meta/models/spec.py:39 msgid "机器规格类型" msgstr "Machine specification type" -#: backend/db_meta/models/spec.py:31 backend/db_meta/models/spec.py:93 +#: backend/db_meta/models/spec.py:40 +msgid "cpu规格描述:{\"min\":1,\"max\":10}" +msgstr "cpu specification description: {\"min\":1,\"max\":10}" + +#: backend/db_meta/models/spec.py:41 +msgid "mem规格描述:{\"min\":100,\"max\":1000}" +msgstr "mem specification description: {\"min\":100,\"max\":1000}" + +#: backend/db_meta/models/spec.py:42 +msgid "实际机器机型: [\"class1\",\"class2\"]" +msgstr "Actual machine model: [\"class1\",\"class2\"]" + +#: backend/db_meta/models/spec.py:44 +msgid "" +"存储磁盘需求配置:[{\"mount_point\":\"/data\",\"size\":500,\"type\":\"ssd\"}]" +msgstr "Storage disk requirement configuration: [{\"mount_point\":\"/data\",\"size\":500,\"type\":\"ssd\"}]" + +#: backend/db_meta/models/spec.py:46 backend/db_meta/models/spec.py:255 +msgid "资源规格描述" +msgstr "Resource specification description" + +#: backend/db_meta/models/spec.py:47 backend/db_monitor/models/alarm.py:241 +#: backend/db_monitor/models/alarm.py:351 +#: backend/db_monitor/models/alarm.py:371 backend/db_monitor/views/policy.py:52 +#: backend/db_package/models.py:40 +#: backend/db_services/dbresource/serializers.py:317 +msgid "是否启用" +msgstr "Whether to enable" + +#: backend/db_meta/models/spec.py:49 +msgid "实例数(es专属)" +msgstr "Number of instances (es exclusive)" + +#: backend/db_meta/models/spec.py:51 +msgid "qps规格描述:{\"min\": 1, \"max\": 100}" +msgstr "qps specification description: {\"min\": 1, \"max\": 100}" + +#: backend/db_meta/models/spec.py:54 +msgid "资源规格(Spec)" +msgstr "Resource specification (Spec)" + +#: backend/db_meta/models/spec.py:251 msgid "cpu规格描述:{'min':1,'max':10}" msgstr "cpu specification description: {'min':1,'max':10}" -#: backend/db_meta/models/spec.py:32 backend/db_meta/models/spec.py:94 +#: backend/db_meta/models/spec.py:252 msgid "mem规格描述:{'min':100,'max':1000}" msgstr "mem specification description: {'min':100,'max':1000}" -#: backend/db_meta/models/spec.py:33 backend/db_meta/models/spec.py:95 +#: backend/db_meta/models/spec.py:253 msgid "实际机器机型: ['class1','class2'] " msgstr "Actual machine type: ['class1','class2']" -#: backend/db_meta/models/spec.py:34 -msgid "存储磁盘需求配置:{'mount_point':'/data','size':500,'type':'ssd'}" -msgstr "" -"Storage disk requirements configuration: {'mount_point':'/" -"data','size':500,'type':'ssd'}" +#: backend/db_meta/models/sqlserver_dts.py:32 +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:146 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:137 +msgid "待执行" +msgstr "To be executed" -#: backend/db_meta/models/spec.py:35 backend/db_meta/models/spec.py:97 -msgid "资源规格描述" -msgstr "Resource specification description" +#: backend/db_meta/models/sqlserver_dts.py:33 backend/ticket/constants.py:56 +#: backend/ticket/flow_manager/itsm.py:74 +msgid "已终止" +msgstr "terminated" + +#: backend/db_meta/models/sqlserver_dts.py:34 +msgid "中断中" +msgstr "Interrupted" + +#: backend/db_meta/models/sqlserver_dts.py:35 +msgid "已断开" +msgstr "Disconnected" + +#: backend/db_meta/models/sqlserver_dts.py:38 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:133 +msgid "全量传输中" +msgstr "Full transfer in progress" + +#: backend/db_meta/models/sqlserver_dts.py:39 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:135 +msgid "全量传输失败" +msgstr "Full transfer failed" + +#: backend/db_meta/models/sqlserver_dts.py:40 +msgid "全量传输完成" +msgstr "Full transfer completed" + +#: backend/db_meta/models/sqlserver_dts.py:43 +msgid "增量传输中" +msgstr "Incremental transfer in progress" + +#: backend/db_meta/models/sqlserver_dts.py:44 +msgid "增量传输失败" +msgstr "Incremental transfer failed" + +#: backend/db_meta/models/sqlserver_dts.py:45 +msgid "增量传输完成" +msgstr "Incremental transfer completed" + +#: backend/db_meta/models/sqlserver_dts.py:55 +#: backend/db_services/mysql/open_area/models.py:29 +#: backend/ticket/builders/mysql/mysql_data_migrate.py:26 +#: backend/ticket/builders/mysql/mysql_openarea.py:48 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:44 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:48 +msgid "源集群ID" +msgstr "Source cluster ID" + +#: backend/db_meta/models/sqlserver_dts.py:56 +#: backend/ticket/builders/mysql/mysql_openarea.py:31 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:45 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:49 +msgid "目标集群ID" +msgstr "Target cluster ID" + +#: backend/db_meta/models/sqlserver_dts.py:57 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:50 +msgid "库正则" +msgstr "library regular" + +#: backend/db_meta/models/sqlserver_dts.py:58 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:47 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:51 +msgid "忽略库正则" +msgstr "Ignore library regex" + +#: backend/db_meta/models/sqlserver_dts.py:59 +msgid "迁移类型" +msgstr "Migration type" + +#: backend/db_meta/models/sqlserver_dts.py:60 +msgid "关联的单据id" +msgstr "associated document id" + +#: backend/db_meta/models/sqlserver_dts.py:61 +msgid "关联root_id" +msgstr "Associated root_id" + +#: backend/db_meta/models/sqlserver_dts.py:63 +#: backend/db_services/bigdata/influxdb/serializers.py:19 +#: backend/db_services/dbbase/resources/serializers.py:32 +#: backend/db_services/dbbase/resources/serializers.py:102 +#: backend/db_services/plugin/mysql/authorize/serializers.py:56 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:21 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:34 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:40 +#: backend/db_services/redis/toolbox/serializers.py:190 +#: backend/ticket/serializers.py:85 backend/ticket/serializers.py:265 +msgid "状态" +msgstr "state" + +#: backend/db_meta/models/sqlserver_dts.py:65 +msgid "迁移配置" +msgstr "Migrate configuration" -#: backend/db_meta/models/spec.py:69 -msgid "集群分片总数" -msgstr "Total number of cluster shards" +#: backend/db_meta/models/sqlserver_dts.py:68 +msgid "sqlserver数据迁移记录表" +msgstr "sqlserver data migration record table" -#: backend/db_meta/models/spec.py:70 -msgid "集群存储预估总容量/G" -msgstr "Estimated total capacity of cluster storage/G" +#: backend/db_meta/models/sqlserver_dts.py:107 +msgid "当前操作「{}(单据:{})」与迁移记录(关联单据:{})存在执行互斥" +msgstr "The current operation {}(document: {}) and the migration record (associated document: {}) are mutually exclusive." -#: backend/db_meta/models/spec.py:71 -msgid "机器组数: (每组两台)" -msgstr "Number of machine groups: (two for each group)" +#: backend/db_meta/models/storage_instance_tuple.py:33 +msgid "存储实例元组对(StorageInstanceTuple)" +msgstr "Storage instance tuple pair (StorageInstanceTuple)" -#: backend/db_meta/models/spec.py:74 -msgid "方案描述" -msgstr "Program description" +#: backend/db_meta/models/tag.py:21 +msgid "tag名称" +msgstr "tag name" -#: backend/db_meta/views/helper/views.py:34 -msgid "drop_cluster - 方便调试,后面去掉" -msgstr "drop_cluster - convenient for debugging, removed later" +#: backend/db_meta/models/tag.py:22 +msgid "tag类型" +msgstr "tag type" -#: backend/db_meta/views/helper/views.py:68 +#: backend/db_meta/models/tag.py:23 +msgid "关联集群" +msgstr "Associated clusters" + +#: backend/db_meta/utils.py:72 backend/db_meta/utils.py:143 msgid "清理集群" msgstr "Clean up the cluster" -#: backend/db_meta/views/helper/views.py:80 -msgid "drop_my_cluster - 方便调试,后面去掉" -msgstr "drop_my_cluster - convenient for debugging, removed later" - -#: backend/db_monitor/constants.py:25 +#: backend/db_monitor/constants.py:28 backend/db_monitor/constants.py:47 +#: backend/db_monitor/constants.py:57 msgid "platform" msgstr "platform" -#: backend/db_monitor/constants.py:26 +#: backend/db_monitor/constants.py:29 msgid "app" msgstr "app" -#: backend/db_monitor/constants.py:27 +#: backend/db_monitor/constants.py:30 msgid "cluster" msgstr "cluster" -#: backend/db_monitor/models.py:25 backend/db_monitor/models.py:49 -#: backend/db_monitor/models.py:67 backend/db_monitor/models.py:87 +#: backend/db_monitor/constants.py:37 +msgid "固定值班" +msgstr "Fixed duty" + +#: backend/db_monitor/constants.py:38 +msgid "交替轮值" +msgstr "alternate duty" + +#: backend/db_monitor/constants.py:48 backend/db_monitor/constants.py:58 +msgid "app id" +msgstr "app id" + +#: backend/db_monitor/constants.py:49 backend/db_monitor/constants.py:59 +msgid "db module" +msgstr "db module" + +#: backend/db_monitor/constants.py:50 backend/db_monitor/constants.py:60 +msgid "cluster domain" +msgstr "cluster domain" + +#: backend/db_monitor/constants.py:76 +msgid "有效" +msgstr "efficient" + +#: backend/db_monitor/constants.py:77 +msgid "监控目标已失效" +msgstr "Monitoring target has expired" + +#: backend/db_monitor/constants.py:83 +msgid "等于" +msgstr "equal" + +#: backend/db_monitor/constants.py:84 +msgid "不等于" +msgstr "not equal to" + +#: backend/db_monitor/constants.py:85 +msgid "小于" +msgstr "less than" + +#: backend/db_monitor/constants.py:86 +msgid "大于" +msgstr "greater than" + +#: backend/db_monitor/constants.py:87 +msgid "小于等于" +msgstr "less than or equal to" + +#: backend/db_monitor/constants.py:88 +msgid "大于等于" +msgstr "Greater than or equal to" + +#: backend/db_monitor/constants.py:94 +msgid "致命" +msgstr "fatal" + +#: backend/db_monitor/constants.py:95 +msgid "预警" +msgstr "early warning" + +#: backend/db_monitor/constants.py:96 +msgid "提醒" +msgstr "remind" + +#: backend/db_monitor/constants.py:102 +msgid "时序数据" +msgstr "Time series data" + +#: backend/db_monitor/constants.py:103 +msgid "事件数据" +msgstr "event data" + +#: backend/db_monitor/constants.py:104 +msgid "日志关键字" +msgstr "Log keyword" + +#: backend/db_monitor/constants.py:110 +msgid "阈值检测" +msgstr "threshold detection" + +#: backend/db_monitor/constants.py:116 +msgid "基于分派规则通知" +msgstr "Notification based on dispatch rules" + +#: backend/db_monitor/constants.py:117 +msgid "基于告警组直接通知" +msgstr "Direct notification based on alarm group" + +#: backend/db_monitor/constants.py:177 +msgid "平台级分派给业务" +msgstr "Platform level assignment to business" + +#: backend/db_monitor/exceptions.py:19 +msgid "监控异常" +msgstr "Monitoring anomalies" + +#: backend/db_monitor/exceptions.py:24 +msgid "内置告警组不允许删除" +msgstr "Built-in alarm groups are not allowed to be deleted" + +#: backend/db_monitor/exceptions.py:29 +msgid "监控策略保存失败" +msgstr "Monitoring policy failed to save" + +#: backend/db_monitor/exceptions.py:30 +#, python-brace-format +msgid "监控策略保存失败: {message}" +msgstr "Monitoring policy failed to save: {message}" + +#: backend/db_monitor/exceptions.py:35 +msgid "监控策略删除失败" +msgstr "Monitoring policy deletion failed" + +#: backend/db_monitor/exceptions.py:36 +#, python-brace-format +msgid "监控策略删除失败: {message}" +msgstr "Monitoring policy deletion failed: {message}" + +#: backend/db_monitor/exceptions.py:41 +msgid "故障自愈异常" +msgstr "Fault self-healing exception" + +#: backend/db_monitor/exceptions.py:42 +#, python-brace-format +msgid "故障自愈异常: {message}" +msgstr "Fault self-healing exception: {message}" + +#: backend/db_monitor/mock_data.py:21 +msgid "群机器人" +msgstr "swarm robots" + +#: backend/db_monitor/mock_data.py:26 +msgid "产品人员" +msgstr "product people" + +#: backend/db_monitor/mock_data.py:27 +msgid "测试人员" +msgstr "tester" + +#: backend/db_monitor/mock_data.py:28 +msgid "开发人员" +msgstr "Developer" + +#: backend/db_monitor/mock_data.py:29 +msgid "主负责人" +msgstr "Main person in charge" + +#: backend/db_monitor/mock_data.py:30 +msgid "备份负责人" +msgstr "Backup person in charge" + +#: backend/db_monitor/mock_data.py:111 +msgid "自定义告警组名称" +msgstr "Custom alarm group name" + +#: backend/db_monitor/mock_data.py:128 +msgid "新建告警组1" +msgstr "Create new alarm group 1" + +#: backend/db_monitor/mock_data.py:134 +msgid "新建告警组2" +msgstr "Create new alarm group 2" + +#: backend/db_monitor/mock_data.py:141 +msgid "更新告警组" +msgstr "Update alarm group" + +#: backend/db_monitor/mock_data.py:143 +msgid "策略 A" +msgstr "Strategy A" + +#: backend/db_monitor/mock_data.py:143 +msgid "策略 B" +msgstr "Strategy B" + +#: backend/db_monitor/mock_data.py:146 +msgid "周末轮值" +msgstr "weekend duty" + +#: backend/db_monitor/mock_data.py:164 +msgid "固定排班" +msgstr "Fixed shift" + +#: backend/db_monitor/mock_data.py:223 +msgid "mysql 周末轮值 告警组" +msgstr "mysql weekend rotation alarm group" + +#: backend/db_monitor/models/alarm.py:56 backend/db_monitor/models/alarm.py:342 +#: backend/db_monitor/models/alarm.py:360 +#: backend/db_monitor/models/alarm.py:393 +#: backend/db_monitor/models/alarm.py:516 +#: backend/db_monitor/models/collect.py:41 msgid "业务ID, 0代表全业务" msgstr "Business ID, 0 means full business" -#: backend/db_monitor/models.py:26 +#: backend/db_monitor/models/alarm.py:57 +msgid "告警通知组名称" +msgstr "Alarm notification group name" + +#: backend/db_monitor/models/alarm.py:58 msgid "监控通知组ID" msgstr "Monitoring notification group ID" -#: backend/db_monitor/models.py:28 -msgid "告警通知组类别" -msgstr "Alarm notification group category" +#: backend/db_monitor/models/alarm.py:59 backend/db_monitor/models/alarm.py:239 +msgid "监控轮值规则 ID" +msgstr "Monitoring duty rule ID" -#: backend/db_monitor/models.py:34 +#: backend/db_monitor/models/alarm.py:61 +msgid "告警接收人员/组列表" +msgstr "Alarm recipient/group list" + +#: backend/db_monitor/models/alarm.py:62 +msgid "通知方式详情" +msgstr "Notification method details" + +#: backend/db_monitor/models/alarm.py:63 +msgid "是否内置" +msgstr "Is it built-in" + +#: backend/db_monitor/models/alarm.py:64 backend/db_monitor/models/alarm.py:400 +#: backend/db_monitor/models/alarm.py:603 +#: backend/db_monitor/models/collect.py:69 +msgid "最近一次的同步时间" +msgstr "Last sync time" + +#: backend/db_monitor/models/alarm.py:65 msgid "自动同步DBA人员配置" msgstr "Automatic synchronization of DBA personnel configuration" -#: backend/db_monitor/models.py:37 -msgid "告警通知组" -msgstr "Alarm notification group" +#: backend/db_monitor/models/alarm.py:68 +msgid "告警通知组(NoticeGroup)" +msgstr "Alarm notification group (NoticeGroup)" + +#: backend/db_monitor/models/alarm.py:238 +msgid "轮值规则名称" +msgstr "Rotation rule name" + +#: backend/db_monitor/models/alarm.py:240 +msgid "优先级" +msgstr "priority" + +#: backend/db_monitor/models/alarm.py:242 +msgid "生效时间" +msgstr "Effective time" + +#: backend/db_monitor/models/alarm.py:243 +msgid "截止时间" +msgstr "Deadline" -#: backend/db_monitor/models.py:50 backend/db_monitor/models.py:70 +#: backend/db_monitor/models/alarm.py:244 +msgid "轮值类型" +msgstr "Rotation type" + +#: backend/db_monitor/models/alarm.py:246 +msgid "轮值人员设置" +msgstr "Rotation staff settings" + +#: backend/db_monitor/models/alarm.py:336 +msgid "轮值规则(DutyRule)" +msgstr "DutyRule" + +#: backend/db_monitor/models/alarm.py:343 +#: backend/db_monitor/models/alarm.py:363 msgid "监控策略ID" msgstr "Monitoring Policy ID" -#: backend/db_monitor/models.py:52 backend/db_monitor/models.py:72 -msgid "策略名称" -msgstr "policy name" +#: backend/db_monitor/models/alarm.py:345 +msgid "策略名称监控侧要求唯一" +msgstr "The policy name on the monitoring side must be unique" -#: backend/db_monitor/models.py:54 backend/db_monitor/models.py:74 -#: backend/db_monitor/models.py:90 backend/db_package/filters.py:21 +#: backend/db_monitor/models/alarm.py:347 +#: backend/db_monitor/models/alarm.py:367 +#: backend/db_monitor/models/alarm.py:519 +#: backend/db_monitor/models/collect.py:45 backend/db_package/filters.py:21 +#: backend/iam_app/dataclass/resources.py:192 msgid "DB类型" msgstr "DB type" -#: backend/db_monitor/models.py:57 +#: backend/db_monitor/models/alarm.py:350 msgid "模板详情" msgstr "Template details" -#: backend/db_monitor/models.py:58 backend/db_monitor/models.py:78 -msgid "是否启用" -msgstr "Whether to enable" - -#: backend/db_monitor/models.py:61 +#: backend/db_monitor/models/alarm.py:354 msgid "告警策略模板" msgstr "Alert Policy Template" -#: backend/db_monitor/models.py:69 +#: backend/db_monitor/models/alarm.py:362 msgid "监控模板ID" msgstr "Monitoring Template ID" -#: backend/db_monitor/models.py:77 +#: backend/db_monitor/models/alarm.py:365 +msgid "策略名称" +msgstr "policy name" + +#: backend/db_monitor/models/alarm.py:370 msgid "实例详情" msgstr "Instance details" -#: backend/db_monitor/models.py:81 +#: backend/db_monitor/models/alarm.py:387 msgid "告警策略实例" msgstr "Alert Policy Example" -#: backend/db_monitor/models.py:88 +#: backend/db_monitor/models/alarm.py:394 +msgid "蓝鲸监控分派策略组ID" +msgstr "Blue Whale Monitoring Distribution Policy Group ID" + +#: backend/db_monitor/models/alarm.py:397 +msgid "策略模板详情" +msgstr "Policy template details" + +#: backend/db_monitor/models/alarm.py:398 +#: backend/db_services/dbpermission/db_account/serializers.py:96 +#: backend/db_services/dbpermission/db_account/serializers.py:109 +#: backend/db_services/dbpermission/db_authorize/serializers.py:98 +msgid "规则列表" +msgstr "rule list" + +#: backend/db_monitor/models/alarm.py:403 +msgid "分派策略组" +msgstr "Assignment strategy group" + +#: backend/db_monitor/models/alarm.py:480 +msgid "DBM平台规则_勿动_{}" +msgstr "DBM platform rules_don’t move_{}" + +#: backend/db_monitor/models/alarm.py:512 +msgid "父级策略ID,0代表父级" +msgstr "Parent policy ID, 0 represents the parent" + +#: backend/db_monitor/models/alarm.py:513 +msgid "父级策略模板详情,可用于还原" +msgstr "Parent policy template details, available for restore" + +#: backend/db_monitor/models/alarm.py:515 +#: backend/db_monitor/models/collect.py:43 +msgid "策略名称,全局唯一" +msgstr "Policy name, globally unique" + +#: backend/db_monitor/models/alarm.py:522 +msgid "当前策略详情,可用于patch" +msgstr "Current policy details, available for patching" + +#: backend/db_monitor/models/alarm.py:523 +msgid "监控指标名" +msgstr "Monitoring indicator name" + +#: backend/db_monitor/models/alarm.py:560 +msgid "监控目标" +msgstr "Monitoring target" + +#: backend/db_monitor/models/alarm.py:562 +msgid "监控目标级别,跟随targets调整" +msgstr "Monitor target levels and adjust according to targets" + +#: backend/db_monitor/models/alarm.py:567 +msgid "监控策略优先级,跟随targets调整" +msgstr "Monitoring strategy priority, adjusted according to targets" + +#: backend/db_monitor/models/alarm.py:568 +msgid "监控目标检索冗余字段" +msgstr "Monitor target retrieval redundant fields" + +#: backend/db_monitor/models/alarm.py:571 +msgid "自定义过滤列表" +msgstr "Custom filter list" + +#: backend/db_monitor/models/alarm.py:591 +msgid "检测规则" +msgstr "Detection rules" + +#: backend/db_monitor/models/alarm.py:594 +msgid "通知规则" +msgstr "notification rules" + +#: backend/db_monitor/models/alarm.py:596 +msgid "通知组" +msgstr "notification group" + +#: backend/db_monitor/models/alarm.py:600 +msgid "是否已启用" +msgstr "Is it enabled" + +#: backend/db_monitor/models/alarm.py:604 +msgid "告警事件数量,初始值设置为-1" +msgstr "The number of alarm events, the initial value is set to -1" + +#: backend/db_monitor/models/alarm.py:608 +msgid "策略状态" +msgstr "Policy status" + +#: backend/db_monitor/models/alarm.py:614 +msgid "蓝鲸监控策略ID" +msgstr "Blue Whale Monitoring Policy ID" + +#: backend/db_monitor/models/alarm.py:617 +#: backend/db_monitor/models/collect.py:51 +#: backend/db_services/bigdata/influxdb/query.py:35 +#: backend/db_services/bigdata/resources/query.py:43 +msgid "版本" +msgstr "Version" + +#: backend/db_monitor/models/alarm.py:620 +msgid "告警数据来源" +msgstr "Alarm data source" + +#: backend/db_monitor/models/alarm.py:627 +msgid "告警策略(MonitorPolicy)" +msgstr "Alarm policy (MonitorPolicy)" + +#: backend/db_monitor/models/collect.py:42 msgid "插件ID" msgstr "Plug-in ID" -#: backend/db_monitor/models.py:92 backend/db_monitor/models.py:120 -#: backend/db_proxy/models.py:56 +#: backend/db_monitor/models/collect.py:47 +msgid "绑定machine" +msgstr "Bind machine" + +#: backend/db_monitor/models/collect.py:48 +#: backend/db_monitor/models/dashboard.py:33 backend/db_proxy/models.py:57 +#: backend/db_proxy/views/cloud/serializers.py:21 +#: backend/db_report/views/meta_check_view.py:72 +#: backend/db_report/views/mysqlbackup_check_view.py:68 +#: backend/db_report/views/redis_dbmeta_check_view.py:67 +#: backend/db_report/views/redisbackup_check_view.py:72 msgid "详情" msgstr "details" -#: backend/db_monitor/models.py:96 backend/db_monitor/models.py:101 +#: backend/db_monitor/models/collect.py:55 +#: backend/db_monitor/models/collect.py:60 msgid "采集策略模板" msgstr "Collection policy template" -#: backend/db_monitor/models.py:107 +#: backend/db_monitor/models/collect.py:66 msgid "监控插件模板ID" msgstr "Monitoring plug-in template ID" -#: backend/db_monitor/models.py:108 +#: backend/db_monitor/models/collect.py:67 msgid "监控采集策略ID" msgstr "Monitoring collection policy ID" -#: backend/db_monitor/models.py:111 +#: backend/db_monitor/models/collect.py:163 msgid "采集策略实例" msgstr "Examples of Collection Strategies" -#: backend/db_monitor/models.py:117 backend/ticket/serializers.py:193 +#: backend/db_monitor/models/dashboard.py:28 backend/ticket/serializers.py:246 msgid "名称" msgstr "name" -#: backend/db_monitor/models.py:121 +#: backend/db_monitor/models/dashboard.py:29 +msgid "视图类型" +msgstr "view type" + +#: backend/db_monitor/models/dashboard.py:34 msgid "变量" msgstr "variable" -#: backend/db_monitor/models.py:124 +#: backend/db_monitor/models/dashboard.py:37 msgid "grafana-org_id" msgstr "grafana-org_id" -#: backend/db_monitor/models.py:125 +#: backend/db_monitor/models/dashboard.py:38 msgid "grafana-org_name" msgstr "grafana-org_name" -#: backend/db_monitor/models.py:126 +#: backend/db_monitor/models/dashboard.py:39 msgid "grafana-uid" msgstr "grafana-uid" -#: backend/db_monitor/models.py:127 +#: backend/db_monitor/models/dashboard.py:40 msgid "grafana-url" msgstr "grafana-url" -#: backend/db_monitor/models.py:130 +#: backend/db_monitor/models/dashboard.py:43 msgid "仪表盘" msgstr "dash board" -#: backend/db_monitor/serializers.py:23 -#: backend/db_services/cmdb/serializers.py:51 -#: backend/db_services/dbbase/resources/serializers.py:72 -#: backend/db_services/dbbase/resources/serializers.py:79 -#: backend/db_services/dbresource/serializers.py:202 -#: backend/db_services/mysql/cluster/serializers.py:61 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:19 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:24 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:30 -#: backend/db_services/mysql/remote_service/serializers.py:36 -#: backend/db_services/partition/serializers.py:44 -#: backend/db_services/partition/serializers.py:98 -#: backend/ticket/builders/common/bigdata.py:70 +#: backend/db_monitor/serializers.py:33 +#: backend/db_services/bigdata/resources/serializers.py:17 +#: backend/db_services/cmdb/serializers.py:81 +#: backend/db_services/dbbase/cluster/serializers.py:55 +#: backend/db_services/dbbase/resources/serializers.py:104 +#: backend/db_services/dbbase/resources/serializers.py:120 +#: backend/db_services/dbbase/serializers.py:172 +#: backend/db_services/dbresource/serializers.py:332 +#: backend/db_services/mysql/cluster/serializers.py:32 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:23 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:43 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:61 +#: backend/db_services/mysql/remote_service/serializers.py:61 +#: backend/db_services/mysql/remote_service/serializers.py:77 +#: backend/db_services/mysql/remote_service/serializers.py:93 +#: backend/db_services/partition/serializers.py:49 +#: backend/db_services/partition/serializers.py:131 +#: backend/db_services/partition/serializers.py:144 +#: backend/db_services/redis/autofix/models.py:36 +#: backend/db_services/redis/autofix/models.py:52 +#: backend/db_services/redis/autofix/models.py:81 +#: backend/db_services/redis/toolbox/serializers.py:218 +#: backend/db_services/redis/toolbox/serializers.py:224 +#: backend/db_services/sqlserver/cluster/serializers.py:17 +#: backend/db_services/sqlserver/cluster/serializers.py:28 +#: backend/db_services/sqlserver/cluster/serializers.py:45 +#: backend/db_services/sqlserver/cluster/serializers.py:56 +#: backend/db_services/sqlserver/rollback/serializers.py:26 +#: backend/db_services/sqlserver/rollback/serializers.py:36 +#: backend/db_services/sqlserver/rollback/serializers.py:46 +#: backend/db_services/sqlserver/rollback/serializers.py:72 +#: backend/ticket/builders/common/bigdata.py:69 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:31 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:33 +#: backend/ticket/builders/mongodb/mongo_backup.py:35 +#: backend/ticket/builders/mongodb/mongo_cutoff.py:39 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:24 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:27 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:29 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:28 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:36 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:36 #: backend/ticket/builders/mysql/base.py:165 -#: backend/ticket/builders/mysql/mysql_checksum.py:37 -#: backend/ticket/builders/mysql/mysql_data_repair.py:28 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:28 -#: backend/ticket/builders/mysql/mysql_flashback.py:27 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:28 +#: backend/ticket/builders/mysql/mysql_checksum.py:44 +#: backend/ticket/builders/mysql/mysql_data_repair.py:26 +#: backend/ticket/builders/mysql/mysql_dump_data.py:29 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:33 +#: backend/ticket/builders/mysql/mysql_flashback.py:33 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:27 #: backend/ticket/builders/mysql/mysql_ha_clear.py:29 +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:28 #: backend/ticket/builders/mysql/mysql_ha_rename.py:30 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:60 #: backend/ticket/builders/mysql/mysql_partition.py:47 -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:29 -#: backend/ticket/builders/redis/base.py:33 backend/ticket/models/ticket.py:245 -#: backend/ticket/serializers.py:217 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:27 +#: backend/ticket/builders/redis/base.py:35 +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:30 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:37 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:44 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:45 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:50 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:59 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:64 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:65 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:30 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:34 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:29 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:27 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:31 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:42 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:46 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:47 +#: backend/ticket/builders/riak/riak_reboot.py:29 +#: backend/ticket/builders/riak/riak_shrink.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:41 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:25 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:26 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:31 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:25 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:56 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:42 +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:26 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:29 +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:24 +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:23 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:29 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:25 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:30 +#: backend/ticket/models/ticket.py:326 backend/ticket/serializers.py:274 msgid "集群ID" msgstr "Cluster ID" -#: backend/db_monitor/serializers.py:24 +#: backend/db_monitor/serializers.py:34 #: backend/db_services/ipchooser/serializers/base.py:49 msgid "节点实例ID" msgstr "Node instance ID" -#: backend/db_monitor/serializers.py:28 +#: backend/db_monitor/serializers.py:38 msgid "监控仪表盘地址" msgstr "Monitoring Dashboard Address" -#: backend/db_monitor/tasks.py:79 -msgid "DBA系统专用" -msgstr "Dedicated to DBA system" - -#: backend/db_monitor/views/grafana.py:27 -msgid "监控告警管理" -msgstr "Monitoring and alarm management" - -#: backend/db_monitor/views/grafana.py:39 +#: backend/db_monitor/serializers.py:109 +msgid "策略ID : {} AND 状态 : {}" +msgstr "Policy ID: {} AND Status: {}" + +#: backend/db_monitor/serializers.py:109 +msgid "未恢复" +msgstr "Not restored" + +#: backend/db_monitor/serializers.py:194 +msgid "请确认告警目标包含当前业务" +msgstr "Please confirm that the alarm target contains the current business" + +#: backend/db_monitor/serializers.py:231 +msgid "告警事件" +msgstr "Alarm event" + +#: backend/db_monitor/serializers.py:232 +#: backend/iam_app/dataclass/actions.py:1622 +#: backend/iam_app/dataclass/actions.py:1634 +#: backend/iam_app/dataclass/actions.py:1646 +#: backend/iam_app/dataclass/actions.py:1658 +#: backend/iam_app/dataclass/actions.py:1670 +#: backend/iam_app/dataclass/actions.py:1682 +#: backend/iam_app/dataclass/actions.py:1694 +#: backend/iam_app/dataclass/actions.py:1706 +#: backend/iam_app/dataclass/resources.py:551 +msgid "监控策略" +msgstr "Monitoring strategy" + +#: backend/db_monitor/serializers.py:233 +msgid "最新异常点信息" +msgstr "Latest abnormal point information" + +#: backend/db_monitor/serializers.py:236 +msgid "告警负责人" +msgstr "Alarm person in charge" + +#: backend/db_monitor/serializers.py:237 +msgid "回调消息体" +msgstr "callback message body" + +#: backend/db_monitor/serializers.py:255 +msgid "未匹配到对应的故障自愈处理单据,请确认是否配置正确" +msgstr "The corresponding fault self-healing processing document is not matched. Please confirm whether the configuration is correct." + +#: backend/db_monitor/views/duty_rule.py:29 +msgid "告警轮值规则" +msgstr "Alarm rotation rules" + +#: backend/db_monitor/views/duty_rule.py:39 +msgid "新建轮值规则" +msgstr "Create a new rotation rule" + +#: backend/db_monitor/views/duty_rule.py:44 +msgid "获取轮值规则" +msgstr "Get rotation rules" + +#: backend/db_monitor/views/duty_rule.py:49 +msgid "更新轮值规则" +msgstr "Update rotation rules" + +#: backend/db_monitor/views/duty_rule.py:55 +msgid "部分更新轮值规则" +msgstr "Partial update of rotation rules" + +#: backend/db_monitor/views/duty_rule.py:107 +msgid "轮值规则优先级统计" +msgstr "Rotation rule priority statistics" + +#: backend/db_monitor/views/grafana.py:36 msgid "查询内嵌仪表盘地址" msgstr "Query the address of the embedded dashboard" -#: backend/db_package/constants.py:20 +#: backend/db_monitor/views/notice_group.py:32 +msgid "监控告警组" +msgstr "Monitor alarm group" + +#: backend/db_monitor/views/notice_group.py:37 +msgid "查询监控告警组列表" +msgstr "Query monitoring alarm group list" + +#: backend/db_monitor/views/notice_group.py:42 +msgid "新建监控告警组" +msgstr "Create a new monitoring and alarm group" + +#: backend/db_monitor/views/notice_group.py:47 +msgid "获取监控告警组" +msgstr "Get monitoring alarm group" + +#: backend/db_monitor/views/notice_group.py:52 +msgid "更新监控告警组" +msgstr "Update monitoring alarm group" + +#: backend/db_monitor/views/notice_group.py:57 +msgid "删除监控告警组" +msgstr "Delete monitoring alarm group" + +#: backend/db_monitor/views/notice_group.py:134 +msgid "查询告警组名称" +msgstr "Query the alarm group name" + +#: backend/db_monitor/views/notice_group.py:140 +msgid "获取默认告警组名称" +msgstr "Get the default alarm group name" + +#: backend/db_monitor/views/policy.py:47 +msgid "策略名" +msgstr "Strategy name" + +#: backend/db_monitor/views/policy.py:48 +#: backend/db_services/bigdata/influxdb/query.py:39 +#: backend/db_services/bigdata/resources/query.py:47 +#: backend/db_services/dbconfig/serializers.py:67 +#: backend/db_services/redis/resources/redis_cluster/query.py:67 +msgid "更新人" +msgstr "updater" + +#: backend/db_monitor/views/policy.py:51 +msgid "目标关键字检索" +msgstr "Target keyword search" + +#: backend/db_monitor/views/policy.py:64 +#: backend/iam_app/dataclass/actions.py:1562 +#: backend/iam_app/dataclass/actions.py:1574 +#: backend/iam_app/dataclass/actions.py:1586 +#: backend/iam_app/dataclass/actions.py:1598 +#: backend/iam_app/dataclass/actions.py:1610 +#: backend/iam_app/dataclass/resources.py:622 +msgid "告警组" +msgstr "Alarm group" + +#: backend/db_monitor/views/policy.py:98 +msgid "获取策略列表" +msgstr "Get policy list" + +#: backend/db_monitor/views/policy.py:106 +msgid "获取策略详情" +msgstr "Get policy details" + +#: backend/db_monitor/views/policy.py:117 +msgid "删除策略" +msgstr "Delete policy" + +#: backend/db_monitor/views/policy.py:197 +msgid "启用策略" +msgstr "enable policy" + +#: backend/db_monitor/views/policy.py:206 +msgid "停用策略" +msgstr "Deactivation policy" + +#: backend/db_monitor/views/policy.py:215 +msgid "克隆策略" +msgstr "cloning strategy" + +#: backend/db_monitor/views/policy.py:224 +msgid "更新策略" +msgstr "update strategy" + +#: backend/db_monitor/views/policy.py:242 +msgid "根据db类型查询集群列表" +msgstr "Query cluster list based on db type" + +#: backend/db_monitor/views/policy.py:271 +msgid "根据db类型查询模块列表" +msgstr "Query module list based on db type" + +#: backend/db_monitor/views/policy.py:292 +msgid "告警策略回调(处理套餐、故障自愈)" +msgstr "Alarm policy callback (processing package, fault self-healing)" + +#: backend/db_package/constants.py:26 msgid "用户定义" msgstr "user defined" -#: backend/db_package/constants.py:21 +#: backend/db_package/constants.py:27 msgid "系统内置" msgstr "system built-in" @@ -3139,234 +5369,607 @@ msgstr "{version}-{pkg_type}-{db_type} media package does not exist" msgid "介质类型" msgstr "media type" -#: backend/db_package/models.py:25 +#: backend/db_package/models.py:27 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:28 msgid "文件名" msgstr "file name" -#: backend/db_package/models.py:27 +#: backend/db_package/models.py:29 msgid "安装包类型" msgstr "Package type" -#: backend/db_package/models.py:29 backend/db_package/serializers.py:31 +#: backend/db_package/models.py:31 backend/db_package/serializers.py:33 msgid "存储类型" msgstr "storage type" -#: backend/db_package/models.py:31 +#: backend/db_package/models.py:33 msgid "包路径" msgstr "package path" -#: backend/db_package/models.py:32 +#: backend/db_package/models.py:34 msgid "包大小" msgstr "packet size" -#: backend/db_package/models.py:33 +#: backend/db_package/models.py:35 msgid "md5值" msgstr "md5 value" -#: backend/db_package/models.py:35 +#: backend/db_package/models.py:37 msgid "允许的业务列表" msgstr "Allowed Business List" -#: backend/db_package/models.py:36 +#: backend/db_package/models.py:38 msgid "安装包模式" msgstr "package mode" #: backend/db_package/models.py:39 +msgid "文件优先级(目前只用作区分是否为默认版本)" +msgstr "File priority (currently only used to distinguish whether it is the default version)" + +#: backend/db_package/models.py:46 msgid "介质包(Package)" msgstr "Media package (Package)" -#: backend/db_package/serializers.py:28 +#: backend/db_package/serializers.py:30 msgid "版本包" msgstr "version package" -#: backend/db_package/serializers.py:29 +#: backend/db_package/serializers.py:31 #: backend/db_services/dbconfig/serializers.py:40 #: backend/db_services/dbconfig/serializers.py:52 #: backend/db_services/dbconfig/serializers.py:65 #: backend/db_services/dbconfig/serializers.py:87 +#: backend/db_services/version/serializers.py:26 #: backend/ticket/builders/mysql/mysql_single_apply.py:65 -#: backend/ticket/builders/spider/tendb_apply.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:64 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:51 msgid "数据库版本" msgstr "database version" -#: backend/db_package/serializers.py:30 +#: backend/db_package/serializers.py:32 backend/db_package/serializers.py:40 msgid "包类型" msgstr "package type" -#: backend/db_package/views.py:43 +#: backend/db_package/serializers.py:46 +msgid "介质同步信息" +msgstr "Media synchronization information" + +#: backend/db_package/serializers.py:52 +#: backend/db_services/version/serializers.py:21 +msgid "查询关键字" +msgstr "query keywords" + +#: backend/db_package/views.py:71 msgid "新建版本文件" msgstr "New version file" -#: backend/db_package/views.py:50 +#: backend/db_package/views.py:78 +msgid "同步制品库的文件信息(适用于medium初始化)" +msgstr "Synchronize file information of product library (applicable to medium initialization)" + +#: backend/db_package/views.py:110 msgid "查询版本文件列表" msgstr "Query version file list" -#: backend/db_package/views.py:57 +#: backend/db_package/views.py:122 +msgid "查询组件安装包类型" +msgstr "Query component installation package type" + +#: backend/db_package/views.py:130 +msgid "查询组件安装包列表" +msgstr "Query component installation package list" + +#: backend/db_package/views.py:139 +msgid "请保证过滤类型是[{}]安装包类型" +msgstr "Please ensure that the filtering type is [{}] installation package type" + +#: backend/db_package/views.py:151 +msgid "更新版本文件属性" +msgstr "Update version file properties" + +#: backend/db_package/views.py:166 msgid "删除版本文件" msgstr "delete version file" -#: backend/db_package/views.py:65 +#: backend/db_package/views.py:177 #: backend/db_proxy/views/bkrepo/serializers.py:18 msgid "上传文件" msgstr "upload files" -#: backend/db_proxy/constants.py:16 -msgid "透传服务" -msgstr "Transparent transmission service" +#: backend/db_periodic_task/constants.py:24 +msgid "远程 API 周期任务" +msgstr "Remote API periodic tasks" + +#: backend/db_periodic_task/constants.py:25 +msgid "本地函数周期任务" +msgstr "Local function periodic task" + +#: backend/db_periodic_task/constants.py:29 +msgid "告警恢复时" +msgstr "When the alarm is restored" + +#: backend/db_periodic_task/constants.py:30 +msgid "告警触发时" +msgstr "When the alarm is triggered" + +#: backend/db_periodic_task/constants.py:31 +msgid "告警关闭时" +msgstr "When the alarm is turned off" + +#: backend/db_periodic_task/constants.py:32 +msgid "告警确认时" +msgstr "When the alarm is confirmed" + +#: backend/db_periodic_task/constants.py:33 +msgid "无数据告警" +msgstr "No data alarm" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:85 +#: backend/ticket/tasks/ticket_tasks.py:123 +msgid "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" +msgstr "" +"The relevant information of the cluster {} cannot be queried in dbm meta, " +"please check the status of the cluster" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:143 +msgid "数据不一致" +msgstr "Data is inconsistent" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:148 +msgid "近2天未校验" +msgstr "Not verified in the past 2 days" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:150 +msgid ";近2天未校验" +msgstr ";Not verified in the past 2 days" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:32 +msgid "有 {} 个接入层实例" +msgstr "There are {} access layer instances" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:35 +msgid "有 {} 个存储层实例" +msgstr "There are {} storage layer instances" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:45 +msgid "实例 {} ({}-{}-{}) 与集群类型不匹配" +msgstr "Instance {} ({}-{}-{}) does not match cluster type" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_instance_belong.py:31 +msgid "{} 属于 {} 个集群" +msgstr "{} belongs to {} clusters" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_instance_belong.py:33 +msgid "{} 不属于任何集群" +msgstr "{} does not belong to any cluster" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:63 +msgid "cluster:{} now had proxies[{}] < 2" +msgstr "cluster:{} now had proxies[{}] < 2" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:82 +msgid "集群{}的master:{} 获取slave失败" +msgstr "Master of cluster {}: {} failed to obtain slave" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:84 +msgid "集群{}的master{}get slave_obj failed" +msgstr "Master{} of cluster{}get slave_obj failed" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:89 +msgid "unsupport mutil slave with cluster {} 4:{}" +msgstr "unsupport mutil slave with cluster {} 4:{}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:98 +msgid "集群{}的master实例:{} 没有slave" +msgstr "Master instance of cluster {}: {} has no slave" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:107 +msgid "集群{}的slave:{} 获取master失败" +msgstr "Slave of cluster {}: {} failed to obtain master" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:109 +msgid "集群{}的slave{} get master_obj failed" +msgstr "slave{} of cluster{} get master_obj failed" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:114 +msgid "unsupport mutil master with cluster {} 4:{}" +msgstr "unsupport mutil master with cluster {} 4:{}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:123 +msgid "集群{}的slave实例:{} 没有master" +msgstr "Slave instance of cluster {}: {} has no master" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:152 +msgid "集群{}的实例:{}实例状态异常:{}" +msgstr "Instance of cluster {}: {} Instance status abnormal: {}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_replicate_role.py:39 +msgid "{} {} 不能作为同步 ejector" +msgstr "{} {} cannot be used as a synchronized ejector" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_replicate_role.py:59 +msgid "{} {} 不能作为同步 receiver" +msgstr "{} {} cannot be used as a synchronization receiver" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:56 +msgid "nginx机器{}当前agent异常,跳过文件下发。请管理员检查机器运行状态" +msgstr "The current agent of nginx machine {} is abnormal and file delivery is skipped. Ask the administrator to check the running status of the machine" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:66 +msgid "nginx配置文件下发参数:{}" +msgstr "nginx configuration file delivery parameters: {}" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:69 +msgid "下发文件job启动失败,错误信息: {}" +msgstr "The file delivery job failed to start, error message: {}" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:98 +msgid "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" +msgstr "" +"Cluster type: The nginx configuration file of {} does not exist, skip the " +"distribution of the nginx configuration" + +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:146 +msgid "+===+++++=== missing_heartbeat_ips 实例:{} +++++===++++ " +msgstr "+====++++++=== missing_heartbeat_ips Example: {} +++++===++++" + +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:192 +msgid "实例 {} dbmon 心跳超时" +msgstr "Instance{} dbmon heartbeat timeout" + +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:207 +msgid "+===+++++=== 实例 {} dbmon 心跳超时 +++++===++++ " +msgstr "+====++++++=== Example{} dbmon heartbeat timeout++++====++++" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:37 +msgid "分区服务check_log接口异常: {}" +msgstr "Partition service check_log interface exception: {}" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:41 +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:43 +msgid "未执行" +msgstr "Not executed" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:42 +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:44 +#: backend/db_services/redis/autofix/models.py:73 backend/flow/consts.py:683 +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:98 +#: backend/ticket/constants.py:80 backend/ticket/constants.py:92 +msgid "失败" +msgstr "fail" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:47 +msgid "环境变量MYSQL_CHATID未设置" +msgstr "Environment variable MYSQL_CHATID is not set" -#: backend/db_proxy/constants.py:26 +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:50 +msgid "环境变量WECOM_ROBOT未设置" +msgstr "Environment variable WECOM_ROBOT is not set" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:58 +msgid "" +"【DBM】分区表异常情况 {} \n" +"业务名称 bk_biz_id DB类型 失败/未执行 数量 DBA\n" +msgstr "[DBM] Partition table exception {} \nBusiness name bk_biz_id DB type failed/unexecuted number DBA\n{}" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:80 +msgid "{}{} {} {} {} {} <@{}>\n" +msgstr "{}{} {} {} {} {} <@{}>\n" + +#: backend/db_periodic_task/local_tasks/redis_backup/bklog_query.py:84 +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:118 +#: backend/db_services/redis/rollback/handlers.py:138 +msgid "无法查找到在时间范围内{}-{},集群{}的全备份日志" +msgstr "Unable to find the full backup log of cluster {} in the time range {}-{}" + +#: backend/db_periodic_task/local_tasks/redis_backup/bklog_query.py:115 +msgid "无法查找到在时间范围内{}-{},集群{}的binlog备份日志" +msgstr "Unable to find the binlog backup log of cluster {} in the time range {}-{}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:96 +msgid "无法查找到在时间范围内{}-{},集群{}:{}的binlog备份日志" +msgstr "Unable to find the binlog backup log in the time range {}-{}, cluster {}:{}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:100 +msgid "+===+++++=== {} 集群{} 实例维度日志不为空 +++++===++++ " +msgstr "+====++++++=== {} cluster{} instance dimension log is not empty++++====++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:125 +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:139 +#: backend/db_services/redis/rollback/handlers.py:247 +#: backend/db_services/redis/rollback/handlers.py:268 +msgid "" +"重复/缺失的binlog共{}个,重复/缺失的binlog index是:{},详细信息请查看error日志" +msgstr "There are {} duplicate/missing binlogs in total. The duplicate/missing binlog index is: {}. Please check the error log for details." + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:145 +msgid "+===+++++=== {} binlog 序号连续 +++++===++++ " +msgstr "+====++++++=== {} binlog serial numbers are consecutive++++++===++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:152 +msgid "+===++=== 实例{}binlog备份失败,集群类型{}写入表 ++++++++ " +msgstr "+====++=== Instance {} binlog backup failed, cluster type {} is written to the table ++++++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:198 +msgid "文件序号重复: {}" +msgstr "Duplicate file serial number: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:199 +msgid "文件重复: {}" +msgstr "Duplicate file: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:203 +msgid "缺失时打印排序后的当前文件:{}和上一个文件: {}" +msgstr "If missing, print the sorted current file: {} and previous file: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:210 +#: backend/db_services/redis/rollback/handlers.py:316 +msgid "缺少的文件序号: {}" +msgstr "Missing file number: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:124 +msgid "+===+++++=== {} 集群维度日志不为空 +++++===++++ " +msgstr "+====++++++=== {} Cluster dimension log is not empty++++===++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:146 +msgid "+===++==={}正常备份次数{},集群类型{} ++++++++ " +msgstr "+====++==={}Normal backup times{}, cluster type{} ++++++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:172 +msgid "+===++=== 实例{}全备份失败,集群类型{}写入表 ++++++++ " +msgstr "+====++==== Instance {} full backup failed, cluster type {} is written to the table ++++++++" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:82 +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:100 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:925 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:944 +msgid "获取实例 {}:{} 的binlog备份信息失败" +msgstr "Failed to obtain binlog backup information of instance {}:{}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:85 +msgid "get_instance_backupfile instance_full_backupfile: {}" +msgstr "get_instance_backupfile instance_full_backupfile: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:118 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:513 +msgid "redis_data_structure_flow cluster_type: {}" +msgstr "redis_data_structure_flow cluster_type: {}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:118 +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:166 +msgid "根据上报的immute_domain找不到对应的集群" +msgstr "The corresponding cluster cannot be found based on the reported immute_domain." + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:141 +msgid "集群:{} 存在'{}({})'的单据正在执行" +msgstr "Cluster: {} The document with '{}({})' is being executed" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:212 +msgid "{}:{} 状态变成了不可用\n" +msgstr "{}:{} status changed to unavailable\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:219 +msgid "域名{} 删除 {} 记录成功" +msgstr "Domain name {} deleted {} record successfully" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:222 +msgid "域名{} 删除 {} 记录失败,{}" +msgstr "Domain name {} failed to delete {} record, {}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:225 +msgid "{}:{} 状态变成了可用\n" +msgstr "{}:{} status changed to available\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:232 +msgid "域名{} 新增 {} 记录成功" +msgstr "Domain name {} added {} recorded successfully" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:235 +msgid "域名{} 新增 {} 记录失败,{}" +msgstr "Domain name {} added {} record failed, {}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:257 +msgid "slave:{} 变成了master\n" +msgstr "slave:{} becomes master\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:277 +msgid "master:{} 变成了slave\n" +msgstr "master:{} becomes slave\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:288 +msgid "" +"master:{} 变成了slave,但是其master({}:{})不在集群meta数据中,所以不做处理\n" +msgstr "master:{} has become a slave, but its master ({}:{}) is not in the cluster meta data, so it is not processed\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:314 +msgid "" +"master:{} 变成了disconnected状态,其slave:{}变成了master,现将old_master变成其" +"slave,便于发起自愈\n" +msgstr "master:{} has become disconnected, and its slave:{} has become master. Now old_master has become its slave to facilitate self-healing\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:390 +msgid "存在机器:{} 所有实例均变成了unrunning状态,发起自愈流程\n" +msgstr "Existing machine: {} All instances have become unrunning status and the self-healing process is initiated\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:411 +msgid "开始更新集群:{} 元数据" +msgstr "Start updating cluster:{} metadata" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:426 +msgid "master:{} 和 slave:{} 主从状态和关系都没变,不做处理\n" +msgstr "master:{} and slave:{} The master-slave status and relationship have not changed and will not be processed\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:444 +msgid "处理异常,{}" +msgstr "Handling exceptions,{}" + +#: backend/db_periodic_task/models.py:32 +msgid "周期任务名称" +msgstr "Periodic task name" + +#: backend/db_periodic_task/models.py:33 +msgid "celery 周期任务实例" +msgstr "celery periodic task instance" + +#: backend/db_periodic_task/models.py:34 +msgid "任务类型" +msgstr "Task type" + +#: backend/db_periodic_task/models.py:35 +msgid "人工冻结此任务,将不受更新影响" +msgstr "This task is artificially frozen and will not be affected by updates." + +#: backend/db_periodic_task/models.py:40 +msgid "周期任务(PeriodicTask)" +msgstr "PeriodicTask" + +#: backend/db_proxy/constants.py:19 +msgid "透传服务(proxypass)" +msgstr "Transparent transmission service (proxypass)" + +#: backend/db_proxy/constants.py:32 msgid "nginx 转发服务" msgstr "nginx forwarding service" -#: backend/db_proxy/constants.py:27 +#: backend/db_proxy/constants.py:33 msgid "域名解析服务" msgstr "Domain name resolution service" -#: backend/db_proxy/constants.py:28 +#: backend/db_proxy/constants.py:34 msgid "SQL 远程执行服务" msgstr "SQL Remote Execution Service" -#: backend/db_proxy/constants.py:29 +#: backend/db_proxy/constants.py:35 msgid "数据库高可用服务" msgstr "Database high availability service" -#: backend/db_proxy/constants.py:43 +#: backend/db_proxy/constants.py:36 +msgid "Redis DTS服务" +msgstr "Redis DTS service" + +#: backend/db_proxy/constants.py:50 msgid "kibana-ES管理端" msgstr "kibana-ES management terminal" -#: backend/db_proxy/constants.py:44 +#: backend/db_proxy/constants.py:51 msgid "kafka_manager-Kafka管理端" msgstr "kafka_manager-Kafka management terminal" -#: backend/db_proxy/constants.py:45 +#: backend/db_proxy/constants.py:52 msgid "haproxy-HDFS管理端" msgstr "haproxy-HDFS management terminal" -#: backend/db_proxy/constants.py:46 +#: backend/db_proxy/constants.py:53 msgid "pulsar_manager管理端" msgstr "pulsar_manager management terminal" -#: backend/db_proxy/models.py:30 +#: backend/db_proxy/constants.py:59 +msgid "user" +msgstr "user" + +#: backend/db_proxy/constants.py:60 +msgid "pwd" +msgstr "pwd" + +#: backend/db_proxy/constants.py:61 +msgid "webconsole_user" +msgstr "webconsole_user" + +#: backend/db_proxy/constants.py:62 +msgid "webconsole_pwd" +msgstr "webconsole_pwd" + +#: backend/db_proxy/models.py:31 msgid "代理内部地址" msgstr "proxy internal address" -#: backend/db_proxy/models.py:31 +#: backend/db_proxy/models.py:32 msgid "代理外部地址" msgstr "proxy external address" -#: backend/db_proxy/models.py:34 -msgid "云区域代理" -msgstr "Cloud Zone Proxy" +#: backend/db_proxy/models.py:35 +msgid "云区域代理(DBCloudProxy)" +msgstr "Cloud region proxy (DBCloudProxy)" -#: backend/db_proxy/models.py:49 +#: backend/db_proxy/models.py:50 backend/db_proxy/views/cloud/serializers.py:20 msgid "扩展类型" msgstr "extension type" -#: backend/db_proxy/models.py:54 +#: backend/db_proxy/models.py:55 msgid "服务状态" msgstr "service status" -#: backend/db_proxy/models.py:122 +#: backend/db_proxy/models.py:60 +msgid "云区域组件扩展(DBExtension)" +msgstr "Cloud Zone Component Extension (DBExtension)" + +#: backend/db_proxy/models.py:134 +msgid "" +"在业务{}下已经存在同种配置的服务组件记录,请检查是否在同一业务下部署了同名的" +"集群" +msgstr "There are already service component records of the same configuration under business {}. Please check whether a cluster with the same name is deployed under the same business." + +#: backend/db_proxy/models.py:145 msgid "部署机器ip" msgstr "deployment machine ip" -#: backend/db_proxy/models.py:123 +#: backend/db_proxy/models.py:146 msgid "部署机器port" msgstr "Deployment machine port" -#: backend/db_proxy/models.py:124 +#: backend/db_proxy/models.py:147 backend/db_services/dbbase/serializers.py:121 msgid "服务类型" msgstr "Service type" -#: backend/db_proxy/models.py:125 -#: backend/db_proxy/views/db_meta/serializers.py:94 -#: backend/db_proxy/views/db_meta/serializers.py:104 -#: backend/db_services/bigdata/resources/query.py:40 -#: backend/db_services/mysql/permission/authorize/serializers.py:28 -#: backend/db_services/mysql/resources/spider/query.py:36 -#: backend/db_services/mysql/resources/tendbha/query.py:39 -#: backend/db_services/mysql/resources/tendbsingle/query.py:38 -#: backend/db_services/redis/resources/redis_cluster/query.py:54 -#: backend/ticket/builders/spider/tendb_apply.py:30 +#: backend/db_proxy/models.py:148 +#: backend/db_proxy/views/db_meta/serializers.py:107 +#: backend/db_proxy/views/db_meta/serializers.py:117 +#: backend/db_services/bigdata/resources/query.py:38 +#: backend/db_services/dbbase/serializers.py:28 +#: backend/db_services/dbpermission/db_authorize/serializers.py:27 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:25 +#: backend/db_services/mysql/resources/tendbcluster/query.py:40 +#: backend/db_services/mysql/resources/tendbha/query.py:34 +#: backend/db_services/mysql/resources/tendbsingle/query.py:32 +#: backend/db_services/quick_search/constants.py:17 +#: backend/db_services/redis/redis_dts/serializers.py:26 +#: backend/db_services/redis/resources/redis_cluster/query.py:58 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:19 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:25 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:31 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:31 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:32 msgid "集群名" msgstr "cluster name" -#: backend/db_proxy/models.py:128 -#: backend/db_proxy/views/jobapi/serializers.py:20 -#: backend/db_proxy/views/jobapi/serializers.py:61 -#: backend/db_proxy/views/jobapi/serializers.py:71 -#: backend/db_proxy/views/jobapi/serializers.py:79 -#: backend/db_proxy/views/redis_dts/serializers.py:59 -#: backend/db_proxy/views/redis_dts/serializers.py:68 -#: backend/db_proxy/views/redis_dts/serializers.py:77 -#: backend/db_proxy/views/redis_dts/serializers.py:86 -#: backend/db_services/dbresource/serializers.py:51 -#: backend/db_services/ipchooser/serializers/base.py:33 -#: backend/db_services/mysql/cluster/serializers.py:40 -#: backend/db_services/mysql/instance/serializers.py:37 -#: backend/db_services/mysql/permission/clone/models.py:28 -#: backend/db_services/mysql/permission/clone/serializers.py:24 -#: backend/db_services/partition/serializers.py:38 -#: backend/db_services/partition/serializers.py:101 -#: backend/ticket/builders/cloud/dbha_add.py:29 -#: backend/ticket/builders/cloud/dbha_reduce.py:30 -#: backend/ticket/builders/cloud/dbha_reload.py:28 -#: backend/ticket/builders/cloud/dbha_replace.py:28 -#: backend/ticket/builders/cloud/dns_add.py:28 -#: backend/ticket/builders/cloud/dns_reduce.py:29 -#: backend/ticket/builders/cloud/dns_reload.py:28 -#: backend/ticket/builders/cloud/dns_replace.py:28 -#: backend/ticket/builders/cloud/drs_add.py:28 -#: backend/ticket/builders/cloud/drs_reduce.py:29 -#: backend/ticket/builders/cloud/drs_reload.py:28 -#: backend/ticket/builders/cloud/drs_replace.py:28 -#: backend/ticket/builders/cloud/nginx_reload.py:27 -#: backend/ticket/builders/cloud/nginx_replace.py:32 -#: backend/ticket/builders/cloud/service_apply.py:40 -#: backend/ticket/builders/cloud/service_apply.py:49 -#: backend/ticket/builders/common/base.py:29 -#: backend/ticket/builders/common/bigdata.py:117 -#: backend/ticket/builders/common/bigdata.py:211 -#: backend/ticket/builders/common/bigdata.py:277 -#: backend/ticket/builders/influxdb/influxdb_apply.py:37 -#: backend/ticket/builders/mysql/mysql_partition.py:48 -#: backend/ticket/builders/mysql/mysql_single_apply.py:46 -#: backend/ticket/builders/redis/redis_cluster_apply.py:29 -#: backend/ticket/builders/spider/tendb_apply.py:29 -#: backend/ticket/serializers.py:234 -msgid "云区域ID" -msgstr "Cloud Region ID" - -#: backend/db_proxy/models.py:132 +#: backend/db_proxy/models.py:155 msgid "是否刷新(该条记录是否执行)" msgstr "Whether to refresh (whether the record is executed)" -#: backend/db_proxy/models.py:133 +#: backend/db_proxy/models.py:156 msgid "是否删除" msgstr "delete or not" -#: backend/db_proxy/models.py:135 +#: backend/db_proxy/models.py:157 msgid "服务访问地址" msgstr "Service access address" -#: backend/db_proxy/tasks.py:47 -msgid "[{}] nginx配置文件下发参数:{}" -msgstr "[{}] nginx configuration file delivery parameters: {}" - -#: backend/db_proxy/tasks.py:50 -msgid "下发文件job启动失败,错误信息: {}" -msgstr "The file delivery job failed to start, error message: {}" - -#: backend/db_proxy/tasks.py:73 -msgid "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" -msgstr "" -"Cluster type: The nginx configuration file of {} does not exist, skip the " -"distribution of the nginx configuration" +#: backend/db_proxy/models.py:163 +msgid "集群扩展服务(ClusterExtension)" +msgstr "Cluster extension service (ClusterExtension)" #: backend/db_proxy/views/bkrepo/views.py:31 msgid "[bkrepo]上传文件" msgstr "[bkrepo] Upload files" +#: backend/db_proxy/views/cloud/views.py:36 +msgid "[容器化]写入云区域组件记录" +msgstr "[Containerization] Write cloud zone component records" + +#: backend/db_proxy/views/cloud/views.py:125 +msgid "[容器化]获取云区域nginx子配置文件" +msgstr "[Containerization] Get cloud zone nginx sub-configuration file" + #: backend/db_proxy/views/db_meta/serializers.py:20 msgid "逻辑城市ID列表" msgstr "List of Logical City IDs" @@ -3379,149 +5982,239 @@ msgstr "address list" msgid "状态列表" msgstr "status list" -#: backend/db_proxy/views/db_meta/serializers.py:45 +#: backend/db_proxy/views/db_meta/serializers.py:40 +msgid "哈希分片数" +msgstr "Number of hash shards" + +#: backend/db_proxy/views/db_meta/serializers.py:41 +msgid "哈希分片值" +msgstr "Hash shard value" + +#: backend/db_proxy/views/db_meta/serializers.py:58 msgid "角色交换信息列表" msgstr "List of role exchange information" -#: backend/db_proxy/views/db_meta/serializers.py:53 +#: backend/db_proxy/views/db_meta/serializers.py:66 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:29 msgid "实例Port" msgstr "Instance Port" -#: backend/db_proxy/views/db_meta/serializers.py:57 +#: backend/db_proxy/views/db_meta/serializers.py:70 msgid "domain信息" msgstr "domain information" -#: backend/db_proxy/views/db_meta/serializers.py:59 +#: backend/db_proxy/views/db_meta/serializers.py:72 msgid "tendis-swap的payload信息" msgstr "Payload information of tendis-swap" -#: backend/db_proxy/views/db_meta/serializers.py:70 +#: backend/db_proxy/views/db_meta/serializers.py:83 msgid "更新状态的信息列表" msgstr "List of updated status information" -#: backend/db_proxy/views/db_meta/serializers.py:76 +#: backend/db_proxy/views/db_meta/serializers.py:89 msgid "查询的domain列表" msgstr "Query domain list" -#: backend/db_proxy/views/db_meta/serializers.py:80 +#: backend/db_proxy/views/db_meta/serializers.py:93 msgid "查询的Hosts列表" msgstr "Query Hosts list" -#: backend/db_proxy/views/db_meta/serializers.py:84 +#: backend/db_proxy/views/db_meta/serializers.py:97 msgid "查询的集群IDs" msgstr "Cluster IDs to query" -#: backend/db_proxy/views/db_meta/serializers.py:88 +#: backend/db_proxy/views/db_meta/serializers.py:101 msgid "逻辑城市名称" msgstr "logical city name" -#: backend/db_proxy/views/db_meta/serializers.py:92 -#: backend/db_services/mysql/resources/tendbsingle/query.py:40 -#: backend/ticket/handler.py:63 +#: backend/db_proxy/views/db_meta/serializers.py:105 +#: backend/db_services/mysql/resources/tendbsingle/query.py:34 +#: backend/db_services/quick_search/constants.py:19 +#: backend/ticket/handler.py:89 msgid "实例" msgstr "instance" -#: backend/db_proxy/views/db_meta/serializers.py:93 -#: backend/db_services/mysql/cluster/serializers.py:62 -#: backend/db_services/mysql/permission/clone/serializers.py:26 -#: backend/db_services/partition/serializers.py:22 -#: backend/db_services/partition/serializers.py:40 -#: backend/db_services/partition/serializers.py:99 +#: backend/db_proxy/views/db_meta/serializers.py:106 +#: backend/db_proxy/views/dumper/serializers.py:26 +#: backend/db_report/views/dbmon_heartbeat_view.py:53 +#: backend/db_report/views/mysqlbackup_check_view.py:53 +#: backend/db_report/views/redis_dbmeta_check_view.py:52 +#: backend/db_report/views/redisbackup_check_view.py:52 +#: backend/db_services/dbbase/serializers.py:40 +#: backend/db_services/mongodb/restore/serializers.py:38 +#: backend/db_services/mysql/cluster/serializers.py:33 +#: backend/db_services/mysql/permission/clone/serializers.py:27 +#: backend/db_services/partition/serializers.py:27 +#: backend/db_services/quick_search/constants.py:18 +#: backend/db_services/redis/autofix/models.py:54 +#: backend/db_services/redis/autofix/models.py:83 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:26 +#: backend/db_services/redis/rollback/views.py:35 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:29 #: backend/ticket/builders/mysql/mysql_partition.py:49 +#: backend/ticket/filters.py:21 msgid "集群域名" msgstr "Cluster domain name" -#: backend/db_proxy/views/db_meta/serializers.py:96 -#: backend/db_proxy/views/db_meta/serializers.py:106 -#: backend/db_services/cmdb/serializers.py:50 +#: backend/db_proxy/views/db_meta/serializers.py:109 +#: backend/db_proxy/views/db_meta/serializers.py:119 +#: backend/db_services/cmdb/serializers.py:80 +#: backend/db_services/meta_import/serializers.py:58 +#: backend/db_services/meta_import/serializers.py:89 +#: backend/db_services/meta_import/serializers.py:117 +#: backend/dbm_tools/management/commands/fix_process_ip.py:26 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:33 +#: backend/ticket/builders/spider/metadata_import.py:33 +#: backend/ticket/builders/tendbsingle/metadata_import.py:32 msgid "模块ID" msgstr "module ID" -#: backend/db_proxy/views/db_meta/serializers.py:100 +#: backend/db_proxy/views/db_meta/serializers.py:113 msgid "代理列表" msgstr "proxy list" -#: backend/db_proxy/views/db_meta/serializers.py:101 -#: backend/db_proxy/views/db_meta/serializers.py:112 +#: backend/db_proxy/views/db_meta/serializers.py:114 +#: backend/db_proxy/views/db_meta/serializers.py:125 msgid "master实例" msgstr "master instance" -#: backend/db_proxy/views/db_meta/serializers.py:102 -#: backend/db_proxy/views/db_meta/serializers.py:113 +#: backend/db_proxy/views/db_meta/serializers.py:115 +#: backend/db_proxy/views/db_meta/serializers.py:126 msgid "slave实例" msgstr "slave instance" -#: backend/db_proxy/views/db_meta/serializers.py:103 -#: backend/db_proxy/views/db_meta/serializers.py:114 -#: backend/db_services/bigdata/resources/query.py:44 -#: backend/db_services/dbbase/resources/serializers.py:69 -#: backend/db_services/redis/resources/redis_cluster/query.py:57 +#: backend/db_proxy/views/db_meta/serializers.py:116 +#: backend/db_proxy/views/db_meta/serializers.py:127 +#: backend/db_services/bigdata/resources/query.py:42 +#: backend/db_services/cluster_entry/serializers.py:22 +#: backend/db_services/dbbase/resources/serializers.py:101 +#: backend/db_services/redis/resources/redis_cluster/query.py:61 +#: backend/flow/consts.py:1085 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:29 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:30 msgid "域名" msgstr "domain name" -#: backend/db_proxy/views/db_meta/serializers.py:107 +#: backend/db_proxy/views/db_meta/serializers.py:120 msgid "从库域名" msgstr "Slave domain name" -#: backend/db_proxy/views/db_meta/serializers.py:111 +#: backend/db_proxy/views/db_meta/serializers.py:124 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:39 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:36 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:32 msgid "proxy列表" msgstr "proxy list" -#: backend/db_proxy/views/db_meta/serializers.py:115 +#: backend/db_proxy/views/db_meta/serializers.py:128 msgid "slave域名" msgstr "slave domain name" -#: backend/db_proxy/views/db_meta/views.py:45 +#: backend/db_proxy/views/db_meta/serializers.py:134 +#: backend/db_proxy/views/db_meta/serializers.py:139 +#: backend/db_proxy/views/dns/serializers.py:45 +#: backend/db_proxy/views/dns/serializers.py:92 +#: backend/ticket/builders/mysql/mysql_single_apply.py:61 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:60 +msgid "域名列表" +msgstr "domain name list" + +#: backend/db_proxy/views/db_meta/serializers.py:143 +#: backend/db_services/bigdata/resources/serializers.py:19 +#: backend/db_services/redis/toolbox/serializers.py:186 +#: backend/ticket/builders/mysql/mysql_partition.py:38 +msgid "ip" +msgstr "ip" + +#: backend/db_proxy/views/db_meta/serializers.py:144 +#: backend/ticket/builders/mysql/mysql_partition.py:39 +msgid "port" +msgstr "port" + +#: backend/db_proxy/views/db_meta/serializers.py:145 +msgid "bk_cloud_id" +msgstr "bk_cloud_id" + +#: backend/db_proxy/views/db_meta/views.py:48 msgid "[dbmeta]过滤实例列表" msgstr "[dbmeta] filter instance list" -#: backend/db_proxy/views/db_meta/views.py:56 +#: backend/db_proxy/views/db_meta/views.py:59 msgid "[dbmeta]实例角色交换" msgstr "[dbmeta] instance role swap" -#: backend/db_proxy/views/db_meta/views.py:66 +#: backend/db_proxy/views/db_meta/views.py:69 +msgid "[dbmeta]sqlserver实例角色交换" +msgstr "[dbmeta]sqlserver instance role exchange" + +#: backend/db_proxy/views/db_meta/views.py:84 msgid "[dbmeta]tendis集群交换" msgstr "[dbmeta] Tendis Cluster Exchange" -#: backend/db_proxy/views/db_meta/views.py:81 +#: backend/db_proxy/views/db_meta/views.py:99 msgid "[dbmeta]状态更新" msgstr "[dbmeta] status update" -#: backend/db_proxy/views/db_meta/views.py:93 +#: backend/db_proxy/views/db_meta/views.py:111 msgid "[dbmeta]查询entry信息" msgstr "[dbmeta] query entry information" -#: backend/db_proxy/views/db_meta/views.py:105 +#: backend/db_proxy/views/db_meta/views.py:123 msgid "[dbmeta]根据逻辑城市查询具体城市名称" msgstr "[dbmeta] Query the specific city name according to the logical city" -#: backend/db_proxy/views/db_meta/views.py:118 +#: backend/db_proxy/views/db_meta/views.py:136 msgid "[dbmeta]构建测试单节点集群数据" msgstr "[dbmeta] Build and test single-node cluster data" -#: backend/db_proxy/views/db_meta/views.py:135 +#: backend/db_proxy/views/db_meta/views.py:153 msgid "[dbmeta]构建测试高可用集群数据" msgstr "[dbmeta] Build and test high-availability cluster data" -#: backend/db_proxy/views/db_meta/views.py:153 +#: backend/db_proxy/views/db_meta/views.py:171 msgid "[dbmeta]查询主机信息" msgstr "[dbmeta] query host information" -#: backend/db_proxy/views/db_meta/views.py:169 -msgid "[dbmeta]查询集群信息" -msgstr "[dbmeta] query cluster information" +#: backend/db_proxy/views/db_meta/views.py:187 +msgid "[dbmeta]查询redis集群信息" +msgstr "[dbmeta] Query redis cluster information" -#: backend/db_proxy/views/db_meta/views.py:185 +#: backend/db_proxy/views/db_meta/views.py:203 msgid "[dbmeta]fake重置dbha集群" msgstr "[dbmeta] fake reset dbha cluster" +#: backend/db_proxy/views/db_meta/views.py:220 +msgid "[dbmeta]priv_manager根据域名查询集群信息" +msgstr "[dbmeta]priv_manager queries cluster information based on domain name" + +#: backend/db_proxy/views/db_meta/views.py:239 +msgid "[dbmeta]priv_manager查询tendbsingle集群实例信息" +msgstr "[dbmeta]priv_manager queries tendbsingle cluster instance information" + +#: backend/db_proxy/views/db_meta/views.py:255 +msgid "[dbmeta]priv_manager查询tendbha集群实例信息" +msgstr "[dbmeta]priv_manager queries tendbha cluster instance information" + +#: backend/db_proxy/views/db_meta/views.py:271 +msgid "[dbmeta]priv_manager查询tendbcluster集群实例信息" +msgstr "[dbmeta]priv_manager queries tendbcluster cluster instance information" + +#: backend/db_proxy/views/db_meta/views.py:287 +msgid "[dbmeta]priv_manager查询SqlserverHA集群信息" +msgstr "[dbmeta]priv_manager queries SqlserverHA cluster information" + +#: backend/db_proxy/views/db_meta/views.py:306 +msgid "[dbmeta]priv_manager查询SqlserverSingle集群信息" +msgstr "[dbmeta]priv_manager queries SqlserverSingle cluster information" + #: backend/db_proxy/views/db_remote_service/serializers.py:19 -#: backend/db_proxy/views/gcs_dns/serializers.py:42 -#: backend/db_proxy/views/gcs_dns/serializers.py:86 -#: backend/db_services/mysql/cluster/serializers.py:45 -#: backend/db_services/mysql/instance/serializers.py:42 -#: backend/ticket/builders/common/bigdata.py:213 -#: backend/ticket/builders/common/bigdata.py:279 +#: backend/db_proxy/views/dbpriv/serializers.py:29 +#: backend/db_proxy/views/dns/serializers.py:42 +#: backend/db_proxy/views/dns/serializers.py:86 +#: backend/db_services/dbbase/cluster/serializers.py:42 +#: backend/db_services/redis/autofix/models.py:56 +#: backend/ticket/builders/common/bigdata.py:229 +#: backend/ticket/builders/common/bigdata.py:307 msgid "实例列表" msgstr "instance list" @@ -3530,19 +6223,30 @@ msgid "SQL命令列表" msgstr "List of SQL commands" #: backend/db_proxy/views/db_remote_service/serializers.py:21 +#: backend/ticket/builders/mysql/mysql_dump_data.py:37 +#: backend/ticket/builders/mysql/mysql_flashback.py:46 #: backend/ticket/builders/mysql/mysql_ha_clear.py:35 -#: backend/ticket/builders/mysql/mysql_ha_rename.py:33 +#: backend/ticket/builders/mysql/mysql_ha_rename.py:36 +#: backend/ticket/builders/mysql/mysql_openarea.py:50 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:31 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:61 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:45 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:35 msgid "是否强制执行" msgstr "Whether to enforce" -#: backend/db_proxy/views/db_remote_service/views.py:35 +#: backend/db_proxy/views/db_remote_service/views.py:30 msgid "[db-remote-service]SQL远程执行" msgstr "[db-remote-service] SQL remote execution" -#: backend/db_proxy/views/db_remote_service/views.py:46 +#: backend/db_proxy/views/db_remote_service/views.py:41 msgid "[db-remote-service]Proxy SQL远程执行" msgstr "[db-remote-service] Proxy SQL remote execution" +#: backend/db_proxy/views/db_remote_service/views.py:52 +msgid "[db-remote-service]sqlserver SQL远程执行" +msgstr "[db-remote-service]sqlserver SQL remote execution" + #: backend/db_proxy/views/dbconfig/serializers.py:22 msgid "" "conf_file 可以是,号分隔的多个文件名,返回结果是一个按照配置文件名组合的一个 " @@ -3561,6 +6265,7 @@ msgstr "" #: backend/db_proxy/views/dbconfig/serializers.py:29 #: backend/db_services/dbconfig/serializers.py:21 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:31 msgid "配置类型" msgstr "configuration type" @@ -3611,111 +6316,159 @@ msgstr "level name" msgid "level value列表" msgstr "level value list" -#: backend/db_proxy/views/dbconfig/views.py:40 +#: backend/db_proxy/views/dbconfig/views.py:35 msgid "[dbconfig]查询配置项列表" msgstr "[dbconfig] query configuration item list" -#: backend/db_proxy/views/dbconfig/views.py:53 +#: backend/db_proxy/views/dbconfig/views.py:48 msgid "[dbconfig]批量获取多个对象的某一配置项" msgstr "" "[dbconfig] Get a certain configuration item of multiple objects in batches" -#: backend/db_proxy/views/gcs_dns/serializers.py:28 -#: backend/db_proxy/views/gcs_dns/serializers.py:44 -#: backend/db_proxy/views/gcs_dns/serializers.py:58 -#: backend/db_proxy/views/gcs_dns/serializers.py:72 -#: backend/db_proxy/views/gcs_dns/serializers.py:91 +#: backend/db_proxy/views/dbpriv/serializers.py:23 +msgid "云区域id,如果传入ip、port也要传入bk_cloud_id" +msgstr "Cloud area id. If you pass in IP and port, you must also pass in bk_cloud_id." + +#: backend/db_proxy/views/dbpriv/serializers.py:26 +msgid "用户名称" +msgstr "Username" + +#: backend/db_proxy/views/dbpriv/serializers.py:27 +msgid "组件,比如mysql、redis、tbinlogdumper等" +msgstr "Components, such as mysql, redis, tbinlogdumper, etc." + +#: backend/db_proxy/views/dbpriv/serializers.py:30 +msgid "信息列表" +msgstr "Information list" + +#: backend/db_proxy/views/dbpriv/views.py:30 +msgid "[dbpriv]获取proxy密码" +msgstr "[dbpriv] Get proxy password" + +#: backend/db_proxy/views/dns/serializers.py:28 +#: backend/db_proxy/views/dns/serializers.py:44 +#: backend/db_proxy/views/dns/serializers.py:58 +#: backend/db_proxy/views/dns/serializers.py:72 +#: backend/db_proxy/views/dns/serializers.py:91 msgid "GCS业务英文缩写" msgstr "GCS Business English Abbreviation" -#: backend/db_proxy/views/gcs_dns/serializers.py:29 +#: backend/db_proxy/views/dns/serializers.py:29 msgid "查询的域名列表" msgstr "List of domain names to query" -#: backend/db_proxy/views/gcs_dns/serializers.py:30 +#: backend/db_proxy/views/dns/serializers.py:30 msgid "查询的IP列表" msgstr "Query IP list" -#: backend/db_proxy/views/gcs_dns/serializers.py:31 +#: backend/db_proxy/views/dns/serializers.py:31 msgid "返回数据列表字段" msgstr "return data list field" -#: backend/db_proxy/views/gcs_dns/serializers.py:41 -#: backend/db_proxy/views/gcs_dns/serializers.py:59 -#: backend/db_proxy/views/gcs_dns/serializers.py:73 -#: backend/db_proxy/views/gcs_dns/serializers.py:85 +#: backend/db_proxy/views/dns/serializers.py:41 +#: backend/db_proxy/views/dns/serializers.py:59 +#: backend/db_proxy/views/dns/serializers.py:73 +#: backend/db_proxy/views/dns/serializers.py:85 msgid "查询的域名" msgstr "query domain name" -#: backend/db_proxy/views/gcs_dns/serializers.py:45 -#: backend/db_proxy/views/gcs_dns/serializers.py:92 -#: backend/ticket/builders/mysql/mysql_single_apply.py:61 -msgid "域名列表" -msgstr "domain name list" - -#: backend/db_proxy/views/gcs_dns/serializers.py:55 +#: backend/db_proxy/views/dns/serializers.py:55 msgid "旧实例节点" msgstr "old instance node" -#: backend/db_proxy/views/gcs_dns/serializers.py:56 +#: backend/db_proxy/views/dns/serializers.py:56 msgid "新实例节点" msgstr "new instance node" -#: backend/db_proxy/views/gcs_dns/serializers.py:60 +#: backend/db_proxy/views/dns/serializers.py:60 msgid "修改数组" msgstr "modify array" -#: backend/db_proxy/views/gcs_dns/serializers.py:70 +#: backend/db_proxy/views/dns/serializers.py:70 msgid "新的实例节点" msgstr "new instance node" -#: backend/db_proxy/views/gcs_dns/serializers.py:74 +#: backend/db_proxy/views/dns/serializers.py:74 msgid "修改列列表" msgstr "modify column list" -#: backend/db_proxy/views/gcs_dns/serializers.py:75 +#: backend/db_proxy/views/dns/serializers.py:75 +#: backend/db_report/views/redisbackup_check_view.py:57 msgid "实例节点" msgstr "instance node" -#: backend/db_proxy/views/gcs_dns/serializers.py:87 +#: backend/db_proxy/views/dns/serializers.py:87 msgid "管理者" msgstr "manager" -#: backend/db_proxy/views/gcs_dns/serializers.py:88 +#: backend/db_proxy/views/dns/serializers.py:88 msgid "域名备注信息" msgstr "Domain Name Remarks" -#: backend/db_proxy/views/gcs_dns/serializers.py:89 +#: backend/db_proxy/views/dns/serializers.py:89 msgid "域名类型" msgstr "domain type" -#: backend/db_proxy/views/gcs_dns/views.py:49 -msgid "[gcsdns]获取所有ip、域名关系" -msgstr "[gcsdns] Get all ip, domain name relationship" +#: backend/db_proxy/views/dns/views.py:30 +msgid "[dns]获取所有ip、域名关系" +msgstr "[dns] Get all IP and domain name relationships" -#: backend/db_proxy/views/gcs_dns/views.py:60 -msgid "[gcsdns]获取域名映射关系" -msgstr "[gcsdns] Get domain name mapping relationship" +#: backend/db_proxy/views/dns/views.py:46 +msgid "[dns]获取域名映射关系" +msgstr "[dns] Get domain name mapping relationship" -#: backend/db_proxy/views/gcs_dns/views.py:71 -msgid "[gcsdns]批量更新域名映射关系" -msgstr "[gcsdns] Batch update domain name mapping relationship" +#: backend/db_proxy/views/dns/views.py:59 +msgid "[dns]批量更新域名映射关系" +msgstr "[dns] Batch update domain name mapping relationships" -#: backend/db_proxy/views/gcs_dns/views.py:82 -msgid "[gcsdns]更新域名映射关系" -msgstr "[gcsdns] Update domain name mapping relationship" +#: backend/db_proxy/views/dns/views.py:75 +msgid "[dns]更新域名映射关系" +msgstr "[dns] Update domain name mapping relationship" -#: backend/db_proxy/views/gcs_dns/views.py:93 -msgid "[gcsdns]删除域名映射" -msgstr "[gcsdns] delete domain name mapping" +#: backend/db_proxy/views/dns/views.py:88 +msgid "[dns]删除域名映射" +msgstr "[dns]Delete domain name mapping" -#: backend/db_proxy/views/gcs_dns/views.py:104 -msgid "[gcsdns]新增域名映射关系" -msgstr "[gcsdns] Add domain name mapping relationship" +#: backend/db_proxy/views/dns/views.py:104 +msgid "[dns]新增域名映射关系" +msgstr "[dns] Add domain name mapping relationship" -#: backend/db_proxy/views/hadb/serializers.py:19 -msgid "名字" -msgstr "name" +#: backend/db_proxy/views/dumper/serializers.py:22 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:27 +msgid "主机端口" +msgstr "host port" + +#: backend/db_proxy/views/dumper/serializers.py:23 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:28 +msgid "待切换后需要同步的binlog文件" +msgstr "Binlog files that need to be synchronized after switching" + +#: backend/db_proxy/views/dumper/serializers.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:29 +msgid "待切换后需要同步的binlog文件的为位点" +msgstr "The location of the binlog file that needs to be synchronized after switching is" + +#: backend/db_proxy/views/dumper/serializers.py:27 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:32 +msgid "dumper切换信息" +msgstr "dumper switching information" + +#: backend/db_proxy/views/dumper/serializers.py:31 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:35 +msgid "是否安全切换" +msgstr "Is it safe to switch?" + +#: backend/db_proxy/views/dumper/views.py:34 +msgid "[dumper]迁移" +msgstr "[dumper]migration" + +#: backend/db_proxy/views/dumper/views.py:78 +msgid "透传接口dumper迁移创建的单据" +msgstr "Documents created by transparent transmission interface dumper migration" + +#: backend/db_proxy/views/hadb/serializers.py:19 +msgid "名字" +msgstr "name" #: backend/db_proxy/views/hadb/serializers.py:20 msgid "查询参数" @@ -3738,81 +6491,137 @@ msgid "[hadb]上报和查询ha服务的状态" msgstr "[hadb] Report and query the status of ha service" #: backend/db_proxy/views/hadb/views.py:60 +msgid "[hadb]查询和上报切换队列" +msgstr "[hadb] Query and report switching queue" + #: backend/db_proxy/views/hadb/views.py:70 -msgid "[gcsdns]查询和上报切换队列" -msgstr "[gcsdns] query and report switch queue" +msgid "[hadb]查询和上报切换日志" +msgstr "[hadb] Query and report switching logs" + +#: backend/db_proxy/views/hadb/views.py:80 +msgid "[hadb]DBHA切换屏蔽配置" +msgstr "[hadb]DBHA switch shielding configuration" + +#: backend/db_proxy/views/job_callback/serialiers.py:17 +msgid "作业实例ID" +msgstr "job instance ID" + +#: backend/db_proxy/views/job_callback/serialiers.py:18 +msgid "作业状态码" +msgstr "job status code" + +#: backend/db_proxy/views/job_callback/serialiers.py:19 +msgid "步骤块中包含的各个步骤执行状态" +msgstr "Individual step execution status contained in the step block" + +#: backend/db_proxy/views/job_callback/views.py:44 +msgid "nginx文件下发job回调视图" +msgstr "nginx file delivery job callback view" + +#: backend/db_proxy/views/job_callback/views.py:55 +msgid "[{}]nginx配置文件下发失败" +msgstr "[{}]Failed to deliver nginx configuration file" + +#: backend/db_proxy/views/job_callback/views.py:58 +msgid "[{}]nginx配置文件下发成功" +msgstr "[{}]nginx configuration file delivered successfully" + +#: backend/db_proxy/views/job_callback/views.py:62 +msgid "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" +msgstr "" +"[{}] The job information cache of the nginx file delivery has expired, " +"please consider whether the delivery time is too long" + +#: backend/db_proxy/views/job_callback/views.py:87 +msgid "nginx重启参数:{}" +msgstr "nginx restart parameters: {}" + +#: backend/db_proxy/views/job_callback/views.py:92 +msgid "nginx重启失败,错误信息: {}" +msgstr "nginx restart failed, error message: {}" + +#: backend/db_proxy/views/job_callback/views.py:97 +msgid "nginx重启job回调视图" +msgstr "nginx restart job callback view" + +#: backend/db_proxy/views/job_callback/views.py:106 +msgid "[{}]nginx重启失败,请前往作业平台查看详情" +msgstr "" +"[{}]nginx failed to restart, please go to the operation platform to check " +"the details" + +#: backend/db_proxy/views/job_callback/views.py:108 +msgid "[{}]nginx重启成功" +msgstr "[{}]nginx restarted successfully" -#: backend/db_proxy/views/jobapi/serializers.py:21 +#: backend/db_proxy/views/jobapi/serializers.py:20 msgid "主机ip" msgstr "host ip" -#: backend/db_proxy/views/jobapi/serializers.py:26 -#: backend/db_proxy/views/jobapi/serializers.py:51 +#: backend/db_proxy/views/jobapi/serializers.py:24 +#: backend/db_proxy/views/jobapi/serializers.py:48 msgid "执行脚本的主机ip列表" msgstr "List of host ip to execute the script" -#: backend/db_proxy/views/jobapi/serializers.py:27 +#: backend/db_proxy/views/jobapi/serializers.py:25 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:29 msgid "脚本内容" msgstr "Script content" -#: backend/db_proxy/views/jobapi/serializers.py:28 +#: backend/db_proxy/views/jobapi/serializers.py:26 msgid "脚本语言类型" msgstr "scripting language type" -#: backend/db_proxy/views/jobapi/serializers.py:29 +#: backend/db_proxy/views/jobapi/serializers.py:27 msgid "执行脚本的账号" msgstr "The account that executes the script" -#: backend/db_proxy/views/jobapi/serializers.py:30 -#: backend/db_proxy/views/jobapi/serializers.py:78 +#: backend/db_proxy/views/jobapi/serializers.py:28 +#: backend/db_proxy/views/jobapi/serializers.py:75 msgid "超时时间,单位秒" msgstr "Timeout, in seconds" -#: backend/db_proxy/views/jobapi/serializers.py:39 -#: backend/db_proxy/views/jobapi/serializers.py:49 +#: backend/db_proxy/views/jobapi/serializers.py:37 +#: backend/db_proxy/views/jobapi/serializers.py:46 msgid "任务实例ID" msgstr "Task instance ID" -#: backend/db_proxy/views/jobapi/serializers.py:50 +#: backend/db_proxy/views/jobapi/serializers.py:47 msgid "步骤实例ID" msgstr "Step Instance ID" -#: backend/db_proxy/views/jobapi/serializers.py:62 +#: backend/db_proxy/views/jobapi/serializers.py:59 msgid "源主机ip" msgstr "source host ip" -#: backend/db_proxy/views/jobapi/serializers.py:63 +#: backend/db_proxy/views/jobapi/serializers.py:60 msgid "源主机账号" msgstr "source host account" -#: backend/db_proxy/views/jobapi/serializers.py:65 +#: backend/db_proxy/views/jobapi/serializers.py:62 msgid "文件列表" msgstr "File List" -#: backend/db_proxy/views/jobapi/serializers.py:72 +#: backend/db_proxy/views/jobapi/serializers.py:69 msgid "目标主机ip" msgstr "target host ip" -#: backend/db_proxy/views/jobapi/serializers.py:74 +#: backend/db_proxy/views/jobapi/serializers.py:71 msgid "源文件列表" msgstr "source file list" -#: backend/db_proxy/views/jobapi/serializers.py:75 +#: backend/db_proxy/views/jobapi/serializers.py:72 msgid "目标账号" msgstr "target account" -#: backend/db_proxy/views/jobapi/serializers.py:76 +#: backend/db_proxy/views/jobapi/serializers.py:73 msgid "目标目录" msgstr "target directory" -#: backend/db_proxy/views/jobapi/serializers.py:77 +#: backend/db_proxy/views/jobapi/serializers.py:74 msgid "目标主机ip列表" msgstr "target host ip list" -#: backend/db_proxy/views/jobapi/serializers.py:80 -msgid "db_cloud_token" -msgstr "db_cloud_token" - #: backend/db_proxy/views/jobapi/views.py:42 msgid "[jobapi]快速执行脚本" msgstr "[jobapi] execute script quickly" @@ -3866,405 +6675,744 @@ msgstr "Polaris service token" msgid "需要解绑的后端主机端口数组, 格式为“ip:port" msgstr "An array of backend host ports to be unbound, in the format [ip:port]" -#: backend/db_proxy/views/nameservice/views.py:38 +#: backend/db_proxy/views/nameservice/views.py:33 msgid "[name service]clb解绑部分后端主机" msgstr "[name service]clb unbinds some backend hosts" -#: backend/db_proxy/views/nameservice/views.py:53 +#: backend/db_proxy/views/nameservice/views.py:48 msgid "[name service]获取clb已绑定后端主机的IP" msgstr "[name service] Obtain the IP of the backend host that clb is bound to" -#: backend/db_proxy/views/nameservice/views.py:68 +#: backend/db_proxy/views/nameservice/views.py:63 msgid "[name service]获取polaris后端主机信息" msgstr "[name service] Get polaris backend host information" -#: backend/db_proxy/views/nameservice/views.py:83 +#: backend/db_proxy/views/nameservice/views.py:78 msgid "[name service]polaris解绑部分后端主机" msgstr "[name service]polaris unbinds some backend hosts" #: backend/db_proxy/views/redis_dts/serializers.py:18 -#: backend/db_proxy/views/redis_dts/serializers.py:60 -#: backend/db_proxy/views/redis_dts/serializers.py:69 -#: backend/db_proxy/views/redis_dts/serializers.py:78 +#: backend/db_proxy/views/redis_dts/serializers.py:41 +#: backend/db_proxy/views/redis_dts/serializers.py:50 +#: backend/db_proxy/views/redis_dts/serializers.py:59 msgid "DTS_server IP" msgstr "DTS_server IP" -#: backend/db_proxy/views/redis_dts/serializers.py:28 -#: backend/db_proxy/views/redis_dts/serializers.py:34 -#: backend/db_proxy/views/redis_dts/serializers.py:93 -#: backend/db_proxy/views/redis_dts/serializers.py:99 -#: backend/db_services/redis_dts/serializers.py:23 -msgid "任务ID" -msgstr "task ID" - +#: backend/db_proxy/views/redis_dts/serializers.py:23 #: backend/db_proxy/views/redis_dts/serializers.py:29 -#: backend/db_proxy/views/redis_dts/serializers.py:35 -#: backend/db_proxy/views/redis_dts/serializers.py:94 -#: backend/db_proxy/views/redis_dts/serializers.py:100 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:43 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:24 -#: backend/db_services/redis_dts/serializers.py:24 +#: backend/db_proxy/views/redis_dts/serializers.py:75 +#: backend/db_proxy/views/redis_dts/serializers.py:81 +#: backend/db_proxy/views/redis_dts/serializers.py:101 +#: backend/db_services/mysql/dumper/filters.py:43 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:75 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:22 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:28 +#: backend/db_services/redis/redis_dts/serializers.py:35 +#: backend/db_services/redis/redis_dts/serializers.py:46 msgid "源集群" msgstr "source cluster" +#: backend/db_proxy/views/redis_dts/serializers.py:24 #: backend/db_proxy/views/redis_dts/serializers.py:30 -#: backend/db_proxy/views/redis_dts/serializers.py:36 -#: backend/db_proxy/views/redis_dts/serializers.py:95 -#: backend/db_proxy/views/redis_dts/serializers.py:101 -#: backend/db_services/mysql/permission/authorize/models.py:28 -#: backend/db_services/mysql/permission/authorize/serializers.py:28 -#: backend/db_services/redis_dts/serializers.py:25 +#: backend/db_proxy/views/redis_dts/serializers.py:76 +#: backend/db_proxy/views/redis_dts/serializers.py:82 +#: backend/db_proxy/views/redis_dts/serializers.py:103 +#: backend/db_services/dbpermission/db_authorize/models.py:27 +#: backend/db_services/dbpermission/db_authorize/serializers.py:27 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:25 +#: backend/db_services/mysql/open_area/serializers.py:66 +#: backend/db_services/redis/redis_dts/serializers.py:36 +#: backend/db_services/redis/redis_dts/serializers.py:48 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:25 msgid "目标集群" msgstr "target cluster" -#: backend/db_proxy/views/redis_dts/serializers.py:41 -#: backend/db_proxy/views/redis_dts/serializers.py:47 -#: backend/db_proxy/views/redis_dts/serializers.py:114 -#: backend/db_services/redis_dts/serializers.py:30 -#: backend/db_services/redis_dts/serializers.py:36 -msgid "子任务ID列表" -msgstr "List of subtask IDs" - -#: backend/db_proxy/views/redis_dts/serializers.py:49 -#: backend/db_services/dbconfig/serializers.py:27 -#: backend/db_services/dbresource/serializers.py:144 -#: backend/db_services/redis_dts/serializers.py:38 -#: backend/ticket/serializers.py:220 backend/ticket/serializers.py:228 -msgid "操作类型" -msgstr "operation type" - -#: backend/db_proxy/views/redis_dts/serializers.py:53 +#: backend/db_proxy/views/redis_dts/serializers.py:34 msgid "锁key名" msgstr "lock key name" -#: backend/db_proxy/views/redis_dts/serializers.py:54 +#: backend/db_proxy/views/redis_dts/serializers.py:35 msgid "锁持有者" msgstr "lock holder" -#: backend/db_proxy/views/redis_dts/serializers.py:55 +#: backend/db_proxy/views/redis_dts/serializers.py:36 msgid "锁ttl时间(seconds)" msgstr "Lock ttl time (seconds)" -#: backend/db_proxy/views/redis_dts/serializers.py:61 -#: backend/db_proxy/views/redis_dts/serializers.py:70 -#: backend/db_proxy/views/redis_dts/serializers.py:79 -#: backend/db_proxy/views/redis_dts/serializers.py:89 -msgid "db类型" -msgstr "db type" - -#: backend/db_proxy/views/redis_dts/serializers.py:63 -#: backend/db_proxy/views/redis_dts/serializers.py:72 -#: backend/db_proxy/views/redis_dts/serializers.py:104 +#: backend/db_proxy/views/redis_dts/serializers.py:44 +#: backend/db_proxy/views/redis_dts/serializers.py:53 +#: backend/db_proxy/views/redis_dts/serializers.py:85 msgid "task类型列表" msgstr "task type list" -#: backend/db_proxy/views/redis_dts/serializers.py:80 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:52 +#: backend/db_proxy/views/redis_dts/serializers.py:61 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:57 msgid "task类型" msgstr "task type" -#: backend/db_proxy/views/redis_dts/serializers.py:81 +#: backend/db_proxy/views/redis_dts/serializers.py:62 msgid "限制条数" msgstr "limit number" -#: backend/db_proxy/views/redis_dts/serializers.py:82 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:55 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:65 +#: backend/db_proxy/views/redis_dts/serializers.py:63 +#: backend/db_services/redis/autofix/models.py:86 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:89 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:70 msgid "任务状态" msgstr "task status" -#: backend/db_proxy/views/redis_dts/serializers.py:87 +#: backend/db_proxy/views/redis_dts/serializers.py:68 msgid "最大数据量" msgstr "Maximum amount of data" -#: backend/db_proxy/views/redis_dts/serializers.py:88 +#: backend/db_proxy/views/redis_dts/serializers.py:69 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:20 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:54 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:50 #: backend/ticket/builders/mysql/mysql_single_apply.py:67 -#: backend/ticket/builders/redis/redis_cluster_apply.py:35 -#: backend/ticket/builders/spider/tendb_apply.py:48 +#: backend/ticket/builders/redis/redis_cluster_apply.py:36 +#: backend/ticket/builders/redis/redis_instance_apply.py:51 +#: backend/ticket/builders/riak/riak_apply.py:33 +#: backend/ticket/builders/riak/riak_migrate.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:66 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:53 msgid "城市名" msgstr "city ​​name" -#: backend/db_proxy/views/redis_dts/serializers.py:102 +#: backend/db_proxy/views/redis_dts/serializers.py:83 msgid "源redis slave IP" msgstr "Source redis slave IP" -#: backend/db_proxy/views/redis_dts/serializers.py:109 +#: backend/db_proxy/views/redis_dts/serializers.py:90 msgid "子任务ID" msgstr "Subtask ID" -#: backend/db_proxy/views/redis_dts/views.py:62 +#: backend/db_proxy/views/redis_dts/serializers.py:95 +#: backend/db_services/redis/redis_dts/serializers.py:41 +msgid "子任务ID列表" +msgstr "List of subtask IDs" + +#: backend/db_proxy/views/redis_dts/serializers.py:102 +#: backend/db_services/redis/redis_dts/serializers.py:47 +msgid "源集群密码" +msgstr "Source cluster password" + +#: backend/db_proxy/views/redis_dts/serializers.py:104 +#: backend/db_services/redis/redis_dts/serializers.py:49 +msgid "目标集群密码" +msgstr "Target cluster password" + +#: backend/db_proxy/views/redis_dts/serializers.py:108 +#: backend/db_services/redis/redis_dts/serializers.py:53 +msgid "数据复制类型" +msgstr "Data copy type" + +#: backend/db_proxy/views/redis_dts/serializers.py:110 +#: backend/db_services/redis/redis_dts/serializers.py:55 +msgid "复制列表" +msgstr "Copy list" + +#: backend/db_proxy/views/redis_dts/views.py:56 msgid "dtsserver是否在黑名单中" msgstr "Is dtsserver in the blacklist" -#: backend/db_proxy/views/redis_dts/views.py:77 -#: backend/db_services/redis_dts/views.py:32 -msgid "获取DTS历史任务以及其对应task cnt" -msgstr "Get DTS historical tasks and their corresponding task cnt" - -#: backend/db_proxy/views/redis_dts/views.py:89 +#: backend/db_proxy/views/redis_dts/views.py:71 msgid "获取dts任务详情" msgstr "Get dts task details" -#: backend/db_proxy/views/redis_dts/views.py:99 -#: backend/db_services/redis_dts/views.py:43 +#: backend/db_proxy/views/redis_dts/views.py:81 +#: backend/db_services/redis/redis_dts/views.py:73 msgid "获取迁移任务task列表,失败的排在前面" msgstr "Get the list of migration tasks, the failed ones are listed first" -#: backend/db_proxy/views/redis_dts/views.py:109 -#: backend/db_services/redis_dts/views.py:54 -msgid "" -"dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) 两" -"个操作" -msgstr "" -"The dts task operation currently supports two operations: synchronous " -"completion (syncStopTodo) and forced termination (ForceKillTaskTodo)" - -#: backend/db_proxy/views/redis_dts/views.py:121 -#: backend/db_services/redis_dts/views.py:65 -msgid "dts tasks重新开始" -msgstr "dts tasks restart" - -#: backend/db_proxy/views/redis_dts/views.py:131 -#: backend/db_services/redis_dts/views.py:76 -msgid "dts tasks重试当前步骤" -msgstr "dts tasks retry current step" - -#: backend/db_proxy/views/redis_dts/views.py:141 +#: backend/db_proxy/views/redis_dts/views.py:91 msgid "dts 分布式锁,trylock,成功返回True,失败返回False" msgstr "" "dts distributed lock, trylock, returns True on success, returns False on " "failure" -#: backend/db_proxy/views/redis_dts/views.py:156 +#: backend/db_proxy/views/redis_dts/views.py:106 msgid "dts 分布式锁,unlock" msgstr "dts distributed lock, unlock" -#: backend/db_proxy/views/redis_dts/views.py:171 +#: backend/db_proxy/views/redis_dts/views.py:121 msgid "获取dts server迁移中的任务" msgstr "Get tasks in dts server migration" -#: backend/db_proxy/views/redis_dts/views.py:186 +#: backend/db_proxy/views/redis_dts/views.py:136 msgid "获取DtsServer上syncPort最大的task" msgstr "Get the task with the largest syncPort on DtsServer" -#: backend/db_proxy/views/redis_dts/views.py:201 +#: backend/db_proxy/views/redis_dts/views.py:151 msgid "获取最近30天内task_type类型的等待执行的tasks" msgstr "" "Obtain the tasks waiting to be executed of the task_type type in the last 30 " "days" -#: backend/db_proxy/views/redis_dts/views.py:216 +#: backend/db_proxy/views/redis_dts/views.py:166 msgid "获取最近30天内的等待调度的jobs" msgstr "Get the jobs waiting to be scheduled in the last 30 days" -#: backend/db_proxy/views/redis_dts/views.py:231 -#: backend/db_proxy/views/redis_dts/views.py:246 -#: backend/db_proxy/views/redis_dts/views.py:261 +#: backend/db_proxy/views/redis_dts/views.py:181 +#: backend/db_proxy/views/redis_dts/views.py:196 +#: backend/db_proxy/views/redis_dts/views.py:211 msgid "获取一个job的所有待调度的tasks" msgstr "Get all pending tasks of a job" -#: backend/db_proxy/views/redis_dts/views.py:276 +#: backend/db_proxy/views/redis_dts/views.py:226 msgid "批量更新dts_tasks" msgstr "Batch update dts_tasks" -#: backend/db_proxy/views/serialiers.py:29 +#: backend/db_proxy/views/redis_dts/views.py:238 +msgid "redis 连接性测试" +msgstr "redis connectivity test" + +#: backend/db_proxy/views/serialiers.py:24 msgid "调用的校验token" msgstr "Call verification token" -#: backend/db_proxy/views/serialiers.py:30 +#: backend/db_proxy/views/serialiers.py:25 msgid "请求服务所属的云区域ID" msgstr "The ID of the cloud region to which the requested service belongs" -#: backend/db_proxy/views/serialiers.py:47 -msgid "token:{}解密失败,请检查token是否合法" -msgstr "token: {} decryption failed, please check whether the token is legal" - -#: backend/db_proxy/views/serialiers.py:49 -msgid "token:{}不存在,请传入校验token" -msgstr "token: {} does not exist, please pass in the verification token" - -#: backend/db_proxy/views/serialiers.py:54 -msgid "解析的云区域ID{}与请求参数的云区域ID{}不相同,请检查token是否合法" -msgstr "" -"The parsed cloud region ID{} is different from the cloud region ID{} of the " -"request parameter, please check whether the token is valid" - -#: backend/db_proxy/views/serialiers.py:62 -msgid "作业实例ID" -msgstr "job instance ID" - -#: backend/db_proxy/views/serialiers.py:63 -msgid "作业状态码" -msgstr "job status code" - -#: backend/db_proxy/views/serialiers.py:64 -msgid "步骤块中包含的各个步骤执行状态" -msgstr "Individual step execution status contained in the step block" - -#: backend/db_proxy/views/views.py:55 -msgid "nginx文件下发job回调视图" -msgstr "nginx file delivery job callback view" +#: backend/db_report/enums/__init__.py:20 +msgid "巡检报告" +msgstr "Inspection report" -#: backend/db_proxy/views/views.py:66 -msgid "[{}]nginx配置文件下发失败" -msgstr "[{}]Failed to deliver nginx configuration file" +#: backend/db_report/enums/__init__.py:24 +msgid "文本渲染" +msgstr "text rendering" -#: backend/db_proxy/views/views.py:69 -msgid "[{}]nginx配置文件下发成功" -msgstr "[{}]nginx configuration file delivered successfully" +#: backend/db_report/enums/__init__.py:25 +msgid "状态渲染" +msgstr "state rendering" -#: backend/db_proxy/views/views.py:73 -msgid "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" -msgstr "" -"[{}] The job information cache of the nginx file delivery has expired, " -"please consider whether the delivery time is too long" +#: backend/db_report/enums/__init__.py:27 +msgid "数据校验失败详情渲染" +msgstr "Data verification failure details rendering" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:17 +msgid "TWEMPROXY" +msgstr "TWEMPROXY" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:18 +msgid "PREDIXY" +msgstr "PREDIXY" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:19 +msgid "REDIS_SSD" +msgstr "REDIS_SSD" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:20 +msgid "REDIS_CACHE" +msgstr "REDIS_CACHE" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:21 +msgid "TENDISPLUS" +msgstr "TENDISPLUS" + +#: backend/db_report/enums/meta_check_sub_type.py:17 +#: backend/db_report/views/meta_check_view.py:43 +msgid "实例集群归属" +msgstr "Instance cluster ownership" + +#: backend/db_report/enums/meta_check_sub_type.py:18 +msgid "数据同步实例角色" +msgstr "Data synchronization instance role" + +#: backend/db_report/enums/meta_check_sub_type.py:19 +msgid "集群结构" +msgstr "cluster structure" + +#: backend/db_report/enums/meta_check_sub_type.py:20 +msgid "孤立的实例" +msgstr "isolated instance" + +#: backend/db_report/enums/meta_check_sub_type.py:21 +msgid "不属于RUNNING状态" +msgstr "Not in the RUNNING state" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:17 +msgid "集群可用全备" +msgstr "The cluster is fully available" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:18 +msgid "主库binlog备份" +msgstr "Main library binlog backup" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:19 +msgid "binlog连续性检查" +msgstr "binlog continuity check" + +#: backend/db_report/enums/redisbackup_check_sub_type.py:17 +msgid "集群全备" +msgstr "Cluster fully prepared" + +#: backend/db_report/enums/redisbackup_check_sub_type.py:18 +msgid "从库binlog备份" +msgstr "Backup from library binlog" + +#: backend/db_report/models/checksum_check_report.py:21 +#: backend/db_services/dbbase/resources/query.py:84 +#: backend/db_services/dbbase/resources/query.py:160 +#: backend/db_services/sqlserver/data_migrate/serializers.py:48 +msgid "集群名称" +msgstr "Cluster name" + +#: backend/db_report/models/checksum_check_report.py:25 +msgid "失败的slave实例数量" +msgstr "Number of failed slave instances" + +#: backend/db_report/models/checksum_check_report.py:29 +msgid "slave部署机器ip" +msgstr "slave deployment machine ip" + +#: backend/db_report/models/checksum_check_report.py:30 +msgid "slave部署机器port" +msgstr "slave deployment machine port" + +#: backend/db_report/models/checksum_check_report.py:31 +msgid "master部署机器ip" +msgstr "master deployment machine ip" + +#: backend/db_report/models/checksum_check_report.py:32 +msgid "master部署机器port" +msgstr "master deployment machine port" + +#: backend/db_report/models/checksum_check_report.py:33 +msgid "不一致库表详情" +msgstr "Inconsistent database table details" + +#: backend/db_report/models/dbmon_heartbeat_report.py:20 +msgid "实例类型子项" +msgstr "Instance type child" + +#: backend/db_report/models/dbmon_heartbeat_report.py:22 +#: backend/db_report/models/redisbackup_check_report.py:21 +msgid "实例节点 ip:port" +msgstr "Instance node ip:port" + +#: backend/db_report/models/dbmon_heartbeat_report.py:23 +#: backend/db_report/views/dbmon_heartbeat_view.py:63 +#: backend/db_services/cmdb/serializers.py:37 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:12 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:12 +#: backend/ticket/builders/__init__.py:160 backend/ticket/serializers.py:94 +msgid "业务名" +msgstr "business name" -#: backend/db_proxy/views/views.py:91 -msgid "[{}] nginx重启参数:{}" -msgstr "[{}] nginx restart parameters: {}" +#: backend/db_report/models/dbmon_heartbeat_report.py:24 +#: backend/db_report/views/dbmon_heartbeat_view.py:68 +msgid "业务所属dba" +msgstr "DBA to which the business belongs" -#: backend/db_proxy/views/views.py:96 -msgid "nginx重启失败,错误信息: {}" -msgstr "nginx restart failed, error message: {}" +#: backend/db_report/models/meta_check_report.py:26 +msgid "元数据检查子项" +msgstr "Metadata check subkeys" -#: backend/db_proxy/views/views.py:101 -msgid "nginx重启job回调视图" -msgstr "nginx restart job callback view" +#: backend/db_report/models/mysqlbackup_check_report.py:23 +#: backend/db_report/models/redisbackup_check_report.py:23 +msgid "备份检查子项" +msgstr "Backup check items" -#: backend/db_proxy/views/views.py:110 -msgid "[{}]nginx重启失败,请前往作业平台查看详情" -msgstr "" -"[{}]nginx failed to restart, please go to the operation platform to check " -"the details" +#: backend/db_report/report_basemodel.py:18 +msgid "业务的 cmdb id" +msgstr "business cmdb id" -#: backend/db_proxy/views/views.py:112 -msgid "[{}]nginx重启成功" -msgstr "[{}]nginx restarted successfully" +#: backend/db_report/report_basemodel.py:19 +msgid "云区域 id" +msgstr "Cloud area id" + +#: backend/db_report/report_basemodel.py:20 +msgid "巡检结果状态, 默认正常" +msgstr "Inspection result status, default is normal" + +#: backend/db_report/report_basemodel.py:21 +msgid "备注信息" +msgstr "Remarks" + +#: backend/db_report/views/checksum_check_report_view.py:44 +#: backend/db_report/views/checksum_check_report_view.py:84 +msgid "数据校验" +msgstr "Data verification" + +#: backend/db_report/views/checksum_check_report_view.py:48 +msgid "报告ID" +msgstr "Report ID" + +#: backend/db_report/views/checksum_check_report_view.py:53 +#: backend/db_report/views/dbmon_heartbeat_view.py:48 +#: backend/db_report/views/meta_check_view.py:47 +#: backend/db_report/views/mysqlbackup_check_view.py:48 +#: backend/db_report/views/redis_dbmeta_check_view.py:47 +#: backend/db_report/views/redisbackup_check_view.py:47 +#: backend/db_services/dbbase/resources/constants.py:19 +#: backend/db_services/dbbase/resources/query.py:238 +#: backend/db_services/ipchooser/constants.py:95 +#: backend/db_services/ipchooser/constants.py:118 +#: backend/db_services/ipchooser/mock_data.py:36 +#: backend/db_services/ipchooser/mock_data.py:92 +#: backend/db_services/meta_import/serializers.py:57 +#: backend/db_services/meta_import/serializers.py:88 +#: backend/db_services/meta_import/serializers.py:103 +#: backend/db_services/meta_import/serializers.py:115 +#: backend/iam_app/dataclass/actions.py:116 +#: backend/iam_app/dataclass/actions.py:150 +#: backend/iam_app/dataclass/actions.py:195 +#: backend/iam_app/dataclass/actions.py:1908 +#: backend/iam_app/dataclass/actions.py:1918 +#: backend/iam_app/dataclass/resources.py:169 +msgid "业务" +msgstr "business" -#: backend/db_services/bigdata/es/query.py:34 -msgid "Master节点" -msgstr "Master node" +#: backend/db_report/views/checksum_check_report_view.py:63 +msgid "校验结果" +msgstr "Verification result" + +#: backend/db_report/views/checksum_check_report_view.py:68 +msgid "失败的从库实例数量" +msgstr "Number of failed slave database instances" + +#: backend/db_report/views/checksum_check_report_view.py:73 +msgid "失败信息" +msgstr "Failure message" + +#: backend/db_report/views/checksum_check_report_view.py:78 +#: backend/db_report/views/meta_check_view.py:77 +#: backend/db_report/views/mysqlbackup_check_view.py:73 +#: backend/db_report/views/redis_dbmeta_check_view.py:72 +#: backend/db_report/views/redisbackup_check_view.py:77 +msgid "巡检时间" +msgstr "Inspection time" + +#: backend/db_report/views/checksum_instance_view.py:38 +#: backend/db_report/views/checksum_instance_view.py:42 +msgid "失败的从库实例详情" +msgstr "Failed slave instance details" + +#: backend/db_report/views/dbmon_heartbeat_view.py:44 +msgid "dbmon心跳超时检查" +msgstr "dbmon heartbeat timeout check" + +#: backend/db_report/views/dbmon_heartbeat_view.py:73 +msgid "实例节点信息" +msgstr "Instance node information" + +#: backend/db_report/views/dbmon_heartbeat_view.py:78 +msgid "心跳超时时间" +msgstr "Heartbeat timeout" + +#: backend/db_report/views/dbmon_heartbeat_view.py:84 +msgid "dbmon心跳超时检查报告" +msgstr "dbmon heartbeat timeout check report" + +#: backend/db_report/views/meta_check_view.py:52 +#: backend/db_services/dbbase/resources/query.py:154 +#: backend/db_services/dbbase/resources/serializers.py:70 +#: backend/db_services/mongodb/resources/query.py:36 +#: backend/ticket/builders/common/bigdata.py:222 +#: backend/ticket/builders/common/bigdata.py:301 +msgid "IP" +msgstr "IP" -#: backend/db_services/bigdata/es/query.py:37 -msgid "代理节点" -msgstr "proxy node" +#: backend/db_report/views/meta_check_view.py:57 +#: backend/db_services/dbbase/resources/serializers.py:71 +#: backend/ticket/builders/es/es_apply.py:31 +#: backend/ticket/builders/influxdb/influxdb_apply.py:39 +#: backend/ticket/builders/kafka/kafka_apply.py:81 +#: backend/ticket/builders/pulsar/pulsar_apply.py:33 +msgid "端口" +msgstr "port" -#: backend/db_services/bigdata/es/views.py:28 -#: backend/db_services/bigdata/hdfs/views.py:36 -#: backend/db_services/bigdata/kafka/views.py:26 -#: backend/db_services/bigdata/pulsar/views.py:26 -#: backend/db_services/redis/resources/redis_cluster/views.py:32 +#: backend/db_report/views/meta_check_view.py:67 +#: backend/db_report/views/redis_dbmeta_check_view.py:62 +msgid "元数据状态" +msgstr "metadata status" + +#: backend/db_report/views/meta_check_view.py:83 +msgid "元数据检查报告列表" +msgstr "Metadata Check Report List" + +#: backend/db_report/views/mysqlbackup_check_view.py:44 +msgid "集群全备检查" +msgstr "Cluster readiness check" + +#: backend/db_report/views/mysqlbackup_check_view.py:63 +msgid "全备状态" +msgstr "fully prepared" + +#: backend/db_report/views/mysqlbackup_check_view.py:79 +#: backend/db_report/views/redisbackup_check_view.py:83 +msgid "备份检查报告" +msgstr "Backup inspection report" + +#: backend/db_report/views/mysqlbackup_check_view.py:91 +msgid "MySQL 全备检查" +msgstr "MySQL Thoroughness Check" + +#: backend/db_report/views/mysqlbackup_check_view.py:94 +msgid "MySQL 全备检查报告" +msgstr "MySQL health check report" + +#: backend/db_report/views/mysqlbackup_check_view.py:105 +msgid "集群binlog检查" +msgstr "Cluster binlog check" + +#: backend/db_report/views/mysqlbackup_check_view.py:108 +msgid "MySQL binlog检查报告" +msgstr "MySQL binlog inspection report" + +#: backend/db_report/views/redis_dbmeta_check_view.py:43 +msgid "redis 元数据检查" +msgstr "redis metadata check" + +#: backend/db_report/views/redis_dbmeta_check_view.py:78 +msgid "redis 元数据检查报告" +msgstr "redis metadata inspection report" + +#: backend/db_report/views/redis_dbmeta_check_view.py:90 +msgid "孤立节点检查" +msgstr "Orphan node check" + +#: backend/db_report/views/redis_dbmeta_check_view.py:93 +msgid "孤立节点检查报告" +msgstr "Orphan node check report" + +#: backend/db_report/views/redis_dbmeta_check_view.py:104 +#: backend/db_report/views/redis_dbmeta_check_view.py:107 +msgid "实例状态异常检查" +msgstr "Instance status abnormality check" + +#: backend/db_report/views/redisbackup_check_view.py:43 +msgid "集群备份检查" +msgstr "Cluster backup check" + +#: backend/db_report/views/redisbackup_check_view.py:67 +msgid "备份状态" +msgstr "Backup status" + +#: backend/db_report/views/redisbackup_check_view.py:95 +msgid "Redis 全备检查" +msgstr "Redis full check" + +#: backend/db_report/views/redisbackup_check_view.py:98 +msgid "Redis 全备检查报告" +msgstr "Redis full check report" + +#: backend/db_report/views/redisbackup_check_view.py:110 +msgid "Redis集群binlog检查" +msgstr "Redis cluster binlog check" + +#: backend/db_report/views/redisbackup_check_view.py:113 +msgid "Redis binlog检查报告" +msgstr "Redis binlog inspection report" + +#: backend/db_services/bigdata/doris/query.py:35 +msgid "Follower节点" +msgstr "Followernode" + +#: backend/db_services/bigdata/doris/query.py:36 +msgid "Observer节点" +msgstr "Observer node" + +#: backend/db_services/bigdata/doris/views.py:29 +#: backend/db_services/bigdata/es/views.py:29 +#: backend/db_services/bigdata/hdfs/views.py:37 +#: backend/db_services/bigdata/kafka/views.py:27 +#: backend/db_services/bigdata/pulsar/views.py:27 +#: backend/db_services/bigdata/riak/views.py:27 +#: backend/db_services/redis/resources/redis_cluster/views.py:34 msgid "获取集群列表" msgstr "Get a list of clusters" -#: backend/db_services/bigdata/es/views.py:37 -#: backend/db_services/bigdata/hdfs/views.py:45 -#: backend/db_services/bigdata/kafka/views.py:35 -#: backend/db_services/bigdata/pulsar/views.py:35 -#: backend/db_services/redis/resources/redis_cluster/views.py:41 +#: backend/db_services/bigdata/doris/views.py:38 +#: backend/db_services/bigdata/es/views.py:38 +#: backend/db_services/bigdata/hdfs/views.py:46 +#: backend/db_services/bigdata/kafka/views.py:36 +#: backend/db_services/bigdata/pulsar/views.py:36 +#: backend/db_services/bigdata/riak/views.py:36 +#: backend/db_services/redis/resources/redis_cluster/views.py:43 msgid "获取集群详情" msgstr "Get cluster details" -#: backend/db_services/bigdata/es/views.py:45 -#: backend/db_services/bigdata/hdfs/views.py:53 -#: backend/db_services/bigdata/influxdb/views.py:27 -#: backend/db_services/bigdata/kafka/views.py:43 -#: backend/db_services/bigdata/pulsar/views.py:43 +#: backend/db_services/bigdata/doris/views.py:46 +#: backend/db_services/bigdata/es/views.py:46 +#: backend/db_services/bigdata/hdfs/views.py:54 +#: backend/db_services/bigdata/influxdb/views.py:29 +#: backend/db_services/bigdata/kafka/views.py:44 +#: backend/db_services/bigdata/pulsar/views.py:44 +#: backend/db_services/bigdata/riak/views.py:44 msgid "获取实例列表" msgstr "Get instance list" -#: backend/db_services/bigdata/es/views.py:54 -#: backend/db_services/bigdata/hdfs/views.py:62 -#: backend/db_services/bigdata/influxdb/views.py:36 -#: backend/db_services/bigdata/kafka/views.py:52 -#: backend/db_services/bigdata/pulsar/views.py:52 +#: backend/db_services/bigdata/doris/views.py:55 +#: backend/db_services/bigdata/es/views.py:55 +#: backend/db_services/bigdata/hdfs/views.py:63 +#: backend/db_services/bigdata/influxdb/views.py:38 +#: backend/db_services/bigdata/kafka/views.py:53 +#: backend/db_services/bigdata/pulsar/views.py:53 +#: backend/db_services/bigdata/riak/views.py:53 msgid "获取实例详情" msgstr "Get instance details" -#: backend/db_services/bigdata/es/views.py:62 -#: backend/db_services/bigdata/hdfs/views.py:70 -#: backend/db_services/bigdata/influxdb/views.py:44 -#: backend/db_services/bigdata/kafka/views.py:60 -#: backend/db_services/bigdata/pulsar/views.py:60 +#: backend/db_services/bigdata/doris/views.py:63 +#: backend/db_services/bigdata/es/views.py:63 +#: backend/db_services/bigdata/hdfs/views.py:71 +#: backend/db_services/bigdata/influxdb/views.py:46 +#: backend/db_services/bigdata/kafka/views.py:61 +#: backend/db_services/bigdata/pulsar/views.py:61 +#: backend/db_services/bigdata/riak/views.py:61 msgid "获取查询返回字段" msgstr "Get query return fields" -#: backend/db_services/bigdata/es/views.py:70 -#: backend/db_services/bigdata/hdfs/views.py:78 -#: backend/db_services/bigdata/influxdb/views.py:52 -#: backend/db_services/bigdata/kafka/views.py:68 -#: backend/db_services/bigdata/pulsar/views.py:68 -#: backend/db_services/redis/resources/redis_cluster/views.py:71 +#: backend/db_services/bigdata/doris/views.py:71 +#: backend/db_services/bigdata/es/views.py:71 +#: backend/db_services/bigdata/hdfs/views.py:79 +#: backend/db_services/bigdata/influxdb/views.py:54 +#: backend/db_services/bigdata/kafka/views.py:69 +#: backend/db_services/bigdata/pulsar/views.py:69 +#: backend/db_services/bigdata/riak/views.py:69 +#: backend/db_services/redis/resources/redis_cluster/views.py:73 msgid "获取集群拓扑" msgstr "Get cluster topology" -#: backend/db_services/bigdata/es/views.py:78 -#: backend/db_services/redis/resources/redis_cluster/views.py:79 +#: backend/db_services/bigdata/doris/views.py:79 +#: backend/db_services/bigdata/es/views.py:79 +#: backend/db_services/redis/resources/redis_cluster/views.py:89 msgid "获取集群节点" msgstr "Get cluster nodes" -#: backend/db_services/bigdata/hdfs/query.py:34 +#: backend/db_services/bigdata/es/query.py:35 +msgid "Master节点" +msgstr "Master node" + +#: backend/db_services/bigdata/es/query.py:38 +msgid "代理节点" +msgstr "proxy node" + +#: backend/db_services/bigdata/hdfs/query.py:36 msgid "namenode节点" msgstr "namenode node" -#: backend/db_services/bigdata/hdfs/query.py:35 -#: backend/db_services/bigdata/kafka/query.py:28 -#: backend/db_services/bigdata/pulsar/query.py:27 +#: backend/db_services/bigdata/hdfs/query.py:37 +#: backend/db_services/bigdata/kafka/query.py:30 +#: backend/db_services/bigdata/pulsar/query.py:29 msgid "zookeeper节点" msgstr "zookeeper node" -#: backend/db_services/bigdata/hdfs/query.py:36 +#: backend/db_services/bigdata/hdfs/query.py:38 msgid "journalnode节点" msgstr "journal node node" -#: backend/db_services/bigdata/hdfs/query.py:37 +#: backend/db_services/bigdata/hdfs/query.py:39 msgid "datanode节点" msgstr "datanode node" -#: backend/db_services/bigdata/hdfs/views.py:88 +#: backend/db_services/bigdata/hdfs/views.py:90 msgid "获取集群访问xml配置" msgstr "Get cluster access xml configuration" -#: backend/db_services/bigdata/influxdb/query.py:33 -#: backend/db_services/bigdata/resources/query.py:45 -msgid "版本" -msgstr "Version" - -#: backend/db_services/bigdata/influxdb/query.py:37 -#: backend/db_services/bigdata/resources/query.py:49 -#: backend/db_services/dbconfig/serializers.py:67 -#: backend/db_services/redis/resources/redis_cluster/query.py:63 -msgid "更新人" -msgstr "updater" - -#: backend/db_services/bigdata/kafka/query.py:27 -#: backend/db_services/bigdata/pulsar/query.py:26 +#: backend/db_services/bigdata/kafka/query.py:29 +#: backend/db_services/bigdata/pulsar/query.py:28 msgid "broker节点" msgstr "broker node" -#: backend/db_services/bigdata/pulsar/query.py:28 +#: backend/db_services/bigdata/pulsar/query.py:30 msgid "bookkeeper节点" msgstr "bookkeeper node" -#: backend/db_services/bigdata/resources/query.py:43 +#: backend/db_services/bigdata/resources/query.py:41 msgid "集群类型名" msgstr "cluster type name" -#: backend/db_services/bigdata/resources/views.py:80 -#: backend/db_services/redis/resources/redis_cluster/views.py:95 +#: backend/db_services/bigdata/resources/serializers.py:21 +msgid "Agent状态" +msgstr "Agent status" + +#: backend/db_services/bigdata/resources/serializers.py:22 +#: backend/db_services/dbresource/serializers.py:203 +msgid "排序字段" +msgstr "sort field" + +#: backend/db_services/bigdata/resources/serializers.py:30 +msgid "排序参数只能是 'create_at' 或 'node_count'。" +msgstr "The sorting parameter can only be 'create_at' or 'node_count'." + +#: backend/db_services/bigdata/resources/views.py:98 +#: backend/db_services/redis/resources/redis_cluster/views.py:130 msgid "获取集群访问密码" msgstr "Obtain the cluster access password" -#: backend/db_services/bigdata/resources/views.py:121 +#: backend/db_services/bigdata/resources/views.py:158 msgid "获取集群节点列表信息" msgstr "Get cluster node list information" -#: backend/db_services/bigdata/resources/views.py:139 -#: backend/db_services/mysql/resources/views.py:85 -#: backend/db_services/redis/resources/views.py:83 +#: backend/db_services/bigdata/resources/views.py:188 +#: backend/db_services/mongodb/resources/views.py:113 +#: backend/db_services/mysql/resources/views.py:45 +#: backend/db_services/redis/resources/views.py:43 +#: backend/db_services/sqlserver/resources/views.py:48 msgid "获取资源拓扑树" msgstr "Get resource topology tree" +#: backend/db_services/bigdata/riak/query.py:29 +msgid "riak节点" +msgstr "riaknode" + +#: backend/db_services/cluster_entry/serializers.py:20 +msgid "访问入口类型" +msgstr "Access type" + +#: backend/db_services/cluster_entry/serializers.py:24 +msgid "目标实例,格式为 ip#port " +msgstr "Target instance in the format of ip#port" + +#: backend/db_services/cluster_entry/serializers.py:24 +msgid "目标实例列表" +msgstr "Target instance list" + +#: backend/db_services/cluster_entry/serializers.py:27 +#: backend/db_services/cluster_entry/serializers.py:43 +#: backend/db_services/dbbase/resources/query.py:83 +#: backend/db_services/dbbase/resources/query.py:159 +msgid "集群 ID" +msgstr "Cluster ID" + +#: backend/db_services/cluster_entry/serializers.py:29 +msgid "访问入口详情" +msgstr "Access entrance details" + +#: backend/db_services/cluster_entry/serializers.py:36 +msgid "修改 DNS 访问入口需要传入 domain_name 和 target_instances" +msgstr "Modifying the DNS access entry requires passing in domain_name and target_instances" + +#: backend/db_services/cluster_entry/serializers.py:38 +msgid "修改 DNS,目标实例列表不能为空" +msgstr "Modify DNS, the target instance list cannot be empty" + +#: backend/db_services/cluster_entry/serializers.py:44 +#: backend/db_services/ipchooser/serializers/base.py:32 +#: backend/db_services/ipchooser/serializers/base.py:41 +#: backend/db_services/redis/autofix/models.py:25 +msgid "业务 ID" +msgstr "Business ID" + +#: backend/db_services/cluster_entry/serializers.py:45 +msgid "入口类型" +msgstr "Entrance type" + +#: backend/db_services/cluster_entry/views.py:32 +msgid "集群访问入口" +msgstr "Cluster access entrance" + +#: backend/db_services/cluster_entry/views.py:63 +msgid "修改集群访问入口" +msgstr "Modify cluster access entry" + +#: backend/db_services/cluster_entry/views.py:73 +msgid "获取集群入口列表" +msgstr "Get the cluster entry list" + #: backend/db_services/cmdb/exceptions.py:18 msgid "CMDB模块异常" msgstr "CMDB module exception" @@ -4273,107 +7421,460 @@ msgstr "CMDB module exception" msgid "英文缩写已存在,不允许修改" msgstr "English abbreviation already exists, modification is not allowed" -#: backend/db_services/cmdb/serializers.py:19 backend/ticket/serializers.py:76 -msgid "业务名" -msgstr "business name" - #: backend/db_services/cmdb/serializers.py:21 +msgid "查询的权限动作" +msgstr "Query permission action" + +#: backend/db_services/cmdb/serializers.py:30 +msgid "只允许查询关联资源为业务的动作权限" +msgstr "Only allowed to query related resources for business action permissions" + +#: backend/db_services/cmdb/serializers.py:39 msgid "业务权限列表" msgstr "Business authority list" -#: backend/db_services/cmdb/serializers.py:26 +#: backend/db_services/cmdb/serializers.py:44 +#: backend/db_services/dbconfig/serializers.py:94 #: backend/ticket/builders/mysql/mysql_single_apply.py:51 -#: backend/ticket/builders/spider/tendb_apply.py:34 +#: backend/ticket/builders/riak/riak_apply.py:28 +#: backend/ticket/builders/riak/riak_migrate.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:50 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:36 msgid "DB模块ID" msgstr "DB module ID" -#: backend/db_services/cmdb/serializers.py:27 -#: backend/db_services/cmdb/serializers.py:35 +#: backend/db_services/cmdb/serializers.py:45 +#: backend/db_services/cmdb/serializers.py:53 #: backend/ticket/builders/mysql/mysql_single_apply.py:66 -#: backend/ticket/builders/spider/tendb_apply.py:47 +#: backend/ticket/builders/riak/riak_apply.py:32 +#: backend/ticket/builders/riak/riak_migrate.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:65 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:52 msgid "DB模块名" msgstr "DB module name" -#: backend/db_services/cmdb/serializers.py:40 +#: backend/db_services/cmdb/serializers.py:58 +msgid "请确保模块名称的长度不超过: {}" +msgstr "Please ensure that the module name is no longer than: {}" + +#: backend/db_services/cmdb/serializers.py:64 msgid "英文缩写" msgstr "English abbreviations" -#: backend/db_services/cmdb/serializers.py:48 -#: backend/db_services/dbresource/serializers.py:83 +#: backend/db_services/cmdb/serializers.py:68 +msgid "请确保业务CODE的长度不超过: {}" +msgstr "Please ensure that the length of the business CODE does not exceed: {}" + +#: backend/db_services/cmdb/serializers.py:78 +#: backend/db_services/dbresource/serializers.py:94 msgid "单页数量" msgstr "Single page quantity" -#: backend/db_services/cmdb/serializers.py:49 +#: backend/db_services/cmdb/serializers.py:79 msgid "页数" msgstr "number of pages" -#: backend/db_services/cmdb/views.py:36 +#: backend/db_services/cmdb/views.py:43 +#: backend/db_services/quick_search/serializers.py:20 msgid "业务列表" msgstr "business list" -#: backend/db_services/cmdb/views.py:37 +#: backend/db_services/cmdb/views.py:45 msgid "业务信息" msgstr "business information" -#: backend/db_services/cmdb/views.py:46 +#: backend/db_services/cmdb/views.py:55 msgid "业务下的模块列表" msgstr "Module List under Business" -#: backend/db_services/cmdb/views.py:48 +#: backend/db_services/cmdb/views.py:57 msgid "模块信息" msgstr "module information" -#: backend/db_services/cmdb/views.py:59 +#: backend/db_services/cmdb/views.py:75 msgid "创建数据库模块" msgstr "Create database module" -#: backend/db_services/cmdb/views.py:71 +#: backend/db_services/cmdb/views.py:87 msgid "设置业务英文缩写" msgstr "Set business abbreviations" -#: backend/db_services/dbbase/constants.py:31 -msgid "手动录入" -msgstr "Manual entry" +#: backend/db_services/cmdb/views.py:97 +msgid "查询 CC 角色对象" +msgstr "Query CC role object" -#: backend/db_services/dbbase/constants.py:32 -#: backend/db_services/dbresource/constants.py:15 -msgid "资源池" -msgstr "resource pool" +#: backend/db_services/dbbase/cluster/handlers.py:43 +msgid "集群[]不存在,请检查集群ID" +msgstr "Cluster[] does not exist, please check the cluster ID" -#: backend/db_services/dbbase/resources/constants.py:18 -#: backend/db_services/dbbase/resources/query.py:27 -#: backend/db_services/ipchooser/constants.py:59 -#: backend/db_services/ipchooser/constants.py:82 -#: backend/db_services/ipchooser/mock_data.py:36 -#: backend/db_services/ipchooser/mock_data.py:92 -#: backend/iam_app/dataclass/resources.py:61 -msgid "业务" -msgstr "business" +#: backend/db_services/dbbase/cluster/handlers.py:185 +msgid "无法找到集群{}所包含实例,请检查集群相关信息" +msgstr "" +"Unable to find the instance contained in the cluster {}, please check the " +"relevant information of the cluster" -#: backend/db_services/dbbase/resources/constants.py:20 -#: backend/db_services/ipchooser/constants.py:82 +#: backend/db_services/dbbase/cluster/serializers.py:24 +#: backend/db_services/mongodb/restore/serializers.py:21 +#: backend/db_services/mysql/cluster/serializers.py:48 +#: backend/db_services/mysql/cluster/serializers.py:57 +#: backend/db_services/mysql/cluster/serializers.py:79 +#: backend/db_services/mysql/remote_service/serializers.py:28 +#: backend/db_services/mysql/remote_service/serializers.py:32 +#: backend/db_services/mysql/remote_service/serializers.py:43 +#: backend/db_services/mysql/sql_import/serializers.py:92 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:33 +#: backend/ticket/builders/mongodb/mongo_backup.py:35 +#: backend/ticket/builders/mongodb/mongo_clear.py:28 +#: backend/ticket/builders/mongodb/mongo_destroy.py:23 +#: backend/ticket/builders/mongodb/mongo_disable.py:24 +#: backend/ticket/builders/mongodb/mongo_enable.py:24 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:28 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:31 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:25 +#: backend/ticket/builders/mysql/mysql_add_slave.py:28 +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:26 +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:24 +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:37 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:30 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:35 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:29 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:34 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:24 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:22 +#: backend/ticket/builders/mysql/mysql_restore_slave.py:28 +#: backend/ticket/builders/redis/redis_close.py:55 +#: backend/ticket/builders/redis/redis_cluster_version_update.py:23 +#: backend/ticket/builders/redis/redis_destroy.py:54 +#: backend/ticket/builders/redis/redis_maxmemory_set.py:65 +#: backend/ticket/builders/redis/redis_open.py:52 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:29 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:32 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:26 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:25 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:23 +#: backend/ticket/builders/tendbsingle/standardize.py:24 +#: backend/ticket/models/ticket.py:236 backend/ticket/serializers.py:303 +msgid "集群ID列表" +msgstr "Cluster ID list" + +#: backend/db_services/dbbase/cluster/serializers.py:38 +#: backend/ticket/builders/common/base.py:101 +msgid "IP地址" +msgstr "IP address" + +#: backend/db_services/dbbase/cluster/serializers.py:40 +#: backend/ticket/builders/common/base.py:115 +#: backend/ticket/builders/common/bigdata.py:223 +#: backend/ticket/builders/common/bigdata.py:302 +msgid "端口号" +msgstr "The port number" + +#: backend/db_services/dbbase/cluster/serializers.py:56 +#: backend/db_services/sqlserver/cluster/serializers.py:18 +#: backend/db_services/sqlserver/cluster/serializers.py:46 +#: backend/db_services/sqlserver/cluster/serializers.py:57 +msgid "db列表" +msgstr "db list" + +#: backend/db_services/dbbase/cluster/views.py:36 +msgid "通过集群查询同机关联集群" +msgstr "Query the cluster associated with the same machine through the cluster" + +#: backend/db_services/dbbase/cluster/views.py:49 +msgid "通过实例查询同机关联集群" +msgstr "" +"Query the cluster associated with the same machine through the instance" + +#: backend/db_services/dbbase/constants.py:36 +msgid "手动录入" +msgstr "Manual entry" + +#: backend/db_services/dbbase/constants.py:37 +#: backend/db_services/dbresource/constants.py:25 +#: backend/iam_app/dataclass/actions.py:1504 +#: backend/iam_app/dataclass/actions.py:1516 +msgid "资源池" +msgstr "resource pool" + +#: backend/db_services/dbbase/constants.py:43 +msgid "污点主机" +msgstr "Tainted host" + +#: backend/db_services/dbbase/constants.py:44 +msgid "资源操作记录" +msgstr "Resource operation records" + +#: backend/db_services/dbbase/instances/views.py:29 +msgid "根据用户手动输入的 ip:port 查询真实的实例" +msgstr "" +"Query the real instance according to the ip:port manually entered by the user" + +#: backend/db_services/dbbase/instances/yasg_slz.py:20 +msgid "实例地址列表" +msgstr "instance address list" + +#: backend/db_services/dbbase/instances/yasg_slz.py:20 +#: backend/db_services/dbbase/resources/serializers.py:69 +#: backend/db_services/dbbase/resources/serializers.py:121 +msgid "实例地址(ip:port)" +msgstr "Instance address (ip:port)" + +#: backend/db_services/dbbase/instances/yasg_slz.py:23 +msgid "实例所属组件类型" +msgstr "The component type to which the instance belongs" + +#: backend/db_services/dbbase/instances/yasg_slz.py:25 +msgid "实例所在的集群列表" +msgstr "List of clusters where the instance is located" + +#: backend/db_services/dbbase/instances/yasg_slz.py:53 +msgid "测试业务" +msgstr "test business" + +#: backend/db_services/dbbase/resources/constants.py:21 +#: backend/db_services/ipchooser/constants.py:118 #: backend/db_services/ipchooser/mock_data.py:50 #: backend/db_services/ipchooser/mock_data.py:69 msgid "模块" msgstr "module" -#: backend/db_services/dbbase/resources/serializers.py:47 -#: backend/db_services/dbbase/resources/serializers.py:80 -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:113 -msgid "实例地址(ip:port)" -msgstr "Instance address (ip:port)" +#: backend/db_services/dbbase/resources/query.py:87 +#: backend/db_services/dbbase/resources/query.py:163 +#: backend/db_services/mongodb/resources/query.py:35 +#: backend/db_services/mysql/resources/tendbcluster/query.py:41 +#: backend/db_services/mysql/resources/tendbha/query.py:35 +#: backend/db_services/mysql/resources/tendbsingle/query.py:33 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:32 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:32 +msgid "主域名" +msgstr "primary domain name" + +#: backend/db_services/dbbase/resources/query.py:88 +#: backend/db_services/mysql/resources/tendbcluster/query.py:42 +#: backend/db_services/mysql/resources/tendbha/query.py:36 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:33 +msgid "从域名" +msgstr "from domain name" + +#: backend/db_services/dbbase/resources/query.py:89 +#: backend/db_services/dbbase/resources/query.py:164 +msgid "主版本" +msgstr "major version" + +#: backend/db_services/dbbase/resources/query.py:91 +#: backend/ticket/builders/common/bigdata.py:114 +#: backend/ticket/builders/influxdb/influxdb_apply.py:35 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:37 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:32 +#: backend/ticket/builders/mysql/mysql_ha_apply.py:38 +#: backend/ticket/builders/redis/redis_cluster_apply.py:34 +#: backend/ticket/builders/redis/redis_instance_apply.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:34 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:41 +msgid "容灾级别" +msgstr "Disaster recovery level" + +#: backend/db_services/dbbase/resources/query.py:152 +msgid "主机 ID" +msgstr "Host ID" + +#: backend/db_services/dbbase/resources/query.py:155 +msgid "IP 端口" +msgstr "IP port" + +#: backend/db_services/dbbase/resources/query.py:157 +#: backend/db_services/dbresource/serializers.py:80 +#: backend/db_services/dbresource/serializers.py:378 +msgid "城市" +msgstr "City" + +#: backend/db_services/dbbase/resources/serializers.py:30 +msgid "精确域名查询" +msgstr "Precise domain name query" + +#: backend/db_services/dbbase/resources/serializers.py:31 +msgid "排序字段,非必填" +msgstr "Sorting field, optional" + +#: backend/db_services/dbbase/resources/serializers.py:33 +#: backend/db_services/dbbase/resources/serializers.py:110 +msgid "所属DB模块" +msgstr "Belonging DB module" + +#: backend/db_services/dbbase/resources/serializers.py:34 +msgid "管控区域" +msgstr "control area" #: backend/db_services/dbbase/resources/serializers.py:48 -#: backend/ticket/builders/common/bigdata.py:206 -#: backend/ticket/builders/common/bigdata.py:273 -msgid "IP" -msgstr "IP" +msgid "模块类型" +msgstr "module type" + +#: backend/db_services/dbbase/resources/serializers.py:52 +msgid "批量域名查询(逗号分割)" +msgstr "Batch domain name query (comma separated)" + +#: backend/db_services/dbbase/resources/serializers.py:103 +#: backend/db_services/dbbase/resources/serializers.py:125 +#: backend/db_services/redis/toolbox/serializers.py:189 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:30 +#: backend/ticket/serializers.py:251 +msgid "角色" +msgstr "Role" + +#: backend/db_services/dbbase/resources/serializers.py:114 +msgid "精确IP查询" +msgstr "Accurate IP query" -#: backend/db_services/dbbase/resources/serializers.py:85 -#: backend/ticket/serializers.py:199 +#: backend/db_services/dbbase/resources/serializers.py:126 +#: backend/db_services/quick_search/serializers.py:32 +#: backend/ticket/serializers.py:252 msgid "关键字过滤" msgstr "keyword filtering" +#: backend/db_services/dbbase/resources/serializers.py:131 +msgid "IP(多个IP过滤以逗号分隔)" +msgstr "IP (multiple IP filters separated by commas)" + +#: backend/db_services/dbbase/resources/serializers.py:132 +msgid "集群ID(多个过滤以逗号分隔)" +msgstr "Cluster ID (multiple filters separated by commas)" + +#: backend/db_services/dbbase/resources/serializers.py:133 +#: backend/db_services/dbbase/resources/serializers.py:142 +#: backend/db_services/redis/toolbox/serializers.py:191 +msgid "集群状态" +msgstr "Cluster status" + +#: backend/db_services/dbbase/resources/serializers.py:135 +msgid "城市名(多个过滤以逗号分隔)" +msgstr "City name (multiple filters separated by commas)" + +#: backend/db_services/dbbase/resources/serializers.py:136 +#: backend/db_services/dbresource/serializers.py:322 +msgid "机器类型" +msgstr "machine type" + +#: backend/db_services/dbbase/resources/serializers.py:137 +msgid "os名字" +msgstr "os name" + +#: backend/db_services/dbbase/resources/serializers.py:139 +msgid "agent id" +msgstr "agent id" + +#: backend/db_services/dbbase/resources/serializers.py:140 +msgid "机器部署的实例角色" +msgstr "Instance role for machine deployment" + +#: backend/db_services/dbbase/resources/serializers.py:144 +#: backend/db_services/dbpermission/db_account/serializers.py:88 +#: backend/db_services/dbpermission/db_account/serializers.py:97 +#: backend/iam_app/dataclass/resources.py:231 +#: backend/iam_app/dataclass/resources.py:277 +#: backend/iam_app/dataclass/resources.py:323 +#: backend/iam_app/dataclass/resources.py:473 +#: backend/iam_app/dataclass/resources.py:555 +#: backend/iam_app/dataclass/resources.py:626 +#: backend/iam_app/dataclass/resources.py:680 +#: backend/iam_app/dataclass/resources.py:703 +msgid "创建者" +msgstr "creator" + +#: backend/db_services/dbbase/resources/serializers.py:153 +msgid "spider角色" +msgstr "spider role" + +#: backend/db_services/dbbase/serializers.py:39 +#: backend/db_services/dbbase/serializers.py:63 +msgid "集群类型(逗号分隔)" +msgstr "Cluster types (comma separated)" + +#: backend/db_services/dbbase/serializers.py:42 +msgid "集群阶段状态" +msgstr "Cluster stage status" + +#: backend/db_services/dbbase/serializers.py:64 +#: backend/db_services/dbbase/serializers.py:80 +msgid "集群ID(逗号分割)" +msgstr "Cluster ID (comma separated)" + +#: backend/db_services/dbbase/serializers.py:79 +msgid "域名精确查询" +msgstr "Domain name precise query" + +#: backend/db_services/dbbase/serializers.py:96 +msgid "查询集群属性字段(逗号分隔)" +msgstr "Query cluster attribute fields (comma separated)" + +#: backend/db_services/dbbase/serializers.py:97 +msgid "查询实例属性字段(逗号分隔)" +msgstr "Query instance attribute fields (comma separated)" + +#: backend/db_services/dbbase/serializers.py:108 +msgid "未知的集群类型:{}" +msgstr "Unknown cluster type: {}" + +#: backend/db_services/dbbase/serializers.py:111 +msgid "所有集群类型必须属于同一种DBtype类型" +msgstr "All cluster types must belong to the same DBtype" + +#: backend/db_services/dbbase/serializers.py:173 +#: backend/db_services/mysql/sql_import/serializers.py:29 +#: backend/db_services/sqlserver/sql_import/serializers.py:19 +msgid "sql语句" +msgstr "sql statement" + +#: backend/db_services/dbbase/serializers.py:175 +msgid "数据库编号(redis 额外参数)" +msgstr "Database number (redis extra parameters)" + +#: backend/db_services/dbbase/serializers.py:176 +msgid "源编码(redis 额外参数)" +msgstr "Source encoding (redis extra parameters)" + +#: backend/db_services/dbbase/views.py:50 +msgid "集群通用接口" +msgstr "Cluster common interface" + +#: backend/db_services/dbbase/views.py:71 +msgid "查询集群名字是否重复" +msgstr "Check whether cluster names are duplicated" + +#: backend/db_services/dbbase/views.py:84 +msgid "查询业务集群简略信息" +msgstr "Query the brief information of the business cluster" + +#: backend/db_services/dbbase/views.py:99 +msgid "查询业务下集群通用信息" +msgstr "Query the general information of the cluster under the business" + +#: backend/db_services/dbbase/views.py:112 +msgid "根据过滤条件查询业务下集群详细信息" +msgstr "Query cluster details under the business based on filter conditions" + +#: backend/db_services/dbbase/views.py:138 +msgid "根据用户手动输入的ip[:port]查询真实的实例" +msgstr "Query the real instance based on the ip[:port] manually entered by the user" + +#: backend/db_services/dbbase/views.py:155 +msgid "查询集群的库是否存在" +msgstr "Query whether the cluster library exists" + +#: backend/db_services/dbbase/views.py:167 +msgid "查询业务下集群的属性字段" +msgstr "Query the attribute fields of the cluster under the business" + +#: backend/db_services/dbbase/views.py:234 +msgid "查询资源池,污点主机管理表头筛选数据" +msgstr "Query the resource pool and filter data in the tainted host management header" + +#: backend/db_services/dbbase/views.py:247 +msgid "webconsole查询" +msgstr "webconsole query" + #: backend/db_services/dbconfig/exceptions.py:18 msgid "配置模块异常" msgstr "configuration module exception" @@ -4424,6 +7925,13 @@ msgstr "parameter item" msgid "是否锁定" msgstr "Whether to lock" +#: backend/db_services/dbconfig/serializers.py:27 +#: backend/db_services/dbresource/serializers.py:196 +#: backend/db_services/mysql/open_area/serializers.py:80 +#: backend/ticket/serializers.py:277 backend/ticket/serializers.py:285 +msgid "操作类型" +msgstr "operation type" + #: backend/db_services/dbconfig/serializers.py:32 msgid "是否重启实例生效" msgstr "Whether to restart the instance to take effect" @@ -4451,22 +7959,22 @@ msgid "配置文件名" msgstr "configuration file name" #: backend/db_services/dbconfig/serializers.py:42 -#: backend/db_services/dbconfig/serializers.py:94 +#: backend/db_services/dbconfig/serializers.py:98 msgid "配置项列表" msgstr "List of configuration items" #: backend/db_services/dbconfig/serializers.py:43 -#: backend/db_services/dbconfig/serializers.py:95 +#: backend/db_services/dbconfig/serializers.py:99 msgid "是否确认" msgstr "Whether to confirm" #: backend/db_services/dbconfig/serializers.py:44 -#: backend/db_services/dbconfig/serializers.py:96 +#: backend/db_services/dbconfig/serializers.py:100 msgid "配置文件描述" msgstr "Profile description" #: backend/db_services/dbconfig/serializers.py:45 -#: backend/db_services/dbconfig/serializers.py:97 +#: backend/db_services/dbconfig/serializers.py:101 msgid "发布描述" msgstr "release description" @@ -4482,10306 +7990,22723 @@ msgstr "level value" msgid "层级关系" msgstr "hierarchical relationship" -#: backend/db_services/dbconfig/serializers.py:114 +#: backend/db_services/dbconfig/serializers.py:118 msgid "历史版本号" msgstr "Historical version number" -#: backend/db_services/dbconfig/views.py:35 +#: backend/db_services/dbconfig/views.py:68 msgid "查询配置项名称列表" msgstr "Query the list of configuration item names" -#: backend/db_services/dbconfig/views.py:47 +#: backend/db_services/dbconfig/views.py:80 msgid "查询平台配置列表" msgstr "Query the platform configuration list" -#: backend/db_services/dbconfig/views.py:59 +#: backend/db_services/dbconfig/views.py:97 msgid "新建平台配置" msgstr "New platform configuration" -#: backend/db_services/dbconfig/views.py:73 +#: backend/db_services/dbconfig/views.py:111 msgid "编辑平台配置" msgstr "Edit platform configuration" -#: backend/db_services/dbconfig/views.py:87 +#: backend/db_services/dbconfig/views.py:125 msgid "查询平台配置详情" msgstr "Query platform configuration details" -#: backend/db_services/dbconfig/views.py:99 +#: backend/db_services/dbconfig/views.py:137 msgid "查询业务配置列表" msgstr "Query the list of business configurations" -#: backend/db_services/dbconfig/views.py:112 +#: backend/db_services/dbconfig/views.py:158 msgid "编辑层级(业务、模块、集群)配置" msgstr "Edit level (business, module, cluster) configuration" -#: backend/db_services/dbconfig/views.py:125 +#: backend/db_services/dbconfig/views.py:171 msgid "保存模块部署配置" msgstr "Save the module deployment configuration" -#: backend/db_services/dbconfig/views.py:141 +#: backend/db_services/dbconfig/views.py:187 msgid "查询层级(业务、模块、集群)配置详情" msgstr "Query level (business, module, cluster) configuration details" -#: backend/db_services/dbconfig/views.py:153 +#: backend/db_services/dbconfig/views.py:199 +msgid "查询模块配置详情" +msgstr "Query module configuration details" + +#: backend/db_services/dbconfig/views.py:221 msgid "查询配置发布历史记录" msgstr "Query configuration release history" -#: backend/db_services/dbconfig/views.py:165 +#: backend/db_services/dbconfig/views.py:233 msgid "查询配置发布记录详情" msgstr "Query configuration release record details" -#: backend/db_services/dbresource/constants.py:22 -msgid "导入主机" -msgstr "import host" +#: backend/db_services/dbpermission/constants.py:32 +msgid "选择" +msgstr "choose" -#: backend/db_services/dbresource/constants.py:23 -msgid "消费主机" -msgstr "consumer host" +#: backend/db_services/dbpermission/constants.py:33 +msgid "插入" +msgstr "insert" -#: backend/db_services/dbresource/exceptions.py:18 -msgid "资源池服务异常" -msgstr "Resource pool service exception" +#: backend/db_services/dbpermission/constants.py:36 +msgid "查看视图" +msgstr "view view" -#: backend/db_services/dbresource/exceptions.py:23 -#: backend/db_services/dbresource/exceptions.py:24 -msgid "资源池申请资源异常" -msgstr "Resource pool application resource exception" +#: backend/db_services/dbpermission/constants.py:41 +msgid "创建表" +msgstr "create table" -#: backend/db_services/dbresource/exceptions.py:29 -#: backend/db_services/dbresource/exceptions.py:30 -msgid "规格操作失败" -msgstr "specification operation failed" +#: backend/db_services/dbpermission/constants.py:42 +msgid "修改表" +msgstr "modify table" -#: backend/db_services/dbresource/exceptions.py:35 -#: backend/db_services/dbresource/exceptions.py:36 -msgid "部署方案操作失败" -msgstr "Deployment scenario operation failed" +#: backend/db_services/dbpermission/constants.py:43 backend/flow/consts.py:1330 +msgid "删除表" +msgstr "delete table" -#: backend/db_services/dbresource/filters.py:19 -msgid "规格名称" -msgstr "Specification name" +#: backend/db_services/dbpermission/constants.py:44 +msgid "索引" +msgstr "index" -#: backend/db_services/dbresource/filters.py:21 -msgid "规格集群类型" -msgstr "Specification cluster type" +#: backend/db_services/dbpermission/constants.py:45 +msgid "创建视图" +msgstr "Create view" -#: backend/db_services/dbresource/filters.py:22 -msgid "规格机器类型" -msgstr "Specification Machine Type" +#: backend/db_services/dbpermission/constants.py:46 +msgid "执行" +msgstr "implement" -#: backend/db_services/dbresource/filters.py:30 -msgid "Redis部署方案名称" -msgstr "Redis deployment scheme name" +#: backend/db_services/dbpermission/constants.py:47 +msgid "触发器" +msgstr "trigger" -#: backend/db_services/dbresource/filters.py:31 -msgid "Redis集群类型" -msgstr "Redis cluster type" +#: backend/db_services/dbpermission/constants.py:48 +msgid "事件" +msgstr "event" -#: backend/db_services/dbresource/serializers.py:31 -msgid "专属业务的ID列表" -msgstr "ID list of exclusive business" +#: backend/db_services/dbpermission/constants.py:49 +msgid "create routine" +msgstr "create routine" -#: backend/db_services/dbresource/serializers.py:33 -#: backend/db_services/dbresource/serializers.py:52 -#: backend/db_services/dbresource/serializers.py:68 -#: backend/db_services/dbresource/serializers.py:133 -msgid "专属DB" -msgstr "Exclusive DB" +#: backend/db_services/dbpermission/constants.py:50 +msgid "alter routine" +msgstr "alter routine" -#: backend/db_services/dbresource/serializers.py:35 -msgid "机器当前所属的业务id\t" -msgstr "The business id\t to which the machine currently belongs" +#: backend/db_services/dbpermission/constants.py:51 +msgid "references" +msgstr "references" -#: backend/db_services/dbresource/serializers.py:36 -msgid "主机" -msgstr "the host" +#: backend/db_services/dbpermission/constants.py:52 +msgid "create temporary tables" +msgstr "create temporary tables" -#: backend/db_services/dbresource/serializers.py:37 -#: backend/db_services/dbresource/serializers.py:81 -msgid "标签信息" -msgstr "Label Information" +#: backend/db_services/dbpermission/constants.py:57 +msgid "file" +msgstr "file" -#: backend/db_services/dbresource/serializers.py:42 -msgid "分组类型" -msgstr "grouping type" +#: backend/db_services/dbpermission/constants.py:58 +msgid "reload" +msgstr "reload" -#: backend/db_services/dbresource/serializers.py:43 -#: backend/db_services/dbresource/serializers.py:69 -msgid "机型" -msgstr "model" +#: backend/db_services/dbpermission/constants.py:59 +msgid "show databases" +msgstr "show databases" -#: backend/db_services/dbresource/serializers.py:44 -msgid "cpu&mem参数" -msgstr "cpu&mem parameters" +#: backend/db_services/dbpermission/constants.py:60 +msgid "process" +msgstr "process" -#: backend/db_services/dbresource/serializers.py:45 -msgid "磁盘参数" -msgstr "disk parameter" +#: backend/db_services/dbpermission/constants.py:61 +msgid "replication slave" +msgstr "replication slave" -#: backend/db_services/dbresource/serializers.py:46 -msgid "位置匹配参数" -msgstr "position matching parameters" +#: backend/db_services/dbpermission/constants.py:62 +msgid "replication client" +msgstr "replication client" -#: backend/db_services/dbresource/serializers.py:48 -msgid "亲和性" -msgstr "Affinity" +#: backend/db_services/dbpermission/constants.py:66 +msgid "Read" +msgstr "Read" -#: backend/db_services/dbresource/serializers.py:49 -msgid "数量" -msgstr "quantity" +#: backend/db_services/dbpermission/constants.py:67 backend/flow/consts.py:1413 +msgid "readWrite" +msgstr "readWrite" -#: backend/db_services/dbresource/serializers.py:53 -msgid "业务专属ID" -msgstr "Business exclusive ID" +#: backend/db_services/dbpermission/constants.py:68 backend/flow/consts.py:1411 +msgid "readAnyDatabase" +msgstr "readAnyDatabase" -#: backend/db_services/dbresource/serializers.py:54 -msgid "资源申请参数" -msgstr "Resource application parameters" +#: backend/db_services/dbpermission/constants.py:69 backend/flow/consts.py:1416 +msgid "readWriteAnyDatabase" +msgstr "readWriteAnyDatabase" -#: backend/db_services/dbresource/serializers.py:64 -msgid "资源最小值" -msgstr "resource minimum" +#: backend/db_services/dbpermission/constants.py:72 +msgid "dbAdmin" +msgstr "dbAdmin" -#: backend/db_services/dbresource/serializers.py:65 -msgid "资源最大值" -msgstr "resource max" +#: backend/db_services/dbpermission/constants.py:73 backend/flow/consts.py:450 +#: backend/flow/consts.py:1200 backend/flow/consts.py:1409 +msgid "backup" +msgstr "backup" -#: backend/db_services/dbresource/serializers.py:67 -msgid "专属业务" -msgstr "exclusive business" +#: backend/db_services/dbpermission/constants.py:74 +msgid "restore" +msgstr "restore" -#: backend/db_services/dbresource/serializers.py:70 -msgid "主机IP列表" -msgstr "Host IP list" +#: backend/db_services/dbpermission/constants.py:75 +msgid "userAdmin" +msgstr "userAdmin" -#: backend/db_services/dbresource/serializers.py:71 -msgid "城市" -msgstr "City" +#: backend/db_services/dbpermission/constants.py:76 backend/flow/consts.py:1417 +msgid "clusterAdmin" +msgstr "clusterAdmin" -#: backend/db_services/dbresource/serializers.py:72 -msgid "园区" -msgstr "park" +#: backend/db_services/dbpermission/constants.py:77 +msgid "clusterManager" +msgstr "clusterManager" -#: backend/db_services/dbresource/serializers.py:74 -msgid "cpu资源限制" -msgstr "cpu resource limitation" +#: backend/db_services/dbpermission/constants.py:78 backend/flow/consts.py:1410 +msgid "clusterMonitor" +msgstr "clusterMonitor" -#: backend/db_services/dbresource/serializers.py:75 -msgid "内存资源限制" -msgstr "memory resource limit" +#: backend/db_services/dbpermission/constants.py:79 backend/flow/consts.py:1412 +msgid "hostManager" +msgstr "hostManager" -#: backend/db_services/dbresource/serializers.py:76 -msgid "磁盘资源限制" -msgstr "disk resource limit" +#: backend/db_services/dbpermission/constants.py:80 backend/flow/consts.py:1414 +msgid "userAdminAnyDatabase" +msgstr "userAdminAnyDatabase" -#: backend/db_services/dbresource/serializers.py:77 -msgid "磁盘类型" -msgstr "disk type" +#: backend/db_services/dbpermission/constants.py:81 backend/flow/consts.py:1415 +msgid "dbAdminAnyDatabase" +msgstr "dbAdminAnyDatabase" -#: backend/db_services/dbresource/serializers.py:78 -msgid "磁盘挂载点" -msgstr "disk mount point" +#: backend/db_services/dbpermission/constants.py:82 +msgid "dbOwner" +msgstr "dbOwner" -#: backend/db_services/dbresource/serializers.py:80 -msgid "agent状态" -msgstr "agent state" +#: backend/db_services/dbpermission/constants.py:83 backend/flow/consts.py:1408 +msgid "root" +msgstr "root" -#: backend/db_services/dbresource/serializers.py:84 -msgid "偏移量" -msgstr "Offset" +#: backend/db_services/dbpermission/constants.py:87 +msgid "db_datawriter" +msgstr "db_datawriter" -#: backend/db_services/dbresource/serializers.py:119 -msgid "资源申请的request_id" -msgstr "request_id of resource application" +#: backend/db_services/dbpermission/constants.py:88 +msgid "db_datareader" +msgstr "db_datareader" -#: backend/db_services/dbresource/serializers.py:120 -#: backend/db_services/dbresource/serializers.py:124 -msgid "主机ID列表" -msgstr "List of host IDs" +#: backend/db_services/dbpermission/constants.py:91 +msgid "db_owner" +msgstr "db_owner" -#: backend/db_services/dbresource/serializers.py:129 -#: backend/db_services/ipchooser/serializers/topo_sers.py:78 -#: backend/db_services/mysql/cluster/serializers.py:42 -#: backend/db_services/mysql/instance/serializers.py:39 -#: backend/ticket/builders/common/base.py:31 -#: backend/ticket/builders/common/bigdata.py:210 -#: backend/ticket/builders/common/bigdata.py:276 -msgid "主机ID" -msgstr "host ID" +#: backend/db_services/dbpermission/constants.py:98 +#: backend/db_services/mysql/permission/constants.py:21 +msgid "TendbCluster" +msgstr "Tendbcluster" -#: backend/db_services/dbresource/serializers.py:130 -msgid "Labels" -msgstr "Labels" +#: backend/db_services/dbpermission/constants.py:106 +msgid "账号(单个)" +msgstr "Account (single)" -#: backend/db_services/dbresource/serializers.py:131 -msgid "专用业务ID" -msgstr "Dedicated business ID" +#: backend/db_services/dbpermission/constants.py:107 +msgid "访问源(多个)" +msgstr "access source(s)" -#: backend/db_services/dbresource/serializers.py:137 -msgid "磁盘挂载点信息" -msgstr "Disk mount point information" +#: backend/db_services/dbpermission/constants.py:108 +msgid "访问集群域名(多个)" +msgstr "Access cluster domain names (multiple)" -#: backend/db_services/dbresource/serializers.py:146 -msgid "过滤的单据ID列表" -msgstr "Filtered list of ticket IDs" +#: backend/db_services/dbpermission/constants.py:109 +msgid "访问DB名(多个)" +msgstr "Access DB name(s)" -#: backend/db_services/dbresource/serializers.py:147 -msgid "过滤的任务ID列表" -msgstr "Filtered list of task IDs" +#: backend/db_services/dbpermission/constants.py:110 +#: backend/db_services/dbpermission/db_authorize/models.py:31 +msgid "错误信息/提示信息" +msgstr "Error message/prompt message" -#: backend/db_services/dbresource/serializers.py:148 -#: backend/db_services/partition/serializers.py:78 -msgid "操作者" -msgstr "operator" +#: backend/db_services/dbpermission/db_account/handlers.py:230 +msgid "当前授权规则已被开区模板{}引用,不允许删除" +msgstr "The current authorization rule has been referenced by the zone template {} and is not allowed to be deleted." + +#: backend/db_services/dbpermission/db_account/serializers.py:24 +#: backend/db_services/dbpermission/db_account/serializers.py:61 +#: backend/db_services/dbpermission/db_account/serializers.py:77 +#: backend/db_services/dbpermission/db_account/serializers.py:86 +#: backend/db_services/dbpermission/db_account/serializers.py:107 +#: backend/db_services/dbpermission/db_account/serializers.py:118 +#: backend/db_services/dbpermission/db_authorize/models.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:94 +msgid "账号名称" +msgstr "Account Name" -#: backend/db_services/dbresource/serializers.py:149 -msgid "操作开始时间" -msgstr "Operation start time" +#: backend/db_services/dbpermission/db_account/serializers.py:25 +msgid "账号密码" +msgstr "account password" -#: backend/db_services/dbresource/serializers.py:150 -msgid "操作结束时间" -msgstr "Operation end time" +#: backend/db_services/dbpermission/db_account/serializers.py:36 +msgid "账号名称不符合要求, 请重新更改账号名" +msgstr "The account name does not meet the requirements, please change the account name again." -#: backend/db_services/dbresource/serializers.py:151 -#: backend/ticket/models/ticket.py:95 -msgid "单据状态" -msgstr "ticket status" +#: backend/db_services/dbpermission/db_account/serializers.py:39 +msgid "账号名称不符合过长,请不要超过31位" +msgstr "The account name is not too long. Please do not exceed 31 characters." -#: backend/db_services/dbresource/serializers.py:153 -msgid "分页大小" -msgstr "Paging Size" +#: backend/db_services/dbpermission/db_account/serializers.py:45 +#: backend/ticket/builders/redis/redis_cluster_apply.py:85 +msgid "密码强度不符合要求,请重新输入密码。" +msgstr "The password strength does not meet the requirements, please re-enter the password." -#: backend/db_services/dbresource/serializers.py:154 -msgid "分页起始位置" -msgstr "page start position" +#: backend/db_services/dbpermission/db_account/serializers.py:68 +#: backend/db_services/dbpermission/db_account/serializers.py:76 +#: backend/db_services/dbpermission/db_account/serializers.py:87 +#: backend/db_services/dbpermission/db_account/serializers.py:93 +#: backend/db_services/dbpermission/db_account/serializers.py:169 +msgid "账号ID" +msgstr "Account ID" -#: backend/db_services/dbresource/serializers.py:176 -msgid "规格id列表" -msgstr "specification id list" +#: backend/db_services/dbpermission/db_account/serializers.py:92 +#: backend/db_services/dbpermission/db_account/serializers.py:179 +#: backend/db_services/dbpermission/db_account/serializers.py:186 +msgid "规则ID" +msgstr "rule ID" -#: backend/db_services/dbresource/serializers.py:183 -msgid "部署方案id列表" -msgstr "Deployment scheme id list" +#: backend/db_services/dbpermission/db_account/serializers.py:95 +#: backend/db_services/dbpermission/db_account/serializers.py:108 +#: backend/db_services/dbpermission/db_account/serializers.py:170 +#: backend/db_services/dbpermission/db_authorize/serializers.py:28 +msgid "访问DB" +msgstr "Access DB" -#: backend/db_services/dbresource/serializers.py:190 -msgid "逻辑城市" -msgstr "logic city" +#: backend/db_services/dbpermission/db_account/serializers.py:100 +msgid "账号信息" +msgstr "account information" -#: backend/db_services/dbresource/views/deploy_plan.py:37 -msgid "新建{}部署方案" -msgstr "New {} deployment plan" +#: backend/db_services/dbpermission/db_account/serializers.py:101 +msgid "权限列表信息" +msgstr "Permission list information" -#: backend/db_services/dbresource/views/deploy_plan.py:44 -msgid "更新{}部署方案" -msgstr "update{} deployment scheme" +#: backend/db_services/dbpermission/db_account/serializers.py:106 +msgid "规则ID列表(通过,分割)" +msgstr "Rule ID list (pass, split)" -#: backend/db_services/dbresource/views/deploy_plan.py:50 -msgid "部署方案: {} 正在被引用,无法修改相关参数" -msgstr "" -"Deployment plan: {} is being referenced, cannot modify related parameters" +#: backend/db_services/dbpermission/db_account/serializers.py:119 +#: backend/db_services/dbpermission/db_authorize/serializers.py:28 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:22 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:22 +msgid "访问DB列表" +msgstr "access DB list" -#: backend/db_services/dbresource/views/deploy_plan.py:54 -msgid "查询{}部署方案列表" -msgstr "Query the list of {} deployment schemes" +#: backend/db_services/dbpermission/db_account/serializers.py:124 +msgid "规则数量" +msgstr "number of rules" -#: backend/db_services/dbresource/views/deploy_plan.py:61 -msgid "删除{}部署方案" -msgstr "delete {} deployment scheme" +#: backend/db_services/dbpermission/db_account/serializers.py:125 +msgid "规则信息" +msgstr "rule information" -#: backend/db_services/dbresource/views/deploy_plan.py:67 -msgid "部署方案: {} 正在被引用,无法删除" -msgstr "Deployment scheme: {} is being referenced and cannot be removed" +#: backend/db_services/dbpermission/db_account/serializers.py:134 +#: backend/db_services/dbpermission/db_account/serializers.py:139 +msgid "dml" +msgstr "dml" -#: backend/db_services/dbresource/views/deploy_plan.py:72 -msgid "批量删除{}部署方案" -msgstr "Batch delete {} deployment schemes" +#: backend/db_services/dbpermission/db_account/serializers.py:144 +msgid "glob" +msgstr "glob" -#: backend/db_services/dbresource/views/deploy_plan.py:80 -msgid "部署方案: {} 存在被引用,无法删除" -msgstr "Deployment scheme: {} exists and is referenced and cannot be deleted" +#: backend/db_services/dbpermission/db_account/serializers.py:149 +msgid "mongo用户权限" +msgstr "mongo user permissions" -#: backend/db_services/dbresource/views/resource.py:104 -msgid "获取DBA业务下的主机信息" -msgstr "Obtain host information under the DBA service" +#: backend/db_services/dbpermission/db_account/serializers.py:154 +msgid "mongo管理权限" +msgstr "mongo management permissions" -#: backend/db_services/dbresource/views/resource.py:157 -msgid "查询资源导入任务" -msgstr "Query resource import tasks" +#: backend/db_services/dbpermission/db_account/serializers.py:159 +msgid "sqlserver-dml权限" +msgstr "sqlserver-dml permissions" -#: backend/db_services/dbresource/views/resource.py:182 -#: backend/ticket/builders/__init__.py:333 backend/ticket/constants.py:323 -msgid "资源申请" -msgstr "resource application" +#: backend/db_services/dbpermission/db_account/serializers.py:164 +msgid "sqlserver-owner权限" +msgstr "sqlserver-owner permissions" -#: backend/db_services/dbresource/views/resource.py:218 -msgid "获取机型列表" -msgstr "Get model list" +#: backend/db_services/dbpermission/db_account/serializers.py:171 +msgid "授权规则" +msgstr "Authorization rules" -#: backend/db_services/dbresource/views/resource.py:226 -msgid "资源预申请" -msgstr "Resource pre-application" +#: backend/db_services/dbpermission/db_account/views.py:108 +msgid "修改密码" +msgstr "change Password" -#: backend/db_services/dbresource/views/resource.py:238 -msgid "资源确认" -msgstr "Resource Confirmation" +#: backend/db_services/dbpermission/db_account/views.py:120 +msgid "添加账号规则" +msgstr "Add Account Rules" -#: backend/db_services/dbresource/views/resource.py:268 -msgid "获取资源导入相关链接" -msgstr "Get resource import related links" +#: backend/db_services/dbpermission/db_account/views.py:132 +msgid "查询账号规则清单" +msgstr "Query the list of account rules" -#: backend/db_services/dbresource/views/resource.py:278 -msgid "查询资源操作记录" -msgstr "Query resource operation records" +#: backend/db_services/dbpermission/db_account/views.py:155 +msgid "查询账号规则" +msgstr "Query Account Rules" -#: backend/db_services/dbresource/views/sepc.py:44 -msgid "新建规格" -msgstr "new specification" +#: backend/db_services/dbpermission/db_account/views.py:170 +msgid "修改账号规则" +msgstr "Modify Account Rules" -#: backend/db_services/dbresource/views/sepc.py:51 -msgid "更新规格" -msgstr "update specification" +#: backend/db_services/dbpermission/db_account/views.py:182 +msgid "删除账号规则" +msgstr "delete account rules" -#: backend/db_services/dbresource/views/sepc.py:71 -msgid "规格: {}已经被引用,只允许拓展机型" -msgstr "Specifications: {} has been quoted, only extended models are allowed" +#: backend/db_services/dbpermission/db_authorize/handlers.py:151 +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:77 +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:68 +msgid "前置校验成功" +msgstr "Pre-verification successful" -#: backend/db_services/dbresource/views/sepc.py:74 -msgid "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" -msgstr "" -"Specification: {} has been referenced, cannot modify the configuration! " -"(Only allow to expand the model and modify the description)" +#: backend/db_services/dbpermission/db_authorize/models.py:23 +#: backend/db_services/mysql/permission/clone/models.py:25 +#: backend/ticket/models/ticket.py:46 backend/ticket/models/ticket.py:328 +#: backend/ticket/models/ticket.py:398 backend/ticket/models/todo.py:52 +msgid "关联工单" +msgstr "Associated work order" -#: backend/db_services/dbresource/views/sepc.py:79 -msgid "查询规格列表" -msgstr "Query specification list" +#: backend/db_services/dbpermission/db_authorize/models.py:26 +#: backend/db_services/dbpermission/db_authorize/serializers.py:26 +msgid "源ip列表" +msgstr "source ip list" -#: backend/db_services/dbresource/views/sepc.py:86 -msgid "删除规格" -msgstr "delete specification" +#: backend/db_services/dbpermission/db_authorize/models.py:28 +msgid "访问DB名列表" +msgstr "Access the list of DB names" -#: backend/db_services/dbresource/views/sepc.py:92 -msgid "规格: {}已经被引用,无法被删除" -msgstr "Specification: {} is already referenced and cannot be deleted" +#: backend/db_services/dbpermission/db_authorize/models.py:30 +msgid "是否授权成功" +msgstr "Whether the authorization is successful" -#: backend/db_services/dbresource/views/sepc.py:98 -msgid "批量删除规格" -msgstr "Batch delete specifications" +#: backend/db_services/dbpermission/db_authorize/models.py:32 +#: backend/db_services/mysql/permission/clone/models.py:34 +msgid "记录时间" +msgstr "record time" -#: backend/db_services/dbresource/views/sepc.py:106 -msgid "规格: {}已经被引用,无法删除!" -msgstr "Specification: {} has been referenced and cannot be deleted!" +#: backend/db_services/dbpermission/db_authorize/models.py:35 +#: backend/db_services/dbpermission/db_authorize/models.py:36 +msgid "授权记录" +msgstr "authorization record" -#: backend/db_services/dbresource/views/sepc.py:110 -msgid "获取推荐规格" -msgstr "Get Recommended Specifications" +#: backend/db_services/dbpermission/db_authorize/serializers.py:22 +msgid "ip地址" +msgstr "ip address" -#: backend/db_services/group/serializers.py:20 -msgid "实例数量" -msgstr "number of instances" +#: backend/db_services/dbpermission/db_authorize/serializers.py:23 +msgid "资源池主机ID" +msgstr "Resource pool host ID" -#: backend/db_services/group/serializers.py:28 -msgid "在该业务下已存在同名的分组,请重新命名分组" -msgstr "" -"A group with the same name already exists under this business, please rename " -"the group" +#: backend/db_services/dbpermission/db_authorize/serializers.py:31 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:28 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:28 +msgid "集群id列表" +msgstr "list of cluster ids" -#: backend/db_services/group/serializers.py:38 -msgid "新分组ID" -msgstr "new group ID" +#: backend/db_services/dbpermission/db_authorize/serializers.py:39 +#: backend/db_services/dbpermission/db_authorize/serializers.py:76 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:36 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:36 +msgid "前置检查结果" +msgstr "Pre-check results" -#: backend/db_services/group/serializers.py:39 -msgid "待移动实例的ID列表" -msgstr "ID list of instances to be moved" +#: backend/db_services/dbpermission/db_authorize/serializers.py:40 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:37 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:37 +msgid "检查结果信息" +msgstr "Check result information" -#: backend/db_services/group/views.py:29 -msgid "分组" -msgstr "group" +#: backend/db_services/dbpermission/db_authorize/serializers.py:41 +#: backend/db_services/dbpermission/db_authorize/serializers.py:77 +#: backend/db_services/dbpermission/db_authorize/serializers.py:85 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:38 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:38 +#: backend/ticket/builders/mongodb/mongo_authorize.py:25 +#: backend/ticket/builders/mongodb/mongo_authorize.py:37 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:40 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:65 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:38 +msgid "授权数据缓存uid" +msgstr "Authorization data cache uid" -#: backend/db_services/group/views.py:57 backend/db_services/group/views.py:58 -msgid "分组详情" -msgstr "Group details" +#: backend/db_services/dbpermission/db_authorize/serializers.py:42 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:39 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:39 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:41 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:29 +msgid "授权数据信息" +msgstr "Authorization data information" -#: backend/db_services/group/views.py:66 -msgid "分组列表" -msgstr "group list" +#: backend/db_services/dbpermission/db_authorize/serializers.py:49 +msgid "授权excel文件" +msgstr "Authorize excel file" -#: backend/db_services/group/views.py:74 backend/db_services/group/views.py:76 -msgid "创建新分组" -msgstr "Create a new group" +#: backend/db_services/dbpermission/db_authorize/serializers.py:60 +msgid "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" +msgstr "" +"Excel content parsing failed, error message: {}. Tip: Please fill in the " +"authorization data according to the template" -#: backend/db_services/group/views.py:83 backend/db_services/group/views.py:85 -msgid "更新分组信息" -msgstr "Update group information" +#: backend/db_services/dbpermission/db_authorize/serializers.py:64 +msgid "excel表格为空!" +msgstr "The excel sheet is empty!" -#: backend/db_services/group/views.py:92 backend/db_services/group/views.py:94 -msgid "删除分组" -msgstr "delete group" +#: backend/db_services/dbpermission/db_authorize/serializers.py:69 +#: backend/db_services/mysql/permission/clone/serializers.py:109 +msgid "excel包含空的单元格!请检查数据的完整性和合法性" +msgstr "" +"excel contains empty cells! Please check the integrity and legality of the " +"data" -#: backend/db_services/group/views.py:102 -msgid "移动实例到新组" -msgstr "Move instance to new group" +#: backend/db_services/dbpermission/db_authorize/serializers.py:78 +msgid "授权信息excel文件下载url" +msgstr "Authorization information excel file download url" -#: backend/db_services/infras/constants.py:18 -msgid "不足" -msgstr "insufficient" +#: backend/db_services/dbpermission/db_authorize/serializers.py:90 +msgid "授权执行错误excel" +msgstr "authorization execution error excel" -#: backend/db_services/infras/constants.py:19 -msgid "充足" -msgstr "adequate" +#: backend/db_services/dbpermission/db_authorize/serializers.py:95 +msgid "访问源ip" +msgstr "access source ip" -#: backend/db_services/infras/host.py:40 backend/db_services/infras/host.py:42 -msgid "标准型SA2" -msgstr "Standard SA2" +#: backend/db_services/dbpermission/db_authorize/serializers.py:96 +msgid "访问集群名称" +msgstr "access cluster name" -#: backend/db_services/infras/host.py:40 backend/db_services/infras/host.py:42 -#: backend/db_services/infras/host.py:44 -msgid "1核" -msgstr "1 core" +#: backend/db_services/dbpermission/db_authorize/serializers.py:97 +msgid "访问db名称" +msgstr "access db name" -#: backend/db_services/infras/host.py:41 -msgid "标准型S6" -msgstr "Standard S6" +#: backend/db_services/dbpermission/db_authorize/serializers.py:103 +msgid "现网授权列表" +msgstr "Live Network Authorization List" -#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 -#: backend/db_services/infras/host.py:45 -msgid "2核" -msgstr "2 cores" +#: backend/db_services/dbpermission/db_authorize/serializers.py:103 +#: backend/ticket/builders/mysql/mysql_openarea.py:53 +msgid "授权信息" +msgstr "authorization information" -#: backend/db_services/infras/host.py:43 -msgid "标准型S5" -msgstr "Standard S5" +#: backend/db_services/dbpermission/db_authorize/views.py:71 +#: backend/db_services/mongodb/permission/db_authorize/views.py:42 +#: backend/db_services/sqlserver/permission/db_authorize/views.py:41 +msgid "规则前置检查" +msgstr "Rule pre-check" -#: backend/db_services/infras/serializers.py:56 -#: backend/ticket/builders/common/bigdata.py:89 -#: backend/ticket/builders/common/bigdata.py:116 -#: backend/ticket/builders/common/bigdata.py:169 -#: backend/ticket/builders/common/bigdata.py:290 -#: backend/ticket/builders/influxdb/influxdb_apply.py:32 -#: backend/ticket/builders/mysql/mysql_single_apply.py:57 -#: backend/ticket/builders/pulsar/pulsar_shrink.py:31 -#: backend/ticket/builders/redis/redis_cluster_apply.py:44 -#: backend/ticket/builders/spider/tendb_apply.py:36 -msgid "主机来源" -msgstr "host source" +#: backend/db_services/dbpermission/db_authorize/views.py:83 +msgid "excel规则前置检查" +msgstr "Excel rule pre-check" -#: backend/db_services/infras/serializers.py:57 -#: backend/ticket/builders/mysql/mysql_single_apply.py:59 -#: backend/ticket/builders/redis/redis_cluster_apply.py:45 -msgid "部署节点" -msgstr "deployment node" +#: backend/db_services/dbpermission/db_authorize/views.py:95 +msgid "获得授权信息excel文件" +msgstr "Obtain the authorization information excel file" -#: backend/db_services/infras/views.py:31 -msgid "查询集群类型" -msgstr "Query cluster type" +#: backend/db_services/dbpermission/db_authorize/views.py:107 +msgid "现网授权查询(暂搁置)" +msgstr "Live network authorization query (temporarily put on hold)" -#: backend/db_services/infras/views.py:42 -msgid "查询服务器资源的城市信息" -msgstr "Query the city information of server resources" +#: backend/db_services/dbresource/constants.py:45 +msgid "导入主机" +msgstr "import host" -#: backend/db_services/infras/views.py:43 -msgid "城市信息" -msgstr "city information" +#: backend/db_services/dbresource/constants.py:46 +msgid "消费主机" +msgstr "consumer host" -#: backend/db_services/infras/views.py:56 -msgid "服务器规格列表" -msgstr "List of Server Specifications" +#: backend/db_services/dbresource/enmus.py:17 backend/flow/consts.py:1038 +msgid "原地变更" +msgstr "Change in place" -#: backend/db_services/infras/views.py:57 -msgid "服务器规格信息" -msgstr "Server specification information" +#: backend/db_services/dbresource/enmus.py:18 +msgid "替换变更" +msgstr "Replace changes" -#: backend/db_services/infras/views.py:70 -msgid "容量规格列表" -msgstr "List of capacity specifications" +#: backend/db_services/dbresource/exceptions.py:18 +msgid "资源池服务异常" +msgstr "Resource pool service exception" -#: backend/db_services/infras/views.py:72 -msgid "申请容量规格信息" -msgstr "Apply for capacity specification information" +#: backend/db_services/dbresource/exceptions.py:23 +#: backend/db_services/dbresource/exceptions.py:24 +msgid "资源池申请资源异常" +msgstr "Resource pool application resource exception" -#: backend/db_services/infras/views.py:104 -msgid "主机{}配置异常,无法获取到合法的cpu({})或内存({})" -msgstr "" -"The configuration of the host {} is abnormal, and the legal cpu ({}) or " -"memory ({}) cannot be obtained" +#: backend/db_services/dbresource/exceptions.py:29 +#: backend/db_services/dbresource/exceptions.py:30 +msgid "资源池申请不足异常" +msgstr "Insufficient resource pool application exception" -#: backend/db_services/infras/views.py:120 -msgid "暂不支持该集群类型: {}" -msgstr "This cluster type is not currently supported: {}" +#: backend/db_services/dbresource/exceptions.py:35 +#: backend/db_services/dbresource/exceptions.py:36 +msgid "规格操作失败" +msgstr "specification operation failed" -#: backend/db_services/ipchooser/constants.py:45 -msgid "字段分隔符" -msgstr "field separator" +#: backend/db_services/dbresource/exceptions.py:41 +#: backend/db_services/dbresource/exceptions.py:42 +msgid "规格筛选类不存在" +msgstr "Specification filter class does not exist" -#: backend/db_services/ipchooser/constants.py:46 -msgid "全量返回标志" -msgstr "full return sign" +#: backend/db_services/dbresource/filters.py:20 +#: backend/db_services/dbresource/serializers.py:323 +msgid "规格名称" +msgstr "Specification name" -#: backend/db_services/ipchooser/constants.py:47 -msgid "默认模糊查询字段" -msgstr "Default fuzzy query field" +#: backend/db_services/dbresource/filters.py:22 +msgid "规格集群类型" +msgstr "Specification cluster type" -#: backend/db_services/ipchooser/constants.py:48 -msgid "主机列表默认返回字段" -msgstr "host list default return field" +#: backend/db_services/dbresource/filters.py:23 +msgid "规格机器类型" +msgstr "Specification Machine Type" -#: backend/db_services/ipchooser/constants.py:70 -msgid "完整模式" -msgstr "full mode" +#: backend/db_services/dbresource/filters.py:24 +#: backend/db_services/dbresource/serializers.py:241 +msgid "规格组件类型" +msgstr "Specification component type" -#: backend/db_services/ipchooser/constants.py:70 -msgid "空闲机模式" -msgstr "idle mode" +#: backend/db_services/dbresource/filters.py:25 +msgid "ID过滤(逗号分隔)" +msgstr "ID filtering (comma separated)" -#: backend/db_services/ipchooser/constants.py:93 -msgid "存活" -msgstr "survive" +#: backend/db_services/dbresource/filters.py:26 +msgid "根据时间正序/逆序" +msgstr "According to time order/reverse order" -#: backend/db_services/ipchooser/constants.py:93 -msgid "未存活" -msgstr "not alive" +#: backend/db_services/dbresource/filters.py:27 +msgid "过滤启用/禁用的规格" +msgstr "Filter enabled/disabled specifications" -#: backend/db_services/ipchooser/exceptions.py:21 -#: backend/db_services/ipchooser/exceptions.py:22 -msgid "参数校验失败" -msgstr "Parameter verification failed" +#: backend/db_services/dbresource/handlers.py:332 +msgid "请保证输入的集群类型是MongoShardedCluster,且机器规格为mongodb" +msgstr "Please ensure that the entered cluster type is MongoShardedCluster and the machine specification is mongodb." -#: backend/db_services/ipchooser/exceptions.py:27 -#, python-brace-format -msgid "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" -msgstr "Business [bk_biz_id: {bk_biz_id}] topology does not exist" +#: backend/db_services/dbresource/handlers.py:349 +msgid "{}核{}G内存{}G容量" +msgstr "{}core{}G memory{}G capacity" -#: backend/db_services/ipchooser/exceptions.py:28 -msgid "业务拓扑不存在" -msgstr "Business topology does not exist" +#: backend/db_services/dbresource/handlers.py:393 +msgid "请保证请求的规格类型一致" +msgstr "Please ensure that the requested specification types are consistent" -#: backend/db_services/ipchooser/mock_data.py:30 -#: backend/db_services/ipchooser/mock_data.py:89 -#: backend/db_services/ipchooser/mock_data.py:110 -#: backend/db_services/ipchooser/mock_data.py:138 -#: backend/db_services/ipchooser/mock_data.py:149 -#: backend/db_services/ipchooser/mock_data.py:171 -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:94 -#: backend/ticket/constants.py:65 backend/ticket/constants.py:75 -msgid "成功" -msgstr "success" +#: backend/db_services/dbresource/serializers.py:39 +msgid "专属业务的ID列表" +msgstr "ID list of exclusive business" -#: backend/db_services/ipchooser/mock_data.py:34 -#: backend/db_services/ipchooser/mock_data.py:92 -#: backend/db_services/ipchooser/mock_data.py:124 -msgid "蓝鲸" -msgstr "blue whale" +#: backend/db_services/dbresource/serializers.py:41 +#: backend/db_services/dbresource/serializers.py:60 +#: backend/db_services/dbresource/serializers.py:76 +#: backend/db_services/dbresource/serializers.py:181 +msgid "专属DB" +msgstr "Exclusive DB" -#: backend/db_services/ipchooser/mock_data.py:41 -#: backend/db_services/ipchooser/mock_data.py:96 -msgid "mark测试" -msgstr "mark test" +#: backend/db_services/dbresource/serializers.py:43 +msgid "机器当前所属的业务id\t" +msgstr "The business id\t to which the machine currently belongs" -#: backend/db_services/ipchooser/mock_data.py:48 -msgid "空闲机模块" -msgstr "idle machine module" +#: backend/db_services/dbresource/serializers.py:44 +#: backend/db_services/quick_search/constants.py:22 +msgid "主机" +msgstr "the host" -#: backend/db_services/ipchooser/mock_data.py:60 -msgid "空闲机池" -msgstr "free machine pool" +#: backend/db_services/dbresource/serializers.py:45 +#: backend/db_services/dbresource/serializers.py:92 +msgid "标签信息" +msgstr "Label Information" -#: backend/db_services/ipchooser/mock_data.py:67 -#: backend/ticket/builders/common/base.py:63 -msgid "空闲机" -msgstr "idle machine" +#: backend/db_services/dbresource/serializers.py:50 +msgid "分组类型" +msgstr "grouping type" -#: backend/db_services/ipchooser/query/resource.py:467 -msgid "直连区域" -msgstr "Direct Mode" +#: backend/db_services/dbresource/serializers.py:51 +#: backend/db_services/dbresource/serializers.py:77 +msgid "机型" +msgstr "model" -#: backend/db_services/ipchooser/serializers/base.py:18 -msgid "数据起始位置" -msgstr "data starting position" +#: backend/db_services/dbresource/serializers.py:52 +msgid "cpu&mem参数" +msgstr "cpu&mem parameters" -#: backend/db_services/ipchooser/serializers/base.py:20 -msgid "拉取数据数量,不传或传 `-1` 表示拉取所有" -msgstr "" -"The number of data to be pulled, if not passed or `-1` means to pull all" +#: backend/db_services/dbresource/serializers.py:53 +msgid "磁盘参数" +msgstr "disk parameter" -#: backend/db_services/ipchooser/serializers/base.py:29 -msgid "资源范围类型" -msgstr "resource scope type" +#: backend/db_services/dbresource/serializers.py:54 +msgid "位置匹配参数" +msgstr "position matching parameters" -#: backend/db_services/ipchooser/serializers/base.py:30 -msgid "资源范围ID" -msgstr "resource scope id" +#: backend/db_services/dbresource/serializers.py:56 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:37 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:40 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:41 +msgid "亲和性" +msgstr "Affinity" -#: backend/db_services/ipchooser/serializers/base.py:48 -msgid "节点类型ID" -msgstr "node type ID" +#: backend/db_services/dbresource/serializers.py:57 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:35 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:38 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:39 +msgid "数量" +msgstr "quantity" -#: backend/db_services/ipchooser/serializers/base.py:54 -msgid "内网IP" -msgstr "Intranet IP" +#: backend/db_services/dbresource/serializers.py:61 +msgid "业务专属ID" +msgstr "Business exclusive ID" -#: backend/db_services/ipchooser/serializers/base.py:55 -msgid "内网IPv6" -msgstr "Intranet IPv6" +#: backend/db_services/dbresource/serializers.py:62 +msgid "资源申请参数" +msgstr "Resource application parameters" +#: backend/db_services/dbresource/serializers.py:72 +msgid "资源最小值" +msgstr "resource minimum" + +#: backend/db_services/dbresource/serializers.py:73 +msgid "资源最大值" +msgstr "resource max" + +#: backend/db_services/dbresource/serializers.py:75 +msgid "专属业务" +msgstr "exclusive business" + +#: backend/db_services/dbresource/serializers.py:78 +msgid "主机IP列表" +msgstr "Host IP list" + +#: backend/db_services/dbresource/serializers.py:79 +msgid "云区域ID列表" +msgstr "Cloud region ID list" + +#: backend/db_services/dbresource/serializers.py:81 +msgid "园区" +msgstr "park" + +#: backend/db_services/dbresource/serializers.py:83 #: backend/db_services/ipchooser/serializers/base.py:56 msgid "操作系统类型" msgstr "operating system type" -#: backend/db_services/ipchooser/serializers/base.py:57 -msgid "主机名称" -msgstr "host name" +#: backend/db_services/dbresource/serializers.py:84 +msgid "cpu资源限制" +msgstr "cpu resource limitation" -#: backend/db_services/ipchooser/serializers/base.py:58 -#: backend/db_services/ipchooser/serializers/base.py:68 -msgid "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" -msgstr "" -"Fuzzy search content (supports fuzzy search for `host IP`/`host name`/" -"`operating system` at the same time" +#: backend/db_services/dbresource/serializers.py:85 +msgid "内存资源限制" +msgstr "memory resource limit" -#: backend/db_services/ipchooser/serializers/base.py:62 -msgid "是否获取所有资源范围的拓扑结构,默认为 `false`" -msgstr "" -"Whether to get the topology of all resource scopes, the default is `false`" +#: backend/db_services/dbresource/serializers.py:86 +msgid "磁盘资源限制" +msgstr "disk resource limit" -#: backend/db_services/ipchooser/serializers/base.py:63 -msgid "要获取拓扑结构的资源范围数组" -msgstr "Array of resource scopes to get topology" +#: backend/db_services/dbresource/serializers.py:87 +msgid "磁盘类型" +msgstr "disk type" -#: backend/db_services/ipchooser/serializers/base.py:70 -msgid "云区域过滤id" -msgstr "cloud region filter id" +#: backend/db_services/dbresource/serializers.py:88 +msgid "磁盘挂载点" +msgstr "disk mount point" -#: backend/db_services/ipchooser/serializers/base.py:91 -msgid "IPv4 协议下的主机IP" -msgstr "Host IP under IPv4 protocol" +#: backend/db_services/dbresource/serializers.py:89 +msgid "过滤的规格ID" +msgstr "Filtered specification ID" -#: backend/db_services/ipchooser/serializers/base.py:92 -msgid "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" -msgstr "Host ID, take `host_id` first, otherwise take `ip` + `cloud_id`" +#: backend/db_services/dbresource/serializers.py:91 +msgid "agent状态" +msgstr "agent state" -#: backend/db_services/ipchooser/serializers/base.py:96 -msgid "请传入 host_id 或者 cloud_id + ip" -msgstr "Please pass in host_id or cloud_id + ip" +#: backend/db_services/dbresource/serializers.py:95 +msgid "偏移量" +msgstr "Offset" -#: backend/db_services/ipchooser/serializers/host_sers.py:20 -#: backend/db_services/ipchooser/serializers/host_sers.py:52 -#: backend/db_services/ipchooser/serializers/topo_sers.py:20 -#: backend/db_services/ipchooser/serializers/topo_sers.py:46 -msgid "模式" -msgstr "model" +#: backend/db_services/dbresource/serializers.py:164 +msgid "主机ID列表(逗号分隔)" +msgstr "List of host IDs (comma separated)" -#: backend/db_services/ipchooser/serializers/host_sers.py:23 -msgid "IPv4 列表" -msgstr "IPv4 list" +#: backend/db_services/dbresource/serializers.py:168 +msgid "资源申请的request_id" +msgstr "request_id of resource application" -#: backend/db_services/ipchooser/serializers/host_sers.py:24 -msgid "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" -msgstr "IPv4, supported input format: `cloud_id:ip` / `ip`" +#: backend/db_services/dbresource/serializers.py:169 +#: backend/db_services/dbresource/serializers.py:173 +#: backend/db_services/dbresource/serializers.py:177 +msgid "主机ID列表" +msgstr "List of host IDs" -#: backend/db_services/ipchooser/serializers/host_sers.py:29 -msgid "IPv6 列表" -msgstr "IPv6 list" +#: backend/db_services/dbresource/serializers.py:178 +msgid "Labels" +msgstr "Labels" -#: backend/db_services/ipchooser/serializers/host_sers.py:30 -msgid "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" -msgstr "IPv6, supported input format: `cloud_id:ipv6` / `ipv6`" +#: backend/db_services/dbresource/serializers.py:179 +msgid "专用业务ID" +msgstr "Dedicated business ID" -#: backend/db_services/ipchooser/serializers/host_sers.py:35 -msgid "关键字列表" -msgstr "keyword list" +#: backend/db_services/dbresource/serializers.py:185 +msgid "是否无专用业务" +msgstr "Whether there is no dedicated business" -#: backend/db_services/ipchooser/serializers/host_sers.py:36 -msgid "关键字,解析出的`主机名`、`host_id` 等关键字信息" -msgstr "Keywords, keyword information such as `hostname`, `host_id`, etc." +#: backend/db_services/dbresource/serializers.py:186 +msgid "是否无专用资源类型" +msgstr "Whether there is no dedicated resource type" -#: backend/db_services/ipchooser/serializers/topo_sers.py:71 -msgid "查询过滤条件" -msgstr "query filter" +#: backend/db_services/dbresource/serializers.py:187 +msgid "磁盘挂载点信息" +msgstr "Disk mount point information" -#: backend/db_services/ipchooser/serializers/topo_sers.py:79 -msgid "拓扑信息列表" -msgstr "Topology Information List" +#: backend/db_services/dbresource/serializers.py:188 +msgid "机架ID" +msgstr "Rack ID" -#: backend/db_services/ipchooser/serializers/topo_sers.py:79 -msgid "拓扑信息" -msgstr "topology information" +#: backend/db_services/dbresource/serializers.py:199 +msgid "过滤的单据ID列表" +msgstr "Filtered list of ticket IDs" -#: backend/db_services/ipchooser/views.py:32 -msgid "批量获取含各节点主机数量的拓扑树" -msgstr "Get the topology tree with the number of hosts on each node in batches" +#: backend/db_services/dbresource/serializers.py:200 +msgid "过滤的单据类型列表" +msgstr "Filtered document type list" -#: backend/db_services/ipchooser/views.py:48 -msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" -msgstr "" -"According to multiple topological nodes and search conditions, batch paging " -"query contains host information" +#: backend/db_services/dbresource/serializers.py:201 +msgid "过滤的任务ID列表" +msgstr "Filtered list of task IDs" -#: backend/db_services/ipchooser/views.py:66 -msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" -msgstr "" -"According to multiple topological nodes and search conditions, the host ID " -"information contained in the batch pagination query" +#: backend/db_services/dbresource/serializers.py:202 +msgid "过滤IP列表" +msgstr "Filter IP list" -#: backend/db_services/ipchooser/views.py:83 -msgid "根据主机过滤查询主机的拓扑信息" -msgstr "Query host topology information based on host filtering" +#: backend/db_services/dbresource/serializers.py:206 +msgid "操作开始时间" +msgstr "Operation start time" -#: backend/db_services/ipchooser/views.py:105 -msgid "" -"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" -"器信息" -msgstr "" -"Obtain real machine information based on keyword information such as `IP`/" -"`IPv6`/`hostname`/`host_id` manually entered by the user" - -#: backend/db_services/ipchooser/views.py:123 -msgid "根据主机关键信息获取机器详情信息" -msgstr "Obtain machine detailed information based on host key information" +#: backend/db_services/dbresource/serializers.py:207 +msgid "操作结束时间" +msgstr "Operation end time" -#: backend/db_services/ipchooser/views.py:164 -msgid "获取自定义配置,比如表格列字段及顺序" -msgstr "Get custom configuration, such as table column fields and order" +#: backend/db_services/dbresource/serializers.py:208 +#: backend/ticket/models/ticket.py:95 +msgid "单据状态" +msgstr "ticket status" -#: backend/db_services/ipchooser/views.py:180 -msgid "保存用户自定义配置" -msgstr "Save user-defined configuration" +#: backend/db_services/dbresource/serializers.py:210 +#: backend/db_services/quick_search/serializers.py:33 +msgid "分页大小" +msgstr "Paging Size" -#: backend/db_services/ipchooser/views.py:194 -msgid "查询云区域的信息" -msgstr "Query information about cloud regions" +#: backend/db_services/dbresource/serializers.py:211 +msgid "分页起始位置" +msgstr "page start position" -#: backend/db_services/ipchooser/views.py:203 -msgid "查询磁盘类型" -msgstr "Query disk type" +#: backend/db_services/dbresource/serializers.py:218 +msgid "排序参数只能是 'update_time' 或 'total_count'。" +msgstr "The sorting parameter can only be 'update_time' or 'total_count'." -#: backend/db_services/mysql/cluster/handlers.py:52 -msgid "无法找到集群{}所包含实例,请检查集群相关信息" -msgstr "" -"Unable to find the instance contained in the cluster {}, please check the " -"relevant information of the cluster" +#: backend/db_services/dbresource/serializers.py:256 +msgid "请保证CPU/MEM的最小最大范围合理" +msgstr "Please ensure that the minimum and maximum range of CPU/MEM are reasonable" -#: backend/db_services/mysql/cluster/serializers.py:27 -#: backend/db_services/mysql/cluster/serializers.py:79 -#: backend/db_services/mysql/instance/serializers.py:24 -#: backend/db_services/mysql/remote_service/serializers.py:24 -#: backend/db_services/mysql/remote_service/serializers.py:36 -#: backend/db_services/mysql/sql_import/serializers.py:83 -#: backend/ticket/builders/mysql/mysql_add_slave.py:33 -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:29 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:34 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:35 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:32 -#: backend/ticket/builders/mysql/mysql_restore_slave.py:29 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:25 -msgid "集群ID列表" -msgstr "Cluster ID list" +#: backend/db_services/dbresource/serializers.py:268 +msgid "已存在同名规格,请保证集群类型-规格类型-规格名称必须唯一" +msgstr "A specification with the same name already exists. Please ensure that the cluster type - specification type - specification name must be unique." -#: backend/db_services/mysql/cluster/serializers.py:41 -#: backend/db_services/mysql/instance/serializers.py:38 -#: backend/ticket/builders/common/base.py:30 -msgid "IP地址" -msgstr "IP address" +#: backend/db_services/dbresource/serializers.py:281 +msgid "已存在同种规格配置,请不要在相同规格类型下重复录入" +msgstr "The same specification configuration already exists. Please do not enter it repeatedly under the same specification type." -#: backend/db_services/mysql/cluster/serializers.py:43 -#: backend/db_services/mysql/instance/serializers.py:40 -#: backend/ticket/builders/common/base.py:36 -#: backend/ticket/builders/common/bigdata.py:207 -#: backend/ticket/builders/common/bigdata.py:274 -msgid "端口号" -msgstr "The port number" +#: backend/db_services/dbresource/serializers.py:291 +msgid "【{}】后端磁盘挂载点必须包含/data,可选/data1" +msgstr "[{}] The backend disk mount point must contain /data, optional /data1" -#: backend/db_services/mysql/cluster/serializers.py:66 -msgid "集群过滤条件列表" -msgstr "List of cluster filter criteria" +#: backend/db_services/dbresource/serializers.py:299 +msgid "【{}】后端磁盘挂载点必须包含/data" +msgstr "[{}] The backend disk mount point must contain /data" -#: backend/db_services/mysql/cluster/views.py:41 -msgid "通过集群查询同机关联集群" -msgstr "Query the cluster associated with the same machine through the cluster" +#: backend/db_services/dbresource/serializers.py:309 +#: backend/db_services/dbresource/serializers.py:316 +msgid "规格id列表" +msgstr "specification id list" -#: backend/db_services/mysql/cluster/views.py:54 -msgid "通过实例查询同机关联集群" -msgstr "" -"Query the cluster associated with the same machine through the instance" +#: backend/db_services/dbresource/serializers.py:324 +msgid "规格ID(更新时传递)" +msgstr "Spec ID (passed when updating)" -#: backend/db_services/mysql/cluster/views.py:69 -msgid "通过过滤条件批量查询集群" -msgstr "Query clusters in batches by filtering conditions" +#: backend/db_services/dbresource/serializers.py:328 +msgid "逻辑城市" +msgstr "logic city" -#: backend/db_services/mysql/cluster/views.py:84 -msgid "获取关联集群从库的交集" -msgstr "Get the intersection of associated cluster slave libraries" +#: backend/db_services/dbresource/serializers.py:344 +msgid "角色类型" +msgstr "role type" + +#: backend/db_services/dbresource/serializers.py:345 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:47 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:51 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:54 +msgid "当前容量需求" +msgstr "Current capacity requirements" + +#: backend/db_services/dbresource/serializers.py:346 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:48 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:52 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:55 +msgid "未来容量需求" +msgstr "future capacity needs" + +#: backend/db_services/dbresource/serializers.py:347 +msgid "所需分片数" +msgstr "Number of shards required" + +#: backend/db_services/dbresource/serializers.py:356 +msgid "qps范围" +msgstr "qps range" + +#: backend/db_services/dbresource/serializers.py:377 +msgid "规格ID列表" +msgstr "Specification ID list" + +#: backend/db_services/dbresource/views/resource.py:142 +msgid "获取DBA业务下的主机信息" +msgstr "Obtain host information under the DBA service" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:220 -msgid "无法查找到在时间范围内{}-{},主机{}的binlog日志" -msgstr "Unable to find binlog logs for host {} in the time range {}-{}" +#: backend/db_services/dbresource/views/resource.py:170 +msgid "查询DBA业务下的主机信息" +msgstr "Query host information under DBA business" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:248 -msgid "查询集群{}的备份日志" -msgstr "Query the backup log of cluster {}" +#: backend/db_services/dbresource/views/resource.py:222 +msgid "查询资源导入任务" +msgstr "Query resource import tasks" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:290 -msgid "作业【{}】执行失败,job_instance_id: {}" -msgstr "Job [{}] failed to execute, job_instance_id: {}" +#: backend/db_services/dbresource/views/resource.py:246 +#: backend/ticket/builders/__init__.py:383 +#: backend/ticket/builders/mongodb/mongo_restore.py:242 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:55 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:50 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:53 +#: backend/ticket/constants.py:477 +msgid "资源申请" +msgstr "resource application" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:331 -msgid "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" -msgstr "" -"Unable to find log records less than near the time point {}, please check " -"the legitimacy of the time point or try again later" +#: backend/db_services/dbresource/views/resource.py:274 +msgid "获取操作系统类型" +msgstr "Get operating system type" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:20 -msgid "查询时间间隔" -msgstr "query time interval" +#: backend/db_services/dbresource/views/resource.py:292 +msgid "获取机型列表" +msgstr "Get model list" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:25 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:32 -msgid "回档时间" -msgstr "Rollback time" +#: backend/db_services/dbresource/views/resource.py:300 +msgid "资源预申请" +msgstr "Resource pre-application" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:26 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:31 -msgid "JOB实例ID" -msgstr "JOB instance ID" +#: backend/db_services/dbresource/views/resource.py:312 +#: backend/ticket/builders/mongodb/mongo_restore.py:261 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +msgid "资源确认" +msgstr "Resource Confirmation" -#: backend/db_services/mysql/fixpoint_rollback/views.py:36 -msgid "通过日志平台获取集群备份记录" -msgstr "Obtain cluster backup records through the log platform" +#: backend/db_services/dbresource/views/resource.py:357 +msgid "获取资源导入相关链接" +msgstr "Get resource import related links" -#: backend/db_services/mysql/fixpoint_rollback/views.py:51 -msgid "通过下发脚本到机器获取集群备份记录" -msgstr "Get the cluster backup record by sending the script to the machine" +#: backend/db_services/dbresource/views/resource.py:367 +msgid "查询资源操作记录" +msgstr "Query resource operation records" -#: backend/db_services/mysql/fixpoint_rollback/views.py:62 -msgid "根据job id查询任务执行状态和执行结果" -msgstr "Query task execution status and execution results based on job id" +#: backend/db_services/dbresource/views/resource.py:418 +msgid "规格数量的预计" +msgstr "Estimated quantity of specifications" -#: backend/db_services/mysql/fixpoint_rollback/views.py:75 -msgid "查询小于回档时间点最近的备份记录" -msgstr "" -"Query the latest backup record that is less than the rollback time point" +#: backend/db_services/dbresource/views/sepc.py:100 +msgid "新建规格" +msgstr "new specification" -#: backend/db_services/mysql/instance/views.py:31 -msgid "根据用户手动输入的 ip:port 查询真实的实例" -msgstr "" -"Query the real instance according to the ip:port manually entered by the user" +#: backend/db_services/dbresource/views/sepc.py:107 +msgid "规格详情" +msgstr "Specification details" -#: backend/db_services/mysql/permission/authorize/handlers.py:79 -msgid "「接口返回结果异常」{}" -msgstr "The interface returns an abnormal result {}" +#: backend/db_services/dbresource/views/sepc.py:114 +msgid "更新规格" +msgstr "update specification" -#: backend/db_services/mysql/permission/authorize/handlers.py:82 -#: backend/db_services/mysql/permission/clone/handlers.py:120 -msgid "「接口调用异常」{}" -msgstr "Interface call exception {}" +#: backend/db_services/dbresource/views/sepc.py:137 +msgid "规格: {}已经被引用,只允许拓展机型" +msgstr "Specifications: {} has been quoted, only extended models are allowed" -#: backend/db_services/mysql/permission/authorize/models.py:24 -#: backend/db_services/mysql/permission/clone/models.py:25 -#: backend/ticket/models/ticket.py:45 backend/ticket/models/ticket.py:247 -#: backend/ticket/models/ticket.py:303 backend/ticket/models/todo.py:32 -msgid "关联工单" -msgstr "Associated work order" +#: backend/db_services/dbresource/views/sepc.py:140 +msgid "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" +msgstr "" +"Specification: {} has been referenced, cannot modify the configuration! " +"(Only allow to expand the model and modify the description)" -#: backend/db_services/mysql/permission/authorize/models.py:26 -#: backend/db_services/mysql/permission/authorize/serializers.py:26 -#: backend/db_services/mysql/permission/authorize/serializers.py:99 -#: backend/db_services/mysql/permission/db_account/serializers.py:24 -#: backend/db_services/mysql/permission/db_account/serializers.py:77 -#: backend/db_services/mysql/permission/db_account/serializers.py:85 -#: backend/db_services/mysql/permission/db_account/serializers.py:109 -#: backend/db_services/mysql/permission/db_account/serializers.py:115 -msgid "账号名称" -msgstr "Account Name" +#: backend/db_services/dbresource/views/sepc.py:145 +msgid "更新规格的启用禁用态" +msgstr "Update specification enabled and disabled status" -#: backend/db_services/mysql/permission/authorize/models.py:27 -#: backend/db_services/mysql/permission/authorize/serializers.py:27 -msgid "源ip列表" -msgstr "source ip list" +#: backend/db_services/dbresource/views/sepc.py:155 +msgid "查询规格列表" +msgstr "Query specification list" -#: backend/db_services/mysql/permission/authorize/models.py:29 -msgid "访问DB名列表" -msgstr "Access the list of DB names" +#: backend/db_services/dbresource/views/sepc.py:174 +msgid "删除规格" +msgstr "delete specification" -#: backend/db_services/mysql/permission/authorize/models.py:31 -msgid "是否授权成功" -msgstr "Whether the authorization is successful" +#: backend/db_services/dbresource/views/sepc.py:180 +msgid "规格: {}已经被引用,无法被删除" +msgstr "Specification: {} is already referenced and cannot be deleted" -#: backend/db_services/mysql/permission/authorize/models.py:32 -#: backend/db_services/mysql/permission/constants.py:64 -msgid "错误信息/提示信息" -msgstr "Error message/prompt message" +#: backend/db_services/dbresource/views/sepc.py:186 +msgid "校验是否存在同名规格" +msgstr "Verify whether the specification with the same name exists" -#: backend/db_services/mysql/permission/authorize/models.py:33 -#: backend/db_services/mysql/permission/clone/models.py:34 -msgid "记录时间" -msgstr "record time" +#: backend/db_services/dbresource/views/sepc.py:200 +msgid "批量删除规格" +msgstr "Batch delete specifications" -#: backend/db_services/mysql/permission/authorize/models.py:36 -#: backend/db_services/mysql/permission/authorize/models.py:37 -msgid "授权记录" -msgstr "authorization record" +#: backend/db_services/dbresource/views/sepc.py:208 +msgid "规格: {}已经被引用,无法删除!" +msgstr "Specification: {} has been referenced and cannot be deleted!" -#: backend/db_services/mysql/permission/authorize/serializers.py:23 -msgid "ip地址" -msgstr "ip address" +#: backend/db_services/dbresource/views/sepc.py:212 +msgid "获取推荐规格" +msgstr "Get Recommended Specifications" -#: backend/db_services/mysql/permission/authorize/serializers.py:24 -msgid "资源池主机ID" -msgstr "Resource pool host ID" +#: backend/db_services/dbresource/views/sepc.py:263 +msgid "获取qps的范围" +msgstr "Get the range of qps" -#: backend/db_services/mysql/permission/authorize/serializers.py:29 -#: backend/db_services/mysql/permission/db_account/serializers.py:116 -msgid "访问DB列表" -msgstr "access DB list" +#: backend/db_services/dbresource/views/sepc.py:282 +msgid "集群: {}后端没有可选任何规格,请前往规格页面配置" +msgstr "Cluster: {}The backend does not have any optional specifications, please go to the specifications page to configure" -#: backend/db_services/mysql/permission/authorize/serializers.py:29 -#: backend/db_services/mysql/permission/db_account/serializers.py:95 -#: backend/db_services/mysql/permission/db_account/serializers.py:110 -#: backend/db_services/mysql/permission/db_account/serializers.py:143 -msgid "访问DB" -msgstr "Access DB" +#: backend/db_services/dbresource/views/sepc.py:296 +msgid "筛选集群部署规格方案" +msgstr "Filter cluster deployment specifications and solutions" -#: backend/db_services/mysql/permission/authorize/serializers.py:32 -msgid "集群id列表" -msgstr "list of cluster ids" +#: backend/db_services/dbresource/views/sepc.py:313 +msgid "集群:{}的规格筛选类不存在,请实现相应接口" +msgstr "Cluster: The specification filtering class of {} does not exist. Please implement the corresponding interface." -#: backend/db_services/mysql/permission/authorize/serializers.py:40 -#: backend/db_services/mysql/permission/authorize/serializers.py:81 -msgid "前置检查结果" -msgstr "Pre-check results" +#: backend/db_services/group/serializers.py:20 +msgid "实例数量" +msgstr "number of instances" -#: backend/db_services/mysql/permission/authorize/serializers.py:41 -msgid "检查结果信息" -msgstr "Check result information" +#: backend/db_services/group/serializers.py:28 +msgid "在该业务下已存在同名的分组,请重新命名分组" +msgstr "" +"A group with the same name already exists under this business, please rename " +"the group" -#: backend/db_services/mysql/permission/authorize/serializers.py:42 -#: backend/db_services/mysql/permission/authorize/serializers.py:82 -#: backend/db_services/mysql/permission/authorize/serializers.py:90 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:31 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:40 -msgid "授权数据缓存uid" -msgstr "Authorization data cache uid" +#: backend/db_services/group/serializers.py:38 +msgid "新分组ID" +msgstr "new group ID" -#: backend/db_services/mysql/permission/authorize/serializers.py:43 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:32 -msgid "授权数据信息" -msgstr "Authorization data information" +#: backend/db_services/group/serializers.py:39 +msgid "待移动实例的ID列表" +msgstr "ID list of instances to be moved" -#: backend/db_services/mysql/permission/authorize/serializers.py:50 -msgid "授权excel文件" -msgstr "Authorize excel file" +#: backend/db_services/group/views.py:29 +msgid "分组" +msgstr "group" -#: backend/db_services/mysql/permission/authorize/serializers.py:61 -msgid "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" -msgstr "" -"Excel content parsing failed, error message: {}. Tip: Please fill in the " -"authorization data according to the template" +#: backend/db_services/group/views.py:76 backend/db_services/group/views.py:77 +msgid "分组详情" +msgstr "Group details" -#: backend/db_services/mysql/permission/authorize/serializers.py:65 -msgid "excel表格为空!" -msgstr "The excel sheet is empty!" +#: backend/db_services/group/views.py:85 +msgid "分组列表" +msgstr "group list" -#: backend/db_services/mysql/permission/authorize/serializers.py:69 -msgid "excel表头校验不正确! 提示: 请按照模板填写授权数据" -msgstr "" -"The excel header verification is incorrect! Reminder: Please fill in the " -"authorization data according to the template" +#: backend/db_services/group/views.py:99 backend/db_services/group/views.py:101 +msgid "创建新分组" +msgstr "Create a new group" -#: backend/db_services/mysql/permission/authorize/serializers.py:74 -#: backend/db_services/mysql/permission/clone/serializers.py:104 -msgid "excel包含空的单元格!请检查数据的完整性和合法性" -msgstr "" -"excel contains empty cells! Please check the integrity and legality of the " -"data" +#: backend/db_services/group/views.py:108 +#: backend/db_services/group/views.py:110 +msgid "更新分组信息" +msgstr "Update group information" -#: backend/db_services/mysql/permission/authorize/serializers.py:83 -msgid "授权信息excel文件下载url" -msgstr "Authorization information excel file download url" +#: backend/db_services/group/views.py:117 +#: backend/db_services/group/views.py:119 +msgid "删除分组" +msgstr "delete group" -#: backend/db_services/mysql/permission/authorize/serializers.py:91 -#: backend/db_services/mysql/permission/clone/serializers.py:126 -#: backend/db_services/mysql/permission/constants.py:53 -#: backend/db_services/mysql/permission/constants.py:77 -#: backend/flow/models.py:20 backend/flow/models.py:37 -#: backend/ticket/serializers.py:63 -msgid "单据ID" -msgstr "Ticket ID" +#: backend/db_services/group/views.py:127 +msgid "移动实例到新组" +msgstr "Move instance to new group" -#: backend/db_services/mysql/permission/authorize/serializers.py:95 -msgid "授权执行错误excel" -msgstr "authorization execution error excel" +#: backend/db_services/infras/constants.py:19 +msgid "不足" +msgstr "insufficient" -#: backend/db_services/mysql/permission/authorize/serializers.py:100 -msgid "访问源ip" -msgstr "access source ip" +#: backend/db_services/infras/constants.py:20 +msgid "充足" +msgstr "adequate" -#: backend/db_services/mysql/permission/authorize/serializers.py:101 -msgid "访问集群名称" -msgstr "access cluster name" +#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 +msgid "标准型SA2" +msgstr "Standard SA2" -#: backend/db_services/mysql/permission/authorize/serializers.py:102 -msgid "访问db名称" -msgstr "access db name" +#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 +#: backend/db_services/infras/host.py:45 +msgid "1核" +msgstr "1 core" -#: backend/db_services/mysql/permission/authorize/serializers.py:103 -#: backend/db_services/mysql/permission/db_account/serializers.py:96 -#: backend/db_services/mysql/permission/db_account/serializers.py:111 -msgid "规则列表" -msgstr "rule list" +#: backend/db_services/infras/host.py:42 +msgid "标准型S6" +msgstr "Standard S6" -#: backend/db_services/mysql/permission/authorize/serializers.py:108 -msgid "现网授权列表" -msgstr "Live Network Authorization List" +#: backend/db_services/infras/host.py:42 backend/db_services/infras/host.py:44 +#: backend/db_services/infras/host.py:46 +msgid "2核" +msgstr "2 cores" -#: backend/db_services/mysql/permission/authorize/serializers.py:108 -msgid "授权信息" -msgstr "authorization information" +#: backend/db_services/infras/host.py:44 +msgid "标准型S5" +msgstr "Standard S5" -#: backend/db_services/mysql/permission/authorize/serializers.py:116 -#: backend/ticket/models/ticket_result_relation.py:24 -msgid "单据id" -msgstr "ticket id" +#: backend/db_services/infras/host.py:60 +msgid "无限制" +msgstr "Unlimited" -#: backend/db_services/mysql/permission/authorize/serializers.py:117 -msgid "过滤搜索关键字" -msgstr "filter search keywords" +#: backend/db_services/infras/serializers.py:65 +#: backend/ticket/builders/common/bigdata.py:89 +#: backend/ticket/builders/common/bigdata.py:123 +#: backend/ticket/builders/common/bigdata.py:182 +#: backend/ticket/builders/influxdb/influxdb_apply.py:38 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:37 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:41 +#: backend/ticket/builders/mongodb/mongo_cutoff.py:45 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:50 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:40 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:42 +#: backend/ticket/builders/mysql/mysql_single_apply.py:57 +#: backend/ticket/builders/pulsar/pulsar_shrink.py:31 +#: backend/ticket/builders/redis/redis_cluster_apply.py:46 +#: backend/ticket/builders/redis/redis_instance_apply.py:48 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:46 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:43 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:41 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:75 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:36 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:57 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:82 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:85 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:40 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:56 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:38 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:45 +msgid "主机来源" +msgstr "host source" -#: backend/db_services/mysql/permission/authorize/views.py:71 -msgid "规则前置检查" -msgstr "Rule pre-check" - -#: backend/db_services/mysql/permission/authorize/views.py:81 -msgid "excel规则前置检查" -msgstr "Excel rule pre-check" +#: backend/db_services/infras/serializers.py:66 +#: backend/ticket/builders/mysql/mysql_single_apply.py:59 +#: backend/ticket/builders/redis/redis_cluster_apply.py:47 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:58 +msgid "部署节点" +msgstr "deployment node" -#: backend/db_services/mysql/permission/authorize/views.py:93 -msgid "获得授权信息excel文件" -msgstr "Obtain the authorization information excel file" +#: backend/db_services/infras/views.py:40 +msgid "查询集群类型" +msgstr "Query cluster type" -#: backend/db_services/mysql/permission/authorize/views.py:105 -msgid "现网授权查询(暂搁置)" -msgstr "Live network authorization query (temporarily put on hold)" +#: backend/db_services/infras/views.py:53 +msgid "查询服务器资源的城市信息" +msgstr "Query the city information of server resources" -#: backend/db_services/mysql/permission/authorize/views.py:114 -msgid "查询授权主机的信息" -msgstr "Query information about authorized hosts" +#: backend/db_services/infras/views.py:54 +#: backend/db_services/infras/views.py:64 +msgid "城市信息" +msgstr "city information" -#: backend/db_services/mysql/permission/clone/models.py:27 -#: backend/db_services/mysql/permission/clone/serializers.py:33 -#: backend/db_services/mysql/permission/clone/serializers.py:84 -#: backend/db_services/mysql/permission/clone/serializers.py:124 -#: backend/ticket/builders/mysql/mysql_clone_rules.py:29 -msgid "权限克隆类型" -msgstr "permission clone type" +#: backend/db_services/infras/views.py:63 +msgid "查询逻辑城市映射关系" +msgstr "Query logical city mapping relationship" -#: backend/db_services/mysql/permission/clone/models.py:29 -#: backend/db_services/mysql/permission/clone/serializers.py:22 -msgid "旧实例/旧客户端IP" -msgstr "Old instance/old client IP" +#: backend/db_services/infras/views.py:78 +msgid "服务器规格列表" +msgstr "List of Server Specifications" -#: backend/db_services/mysql/permission/clone/models.py:30 -msgid "新实例/新客户端IP列表" -msgstr "New instance/new client IP list" +#: backend/db_services/infras/views.py:79 +msgid "服务器规格信息" +msgstr "Server specification information" -#: backend/db_services/mysql/permission/clone/models.py:32 -msgid "是否克隆成功" -msgstr "Whether the clone is successful" +#: backend/db_services/infras/views.py:93 +msgid "容量规格列表" +msgstr "List of capacity specifications" -#: backend/db_services/mysql/permission/clone/models.py:33 -#: backend/ticket/models/ticket.py:57 -msgid "错误信息" -msgstr "error message" +#: backend/db_services/infras/views.py:95 +msgid "申请容量规格信息" +msgstr "Apply for capacity specification information" -#: backend/db_services/mysql/permission/clone/models.py:38 -#: backend/db_services/mysql/permission/clone/models.py:39 -msgid "权限克隆记录" -msgstr "Permission to clone records" +#: backend/db_services/infras/views.py:127 +msgid "主机{}配置异常,无法获取到合法的cpu({})或内存({})" +msgstr "" +"The configuration of the host {} is abnormal, and the legal cpu ({}) or " +"memory ({}) cannot be obtained" -#: backend/db_services/mysql/permission/clone/serializers.py:23 -msgid "新实例/新客户端IP" -msgstr "New instance/new client IP" +#: backend/db_services/infras/views.py:143 +msgid "暂不支持该集群类型: {}" +msgstr "This cluster type is not currently supported: {}" -#: backend/db_services/mysql/permission/clone/serializers.py:25 -msgid "模块名" -msgstr "module name" +#: backend/db_services/ipchooser/constants.py:54 +msgid "字段分隔符" +msgstr "field separator" -#: backend/db_services/mysql/permission/clone/serializers.py:35 -msgid "克隆元素列表" -msgstr "clone element list" +#: backend/db_services/ipchooser/constants.py:55 +msgid "全量返回标志" +msgstr "full return sign" -#: backend/db_services/mysql/permission/clone/serializers.py:35 -msgid "克隆元素信息" -msgstr "clone element information" +#: backend/db_services/ipchooser/constants.py:56 +msgid "默认模糊查询字段" +msgstr "Default fuzzy query field" -#: backend/db_services/mysql/permission/clone/serializers.py:49 -msgid "源克隆对象{}与目的克隆对象{}相同" -msgstr "" -"The source clone object {} is the same as the destination clone object {}" +#: backend/db_services/ipchooser/constants.py:57 +msgid "主机列表默认返回字段" +msgstr "host list default return field" -#: backend/db_services/mysql/permission/clone/serializers.py:66 -msgid "实例{}不属于本业务{},请保证所有实例均在本业务下" -msgstr "" -"Instance {} does not belong to this business {}, please ensure that all " -"instances are under this business" +#: backend/db_services/ipchooser/constants.py:106 +msgid "完整模式" +msgstr "full mode" -#: backend/db_services/mysql/permission/clone/serializers.py:73 -#: backend/db_services/mysql/permission/clone/serializers.py:115 -msgid "权限克隆前置检查结果" -msgstr "Permission cloning pre-check results" +#: backend/db_services/ipchooser/constants.py:106 +msgid "空闲机模式" +msgstr "idle mode" -#: backend/db_services/mysql/permission/clone/serializers.py:74 -#: backend/db_services/mysql/permission/clone/serializers.py:116 -msgid "权限克隆前置检查信息" -msgstr "Permission cloning pre-check information" +#: backend/db_services/ipchooser/constants.py:129 +msgid "存活" +msgstr "survive" -#: backend/db_services/mysql/permission/clone/serializers.py:75 -#: backend/db_services/mysql/permission/clone/serializers.py:117 -msgid "权限克隆数据uid" -msgstr "Permission to clone data uid" +#: backend/db_services/ipchooser/constants.py:129 +msgid "未存活" +msgstr "not alive" -#: backend/db_services/mysql/permission/clone/serializers.py:76 -msgid "权限克隆数据列表" -msgstr "Permission to clone data list" +#: backend/db_services/ipchooser/exceptions.py:21 +#: backend/db_services/ipchooser/exceptions.py:22 +msgid "参数校验失败" +msgstr "Parameter verification failed" -#: backend/db_services/mysql/permission/clone/serializers.py:83 -msgid "克隆实例/客户端excel文件" -msgstr "Clone instance/client excel file" +#: backend/db_services/ipchooser/exceptions.py:27 +#, python-brace-format +msgid "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" +msgstr "Business [bk_biz_id: {bk_biz_id}] topology does not exist" -#: backend/db_services/mysql/permission/clone/serializers.py:91 -msgid "excel内容解析失败, 错误信息:{}。" -msgstr "Excel content parsing failed, error message: {}." +#: backend/db_services/ipchooser/exceptions.py:28 +msgid "业务拓扑不存在" +msgstr "Business topology does not exist" -#: backend/db_services/mysql/permission/clone/serializers.py:95 -msgid "excel表头校验不正确!" -msgstr "The excel table header check is incorrect!" +#: backend/db_services/ipchooser/mock_data.py:30 +#: backend/db_services/ipchooser/mock_data.py:89 +#: backend/db_services/ipchooser/mock_data.py:110 +#: backend/db_services/ipchooser/mock_data.py:138 +#: backend/db_services/ipchooser/mock_data.py:149 +#: backend/db_services/ipchooser/mock_data.py:171 +#: backend/db_services/redis/autofix/models.py:75 +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:98 +#: backend/ticket/constants.py:79 backend/ticket/constants.py:90 +msgid "成功" +msgstr "success" -#: backend/db_services/mysql/permission/clone/serializers.py:99 -msgid "excel内容为空!" -msgstr "The excel content is empty!" +#: backend/db_services/ipchooser/mock_data.py:34 +#: backend/db_services/ipchooser/mock_data.py:92 +#: backend/db_services/ipchooser/mock_data.py:124 +msgid "蓝鲸" +msgstr "blue whale" -#: backend/db_services/mysql/permission/clone/serializers.py:125 -#: backend/ticket/builders/mysql/mysql_clone_rules.py:28 -msgid "权限克隆数据缓存uid" -msgstr "Permission to clone data cache uid" +#: backend/db_services/ipchooser/mock_data.py:41 +#: backend/db_services/ipchooser/mock_data.py:96 +msgid "mark测试" +msgstr "mark test" -#: backend/db_services/mysql/permission/clone/views.py:65 -msgid "权限克隆前置检查" -msgstr "Permission cloning pre-check" +#: backend/db_services/ipchooser/mock_data.py:48 +msgid "空闲机模块" +msgstr "idle machine module" -#: backend/db_services/mysql/permission/clone/views.py:75 -msgid "权限克隆excel前置检查" -msgstr "Permission to clone excel pre-check" +#: backend/db_services/ipchooser/mock_data.py:60 +msgid "空闲机池" +msgstr "free machine pool" -#: backend/db_services/mysql/permission/clone/views.py:85 -msgid "获得权限克隆信息excel文件" -msgstr "Obtain permission to clone information excel file" +#: backend/db_services/ipchooser/mock_data.py:67 +#: backend/ticket/builders/common/base.py:152 +msgid "空闲机" +msgstr "idle machine" -#: backend/db_services/mysql/permission/constants.py:22 -msgid "选择" -msgstr "choose" +#: backend/db_services/ipchooser/query/resource.py:487 +msgid "直连区域" +msgstr "Direct Mode" -#: backend/db_services/mysql/permission/constants.py:23 -msgid "插入" -msgstr "insert" +#: backend/db_services/ipchooser/serializers/base.py:18 +msgid "数据起始位置" +msgstr "data starting position" -#: backend/db_services/mysql/permission/constants.py:30 -msgid "创建表" -msgstr "create table" +#: backend/db_services/ipchooser/serializers/base.py:20 +msgid "拉取数据数量,不传或传 `-1` 表示拉取所有" +msgstr "" +"The number of data to be pulled, if not passed or `-1` means to pull all" -#: backend/db_services/mysql/permission/constants.py:31 -msgid "修改表" -msgstr "modify table" +#: backend/db_services/ipchooser/serializers/base.py:29 +msgid "资源范围类型" +msgstr "resource scope type" -#: backend/db_services/mysql/permission/constants.py:32 -msgid "删除表" -msgstr "delete table" +#: backend/db_services/ipchooser/serializers/base.py:30 +msgid "资源范围ID" +msgstr "resource scope id" -#: backend/db_services/mysql/permission/constants.py:33 -msgid "索引" -msgstr "index" +#: backend/db_services/ipchooser/serializers/base.py:48 +msgid "节点类型ID" +msgstr "node type ID" -#: backend/db_services/mysql/permission/constants.py:34 -msgid "执行" -msgstr "implement" +#: backend/db_services/ipchooser/serializers/base.py:54 +msgid "内网IP" +msgstr "Intranet IP" -#: backend/db_services/mysql/permission/constants.py:39 -msgid "replication client" -msgstr "replication client" +#: backend/db_services/ipchooser/serializers/base.py:55 +msgid "内网IPv6" +msgstr "Intranet IPv6" -#: backend/db_services/mysql/permission/constants.py:40 -msgid "replication slave" -msgstr "replication slave" +#: backend/db_services/ipchooser/serializers/base.py:57 +msgid "主机名称" +msgstr "host name" -#: backend/db_services/mysql/permission/constants.py:41 -msgid "file" -msgstr "file" +#: backend/db_services/ipchooser/serializers/base.py:58 +#: backend/db_services/ipchooser/serializers/base.py:68 +msgid "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" +msgstr "" +"Fuzzy search content (supports fuzzy search for `host IP`/`host name`/" +"`operating system` at the same time" -#: backend/db_services/mysql/permission/constants.py:54 -msgid "授权数据缓存UID" -msgstr "Authorization Data Cache UID" +#: backend/db_services/ipchooser/serializers/base.py:62 +msgid "是否获取所有资源范围的拓扑结构,默认为 `false`" +msgstr "" +"Whether to get the topology of all resource scopes, the default is `false`" -#: backend/db_services/mysql/permission/constants.py:60 -msgid "账号(单个)" -msgstr "Account (single)" +#: backend/db_services/ipchooser/serializers/base.py:63 +msgid "要获取拓扑结构的资源范围数组" +msgstr "Array of resource scopes to get topology" -#: backend/db_services/mysql/permission/constants.py:61 -msgid "访问源(多个)" -msgstr "access source(s)" +#: backend/db_services/ipchooser/serializers/base.py:70 +msgid "云区域过滤id" +msgstr "cloud region filter id" -#: backend/db_services/mysql/permission/constants.py:62 -msgid "访问集群域名(多个)" -msgstr "Access cluster domain names (multiple)" +#: backend/db_services/ipchooser/serializers/base.py:89 +msgid "主机元信息" +msgstr "Host meta information" -#: backend/db_services/mysql/permission/constants.py:63 -msgid "访问DB名(多个)" -msgstr "Access DB name(s)" +#: backend/db_services/ipchooser/serializers/base.py:91 +msgid "IPv4 协议下的主机IP" +msgstr "Host IP under IPv4 protocol" -#: backend/db_services/mysql/permission/constants.py:70 -msgid "实例克隆" -msgstr "Instance cloning" +#: backend/db_services/ipchooser/serializers/base.py:92 +msgid "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" +msgstr "Host ID, take `host_id` first, otherwise take `ip` + `cloud_id`" -#: backend/db_services/mysql/permission/constants.py:71 -msgid "客户端克隆" -msgstr "client clone" +#: backend/db_services/ipchooser/serializers/base.py:96 +msgid "请传入 host_id 或者 cloud_id + ip" +msgstr "Please pass in host_id or cloud_id + ip" -#: backend/db_services/mysql/permission/constants.py:78 -msgid "克隆数据缓存UID" -msgstr "Clone data cache UID" +#: backend/db_services/ipchooser/serializers/host_sers.py:20 +#: backend/db_services/ipchooser/serializers/host_sers.py:52 +#: backend/db_services/ipchooser/serializers/topo_sers.py:20 +#: backend/db_services/ipchooser/serializers/topo_sers.py:46 +msgid "模式" +msgstr "model" -#: backend/db_services/mysql/permission/db_account/serializers.py:25 -msgid "账号密码" -msgstr "account password" +#: backend/db_services/ipchooser/serializers/host_sers.py:23 +msgid "IPv4 列表" +msgstr "IPv4 list" -#: backend/db_services/mysql/permission/db_account/serializers.py:33 -msgid "账号名称不符合要求, 请重新账号名" -msgstr "" -"The account name does not meet the requirements, please change the account " -"name" +#: backend/db_services/ipchooser/serializers/host_sers.py:24 +msgid "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" +msgstr "IPv4, supported input format: `cloud_id:ip` / `ip`" -#: backend/db_services/mysql/permission/db_account/serializers.py:43 -msgid "密码强度不符合要求, 请重新输入密码" -msgstr "" -"The password strength does not meet the requirements, please re-enter the " -"password" +#: backend/db_services/ipchooser/serializers/host_sers.py:29 +msgid "IPv6 列表" +msgstr "IPv6 list" -#: backend/db_services/mysql/permission/db_account/serializers.py:54 -msgid "待校验密码" -msgstr "password to be verified" +#: backend/db_services/ipchooser/serializers/host_sers.py:30 +msgid "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" +msgstr "IPv6, supported input format: `cloud_id:ipv6` / `ipv6`" -#: backend/db_services/mysql/permission/db_account/serializers.py:61 -msgid "密码是否满足强度" -msgstr "Whether the password meets the strength" +#: backend/db_services/ipchooser/serializers/host_sers.py:35 +msgid "关键字列表" +msgstr "keyword list" -#: backend/db_services/mysql/permission/db_account/serializers.py:62 -msgid "密码校验信息字典" -msgstr "Password verification information dictionary" +#: backend/db_services/ipchooser/serializers/host_sers.py:36 +msgid "关键字,解析出的`主机名`、`host_id` 等关键字信息" +msgstr "Keywords, keyword information such as `hostname`, `host_id`, etc." -#: backend/db_services/mysql/permission/db_account/serializers.py:69 -#: backend/db_services/mysql/permission/db_account/serializers.py:76 -#: backend/db_services/mysql/permission/db_account/serializers.py:86 -#: backend/db_services/mysql/permission/db_account/serializers.py:93 -#: backend/db_services/mysql/permission/db_account/serializers.py:142 -msgid "账号ID" -msgstr "Account ID" +#: backend/db_services/ipchooser/serializers/topo_sers.py:71 +msgid "查询过滤条件" +msgstr "query filter" -#: backend/db_services/mysql/permission/db_account/serializers.py:87 -#: backend/db_services/mysql/permission/db_account/serializers.py:97 -#: backend/db_services/partition/serializers.py:51 -msgid "创建者" -msgstr "creator" +#: backend/db_services/ipchooser/serializers/topo_sers.py:79 +msgid "拓扑信息列表" +msgstr "Topology Information List" -#: backend/db_services/mysql/permission/db_account/serializers.py:92 -#: backend/db_services/mysql/permission/db_account/serializers.py:151 -#: backend/db_services/mysql/permission/db_account/serializers.py:158 -msgid "规则ID" -msgstr "rule ID" +#: backend/db_services/ipchooser/serializers/topo_sers.py:79 +msgid "拓扑信息" +msgstr "topology information" -#: backend/db_services/mysql/permission/db_account/serializers.py:102 -msgid "账号信息" -msgstr "account information" +#: backend/db_services/ipchooser/views.py:34 +msgid "批量获取含各节点主机数量的拓扑树" +msgstr "Get the topology tree with the number of hosts on each node in batches" -#: backend/db_services/mysql/permission/db_account/serializers.py:104 -msgid "权限列表信息" -msgstr "Permission list information" +#: backend/db_services/ipchooser/views.py:50 +msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" +msgstr "" +"According to multiple topological nodes and search conditions, batch paging " +"query contains host information" -#: backend/db_services/mysql/permission/db_account/serializers.py:120 -msgid "规则数量" -msgstr "number of rules" +#: backend/db_services/ipchooser/views.py:68 +msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" +msgstr "" +"According to multiple topological nodes and search conditions, the host ID " +"information contained in the batch pagination query" -#: backend/db_services/mysql/permission/db_account/serializers.py:122 -msgid "规则信息" -msgstr "rule information" +#: backend/db_services/ipchooser/views.py:85 +msgid "根据主机过滤查询主机的拓扑信息" +msgstr "Query host topology information based on host filtering" -#: backend/db_services/mysql/permission/db_account/serializers.py:131 -#: backend/db_services/mysql/permission/db_account/serializers.py:134 -msgid "dml" -msgstr "dml" +#: backend/db_services/ipchooser/views.py:108 +msgid "" +"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" +"器信息" +msgstr "" +"Obtain real machine information based on keyword information such as `IP`/" +"`IPv6`/`hostname`/`host_id` manually entered by the user" -#: backend/db_services/mysql/permission/db_account/serializers.py:137 -msgid "glob" -msgstr "glob" +#: backend/db_services/ipchooser/views.py:126 +msgid "根据主机关键信息获取机器详情信息" +msgstr "Obtain machine detailed information based on host key information" -#: backend/db_services/mysql/permission/db_account/views.py:82 -msgid "校验密码强度" -msgstr "Verify password strength" +#: backend/db_services/ipchooser/views.py:168 +msgid "获取自定义配置,比如表格列字段及顺序" +msgstr "Get custom configuration, such as table column fields and order" -#: backend/db_services/mysql/permission/db_account/views.py:94 -msgid "添加账号规则" -msgstr "Add Account Rules" +#: backend/db_services/ipchooser/views.py:184 +msgid "保存用户自定义配置" +msgstr "Save user-defined configuration" -#: backend/db_services/mysql/permission/db_account/views.py:101 -msgid "查询账号规则清单" -msgstr "Query the list of account rules" +#: backend/db_services/ipchooser/views.py:198 +msgid "查询云区域的信息" +msgstr "Query information about cloud regions" -#: backend/db_services/mysql/permission/db_account/views.py:113 -msgid "查询账号规则" -msgstr "Query Account Rules" +#: backend/db_services/meta_import/constants.py:13 +msgid "元数据迁移" +msgstr "Metadata migration" + +#: backend/db_services/meta_import/serializers.py:56 +#: backend/db_services/meta_import/serializers.py:87 +#: backend/db_services/meta_import/serializers.py:116 +msgid "元数据json文件" +msgstr "Metadata json file" + +#: backend/db_services/meta_import/serializers.py:60 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:34 +msgid "代理层规格ID" +msgstr "Agent layer specification ID" + +#: backend/db_services/meta_import/serializers.py:63 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:35 +msgid "存储层规格ID" +msgstr "Storage layer specification ID" + +#: backend/db_services/meta_import/serializers.py:72 +#: backend/db_services/meta_import/serializers.py:80 +#: backend/db_services/meta_import/serializers.py:104 +#: backend/db_services/meta_import/serializers.py:128 +msgid "域名列表文件" +msgstr "Domain name list file" + +#: backend/db_services/meta_import/serializers.py:91 +msgid "Spider规格ID" +msgstr "Spider specification ID" + +#: backend/db_services/meta_import/serializers.py:94 +msgid "Remote规格ID" +msgstr "Remote specification ID" + +#: backend/db_services/meta_import/serializers.py:102 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:53 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:49 +#: backend/ticket/builders/riak/riak_apply.py:31 +#: backend/ticket/builders/riak/riak_migrate.py:31 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:49 +msgid "云区域" +msgstr "cloud area" -#: backend/db_services/mysql/permission/db_account/views.py:125 -msgid "修改账号规则" -msgstr "Modify Account Rules" +#: backend/db_services/meta_import/serializers.py:105 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:26 +msgid "是否使用mydumper流式备份迁移" +msgstr "Whether to use mydumper streaming backup migration" + +#: backend/db_services/meta_import/serializers.py:106 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:27 +msgid "导入到tdbctl前,是否先删除" +msgstr "Before importing to tdbctl, whether to delete it first" + +#: backend/db_services/meta_import/serializers.py:107 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:28 +msgid "mydumper 并发" +msgstr "mydumper concurrency" + +#: backend/db_services/meta_import/serializers.py:108 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:29 +msgid "是否使用mydumper,myloader迁移" +msgstr "Whether to use mydumper, myloader migration" + +#: backend/db_services/meta_import/serializers.py:119 +#: backend/ticket/builders/tendbsingle/metadata_import.py:33 +msgid "存储机规格ID" +msgstr "Storage machine specification ID" + +#: backend/db_services/meta_import/views.py:61 +msgid "TenDB HA 元数据导入" +msgstr "TenDB HA metadata import" + +#: backend/db_services/meta_import/views.py:86 +msgid "TenDB HA 标准化接入" +msgstr "TenDB HA standardized access" + +#: backend/db_services/meta_import/views.py:116 +#: backend/db_services/meta_import/views.py:186 +#: backend/db_services/meta_import/views.py:233 +#: backend/db_services/meta_import/views.py:302 +msgid "cluster {} not found" +msgstr "cluster {} not found" + +#: backend/db_services/meta_import/views.py:133 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:50 +#: backend/ticket/builders/spider/metadata_import.py:237 +#: backend/ticket/constants.py:244 +msgid "TenDB Cluster 元数据导入" +msgstr "TenDB Cluster metadata import" + +#: backend/db_services/meta_import/views.py:156 backend/ticket/constants.py:243 +msgid "TenDB Cluster 集群标准化" +msgstr "TenDB Cluster cluster standardization" + +#: backend/db_services/meta_import/views.py:203 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:76 +#: backend/ticket/constants.py:245 +msgid "TenDB Cluster 追加部署中控" +msgstr "TenDB Cluster additional deployment central control" + +#: backend/db_services/meta_import/views.py:249 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:50 +#: backend/ticket/builders/tendbsingle/metadata_import.py:201 +#: backend/ticket/constants.py:246 +msgid "TenDB Single 元数据导入" +msgstr "TenDB Single metadata import" + +#: backend/db_services/meta_import/views.py:272 backend/ticket/constants.py:247 +msgid "TenDB Single 集群标准化" +msgstr "TenDB Single cluster standardization" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:62 +msgid "无法查询用户{}对应的密码" +msgstr "Unable to query the password corresponding to user {}" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:68 +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:60 +msgid "不存在{}-{}这样的规则模板" +msgstr "There is no such rule template as {}-{}" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:75 +msgid "存在不合法的集群域名" +msgstr "There is an illegal cluster domain name" + +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:21 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:21 +msgid "账号名" +msgstr "Account name" + +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:24 +msgid "mongo账户规则" +msgstr "mongo account rules" + +#: backend/db_services/mongodb/resources/views.py:96 +msgid "获取实例的角色类型" +msgstr "Get the role type of the instance" + +#: backend/db_services/mongodb/restore/handlers.py:51 +msgid "距离回档时间点7天内没有备份日志" +msgstr "There is no backup log within 7 days from the rollback time point" + +#: backend/db_services/mongodb/restore/handlers.py:59 +msgid "无法找到时间点{}附近的全备日志记录" +msgstr "Unable to find full log records near time point {}" + +#: backend/db_services/mongodb/restore/handlers.py:122 +#: backend/db_services/mongodb/restore/handlers.py:138 +msgid "{}-{}内没有通过单据备份的日志" +msgstr "There are no logs backed up by documents in {}-{}" + +#: backend/db_services/mongodb/restore/serializers.py:26 +msgid "分片集群只支持查询单个" +msgstr "Sharded clusters only support querying a single" + +#: backend/db_services/mongodb/restore/serializers.py:40 +msgid "过滤ip,多个ip以逗号分割" +msgstr "Filter IP, multiple IPs separated by commas" + +#: backend/db_services/mongodb/restore/views.py:39 +msgid "获取集群单据备份记录" +msgstr "Get cluster document backup records" + +#: backend/db_services/mongodb/restore/views.py:52 +msgid "获取集群备份记录" +msgstr "Get cluster backup records" + +#: backend/db_services/mongodb/restore/views.py:66 +msgid "查询定点构造记录" +msgstr "Query fixed-point construction records" + +#: backend/db_services/mysql/cluster/serializers.py:36 +msgid "集群过滤条件列表" +msgstr "List of cluster filter criteria" -#: backend/db_services/mysql/permission/db_account/views.py:134 -msgid "删除账号规则" -msgstr "delete account rules" +#: backend/db_services/mysql/cluster/serializers.py:66 +msgid "查询的实例列表" +msgstr "Query instance list" -#: backend/db_services/mysql/permission/exceptions.py:41 -msgid "权限模块异常" -msgstr "Permission module exception" +#: backend/db_services/mysql/cluster/serializers.py:67 +msgid "查询的机器列表" +msgstr "Query machine list" -#: backend/db_services/mysql/permission/exceptions.py:45 -msgid "授权EXCEL表校验异常" -msgstr "Authorized EXCEL table verification exception" +#: backend/db_services/mysql/cluster/serializers.py:81 +msgid "is_stand_by标志(默认获取带有is_stand_by标志的slave)" +msgstr "is_stand_by flag (obtains the slave with is_stand_by flag by default)" -#: backend/db_services/mysql/permission/exceptions.py:49 -msgid "权限克隆EXCEL表校验异常" -msgstr "The verification exception of the permission cloning EXCEL table" +#: backend/db_services/mysql/cluster/views.py:41 +msgid "通过过滤条件批量查询集群" +msgstr "Query clusters in batches by filtering conditions" -#: backend/db_services/mysql/permission/exceptions.py:53 -msgid "授权数据已过期" -msgstr "Authorization data has expired" +#: backend/db_services/mysql/cluster/views.py:54 +msgid "查询tendbcluster集群的remote_db/remote_dr" +msgstr "Query the remote_db/remote_dr of the tendbcluster cluster" -#: backend/db_services/mysql/permission/exceptions.py:57 -msgid "权限克隆数据已过期" -msgstr "Permission to clone data has expired" +#: backend/db_services/mysql/cluster/views.py:65 +msgid "[tendbcluster]根据实例/机器查询关联对" +msgstr "[tendbcluster]Query related pairs based on instance/machine" -#: backend/db_services/mysql/remote_service/serializers.py:37 -msgid "DB名列表" -msgstr "DB name list" +#: backend/db_services/mysql/cluster/views.py:76 +msgid "获取关联集群从库的交集" +msgstr "Get the intersection of associated cluster slave libraries" -#: backend/db_services/mysql/remote_service/serializers.py:37 -msgid "DB名" -msgstr "DB name" +#: backend/db_services/mysql/dumper/filters.py:22 +msgid "库名" +msgstr "Library name" -#: backend/db_services/mysql/remote_service/views.py:35 -msgid "查询集群数据库列表" -msgstr "Query the list of cluster databases" +#: backend/db_services/mysql/dumper/filters.py:23 +msgid "表名" +msgstr "table name" -#: backend/db_services/mysql/remote_service/views.py:48 -msgid "校验DB是否在集群内" -msgstr "Check whether the DB is in the cluster" +#: backend/db_services/mysql/dumper/filters.py:39 +msgid "dumper订阅规则" +msgstr "dumper subscription rules" -#: backend/db_services/mysql/resources/spider/query.py:37 -#: backend/db_services/mysql/resources/tendbha/query.py:40 -#: backend/db_services/mysql/resources/tendbsingle/query.py:39 -msgid "主域名" -msgstr "primary domain name" +#: backend/db_services/mysql/dumper/filters.py:41 +msgid "实例IP:Port" +msgstr "Instance IP:Port" -#: backend/db_services/mysql/resources/spider/query.py:38 -#: backend/db_services/mysql/resources/tendbha/query.py:41 -msgid "从域名" -msgstr "from domain name" +#: backend/db_services/mysql/dumper/filters.py:42 +msgid "dumper id" +msgstr "dumper id" -#: backend/db_services/mysql/resources/spider/query.py:43 -msgid "运维节点" -msgstr "Operation and maintenance node" +#: backend/db_services/mysql/dumper/filters.py:44 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:39 +msgid "接收端类型" +msgstr "Receiver type" -#: backend/db_services/mysql/resources/spider/query.py:44 -#: backend/db_services/mysql/resources/tendbha/query.py:45 -#: backend/db_services/mysql/resources/tendbsingle/query.py:41 -msgid "所属db模块" -msgstr "Belonging to the db module" +#: backend/db_services/mysql/dumper/filters.py:45 +msgid "同步方式" +msgstr "sync mode" -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:113 -msgid "实例地址列表" -msgstr "instance address list" +#: backend/db_services/mysql/dumper/filters.py:46 +msgid "接收端地址" +msgstr "Receiver address" -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:141 -msgid "测试业务" -msgstr "test business" +#: backend/db_services/mysql/dumper/models.py:27 +msgid "订阅配置名" +msgstr "Subscription configuration name" -#: backend/db_services/mysql/sql_import/constants.py:25 -msgid "DEFAULT" -msgstr "DEFAULT" +#: backend/db_services/mysql/dumper/models.py:28 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:49 +msgid "数据同步方式" +msgstr "Data synchronization method" -#: backend/db_services/mysql/sql_import/constants.py:26 -msgid "UTF8" -msgstr "UTF8" +#: backend/db_services/mysql/dumper/models.py:29 +msgid "订阅库表信息 eg: [{'db_name': 'xx', 'table_names': [....]}, ...]" +msgstr "Subscription database table information eg: [{'db_name': 'xx', 'table_names': [....]}, ...]" -#: backend/db_services/mysql/sql_import/constants.py:27 -msgid "UTF8MB4" -msgstr "UTF8MB4" +#: backend/db_services/mysql/dumper/models.py:30 +msgid "订阅配置关联的订阅实例列表" +msgstr "List of subscription instances associated with the subscription configuration" -#: backend/db_services/mysql/sql_import/constants.py:28 -msgid "LATIN1" -msgstr "LATIN 1" +#: backend/db_services/mysql/dumper/models.py:33 +#: backend/db_services/mysql/dumper/models.py:34 +msgid "dumper数据订阅配置" +msgstr "dumper data subscription configuration" -#: backend/db_services/mysql/sql_import/constants.py:29 -msgid "gbk" -msgstr "gbk" +#: backend/db_services/mysql/dumper/serializers.py:25 +msgid "DB名称" +msgstr "DB name" -#: backend/db_services/mysql/sql_import/constants.py:30 -msgid "gb2312" -msgstr "GB2312" +#: backend/db_services/mysql/dumper/serializers.py:26 +msgid "表名列表" +msgstr "table name list" -#: backend/db_services/mysql/sql_import/constants.py:38 -msgid "手动执行" -msgstr "Manual execution" +#: backend/db_services/mysql/dumper/serializers.py:28 +msgid "配置表信息" +msgstr "Configuration table information" -#: backend/db_services/mysql/sql_import/constants.py:39 -msgid "自动执行" -msgstr "automatic execution" +#: backend/db_services/mysql/dumper/serializers.py:29 +msgid "dumper实例数" +msgstr "Number of dumper instances" -#: backend/db_services/mysql/sql_import/constants.py:40 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:184 -msgid "定时执行" -msgstr "Timed execution" +#: backend/db_services/mysql/dumper/serializers.py:30 +msgid "dumper实例列表" +msgstr "dumper instance list" -#: backend/db_services/mysql/sql_import/constants.py:48 -msgid "文件上传" -msgstr "File Upload" +#: backend/db_services/mysql/dumper/serializers.py:31 +msgid "正在部署dumper的任务列表" +msgstr "Task list for deploying dumper" -#: backend/db_services/mysql/sql_import/constants.py:49 -msgid "手动输入" -msgstr "manual input" +#: backend/db_services/mysql/dumper/serializers.py:86 +msgid "订阅配置名称" +msgstr "Subscription configuration name" -#: backend/db_services/mysql/sql_import/mock_data.py:22 -msgid "存在高危命令:drop_table" -msgstr "There are high-risk commands: drop_table" +#: backend/db_services/mysql/dumper/serializers.py:90 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:52 +msgid "dumper配置ID" +msgstr "dumper placement ID" -#: backend/db_services/mysql/sql_import/serializers.py:31 -msgid "sql语句" -msgstr "sql statement" +#: backend/db_services/mysql/dumper/views/dumper_config.py:72 +msgid "查询数据订阅配置列表" +msgstr "Query data subscription configuration list" -#: backend/db_services/mysql/sql_import/serializers.py:33 -msgid "sql文件列表" -msgstr "sql file list" +#: backend/db_services/mysql/dumper/views/dumper_config.py:85 +msgid "数据订阅配置详情" +msgstr "Data subscription configuration details" -#: backend/db_services/mysql/sql_import/serializers.py:33 -msgid "sql文件" -msgstr "sql file" +#: backend/db_services/mysql/dumper/views/dumper_config.py:92 +msgid "数据订阅配置删除" +msgstr "Data subscription configuration deletion" -#: backend/db_services/mysql/sql_import/serializers.py:41 -msgid "不允许sql_content和sql_file同时为空,请至少填写一项" -msgstr "" -"Both sql_content and sql_file are not allowed to be empty at the same time, " -"please fill in at least one item" +#: backend/db_services/mysql/dumper/views/dumper_config.py:99 +msgid "数据订阅配置更新" +msgstr "Data subscription configuration update" -#: backend/db_services/mysql/sql_import/serializers.py:47 -msgid "语法错误" -msgstr "Grammatical errors" +#: backend/db_services/mysql/dumper/views/dumper_config.py:106 +msgid "数据订阅配置部分更新" +msgstr "Data subscription configuration part updated" -#: backend/db_services/mysql/sql_import/serializers.py:48 -msgid "高危警告" -msgstr "High risk warning" +#: backend/db_services/mysql/dumper/views/dumper_config.py:113 +msgid "校验订阅配置是否重名" +msgstr "Verify whether the subscription configuration has the same name" -#: backend/db_services/mysql/sql_import/serializers.py:49 -msgid "禁止命令" -msgstr "prohibition order" +#: backend/db_services/mysql/dumper/views/dumper_config.py:124 +msgid "查询dumper配置正在运行的任务" +msgstr "Query dumper configuration running tasks" -#: backend/db_services/mysql/sql_import/serializers.py:53 -msgid "语法检查结果" -msgstr "grammar check result" +#: backend/db_services/mysql/dumper/views/dumper_instance.py:41 +msgid "查询数据订阅实例列表" +msgstr "Query the list of data subscription instances" -#: backend/db_services/mysql/sql_import/serializers.py:61 -msgid "目标变更DB" -msgstr "target change DB" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:422 +msgid "查询集群{}的备份日志" +msgstr "Query the backup log of cluster {}" -#: backend/db_services/mysql/sql_import/serializers.py:62 -msgid "忽略DB" -msgstr "ignore DB" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:463 +msgid "作业【{}】执行失败,job_instance_id: {}" +msgstr "Job [{}] failed to execute, job_instance_id: {}" -#: backend/db_services/mysql/sql_import/serializers.py:65 -msgid "单据执行模式" -msgstr "Ticket Execution Mode" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:523 +msgid "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "" +"Unable to find log records less than near the time point {}, please check " +"the legitimacy of the time point or try again later" -#: backend/db_services/mysql/sql_import/serializers.py:66 -msgid "定时任务触发时间" -msgstr "Timing task trigger time" +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:24 +#: backend/db_services/sqlserver/rollback/serializers.py:27 +msgid "查询时间间隔" +msgstr "query time interval" -#: backend/db_services/mysql/sql_import/serializers.py:69 -#: backend/ticket/builders/mysql/mysql_add_slave.py:35 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:30 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:81 -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:31 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:44 +#: backend/db_services/sqlserver/rollback/serializers.py:50 +#: backend/db_services/sqlserver/rollback/serializers.py:78 +#: backend/ticket/builders/mongodb/mongo_restore.py:46 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:54 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:47 +msgid "回档时间" +msgstr "Rollback time" + +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:46 +#: backend/db_services/mysql/sql_import/serializers.py:79 +#: backend/ticket/builders/mysql/mysql_add_slave.py:33 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:36 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:37 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:45 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:30 #: backend/ticket/builders/mysql/mysql_restore_slave.py:30 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:38 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:42 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:34 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:36 msgid "备份源" msgstr "backup source" -#: backend/db_services/mysql/sql_import/serializers.py:70 -#: backend/ticket/builders/mysql/mysql_checksum.py:33 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:29 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:30 -msgid "匹配DB列表" -msgstr "match DB list" +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:62 +msgid "JOB实例ID" +msgstr "JOB instance ID" -#: backend/db_services/mysql/sql_import/serializers.py:71 -#: backend/ticket/builders/mysql/mysql_checksum.py:35 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:31 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:32 -msgid "匹配Table列表" -msgstr "Match Table list" +#: backend/db_services/mysql/fixpoint_rollback/views.py:50 +msgid "通过日志平台获取集群备份记录" +msgstr "Obtain cluster backup records through the log platform" -#: backend/db_services/mysql/sql_import/serializers.py:73 -#: backend/ticket/builders/mysql/mysql_checksum.py:34 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:30 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:31 -msgid "忽略DB列表" -msgstr "ignore DB list" +#: backend/db_services/mysql/fixpoint_rollback/views.py:67 +msgid "查询集群的本地备份记录" +msgstr "Query the local backup records of the cluster" -#: backend/db_services/mysql/sql_import/serializers.py:76 -#: backend/ticket/builders/mysql/mysql_checksum.py:36 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:32 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:33 -msgid "忽略Table列表" -msgstr "Ignore the Table list" +#: backend/db_services/mysql/fixpoint_rollback/views.py:79 +msgid "查询小于回档时间点最近的备份记录" +msgstr "" +"Query the latest backup record that is less than the rollback time point" -#: backend/db_services/mysql/sql_import/serializers.py:80 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:58 -#: backend/ticket/builders/mysql/mysql_single_apply.py:64 -#: backend/ticket/builders/spider/tendb_apply.py:45 -msgid "字符集" -msgstr "character set" +#: backend/db_services/mysql/fixpoint_rollback/views.py:98 +msgid "获取定点构造记录" +msgstr "Get fixed-point construction records" -#: backend/db_services/mysql/sql_import/serializers.py:82 -msgid "SQL文件路径" -msgstr "SQL file path" +#: backend/db_services/mysql/open_area/exceptions.py:19 +msgid "Tendb开区通用异常" +msgstr "Tendb zone general exception" -#: backend/db_services/mysql/sql_import/serializers.py:84 -msgid "sql执行文件" -msgstr "sql execution file" +#: backend/db_services/mysql/open_area/filters.py:19 +msgid "模板名称" +msgstr "Template name" -#: backend/db_services/mysql/sql_import/serializers.py:85 -msgid "sql执行的DB信息" -msgstr "DB information executed by sql" +#: backend/db_services/mysql/open_area/filters.py:23 +msgid "排序类型" +msgstr "sort type" -#: backend/db_services/mysql/sql_import/serializers.py:86 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:67 -msgid "高危信息提示" -msgstr "High-risk information reminder" +#: backend/db_services/mysql/open_area/handlers.py:43 +msgid "源集群不存在库{},请检查或修改开区模板" +msgstr "Library {} does not exist in the source cluster. Please check or modify the zone template." -#: backend/db_services/mysql/sql_import/serializers.py:87 -#: backend/flow/models.py:21 backend/ticket/models/ticket.py:88 -#: backend/ticket/serializers.py:65 -msgid "单据类型" -msgstr "Ticket Type" +#: backend/db_services/mysql/open_area/handlers.py:67 +msgid "源集群库{}中不存在表{},请检查或修改开区模板\n" +msgstr "Table {} does not exist in the source cluster library {}. Please check or modify the zone template\n" -#: backend/db_services/mysql/sql_import/serializers.py:89 -#: backend/db_services/mysql/sql_import/serializers.py:185 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:62 -msgid "sql导入模式" -msgstr "sql import mode" +#: backend/db_services/mysql/open_area/handlers.py:76 +msgid "源集群库{}中不存在表匹配[{}],请检查或修改开区模板" +msgstr "There is no table matching [{}] in the source cluster library {}. Please check or modify the zone template." -#: backend/db_services/mysql/sql_import/serializers.py:90 -msgid "备份信息" -msgstr "backup information" +#: backend/db_services/mysql/open_area/handlers.py:126 +msgid "范式{}渲染缺少变量" +msgstr "Paradigm{} rendering missing variables" -#: backend/db_services/mysql/sql_import/serializers.py:102 -msgid "时间{}格式解析失败: {},请按照{}格式输入时间" -msgstr "" -"Time {} format parsing failed: {}, please enter time according to {} format" +#: backend/db_services/mysql/open_area/models.py:24 +msgid "开区模板类型[支持tendbha/tendbcluster]" +msgstr "Open area template type [supports tendbha/tendbcluster]" -#: backend/db_services/mysql/sql_import/serializers.py:108 -#: backend/db_services/mysql/sql_import/serializers.py:116 -#: backend/db_services/mysql/sql_import/serializers.py:142 -#: backend/db_services/mysql/sql_import/serializers.py:161 -#: backend/db_services/mysql/sql_import/serializers.py:177 -msgid "流程id" -msgstr "process id" +#: backend/db_services/mysql/open_area/models.py:28 +msgid "开区模板名" +msgstr "Open area template name" -#: backend/db_services/mysql/sql_import/serializers.py:109 -msgid "语义测试的node_id" -msgstr "The node_id of the semantic test" +#: backend/db_services/mysql/open_area/models.py:30 +#: backend/db_services/mysql/open_area/serializers.py:33 +msgid "模板克隆规则列表" +msgstr "Template cloning rule list" -#: backend/db_services/mysql/sql_import/serializers.py:117 -#: backend/db_services/mysql/sql_import/serializers.py:125 -msgid "是否自动创建单据" -msgstr "Whether to automatically create tickets" +#: backend/db_services/mysql/open_area/models.py:31 +msgid "关联的规则列表(目前用于级联规则的修改删除)" +msgstr "Associated rule list (currently used to modify and delete cascade rules)" -#: backend/db_services/mysql/sql_import/serializers.py:118 -#: backend/db_services/mysql/sql_import/serializers.py:126 -msgid "是否自动跳过确认" -msgstr "Whether to automatically skip confirmation" +#: backend/db_services/mysql/open_area/models.py:43 +msgid "开区配置修改记录数据" +msgstr "Open zone configuration modification record data" -#: backend/db_services/mysql/sql_import/serializers.py:144 -msgid "执行状态" -msgstr "execution state" +#: backend/db_services/mysql/open_area/serializers.py:25 +msgid "获取库表结构的源db" +msgstr "Get the source db of the library table structure" -#: backend/db_services/mysql/sql_import/serializers.py:146 -msgid "语义检查执行信息列表" -msgstr "Semantic check execution information list" +#: backend/db_services/mysql/open_area/serializers.py:27 +msgid "获取表结构的源tb列表" +msgstr "Get the source tb list of the table structure" -#: backend/db_services/mysql/sql_import/serializers.py:154 -msgid "语义执行的root id列表" -msgstr "List of root ids for semantic execution" +#: backend/db_services/mysql/open_area/serializers.py:28 +msgid "获取表数据的源tb列表" +msgstr "Get the source tb list of table data" -#: backend/db_services/mysql/sql_import/serializers.py:168 -msgid "是否撤销成功" -msgstr "Is the cancellation successful?" +#: backend/db_services/mysql/open_area/serializers.py:29 +msgid "目标db范式" +msgstr "target db paradigm" -#: backend/db_services/mysql/sql_import/serializers.py:169 -msgid "撤销相关信息" -msgstr "Withdraw related information" +#: backend/db_services/mysql/open_area/serializers.py:34 +msgid "授权ID列表" +msgstr "Authorization ID list" -#: backend/db_services/mysql/sql_import/serializers.py:170 -msgid "撤销相关数据" -msgstr "Withdraw related data" +#: backend/db_services/mysql/open_area/serializers.py:44 +msgid "源集群不存在,请选择合法集群" +msgstr "The source cluster does not exist, please select a legal cluster." -#: backend/db_services/mysql/sql_import/serializers.py:184 -msgid "语义执行数据" -msgstr "semantic execution data" +#: backend/db_services/mysql/open_area/serializers.py:50 +msgid "请保证同一业务下的开区模板命名不重复" +msgstr "Please ensure that the names of zone templates under the same business are not repeated." -#: backend/db_services/mysql/sql_import/serializers.py:186 -msgid "sql数据是否成功录入到pipeline" -msgstr "Whether the sql data is successfully entered into the pipeline" +#: backend/db_services/mysql/open_area/serializers.py:55 +msgid "请保证校验模板克隆规则的克隆DB不要重复" +msgstr "Please ensure that the clone DB for verifying template cloning rules is not duplicated." -#: backend/db_services/mysql/sql_import/views.py:77 -msgid "sql语义检查" -msgstr "sql semantic check" +#: backend/db_services/mysql/open_area/serializers.py:67 +msgid "变量表" +msgstr "variable table" -#: backend/db_services/mysql/sql_import/views.py:87 -msgid "改变流程配置" -msgstr "Change process configuration" +#: backend/db_services/mysql/open_area/serializers.py:68 +msgid "授权IP" +msgstr "Authorized IP" -#: backend/db_services/mysql/sql_import/views.py:98 -msgid "查询流程配置" -msgstr "Query process configuration" +#: backend/db_services/mysql/open_area/serializers.py:70 +msgid "开区模板ID" +msgstr "Zone template ID" -#: backend/db_services/mysql/sql_import/views.py:110 -msgid "获取用户语义检查任务列表" -msgstr "Get user semantic check task list" +#: backend/db_services/mysql/open_area/serializers.py:71 +msgid "开区数据列表" +msgstr "Open area data list" + +#: backend/db_services/mysql/open_area/serializers.py:81 +msgid "旧变量(delete/update)" +msgstr "Old variables (delete/update)" + +#: backend/db_services/mysql/open_area/serializers.py:82 +msgid "新变量(add/update)" +msgstr "New variables (add/update)" + +#: backend/db_services/mysql/open_area/views.py:65 +#: backend/db_services/mysql/open_area/views.py:67 +msgid "创建开区模板" +msgstr "Create a zone template" + +#: backend/db_services/mysql/open_area/views.py:74 +msgid "开区模板列表" +msgstr "Zone template list" + +#: backend/db_services/mysql/open_area/views.py:102 +#: backend/db_services/mysql/open_area/views.py:104 +msgid "开区模板详情" +msgstr "Open area template details" -#: backend/db_services/mysql/sql_import/views.py:122 -msgid "删除用户语义检查任务列表" -msgstr "Delete User Semantic Check Task List" +#: backend/db_services/mysql/open_area/views.py:114 +#: backend/db_services/mysql/open_area/views.py:116 +msgid "更新开区模板" +msgstr "Update zone template" -#: backend/db_services/mysql/sql_import/views.py:133 -msgid "终止语义检查流程" -msgstr "Terminate the semantic checking process" +#: backend/db_services/mysql/open_area/views.py:123 +msgid "删除开区模板" +msgstr "Delete zone template" -#: backend/db_services/mysql/sql_import/views.py:145 -msgid "根据语义执行id查询语义执行的数据" -msgstr "" -"Query the data of semantic execution according to the semantic execution id" +#: backend/db_services/mysql/open_area/views.py:131 +msgid "获取开区结果预览" +msgstr "Get a preview of open area results" -#: backend/db_services/partition/exceptions.py:18 -msgid "分区管理创建异常" -msgstr "Partition management creation exception" +#: backend/db_services/mysql/open_area/views.py:144 +msgid "变量表修改" +msgstr "Variable table modification" -#: backend/db_services/partition/handlers.py:31 -msgid "分区管理创建失败,创建参数:{}, 错误信息: {}" -msgstr "Partition management creation failed, creation parameter: {}, error message: {}" +#: backend/db_services/mysql/permission/authorize/handlers.py:93 +msgid "「接口返回结果异常」{}" +msgstr "The interface returns an abnormal result {}" -#: backend/db_services/partition/handlers.py:45 -msgid "创建分区后自动执行的分区单据" -msgstr "Partition ticket executed automatically after partition creation" +#: backend/db_services/mysql/permission/authorize/handlers.py:96 +#: backend/db_services/mysql/permission/clone/handlers.py:124 +msgid "「接口调用异常」{}" +msgstr "Interface call exception {}" -#: backend/db_services/partition/serializers.py:23 -msgid "匹配库" -msgstr "matching database" +#: backend/db_services/mysql/permission/authorize/handlers.py:152 +msgid "域名解析失败,请输入合法域名" +msgstr "Domain name resolution failed, please enter a legal domain name" -#: backend/db_services/partition/serializers.py:24 -msgid "匹配表" -msgstr "match table" +#: backend/db_services/mysql/permission/authorize/handlers.py:159 +msgid "无法查询app: {}相关信息,请检查app输入是否合法。" +msgstr "Unable to query app: {} related information, please check whether the app input is legal." -#: backend/db_services/partition/serializers.py:33 -#: backend/db_services/partition/serializers.py:79 -#: backend/db_services/partition/serializers.py:91 -msgid "分区策略ID" -msgstr "Partition policy ID" +#: backend/db_services/mysql/permission/authorize/handlers.py:172 +msgid "授权集群: [{}]。业务信息bk_biz_id为空请检查。" +msgstr "Authorization cluster: [{}]. Business information bk_biz_id is empty, please check." -#: backend/db_services/partition/serializers.py:42 -msgid "PORT" -msgstr "PORT" +#: backend/db_services/mysql/permission/authorize/handlers.py:174 +msgid "授权域名: [{}]对应多个集群,请检查域名合法性。" +msgstr "Authorized domain name: [{}] corresponds to multiple clusters, please check the legitimacy of the domain name." -#: backend/db_services/partition/serializers.py:45 -msgid "匹配库列表(支持通配)" -msgstr "List of matching libraries (supports wildcards)" +#: backend/db_services/mysql/permission/authorize/handlers.py:179 +msgid "集群{}对应的业务与业务ID: {}不匹配" +msgstr "The business corresponding to cluster {} does not match the business ID: {}" -#: backend/db_services/partition/serializers.py:46 -msgid "匹配表列表(不支持通配)" -msgstr "List of matching tables (wildcards are not supported)" +#: backend/db_services/mysql/permission/authorize/handlers.py:201 +msgid "第三方请求授权" +msgstr "Third party request authorization" -#: backend/db_services/partition/serializers.py:47 -msgid "分区字段" -msgstr "partition field" +#: backend/db_services/mysql/permission/authorize/handlers.py:225 +msgid "gcs授权请保证app不为空" +msgstr "For gcs authorization, please ensure that the app is not empty" -#: backend/db_services/partition/serializers.py:48 -msgid "分区字段类型" -msgstr "Partition field type" +#: backend/db_services/mysql/permission/authorize/handlers.py:268 +msgid "授权状态: {}" +msgstr "Authorization status: {}" -#: backend/db_services/partition/serializers.py:49 -msgid "过期时间" -msgstr "Expiration" +#: backend/db_services/mysql/permission/authorize/serializers.py:17 +#: backend/db_services/redis/rollback/views.py:37 +#: backend/ticket/models/ticket_result_relation.py:24 +msgid "单据id" +msgstr "ticket id" -#: backend/db_services/partition/serializers.py:50 -msgid "分区间隔" -msgstr "partition interval" +#: backend/db_services/mysql/permission/authorize/serializers.py:18 +msgid "过滤搜索关键字" +msgstr "filter search keywords" -#: backend/db_services/partition/serializers.py:52 -msgid "更新者" -msgstr "updater" +#: backend/db_services/mysql/permission/authorize/serializers.py:25 +msgid "客户端主机" +msgstr "client host" -#: backend/db_services/partition/serializers.py:67 -msgid "分区表不支持通配" -msgstr "Partition table does not support wildcarding" +#: backend/db_services/mysql/permission/authorize/serializers.py:26 +msgid "客户端版本" +msgstr "client version" -#: backend/db_services/partition/serializers.py:97 -msgid "分区配置ID" -msgstr "Partition Configuration ID" +#: backend/db_services/mysql/permission/authorize/serializers.py:27 +msgid "DB主机(domain#port)" +msgstr "DB host (domain#port)" -#: backend/db_services/partition/serializers.py:100 -msgid "分区使用的端口" -msgstr "The port used by the partition" +#: backend/db_services/mysql/permission/authorize/serializers.py:28 +msgid "数据库名" +msgstr "Database name" -#: backend/db_services/partition/views.py:43 -msgid "获取分区策略列表" -msgstr "Get list of partition strategies" +#: backend/db_services/mysql/permission/authorize/serializers.py:31 +msgid "权限列表,多个权限以逗号分隔" +msgstr "Permission list, multiple permissions separated by commas" -#: backend/db_services/partition/views.py:52 -msgid "修改分区策略" -msgstr "Modify partition strategy" +#: backend/db_services/mysql/permission/authorize/views.py:50 +msgid "查询授权主机的信息" +msgstr "Query information about authorized hosts" -#: backend/db_services/partition/views.py:61 -msgid "增加分区策略" -msgstr "Add partition strategy" +#: backend/db_services/mysql/permission/authorize/views.py:61 +msgid "MySQL集成授权" +msgstr "MySQL integrated authorization" -#: backend/db_services/partition/views.py:70 -msgid "批量删除分区策略" -msgstr "Delete partition policies in batches" +#: backend/db_services/mysql/permission/clone/models.py:27 +#: backend/db_services/mysql/permission/clone/serializers.py:35 +#: backend/db_services/mysql/permission/clone/serializers.py:86 +#: backend/db_services/mysql/permission/clone/serializers.py:129 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:43 +msgid "权限克隆类型" +msgstr "permission clone type" -#: backend/db_services/partition/views.py:80 -msgid "禁用分区策略" -msgstr "disable partition policy" +#: backend/db_services/mysql/permission/clone/models.py:29 +#: backend/db_services/mysql/permission/clone/serializers.py:23 +msgid "旧实例/旧客户端IP" +msgstr "Old instance/old client IP" -#: backend/db_services/partition/views.py:90 -msgid "启用分区策略" -msgstr "enable partition strategy" +#: backend/db_services/mysql/permission/clone/models.py:30 +msgid "新实例/新客户端IP列表" +msgstr "New instance/new client IP list" -#: backend/db_services/partition/views.py:100 -msgid "查询分区策略日志" -msgstr "Query partition policy logs" +#: backend/db_services/mysql/permission/clone/models.py:32 +msgid "是否克隆成功" +msgstr "Whether the clone is successful" -#: backend/db_services/partition/views.py:110 -msgid "分区策略前置执行" -msgstr "Pre-execution of partition strategy" +#: backend/db_services/mysql/permission/clone/models.py:33 +#: backend/ticket/models/ticket.py:58 +msgid "错误信息" +msgstr "error message" -#: backend/db_services/redis/constants.py:18 -msgid "基于正则" -msgstr "Regex-based" +#: backend/db_services/mysql/permission/clone/models.py:38 +#: backend/db_services/mysql/permission/clone/models.py:39 +msgid "权限克隆记录" +msgstr "Permission to clone records" -#: backend/db_services/redis/constants.py:19 -msgid "基于文件" -msgstr "file based" +#: backend/db_services/mysql/permission/clone/serializers.py:24 +msgid "新实例/新客户端IP" +msgstr "New instance/new client IP" -#: backend/db_services/redis_dts/constants.py:19 -msgid "tendis ssd备份任务" -msgstr "tendis ssd backup task" +#: backend/db_services/mysql/permission/clone/serializers.py:26 +#: backend/db_services/redis/autofix/models.py:26 +msgid "模块名" +msgstr "module name" -#: backend/db_services/redis_dts/constants.py:20 -msgid "tendis ssd备份拉取任务" -msgstr "tendis ssd backup pull task" +#: backend/db_services/mysql/permission/clone/serializers.py:37 +msgid "克隆元素列表" +msgstr "clone element list" -#: backend/db_services/redis_dts/constants.py:21 -msgid "tendis ssd备份解析任务" -msgstr "Tendis ssd backup analysis task" +#: backend/db_services/mysql/permission/clone/serializers.py:37 +msgid "克隆元素信息" +msgstr "clone element information" -#: backend/db_services/redis_dts/constants.py:22 -msgid "tendis ssd数据导入任务" -msgstr "Tendis ssd data import task" +#: backend/db_services/mysql/permission/clone/serializers.py:51 +msgid "源克隆对象{}与目的克隆对象{}相同" +msgstr "" +"The source clone object {} is the same as the destination clone object {}" -#: backend/db_services/redis_dts/constants.py:23 -msgid "tendis ssd拉起sync任务" -msgstr "Tendis ssd pulls up the sync task" +#: backend/db_services/mysql/permission/clone/serializers.py:68 +msgid "实例{}不属于本业务{},请保证所有实例均在本业务下" +msgstr "" +"Instance {} does not belong to this business {}, please ensure that all " +"instances are under this business" -#: backend/db_services/redis_dts/constants.py:24 -#: backend/db_services/redis_dts/constants.py:28 -msgid "tendis ssd监视sync任务" -msgstr "Tendis ssd monitor sync task" +#: backend/db_services/mysql/permission/clone/serializers.py:75 +#: backend/db_services/mysql/permission/clone/serializers.py:120 +msgid "权限克隆前置检查结果" +msgstr "Permission cloning pre-check results" -#: backend/db_services/redis_dts/constants.py:27 -msgid "redis cache拉起redis-shake任务" -msgstr "Redis cache pulls up the redis-shake task" +#: backend/db_services/mysql/permission/clone/serializers.py:76 +#: backend/db_services/mysql/permission/clone/serializers.py:121 +msgid "权限克隆前置检查信息" +msgstr "Permission cloning pre-check information" -#: backend/db_services/redis_dts/constants.py:31 -msgid "tendisplus拉起reids-sync任务" -msgstr "Tendisplus pulls up the reids-sync task" +#: backend/db_services/mysql/permission/clone/serializers.py:77 +#: backend/db_services/mysql/permission/clone/serializers.py:122 +msgid "权限克隆数据uid" +msgstr "Permission to clone data uid" -#: backend/db_services/redis_dts/constants.py:33 -msgid "tendisplus全量数据同步" -msgstr "Tendisplus full data synchronization" +#: backend/db_services/mysql/permission/clone/serializers.py:78 +msgid "权限克隆数据列表" +msgstr "Permission to clone data list" -#: backend/db_services/redis_dts/constants.py:34 -msgid "tendisplus增量数据同步" -msgstr "Tendisplus incremental data synchronization" +#: backend/db_services/mysql/permission/clone/serializers.py:85 +msgid "克隆实例/客户端excel文件" +msgstr "Clone instance/client excel file" -#: backend/db_services/redis_dts/constants.py:40 -msgid "停止数据同步todo" -msgstr "stop data sync todo" +#: backend/db_services/mysql/permission/clone/serializers.py:96 +msgid "excel内容解析失败, 错误信息:{}。" +msgstr "Excel content parsing failed, error message: {}." -#: backend/db_services/redis_dts/constants.py:41 -msgid "停止数据同步失败" -msgstr "Failed to stop data sync" +#: backend/db_services/mysql/permission/clone/serializers.py:100 +msgid "excel表头校验不正确!" +msgstr "The excel table header check is incorrect!" -#: backend/db_services/redis_dts/constants.py:42 -msgid "停止数据同步成功" -msgstr "Stop data synchronization successfully" +#: backend/db_services/mysql/permission/clone/serializers.py:104 +msgid "excel内容为空!" +msgstr "The excel content is empty!" -#: backend/db_services/redis_dts/constants.py:44 -msgid "强制暂停任务todo" -msgstr "Forcibly suspend task todo" +#: backend/db_services/mysql/permission/clone/serializers.py:130 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:42 +msgid "权限克隆数据缓存uid" +msgstr "Permission to clone data cache uid" -#: backend/db_services/redis_dts/constants.py:45 -msgid "强制暂停任务失败" -msgstr "Failed to force suspend task" +#: backend/db_services/mysql/permission/clone/views.py:66 +msgid "权限克隆前置检查" +msgstr "Permission cloning pre-check" -#: backend/db_services/redis_dts/constants.py:46 -msgid "强制暂停任务成功" -msgstr "Succeeded in forcing the task to suspend" +#: backend/db_services/mysql/permission/clone/views.py:76 +msgid "权限克隆excel前置检查" +msgstr "Permission to clone excel pre-check" -#: backend/db_services/redis_dts/constants.py:52 -msgid "集群节点数变更" -msgstr "Change in the number of cluster nodes" +#: backend/db_services/mysql/permission/clone/views.py:86 +msgid "获得权限克隆信息excel文件" +msgstr "Obtain permission to clone information excel file" -#: backend/db_services/redis_dts/constants.py:53 -msgid "集群类型变更" -msgstr "Cluster type change" +#: backend/db_services/mysql/permission/constants.py:27 +msgid "实例克隆" +msgstr "Instance cloning" -#: backend/db_services/redis_dts/constants.py:54 -msgid "数据复制" -msgstr "data replication" +#: backend/db_services/mysql/permission/constants.py:28 +msgid "客户端克隆" +msgstr "client clone" -#: backend/db_services/redis_dts/constants.py:60 -msgid "同一业务不同集群" -msgstr "Different clusters of the same business" +#: backend/db_services/mysql/permission/constants.py:35 +msgid "克隆数据缓存UID" +msgstr "Clone data cache UID" -#: backend/db_services/redis_dts/constants.py:61 -msgid "不同业务不同集群" -msgstr "Different business clusters" +#: backend/db_services/mysql/permission/db_account/handlers.py:47 +msgid "创建授权规则前置检查失败,错误信息: {}" +msgstr "Pre-check when creating authorization rules failed, error message: {}" -#: backend/db_services/redis_dts/constants.py:62 -msgid "复制到其他系统" -msgstr "copy to other system" +#: backend/db_services/mysql/permission/db_account/handlers.py:66 +msgid "" +"授权规则{}-{}不存在,bk_biz_id[{}] cluster_type[{}], 请检查检查后重新提单" +msgstr "Authorization rule {}-{} does not exist, bk_biz_id[{}] cluster_type[{}], please check and try again." -#: backend/db_services/redis_dts/constants.py:63 -msgid "从回档临时环境复制数据" -msgstr "Copy data from the archive staging environment" +#: backend/db_services/mysql/permission/db_account/views.py:24 +msgid "添加账号规则前置检查" +msgstr "Add account rule pre-check" -#: backend/db_services/redis_dts/constants.py:64 -msgid "用户自建redis迁移到DBM" -msgstr "Migrating user-built redis to DBM" +#: backend/db_services/mysql/permission/exceptions.py:41 +msgid "权限模块异常" +msgstr "Permission module exception" -#: backend/db_services/redis_dts/constants.py:70 -msgid "自动切换" -msgstr "auto switch" +#: backend/db_services/mysql/permission/exceptions.py:45 +msgid "授权EXCEL表校验异常" +msgstr "Authorized EXCEL table verification exception" -#: backend/db_services/redis_dts/constants.py:71 -msgid "用户确认切换" -msgstr "User confirmation switch" +#: backend/db_services/mysql/permission/exceptions.py:49 +msgid "权限克隆EXCEL表校验异常" +msgstr "The verification exception of the permission cloning EXCEL table" -#: backend/db_services/redis_dts/constants.py:77 -#: backend/ticket/builders/common/constants.py:79 -msgid "自动修复" -msgstr "automatic repair" +#: backend/db_services/mysql/permission/exceptions.py:53 +msgid "授权数据已过期" +msgstr "Authorization data has expired" -#: backend/db_services/redis_dts/constants.py:78 -msgid "用户确认修复" -msgstr "User confirms the fix" +#: backend/db_services/mysql/permission/exceptions.py:57 +msgid "权限克隆数据已过期" +msgstr "Permission to clone data has expired" -#: backend/db_services/redis_dts/exceptions.py:18 -msgid "DBDts模块异常" -msgstr "DBDts module exception" +#: backend/db_services/mysql/push_peripheral_config/constants.py:14 +#: backend/db_services/mysql/push_peripheral_config/views.py:40 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:39 +msgid "下发周边配置" +msgstr "Deliver peripheral configuration" + +#: backend/db_services/mysql/remote_service/exceptions.py:19 +msgid "DRS接口请求通用异常" +msgstr "DRS interface request general exception" + +#: backend/db_services/mysql/remote_service/handlers.py:51 +#: backend/db_services/mysql/remote_service/handlers.py:98 +#: backend/db_services/mysql/remote_service/handlers.py:138 +#: backend/db_services/sqlserver/handlers.py:59 +#: backend/flow/utils/mysql/mysql_version_parse.py:164 +msgid "DRS调用失败,错误信息: {}" +msgstr "DRS call failed, error message: {}" + +#: backend/db_services/mysql/remote_service/handlers.py:242 +msgid "不存在可用于闪回的库" +msgstr "No library exists for flashback" + +#: backend/db_services/mysql/remote_service/handlers.py:247 +msgid "不存在可用于闪回的表" +msgstr "No table exists for flashback" + +#: backend/db_services/mysql/remote_service/serializers.py:29 +msgid "查询的备份角色" +msgstr "Query backup role" + +#: backend/db_services/mysql/remote_service/serializers.py:34 +msgid "集群信息列表" +msgstr "Cluster information list" + +#: backend/db_services/mysql/remote_service/serializers.py:44 +msgid "查询的DB列表" +msgstr "Query DB list" + +#: backend/db_services/mysql/remote_service/serializers.py:46 +msgid "集群数据库信息" +msgstr "Cluster database information" + +#: backend/db_services/mysql/remote_service/serializers.py:62 +msgid "DB名列表" +msgstr "DB name list" -#: backend/db_services/redis_dts/exceptions.py:23 -msgid "获取DTS任务列表异常" -msgstr "Obtaining the DTS task list is abnormal" +#: backend/db_services/mysql/remote_service/serializers.py:62 +msgid "DB名" +msgstr "DB name" -#: backend/db_services/redis_dts/exceptions.py:29 -msgid "DTS task操作异常" -msgstr "DTS task operation is abnormal" +#: backend/db_services/mysql/remote_service/serializers.py:64 +msgid "集群校验信息" +msgstr "Cluster verification information" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:17 -msgid "锁的唯一标识" -msgstr "Unique ID of the lock" +#: backend/db_services/mysql/remote_service/serializers.py:78 +#: backend/db_services/mysql/remote_service/serializers.py:94 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:43 +#: backend/ticket/builders/mysql/mysql_flashback.py:36 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:52 +msgid "目标库列表" +msgstr "target db list" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:18 -msgid "锁的持有者" -msgstr "lock holder" +#: backend/db_services/mysql/remote_service/serializers.py:79 +#: backend/db_services/mysql/remote_service/serializers.py:95 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:44 +#: backend/ticket/builders/mysql/mysql_flashback.py:37 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:54 +msgid "忽略库列表" +msgstr "ignore db list" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:20 -msgid "锁的过期时间" -msgstr "lock expiration time" +#: backend/db_services/mysql/remote_service/serializers.py:80 +#: backend/ticket/builders/mysql/mysql_dump_data.py:33 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:45 +#: backend/ticket/builders/mysql/mysql_flashback.py:38 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:56 +msgid "目标table列表" +msgstr "target table list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:17 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:19 -msgid "单据号" -msgstr "ticket No" +#: backend/db_services/mysql/remote_service/serializers.py:81 +#: backend/ticket/builders/mysql/mysql_dump_data.py:34 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:46 +#: backend/ticket/builders/mysql/mysql_flashback.py:39 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:57 +msgid "忽略table列表" +msgstr "ignore table list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:18 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:21 -msgid "业务bk_biz_id" -msgstr "Business bk_biz_id" +#: backend/db_services/mysql/remote_service/serializers.py:83 +#: backend/ticket/builders/mysql/mysql_flashback.py:45 +msgid "flashback信息" +msgstr "flashback information" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:19 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:22 -msgid "云区域id" -msgstr "cloud region id" +#: backend/db_services/mysql/remote_service/serializers.py:97 +msgid "正则库信息" +msgstr "Regular library information" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:20 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:20 -msgid "申请人" -msgstr "applicant" - -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:25 -msgid "DTS单据类型" -msgstr "DTS ticket type" +#: backend/db_services/mysql/remote_service/views.py:51 +msgid "查询集群数据库列表" +msgstr "Query the list of cluster databases" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:32 -msgid "DTS数据复制类型" -msgstr "DTS data replication type" +#: backend/db_services/mysql/remote_service/views.py:67 +msgid "查询集群数据表列表" +msgstr "Query cluster data table list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:36 -msgid "在线切换类型" -msgstr "Online switch type" +#: backend/db_services/mysql/remote_service/views.py:80 +msgid "校验DB是否在集群内" +msgstr "Check whether the DB is in the cluster" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:37 -msgid "是否数据校验" -msgstr "Whether data verification" +#: backend/db_services/mysql/remote_service/views.py:93 +msgid "校验flashback信息是否合法" +msgstr "Verify whether flashback information is legal" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:38 -msgid "是否数据修复" -msgstr "Data repair Execution" +#: backend/db_services/mysql/remote_service/views.py:104 +msgid "根据库表正则查询集群库信息" +msgstr "Query cluster library information based on library table regularity" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:42 -msgid "数据修复模式" -msgstr "Data Repair Mode" +#: backend/db_services/mysql/resources/tendbcluster/query.py:47 +msgid "运维节点" +msgstr "Operation and maintenance node" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:45 -msgid "源集群类型" -msgstr "source cluster type" +#: backend/db_services/mysql/resources/tendbcluster/query.py:48 +#: backend/db_services/mysql/resources/tendbha/query.py:40 +#: backend/db_services/mysql/resources/tendbsingle/query.py:35 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:36 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:33 +msgid "所属db模块" +msgstr "Belonging to the db module" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:46 -msgid "回滚单据号" -msgstr "Rollback ticket number" +#: backend/db_services/mysql/sql_import/constants.py:31 +msgid "DEFAULT" +msgstr "DEFAULT" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:47 -msgid "回滚临时环境实例" -msgstr "Rollback a temporary environment instance" +#: backend/db_services/mysql/sql_import/constants.py:32 +msgid "UTF8" +msgstr "UTF8" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:48 -msgid "目标业务id" -msgstr "target business id" +#: backend/db_services/mysql/sql_import/constants.py:33 +msgid "UTF8MB4" +msgstr "UTF8MB4" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:49 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:49 -msgid "目的集群" -msgstr "destination cluster" +#: backend/db_services/mysql/sql_import/constants.py:34 +msgid "LATIN1" +msgstr "LATIN 1" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:51 -msgid "目标集群类型" -msgstr "target cluster type" +#: backend/db_services/mysql/sql_import/constants.py:35 +msgid "gbk" +msgstr "gbk" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:52 -msgid "key正则(包含key)" -msgstr "key regular (including key)" +#: backend/db_services/mysql/sql_import/constants.py:36 +msgid "gb2312" +msgstr "GB2312" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:53 -msgid "key正则(排除key)" -msgstr "key regularization (exclude key)" +#: backend/db_services/mysql/sql_import/constants.py:44 +msgid "手动执行" +msgstr "Manual execution" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:56 -msgid "bill备注" -msgstr "Bill Remarks" +#: backend/db_services/mysql/sql_import/constants.py:45 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:56 +msgid "自动执行" +msgstr "automatic execution" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:23 -msgid "执行迁移任务的dts_server" -msgstr "dts_server that executes migration tasks" +#: backend/db_services/mysql/sql_import/constants.py:46 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:57 +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:96 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:200 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:134 +msgid "定时执行" +msgstr "Timed execution" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:25 -msgid "源集群优先级,值越大,优先级越高" -msgstr "Source cluster priority, the larger the value, the higher the priority" +#: backend/db_services/mysql/sql_import/constants.py:54 +#: backend/ticket/builders/common/constants.py:150 +msgid "文件上传" +msgstr "File Upload" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:26 -msgid "源slave_ip" -msgstr "source slave ip" +#: backend/db_services/mysql/sql_import/constants.py:55 +#: backend/ticket/builders/common/constants.py:151 +msgid "手动输入" +msgstr "manual input" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:27 -msgid "源slave_port" -msgstr "source slave_port" +#: backend/db_services/mysql/sql_import/constants.py:63 +msgid "执行失败" +msgstr "Execution failed" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:28 -msgid "源实例密码base64值" -msgstr "Source instance password base64 value" +#: backend/db_services/mysql/sql_import/constants.py:64 +#: backend/ticket/flow_manager/delivery.py:91 +msgid "执行成功" +msgstr "Executed successfully" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:30 -msgid "源slave db类型" -msgstr "Source slave db type" +#: backend/db_services/mysql/sql_import/constants.py:65 +msgid "导入表结构失败" +msgstr "Import table structure failed" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:32 -msgid "源实例数据量大小,单位Byte" -msgstr "Source instance data size, unit Byte" +#: backend/db_services/mysql/sql_import/exceptions.py:19 +msgid "SQL导入接口请求通用异常" +msgstr "SQL import interface request general exception" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:34 -msgid "源实例所属segment_start" -msgstr "The segment_start to which the source instance belongs" +#: backend/db_services/mysql/sql_import/handlers.py:95 +msgid "当前SQL文件过大,暂不提供内容预览..." +msgstr "The current SQL file is too large and content preview is not available yet..." -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:35 -msgid "源实例所属segment_end" -msgstr "The segment_end to which the source instance belongs" +#: backend/db_services/mysql/sql_import/handlers.py:197 +msgid "模拟流程构建失败,错误信息: {}" +msgstr "Simulation process build failed, error message: {}" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:37 -msgid "源实例权重" -msgstr "Source Instance Weight" +#: backend/db_services/mysql/sql_import/mock_data.py:22 +msgid "存在高危命令:drop_table" +msgstr "There are high-risk commands: drop_table" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:39 -msgid "源slave_ip上task并发数控制" -msgstr "Task concurrency control on the source slave_ip" +#: backend/db_services/mysql/sql_import/serializers.py:30 +msgid "sql文件名列表" +msgstr "sql file name list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:40 -msgid "源实例所在城市" -msgstr "The time zone where the instance is located" +#: backend/db_services/mysql/sql_import/serializers.py:32 +#: backend/db_services/sqlserver/sql_import/serializers.py:21 +msgid "sql文件列表" +msgstr "sql file list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:42 -msgid "源实例slave-keep-log-count的旧值" -msgstr "Old value of source instance slave-keep-log-count" +#: backend/db_services/mysql/sql_import/serializers.py:32 +#: backend/db_services/sqlserver/sql_import/serializers.py:21 +msgid "sql文件" +msgstr "sql file" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:43 -msgid "源实例slave-keep-log-count的新值" -msgstr "The new value of the source instance slave-keep-log-count" +#: backend/db_services/mysql/sql_import/serializers.py:37 +msgid "版本列表" +msgstr "Version list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:44 -msgid "源实例slave-keep-log-count是否恢复" -msgstr "Whether the source instance slave-keep-log-count is restored" +#: backend/db_services/mysql/sql_import/serializers.py:44 +#: backend/db_services/sqlserver/sql_import/serializers.py:29 +msgid "不允许语法检查的sql的内容为空!" +msgstr "The content of the syntax checked sql is not allowed to be empty!" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:45 -msgid "srcRedis是否包含list类型key" -msgstr "Whether srcRedis contains list type key" +#: backend/db_services/mysql/sql_import/serializers.py:48 +msgid "请保证单个文件{}不超过1G" +msgstr "Please ensure that a single file {} does not exceed 1G" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:46 -msgid "包含key(正则)" -msgstr "Contains key (regular)" +#: backend/db_services/mysql/sql_import/serializers.py:50 +#: backend/db_services/sqlserver/sql_import/serializers.py:33 +msgid "请保证sql文件[{}]的后缀为.sql" +msgstr "Please ensure that the suffix of the sql file [{}] is .sql" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:47 -msgid "排除key(正则)" -msgstr "Exclude key (regular)" +#: backend/db_services/mysql/sql_import/serializers.py:57 +msgid "语法错误" +msgstr "Grammatical errors" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:50 -msgid "目的密码base64值" -msgstr "Destination password base64 value" +#: backend/db_services/mysql/sql_import/serializers.py:58 +msgid "高危警告" +msgstr "High risk warning" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:53 -msgid "tendisssd slave上bakup文件位置" -msgstr "bakup file location on tendisssd slave" +#: backend/db_services/mysql/sql_import/serializers.py:59 +msgid "禁止命令" +msgstr "prohibition order" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:54 -msgid "backup文件拉取到dts_server本地位置" -msgstr "The backup file is pulled to the local location of dts_server" +#: backend/db_services/mysql/sql_import/serializers.py:61 +msgid "语法检查结果" +msgstr "grammar check result" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:55 -msgid "tendisdumper得到的sql文件夹" -msgstr "The sql folder obtained by tendisdumper" +#: backend/db_services/mysql/sql_import/serializers.py:69 +#: backend/db_services/mysql/sql_import/serializers.py:119 +msgid "目标变更DB" +msgstr "target change DB" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:56 -msgid "redis-sync端口" -msgstr "redis-sync port" +#: backend/db_services/mysql/sql_import/serializers.py:70 +#: backend/db_services/mysql/sql_import/serializers.py:120 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:32 +msgid "忽略DB" +msgstr "ignore DB" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:57 -msgid "sync的进程id" -msgstr "sync process id" +#: backend/db_services/mysql/sql_import/serializers.py:71 +#: backend/db_services/mysql/sql_import/serializers.py:124 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:33 +msgid "sql执行文件" +msgstr "sql execution file" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:59 -msgid "task重试次数" -msgstr "task retries" +#: backend/db_services/mysql/sql_import/serializers.py:72 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:34 +msgid "sql导入模式" +msgstr "sql import mode" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:61 -msgid "sync操作" -msgstr "sync operation" +#: backend/db_services/mysql/sql_import/serializers.py:75 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:37 +msgid "单据执行模式" +msgstr "Ticket Execution Mode" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:63 -msgid "杀死syncer" -msgstr "kill syncer" +#: backend/db_services/mysql/sql_import/serializers.py:76 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:38 +msgid "定时任务触发时间" +msgstr "Timing task trigger time" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:66 -msgid "信息" -msgstr "information" +#: backend/db_services/mysql/sql_import/serializers.py:80 +#: backend/ticket/builders/mongodb/base.py:35 +#: backend/ticket/builders/mysql/mysql_checksum.py:40 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:28 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:30 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:27 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:51 +msgid "匹配DB列表" +msgstr "match DB list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:68 -msgid "被忽略的错误" -msgstr "ignored errors" +#: backend/db_services/mysql/sql_import/serializers.py:81 +#: backend/ticket/builders/mongodb/base.py:37 +#: backend/ticket/builders/mysql/mysql_checksum.py:42 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:30 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:32 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:29 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:53 +msgid "匹配Table列表" +msgstr "Match Table list" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:69 -msgid "sync从该时间点重新同步" -msgstr "sync resynchronizes from this point in time" +#: backend/db_services/mysql/sql_import/serializers.py:83 +#: backend/ticket/builders/mongodb/base.py:36 +#: backend/ticket/builders/mysql/mysql_checksum.py:41 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:29 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:31 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:28 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:52 +msgid "忽略DB列表" +msgstr "ignore DB list" -#: backend/db_services/taskflow/exceptions.py:18 -msgid "任务流程模块异常" -msgstr "Task process module exception" +#: backend/db_services/mysql/sql_import/serializers.py:86 +#: backend/ticket/builders/mongodb/base.py:38 +#: backend/ticket/builders/mysql/mysql_checksum.py:43 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:31 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:33 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:30 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:54 +msgid "忽略Table列表" +msgstr "Ignore the Table list" -#: backend/db_services/taskflow/exceptions.py:23 -msgid "重试节点异常" -msgstr "retry node exception" +#: backend/db_services/mysql/sql_import/serializers.py:90 +#: backend/ticket/builders/mysql/mysql_dump_data.py:30 +#: backend/ticket/builders/mysql/mysql_single_apply.py:64 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:44 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:63 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:50 +msgid "字符集" +msgstr "character set" -#: backend/db_services/taskflow/exceptions.py:28 -msgid "回调节点异常" -msgstr "callback node exception" +#: backend/db_services/mysql/sql_import/serializers.py:93 +#: backend/db_services/mysql/sql_import/serializers.py:128 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:47 +msgid "sql执行体信息" +msgstr "sql execution body information" -#: backend/db_services/taskflow/exceptions.py:33 -msgid "跳过节点异常" -msgstr "skip node exception" +#: backend/db_services/mysql/sql_import/serializers.py:96 +#: backend/ticket/builders/mongodb/mongo_backup.py:41 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:50 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:58 +msgid "备份信息" +msgstr "backup information" -#: backend/db_services/taskflow/exceptions.py:38 -msgid "强制失败节点异常" -msgstr "Force failure node exception" +#: backend/db_services/mysql/sql_import/serializers.py:98 +msgid "集群类型,默认为mysql" +msgstr "Cluster type, default is mysql" -#: backend/db_services/taskflow/exceptions.py:43 -msgid "撤销流程异常" -msgstr "Abnormal cancellation process" +#: backend/db_services/mysql/sql_import/serializers.py:100 +msgid "模拟执行成功后是否自动提单" +msgstr "Whether to automatically pick up the bill after successful simulation execution" -#: backend/db_services/taskflow/handlers.py:78 -msgid "人工强制失败" -msgstr "Manual forced failure" +#: backend/db_services/mysql/sql_import/serializers.py:110 +#: backend/db_services/mysql/sql_import/serializers.py:132 +#: backend/db_services/mysql/sql_import/serializers.py:141 +#: backend/db_services/mysql/sql_import/serializers.py:163 +#: backend/db_services/mysql/sql_import/serializers.py:185 +#: backend/db_services/mysql/sql_import/serializers.py:201 +#: backend/db_services/mysql/sql_import/serializers.py:214 +#: backend/db_services/mysql/sql_import/serializers.py:224 +msgid "流程id" +msgstr "process id" -#: backend/db_services/taskflow/handlers.py:125 -msgid "节点尚未运行,请稍后查看" -msgstr "The node is not running yet, please check later" +#: backend/db_services/mysql/sql_import/serializers.py:111 +msgid "语义测试的node_id" +msgstr "The node_id of the semantic test" -#: backend/db_services/taskflow/handlers.py:127 -msgid "节点日志仅保留7天" -msgstr "Node logs are only kept for 7 days" +#: backend/db_services/mysql/sql_import/serializers.py:122 +msgid "sql执行内容" +msgstr "sql execution content" -#: backend/db_services/taskflow/handlers.py:152 -msgid "日志上报中,请稍后查看" -msgstr "The log is being reported, please check it later" +#: backend/db_services/mysql/sql_import/serializers.py:133 +#: backend/db_services/mysql/sql_import/serializers.py:145 +#: backend/db_services/partition/serializers.py:57 +msgid "是否自动创建单据" +msgstr "Whether to automatically create tickets" -#: backend/db_services/taskflow/serializers.py:21 -#: backend/ticket/serializers.py:73 -msgid "单据类型名称" -msgstr "ticket type name" +#: backend/db_services/mysql/sql_import/serializers.py:134 +#: backend/db_services/mysql/sql_import/serializers.py:146 +msgid "是否自动跳过确认" +msgstr "Whether to automatically skip confirmation" -#: backend/db_services/taskflow/serializers.py:22 -#: backend/ticket/serializers.py:75 backend/ticket/serializers.py:113 -#: backend/ticket/serializers.py:166 -msgid "耗时" -msgstr "time consuming" +#: backend/db_services/mysql/sql_import/serializers.py:154 +msgid "集群类型mysql/tendbcluster,为空查询所有任务" +msgstr "Cluster type mysql/tendbcluster, query all tasks if empty" -#: backend/db_services/taskflow/serializers.py:48 backend/flow/models.py:39 -msgid "节点ID" -msgstr "Node ID" +#: backend/db_services/mysql/sql_import/serializers.py:165 +msgid "执行状态" +msgstr "execution state" -#: backend/db_services/taskflow/serializers.py:52 -msgid "回调描述" -msgstr "callback description" +#: backend/db_services/mysql/sql_import/serializers.py:167 +msgid "语义检查执行信息列表" +msgstr "Semantic check execution information list" -#: backend/db_services/taskflow/serializers.py:56 -msgid "版本ID" -msgstr "version ID" +#: backend/db_services/mysql/sql_import/serializers.py:175 +msgid "语义执行的root id列表" +msgstr "List of root ids for semantic execution" -#: backend/db_services/taskflow/serializers.py:57 -msgid "是否下载日志" -msgstr "Whether to download logs" +#: backend/db_services/mysql/sql_import/serializers.py:192 +msgid "是否撤销成功" +msgstr "Is the cancellation successful?" -#: backend/db_services/taskflow/serializers.py:67 -msgid "目标目录列表" -msgstr "target directory listing" +#: backend/db_services/mysql/sql_import/serializers.py:193 +msgid "撤销相关信息" +msgstr "Withdraw related information" -#: backend/db_services/taskflow/task.py:54 -msgid "存在执行互斥,正在进行重试,当前重试次数为{}" -msgstr "" -"There is an execution mutex, and retrying is in progress, and the current " -"number of retries is {}" +#: backend/db_services/mysql/sql_import/serializers.py:194 +msgid "撤销相关数据" +msgstr "Withdraw related data" -#: backend/db_services/taskflow/task.py:58 -msgid "自动重试次数已超过最大重试次数{}, 请重新手动重试" -msgstr "" -"The number of automatic retries has exceeded the maximum number of retries " -"{}, please try again manually" +#: backend/db_services/mysql/sql_import/serializers.py:215 +msgid "节点id" +msgstr "Node id" -#: backend/db_services/taskflow/task.py:72 -msgid "执行互斥错误信息: {}" -msgstr "Execution mutex error message: {}" +#: backend/db_services/mysql/sql_import/views.py:87 +msgid "sql语义检查" +msgstr "sql semantic check" -#: backend/db_services/taskflow/task.py:79 -msgid "存在执行互斥将自动进行重试..." -msgstr "Execution mutexes will automatically be retried..." +#: backend/db_services/mysql/sql_import/views.py:97 +msgid "获取用户语义检查任务列表" +msgstr "Get user semantic check task list" -#: backend/db_services/taskflow/task.py:89 -msgid "重试成功" -msgstr "successful retry" +#: backend/db_services/mysql/sql_import/views.py:107 +msgid "删除用户语义检查任务列表" +msgstr "Delete User Semantic Check Task List" -#: backend/db_services/taskflow/views/flow.py:61 -msgid "任务列表" -msgstr "task list" +#: backend/db_services/mysql/sql_import/views.py:116 +msgid "终止语义检查流程" +msgstr "Terminate the semantic checking process" -#: backend/db_services/taskflow/views/flow.py:68 -msgid "任务详情" -msgstr "Task details" +#: backend/db_services/mysql/sql_import/views.py:126 +msgid "根据语义执行id查询语义执行的数据" +msgstr "" +"Query the data of semantic execution according to the semantic execution id" -#: backend/db_services/taskflow/views/flow.py:78 -msgid "撤销流程" -msgstr "Rollback process" +#: backend/db_services/mysql/sql_import/views.py:136 +msgid "获取语义执行的结果日志" +msgstr "Get the result log of semantic execution" -#: backend/db_services/taskflow/views/flow.py:87 -msgid "重试节点" -msgstr "retry node" +#: backend/db_services/mysql/sql_import/views.py:146 +msgid "获取语义执行结果" +msgstr "Get semantic execution results" -#: backend/db_services/taskflow/views/flow.py:94 -msgid "非超级用户,暂不允许调用此接口" -msgstr "Non-super users are not allowed to call this interface" +#: backend/db_services/mysql/sqlparse/exceptions.py:19 +msgid "SQL解析通用异常" +msgstr "SQL parsing common exception" -#: backend/db_services/taskflow/views/flow.py:101 -msgid "跳过节点" -msgstr "skip node" +#: backend/db_services/mysql/sqlparse/handlers.py:135 +msgid "LIMIT限制为空或者超过1000" +msgstr "LIMIT limit is empty or exceeds 1000" -#: backend/db_services/taskflow/views/flow.py:111 -msgid "强制失败节点" -msgstr "force failure node" +#: backend/db_services/mysql/sqlparse/handlers.py:143 +msgid "请保证一次只解析一条select语句" +msgstr "Please ensure that only one select statement is parsed at a time" -#: backend/db_services/taskflow/views/flow.py:121 -msgid "节点版本列表" -msgstr "List of node versions" +#: backend/db_services/mysql/sqlparse/handlers.py:152 +msgid "不允许查询以下系统库表:{}" +msgstr "Querying the following system library tables is not allowed: {}" -#: backend/db_services/taskflow/views/flow.py:132 -msgid "节点日志" -msgstr "node log" +#: backend/db_services/mysql/sqlparse/handlers.py:156 +msgid "SQL语句不为查询语句,或者不包含{}命令" +msgstr "The SQL statement is not a query statement, or does not contain the {} command" -#: backend/db_services/taskflow/views/flow.py:154 -msgid "回调节点" -msgstr "callback node" +#: backend/db_services/mysql/toolbox/serializers.py:29 +msgid "源业务ID" +msgstr "Source business ID" -#: backend/db_services/taskflow/views/redis.py:49 -msgid "结果文件列表" -msgstr "Result file list" +#: backend/db_services/mysql/toolbox/serializers.py:30 +msgid "目标业务ID" +msgstr "Target business ID" -#: backend/db_services/taskflow/views/redis.py:94 -msgid "打包下载结果文件列表" -msgstr "Package download result file list" +#: backend/db_services/mysql/toolbox/serializers.py:53 +msgid "TenDBHa集群迁移到其他业务" +msgstr "TenDBHa cluster is migrated to other businesses" -#: backend/db_services/taskflow/views/redis.py:122 -msgid "指定目录下载(返回下载链接)" -msgstr "Specify directory to download (return to download link)" +#: backend/db_services/mysql/toolbox/views.py:44 +msgid "查询 MySQL 可以用的升级包" +msgstr "Query available upgrade packages for MySQL" -#: backend/db_services/user/serializers.py:16 -msgid "模糊搜索" -msgstr "fuzzy search" +#: backend/db_services/mysql/toolbox/views.py:60 +msgid "TenDBHA 集群转移到其他业务" +msgstr "TenDBHA cluster moved to other businesses" -#: backend/db_services/user/serializers.py:18 -msgid "不分页,即将下架,请不要使用,并尽快迁移" -msgstr "" -"No pagination, it will be discontinued soon, please do not use it, and " -"migrate as soon as possible" +#: backend/db_services/mysql/toolbox/views.py:75 +msgid "目标业务的db模块不存在" +msgstr "The db module of the target business does not exist" -#: backend/db_services/version/constants.py:23 -msgid "MySQL-5.6" -msgstr "MySQL-5.6" +#: backend/db_services/mysql/toolbox/views.py:77 +msgid "目标业务不能是自己" +msgstr "The target business cannot be yourself" -#: backend/db_services/version/constants.py:24 -msgid "MySQL-5.7" -msgstr "MySQL-5.7" +#: backend/db_services/mysql/toolbox/views.py:88 +msgid "迁移的集群必须在同一个类型" +msgstr "The migrated cluster must be of the same type" -#: backend/db_services/version/constants.py:25 -msgid "MySQL-8.0" -msgstr "MySQL-8.0" +#: backend/db_services/mysql/toolbox/views.py:92 +msgid "目前只能转移 TenDBHA 和 TenDBSingle 集群" +msgstr "Currently only TenDBHA and TenDBSingle clusters can be transferred" -#: backend/db_services/version/constants.py:31 -msgid "Redis-6" -msgstr "Redis-6" +#: backend/db_services/mysql/toolbox/views.py:103 +msgid "源模块和目标模块的版本或字符集不一致,请检查一下" +msgstr "The versions or character sets of the source module and the target module are inconsistent, please check" -#: backend/db_services/version/constants.py:37 -msgid "Tendisplus-2.5" -msgstr "Tendisplus-2.5" +#: backend/db_services/partition/constants.py:34 +msgid "整型" +msgstr "integer" -#: backend/db_services/version/constants.py:38 -msgid "Tendisplus-2.6" -msgstr "Tendisplus-2.6" +#: backend/db_services/partition/constants.py:35 +msgid "日期类型" +msgstr "date type" -#: backend/db_services/version/constants.py:44 -msgid "TendisSSD-1.2" -msgstr "TendisSSD-1.2" +#: backend/db_services/partition/constants.py:36 +msgid "时间戳类型" +msgstr "timestamp type" -#: backend/db_services/version/constants.py:45 -msgid "TendisSSD-1.3" -msgstr "TendisSSD-1.3" +#: backend/db_services/partition/exceptions.py:18 +msgid "分区管理创建异常" +msgstr "Partition management creation exception" -#: backend/db_services/version/constants.py:51 -msgid "TwemproxyLatest" -msgstr "TwemproxyLatest" +#: backend/db_services/partition/exceptions.py:23 +msgid "服务器内部错误" +msgstr "Server internal error" -#: backend/db_services/version/constants.py:57 -msgid "PredixyLatest" -msgstr "PredixyLatest" +#: backend/db_services/partition/exceptions.py:28 +msgid "不合法的分区字段" +msgstr "Illegal partition field" -#: backend/db_services/version/serializers.py:20 -msgid "查询关键字" -msgstr "query keywords" +#: backend/db_services/partition/exceptions.py:33 +msgid "分区配置不存在" +msgstr "Partition configuration does not exist" -#: backend/db_services/version/views.py:27 -msgid "查询数据库版本列表" -msgstr "Query the list of database versions" +#: backend/db_services/partition/exceptions.py:38 +msgid "分区不支持该集群类型" +msgstr "The cluster type is not supported by the partition" -#: backend/dbm_init/management/commands/cloud_component.py:38 -msgid "云区域组件初始化失败,错误信息:{}" -msgstr "Cloud zone component initialization failed, error message: {}" +#: backend/db_services/partition/exceptions.py:43 +msgid "没有需要执行的操作" +msgstr "No action required" -#: backend/exceptions.py:48 -msgid "系统异常" -msgstr "System exception" +#: backend/db_services/partition/exceptions.py:48 +msgid "分区名格式错误" +msgstr "Partition name format error" -#: backend/exceptions.py:103 -msgid "系统错误" -msgstr "system error" +#: backend/db_services/partition/handlers.py:79 +msgid "分区管理创建失败,创建参数:{}, 错误信息: {}" +msgstr "" +"Partition management creation failed, creation parameter: {}, error message: " -#: backend/exceptions.py:113 -msgid "参数验证失败" -msgstr "Parameter validation failed" -#: backend/exceptions.py:118 -msgid "远程服务请求结果异常" -msgstr "The result of the remote service request is abnormal" +#: backend/db_services/partition/handlers.py:144 +msgid "分区单据执行" +msgstr "Partition document execution" -#: backend/exceptions.py:123 -msgid "组件调用异常" -msgstr "Component call exception" +#: backend/db_services/partition/handlers.py:199 +msgid "字段信息查询错误:{}" +msgstr "Field information query error: {}" -#: backend/exceptions.py:128 -msgid "业务不存在" -msgstr "business does not exist" +#: backend/db_services/partition/handlers.py:206 +msgid "【{}】【{}】当前库表模式匹配为空,请检查是否是合法库表" +msgstr "[{}][{}]The current database table pattern matching is empty, please check whether it is a legal database table" -#: backend/exceptions.py:133 -msgid "语言不支持" -msgstr "language not supported" +#: backend/db_services/partition/handlers.py:225 +msgid "【{}】【{}】分区字段{}不满足属于主键部分或唯一键交集的要求" +msgstr "[{}][{}] The partition field {} does not meet the requirements of being part of the primary key or the intersection of unique keys" -#: backend/exceptions.py:138 -msgid "权限不足" -msgstr "Insufficient permissions" +#: backend/db_services/partition/handlers.py:238 +msgid "【{}】【{}】分区字段{}与该表对应的字段类型不匹配" +msgstr "[{}][{}]Partition field{} does not match the field type corresponding to the table" -#: backend/exceptions.py:165 -msgid "服务不稳定,请检查组件健康状况" -msgstr "The service is unstable, please check the component health status" +#: backend/db_services/partition/handlers.py:243 +msgid "" +"表没有主键或者唯一键,将表改造为分区表的过程中会锁表,会阻塞查询、删除、修" +"改、添加、表结构变更等语句" +msgstr "The table does not have a primary key or a unique key. During the process of transforming the table into a partitioned table, the table will be locked, which will block queries, deletes, modifications, additions, table structure changes and other statements." -#: backend/flow/consts.py:107 -msgid "创建态" -msgstr "creation state" +#: backend/db_services/partition/serializers.py:28 +msgid "匹配库" +msgstr "matching database" -#: backend/flow/consts.py:108 -msgid "准备态" -msgstr "ready state" +#: backend/db_services/partition/serializers.py:29 +msgid "匹配表" +msgstr "match table" -#: backend/flow/consts.py:109 -msgid "运行态" -msgstr "running state" +#: backend/db_services/partition/serializers.py:50 +#: backend/db_services/partition/serializers.py:152 +msgid "匹配库列表(支持通配)" +msgstr "List of matching libraries (supports wildcards)" -#: backend/flow/consts.py:110 -msgid "暂停态" -msgstr "pause state" +#: backend/db_services/partition/serializers.py:51 +#: backend/db_services/partition/serializers.py:153 +msgid "匹配表列表(不支持通配)" +msgstr "List of matching tables (wildcards are not supported)" -#: backend/flow/consts.py:111 -msgid "闭塞态" -msgstr "Blocked state" +#: backend/db_services/partition/serializers.py:52 +#: backend/db_services/partition/serializers.py:154 +msgid "分区字段" +msgstr "partition field" -#: backend/flow/consts.py:112 -msgid "完成态" -msgstr "Completion" +#: backend/db_services/partition/serializers.py:53 +#: backend/db_services/partition/serializers.py:155 +msgid "分区字段类型" +msgstr "Partition field type" -#: backend/flow/consts.py:113 -msgid "失败态" -msgstr "failure state" +#: backend/db_services/partition/serializers.py:54 +msgid "过期时间" +msgstr "Expiration" -#: backend/flow/consts.py:114 -msgid "取消态" -msgstr "cancel state" +#: backend/db_services/partition/serializers.py:55 +msgid "分区间隔" +msgstr "partition interval" -#: backend/flow/consts.py:122 -msgid "共用参数" -msgstr "Shared parameters" +#: backend/db_services/partition/serializers.py:56 +msgid "是否需要获取分区执行数据" +msgstr "Do you need to obtain partition execution data?" -#: backend/flow/consts.py:123 -msgid "redis共用参数" -msgstr "redis shared parameters" +#: backend/db_services/partition/serializers.py:62 +msgid "在自动创建单据的条件下,请保证need_dry_run选项为真" +msgstr "Under the condition of automatically creating documents, please ensure that the need_dry_run option is true" -#: backend/flow/consts.py:124 -msgid "TenDBHA" -msgstr "TenDBHA" +#: backend/db_services/partition/serializers.py:67 +msgid "分区表不支持通配" +msgstr "Partition table does not support wildcarding" -#: backend/flow/consts.py:125 -msgid "RedisCache 主从版" -msgstr "RedisCache master-slave version" +#: backend/db_services/partition/serializers.py:71 +msgid "过期时间大于等于分区间隔,且为分区间隔的整数倍" +msgstr "The expiration time is greater than or equal to the partition interval and is an integer multiple of the partition interval." -#: backend/flow/consts.py:126 -msgid "twemproxy + RedisInstance架构" -msgstr "twemproxy + RedisInstance architecture" +#: backend/db_services/partition/serializers.py:100 +#: backend/db_services/partition/serializers.py:116 +msgid "分区策略ID" +msgstr "Partition policy ID" -#: backend/flow/consts.py:127 -msgid "predixy + tendisplus架构" -msgstr "predixy + tendisplus architecture" +#: backend/db_services/partition/serializers.py:130 +msgid "分区配置ID" +msgstr "Partition Configuration ID" -#: backend/flow/consts.py:128 -msgid "Es" -msgstr "Es" +#: backend/db_services/partition/serializers.py:132 +msgid "PORT" +msgstr "PORT" -#: backend/flow/consts.py:129 -msgid "tendb" -msgstr "tendb" +#: backend/db_services/partition/serializers.py:146 +#: backend/ticket/builders/mysql/mysql_partition.py:50 +msgid "分区执行对象列表" +msgstr "Partition execution object list" -#: backend/flow/consts.py:131 -msgid "Hdfs" -msgstr "Hdfs" +#: backend/db_services/partition/views.py:65 +msgid "获取分区策略列表" +msgstr "Get list of partition strategies" -#: backend/flow/consts.py:133 -msgid "Influxdb" -msgstr "Influxdb" +#: backend/db_services/partition/views.py:96 +msgid "修改分区策略" +msgstr "Modify partition strategy" -#: backend/flow/consts.py:138 -msgid "初始化帐户" -msgstr "Initialize account" +#: backend/db_services/partition/views.py:106 +msgid "增加分区策略" +msgstr "Add partition strategy" -#: backend/flow/consts.py:139 -msgid "实例和帐户" -msgstr "instance and account" +#: backend/db_services/partition/views.py:116 +msgid "批量删除分区策略" +msgstr "Delete partition policies in batches" -#: backend/flow/consts.py:140 -msgid "系统配置" -msgstr "System Configuration" +#: backend/db_services/partition/views.py:126 +msgid "禁用分区策略" +msgstr "disable partition policy" -#: backend/flow/consts.py:141 -msgid "实例配置" -msgstr "instance configuration" +#: backend/db_services/partition/views.py:136 +msgid "启用分区策略" +msgstr "enable partition strategy" -#: backend/flow/consts.py:142 -msgid "默认配置" -msgstr "default allocation" +#: backend/db_services/partition/views.py:146 +msgid "查询分区策略日志" +msgstr "Query partition policy logs" -#: backend/flow/consts.py:143 -msgid "proxyconfig" -msgstr "proxyconfig" +#: backend/db_services/partition/views.py:159 +msgid "分区策略前置执行" +msgstr "Pre-execution of partition strategy" -#: backend/flow/consts.py:144 -msgid "ES实例配置" -msgstr "ES instance configuration" +#: backend/db_services/partition/views.py:178 +msgid "分区策略执行" +msgstr "Partition policy enforcement" + +#: backend/db_services/partition/views.py:188 +msgid "分区策略字段校验" +msgstr "Partition policy field verification" + +#: backend/db_services/plugin/bf/serializers.py:23 +msgid "登录用户" +msgstr "Login user" + +#: backend/db_services/plugin/bf/serializers.py:24 +msgid "登录主机信息" +msgstr "Log in host information" + +#: backend/db_services/plugin/bf/views.py:33 +msgid "是否具有BF机器权限" +msgstr "Do you have BF machine permissions?" + +#: backend/db_services/plugin/bf/views.py:44 +msgid "主机{}不存在业务{}下" +msgstr "Host {} does not exist under business {}" + +#: backend/db_services/plugin/bf/views.py:55 +msgid "放行BF申请的白名单业务" +msgstr "Release the whitelist business applied by BF" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:18 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:28 +msgid "授权账号" +msgstr "Authorized account" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:19 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:29 +msgid "准入DB" +msgstr "Admission DB" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:20 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:30 +msgid "源IP列表" +msgstr "Source IP list" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:21 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:34 +msgid "目标域名" +msgstr "target domain name" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:24 +msgid "GCS业务缩写,如qxzb" +msgstr "GCS business abbreviation, such as qxzb" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:25 +msgid "Set名称,多个以逗号分隔" +msgstr "Set name, multiple separated by commas" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:26 +msgid "模块主机信息" +msgstr "Module host information" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:27 +msgid "模块列表,多个以逗号分隔" +msgstr "List of modules, multiples separated by commas" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:29 +msgid "调用平台" +msgstr "Calling platform" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:33 +msgid "请保证至少输入bk_biz_id或者输入app其中之一" +msgstr "Please make sure to enter at least bk_biz_id or enter one of the app" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:44 +#: backend/db_services/plugin/mysql/authorize/serializers.py:52 +msgid "平台" +msgstr "platform" -#: backend/flow/consts.py:145 -msgid "act配置" -msgstr "act configuration" +#: backend/db_services/plugin/mysql/authorize/serializers.py:57 +msgid "返回信息" +msgstr "Return information" -#: backend/flow/consts.py:146 -msgid "系统配置类型" -msgstr "system configuration type" +#: backend/db_services/plugin/mysql/authorize/views.py:31 +msgid "第三方权限申请(兼容GCS)" +msgstr "Third-party permission application (compatible with GCS)" -#: backend/flow/consts.py:147 -msgid "Kafka实例配置" -msgstr "Kafka instance configuration" +#: backend/db_services/plugin/mysql/authorize/views.py:42 +msgid "查询第三方权限申请结果(兼容GCS)" +msgstr "Query third-party permission application results (compatible with GCS)" -#: backend/flow/consts.py:148 -msgid "HDFS集群配置" -msgstr "HDFS cluster configuration" +#: backend/db_services/quick_search/constants.py:20 +msgid "单号" +msgstr "Order number" -#: backend/flow/consts.py:149 -msgid "HDFS实例hdfs-site配置" -msgstr "HDFS instance hdfs-site configuration" +#: backend/db_services/quick_search/constants.py:21 +msgid "任务" +msgstr "Task" -#: backend/flow/consts.py:150 -msgid "HDFS实例core-site配置" -msgstr "HDFS instance core-site configuration" +#: backend/db_services/quick_search/constants.py:23 +msgid "资源池主机" +msgstr "Resource pool host" -#: backend/flow/consts.py:151 -msgid "HDFS实例安装配置" -msgstr "HDFS instance installation configuration" +#: backend/db_services/quick_search/constants.py:27 +msgid "模糊" +msgstr "Vague" -#: backend/flow/consts.py:155 -msgid "系统" -msgstr "system" +#: backend/db_services/quick_search/constants.py:28 +msgid "精确" +msgstr "accurate" -#: backend/flow/consts.py:156 -msgid "twemproxy config file" -msgstr "twemproxy config file" +#: backend/db_services/quick_search/serializers.py:22 +msgid "数据库类型列表" +msgstr "Database type list" -#: backend/flow/consts.py:157 -msgid "predixy config file" -msgstr "predixy config file" +#: backend/db_services/quick_search/serializers.py:27 +#: backend/iam_app/serializers.py:27 +msgid "资源列表" +msgstr "resource list" -#: backend/flow/consts.py:158 -msgid "redis config file" -msgstr "redis config file" +#: backend/db_services/quick_search/serializers.py:28 +#: backend/iam_app/serializers.py:23 +msgid "资源类型" +msgstr "Resource Type" -#: backend/flow/consts.py:159 -msgid "全备配置" -msgstr "full configuration" +#: backend/db_services/quick_search/serializers.py:31 +msgid "检索类型" +msgstr "Search type" -#: backend/flow/consts.py:160 -msgid "增备配置" -msgstr "Additional configuration" +#: backend/db_services/quick_search/views.py:23 +msgid "全局搜索" +msgstr "global search" -#: backend/flow/consts.py:161 -msgid "心跳配置" -msgstr "heartbeat configuration" +#: backend/db_services/quick_search/views.py:31 +msgid "[quick_search] 快速查询" +msgstr "[quick_search] Quick search" -#: backend/flow/consts.py:162 -msgid "监控配置" -msgstr "monitoring configuration" +#: backend/db_services/redis/autofix/bill.py:106 +msgid "自动发起-自愈任务-{}" +msgstr "Automatically initiate-self-healing task-{}" -#: backend/flow/consts.py:163 -msgid "基本配置" -msgstr "basic configuration" +#: backend/db_services/redis/autofix/enums.py:20 +msgid "切换中?" +msgstr "Switching?" -#: backend/flow/consts.py:164 -msgid "热key配置" -msgstr "Hot key configuration" +#: backend/db_services/redis/autofix/enums.py:21 +msgid "切换失败" +msgstr "Switch failed" -#: backend/flow/consts.py:165 -msgid "大key配置" -msgstr "Big key configuration" +#: backend/db_services/redis/autofix/enums.py:22 +msgid "切换成功" +msgstr "Switch successful" -#: backend/flow/consts.py:169 -msgid "MASTER" -msgstr "MASTER" +#: backend/db_services/redis/autofix/enums.py:28 +msgid "自愈开关" +msgstr "Self-healing switch" -#: backend/flow/consts.py:170 -msgid "SLAVE" -msgstr "SLAVE" +#: backend/db_services/redis/autofix/enums.py:29 +msgid "监控到的id" +msgstr "Monitored id" -#: backend/flow/consts.py:174 backend/flow/consts.py:252 -#: backend/flow/consts.py:750 -msgid "mysql" -msgstr "mysql" +#: backend/db_services/redis/autofix/enums.py:30 +msgid "忽略自愈的APP列表" +msgstr "Ignore self-healing APP list" -#: backend/flow/consts.py:175 -msgid "mysql-proxy" -msgstr "mysql-proxy" +#: backend/db_services/redis/autofix/enums.py:31 +msgid "忽略自愈的集群列表" +msgstr "Ignore list of self-healing clusters" -#: backend/flow/consts.py:179 -msgid "dbbackup" -msgstr "dbbackup" +#: backend/db_services/redis/autofix/enums.py:37 +msgid "初始化" +msgstr "initialization" -#: backend/flow/consts.py:180 -msgid "actuator" -msgstr "actuator" +#: backend/db_services/redis/autofix/enums.py:39 +msgid "发起flow流程" +msgstr "Initiate flow process" -#: backend/flow/consts.py:181 -msgid "最新版本" -msgstr "The latest version" +#: backend/db_services/redis/autofix/enums.py:40 +msgid "监控流程完成状态" +msgstr "Monitor process completion status" -#: backend/flow/consts.py:184 -msgid "redis_tools" -msgstr "redis_tools" +#: backend/db_services/redis/autofix/enums.py:41 +msgid "不支持自愈" +msgstr "Does not support self-healing" -#: backend/flow/consts.py:185 backend/flow/consts.py:258 -msgid "es" -msgstr "es" +#: backend/db_services/redis/autofix/enums.py:42 +msgid "自愈成功" +msgstr "Successful self-healing" -#: backend/flow/consts.py:186 backend/flow/consts.py:259 -msgid "kafka" -msgstr "kafka" +#: backend/db_services/redis/autofix/enums.py:43 +msgid "自愈失败" +msgstr "Self-healing failed" -#: backend/flow/consts.py:187 backend/flow/consts.py:260 -msgid "hdfs" -msgstr "hdfs" +#: backend/db_services/redis/autofix/models.py:27 +msgid "取值范围" +msgstr "Value range" -#: backend/flow/consts.py:188 backend/flow/consts.py:261 -msgid "pulsar" -msgstr "pulsar" +#: backend/db_services/redis/autofix/models.py:38 +msgid "集群主域名" +msgstr "Cluster main domain name" -#: backend/flow/consts.py:190 -msgid "dbmon" -msgstr "dbmon" +#: backend/db_services/redis/autofix/models.py:39 +msgid "故障机器" +msgstr "faulty machine" -#: backend/flow/consts.py:191 -msgid "mysql-checksum" -msgstr "mysql-checksum" +#: backend/db_services/redis/autofix/models.py:41 +msgid "自愈状态" +msgstr "self-healing state" -#: backend/flow/consts.py:192 -msgid "Binlog 滚动备份工具" -msgstr "Binlog rotate tool" +#: backend/db_services/redis/autofix/models.py:42 +msgid "状态版本" +msgstr "status version" -#: backend/flow/consts.py:193 -msgid "DBA 工具集" -msgstr "DBA toolkit" +#: backend/db_services/redis/autofix/models.py:57 +msgid "机器ID" +msgstr "Machine ID" -#: backend/flow/consts.py:194 -msgid "mysql-crond" -msgstr "mysql-crond" +#: backend/db_services/redis/autofix/models.py:58 +msgid "机器IP" +msgstr "Machine IP" -#: backend/flow/consts.py:195 -msgid "MySQL 监控" -msgstr "MySQL monitoring" +#: backend/db_services/redis/autofix/models.py:59 +msgid "切换端口" +msgstr "switch port" -#: backend/flow/consts.py:196 -msgid "nginx 服务" -msgstr "nginx service" +#: backend/db_services/redis/autofix/models.py:60 +msgid "切换最小值" +msgstr "Toggle minimum" -#: backend/flow/consts.py:197 -msgid "dns-bind 服务" -msgstr "dns-bind service" +#: backend/db_services/redis/autofix/models.py:61 +msgid "切换最大值" +msgstr "Toggle maximum" -#: backend/flow/consts.py:198 -msgid "dns-pull-crond服务" -msgstr "dns-pull-crond service" +#: backend/db_services/redis/autofix/models.py:62 +msgid "切换结果" +msgstr "Switch results" -#: backend/flow/consts.py:199 -msgid "cloud-dbha服务" -msgstr "cloud-dbha service" +#: backend/db_services/redis/autofix/models.py:63 +msgid "忽略类型" +msgstr "ignore type" -#: backend/flow/consts.py:200 -msgid "cloud-drs服务" -msgstr "cloud-drs service" +#: backend/db_services/redis/autofix/models.py:71 +#: backend/ticket/constants.py:53 +msgid "待处理" +msgstr "Pending" -#: backend/flow/consts.py:201 -msgid "cloud-drs-tmysqlparse服务" -msgstr "cloud-drs-tmysqlparse service" +#: backend/db_services/redis/autofix/models.py:72 +msgid "已取消" +msgstr "Canceled" -#: backend/flow/consts.py:202 -msgid "spider节点名称" -msgstr "spider node name" +#: backend/db_services/redis/autofix/models.py:74 +#: backend/ticket/constants.py:78 backend/ticket/constants.py:89 +msgid "执行中" +msgstr "in execution" -#: backend/flow/consts.py:203 -msgid "spider中控节点名称" -msgstr "Spider control node name" +#: backend/db_services/redis/autofix/models.py:84 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:71 +msgid "信息" +msgstr "information" -#: backend/flow/consts.py:208 -msgid "nginx服务" -msgstr "nginx-service" +#: backend/db_services/redis/autofix/models.py:88 +msgid "上报IP" +msgstr "Report IP" -#: backend/flow/consts.py:209 -msgid "dns服务" -msgstr "dns service" +#: backend/db_services/redis/autofix/models.py:89 +msgid "上报端口" +msgstr "Reporting port" -#: backend/flow/consts.py:210 -msgid "drs服务" -msgstr "drs service" +#: backend/db_services/redis/autofix/models.py:90 +msgid "上报的nodes data" +msgstr "Reported nodes data" -#: backend/flow/consts.py:211 -msgid "dbha服务" -msgstr "dbha service" +#: backend/db_services/redis/autofix/models.py:91 +msgid "上报时间" +msgstr "Reporting time" -#: backend/flow/consts.py:215 -msgid "pull-crond.conf" -msgstr "pull-crond.conf" +#: backend/db_services/redis/constants.py:19 +msgid "基于正则" +msgstr "Regex-based" -#: backend/flow/consts.py:216 -msgid "ha-gm.conf" -msgstr "ha-gm.conf" +#: backend/db_services/redis/constants.py:20 +msgid "基于文件" +msgstr "file based" -#: backend/flow/consts.py:217 -msgid "ha-agent.conf" -msgstr "ha-agent.conf" +#: backend/db_services/redis/constants.py:26 +msgid "查询当前版本" +msgstr "Query the current version" -#: backend/flow/consts.py:218 -msgid "drs.env" -msgstr "drs.env" +#: backend/db_services/redis/constants.py:27 +msgid "查询更新版本" +msgstr "Query updated version" -#: backend/flow/consts.py:222 -msgid "GM" -msgstr "GM" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:127 +msgid "bk_biz_id {} in blacklist,skip maxmemory set" +msgstr "bk_biz_id {} in blacklist,skip maxmemory set" -#: backend/flow/consts.py:223 -msgid "AGENT" -msgstr "AGENT" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:131 +msgid "domain {} in blacklist,skip maxmemory set" +msgstr "domain {} in blacklist,skip maxmemory set" -#: backend/flow/consts.py:224 -msgid "mysql-monitor" -msgstr "mysql-monitor" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:135 +msgid "cluster {} cluster_type:{} is not redis instance,skip maxmemory set" +msgstr "cluster {} cluster_type:{} is not redis instance,skip maxmemory set" -#: backend/flow/consts.py:234 -msgid "nginx服务模块" -msgstr "nginx service module" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:141 +msgid "cluster {} is dts task dstCluster,skip maxmemory set" +msgstr "cluster {} is dts task dstCluster,skip maxmemory set" -#: backend/flow/consts.py:235 -msgid "dns服务模块" -msgstr "dns service module" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:166 +msgid "首次通过外围程序设置maxmemory" +msgstr "Set maxmemory through the peripheral program for the first time" -#: backend/flow/consts.py:236 -msgid "drs服务模块" -msgstr "drs service module" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:177 +msgid "集群 master addrs 发生变化" +msgstr "Cluster master addrs changes" -#: backend/flow/consts.py:237 -msgid "dbha服务模块" -msgstr "dbha service module" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:187 +msgid "集群master {} 的 used_memory变化了 {}{}" +msgstr "The used_memory of cluster master {} has changed {}{}" -#: backend/flow/consts.py:242 -msgid "蓝盾制品库" -msgstr "Blue Shield Product database" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:192 +msgid "集群master {} 的 used_memory变化了 {}{}%" +msgstr "The used_memory of cluster master {} has changed {}{}%" -#: backend/flow/consts.py:247 -msgid "V1" -msgstr "V1" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:193 +msgid "集群master 的 used_memory没有发生变化" +msgstr "The used_memory of the cluster master has not changed." -#: backend/flow/consts.py:255 -msgid "tendis" -msgstr "tending" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:27 +msgid "backends" +msgstr "backends" -#: backend/flow/consts.py:263 -msgid "bkdbmon" -msgstr "bkdbmon" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:33 +msgid "配置数据" +msgstr "Configuration data" -#: backend/flow/consts.py:264 -msgid "download" -msgstr "download" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:37 +msgid "redis maxmemory配置" +msgstr "redis maxmemory configuration" -#: backend/flow/consts.py:266 -msgid "spiderctl" -msgstr "spiderctl" +#: backend/db_services/redis/redis_dts/constants.py:20 +msgid "tendis ssd备份任务" +msgstr "tendis ssd backup task" -#: backend/flow/consts.py:271 backend/flow/consts.py:315 -msgid "sysinit" -msgstr "sysinit" +#: backend/db_services/redis/redis_dts/constants.py:21 +msgid "tendis ssd备份拉取任务" +msgstr "tendis ssd backup pull task" -#: backend/flow/consts.py:272 backend/flow/consts.py:419 -msgid "deploy" -msgstr "deploy" +#: backend/db_services/redis/redis_dts/constants.py:22 +msgid "tendis ssd备份解析任务" +msgstr "Tendis ssd backup analysis task" -#: backend/flow/consts.py:273 -msgid "find-local-backup" -msgstr "find-local-backup" +#: backend/db_services/redis/redis_dts/constants.py:23 +msgid "tendis ssd数据导入任务" +msgstr "Tendis ssd data import task" -#: backend/flow/consts.py:274 -msgid "restore-dr" -msgstr "restore-dr" +#: backend/db_services/redis/redis_dts/constants.py:24 +msgid "tendis ssd拉起sync任务" +msgstr "Tendis ssd pulls up the sync task" -#: backend/flow/consts.py:275 -msgid "recover-binlog" -msgstr "recover-binlog" +#: backend/db_services/redis/redis_dts/constants.py:25 +#: backend/db_services/redis/redis_dts/constants.py:29 +msgid "tendis ssd监视sync任务" +msgstr "Tendis ssd monitor sync task" -#: backend/flow/consts.py:276 -msgid "grant-repl" -msgstr "grant-repl" +#: backend/db_services/redis/redis_dts/constants.py:28 +msgid "redis cache拉起redis-shake任务" +msgstr "Redis cache pulls up the redis-shake task" -#: backend/flow/consts.py:277 -msgid "change-master" -msgstr "change-master" +#: backend/db_services/redis/redis_dts/constants.py:32 +msgid "tendisplus拉起reids-sync任务" +msgstr "Tendisplus pulls up the reids-sync task" -#: backend/flow/consts.py:278 -msgid "set-backend" -msgstr "set-backend" +#: backend/db_services/redis/redis_dts/constants.py:34 +msgid "tendisplus全量数据同步" +msgstr "Tendisplus full data synchronization" -#: backend/flow/consts.py:279 backend/flow/consts.py:427 -msgid "uninstall" -msgstr "uninstall" +#: backend/db_services/redis/redis_dts/constants.py:35 +msgid "tendisplus增量数据同步" +msgstr "Tendisplus incremental data synchronization" -#: backend/flow/consts.py:280 -msgid "deploy-dbbackup" -msgstr "deploy-dbbackup" +#: backend/db_services/redis/redis_dts/constants.py:41 +msgid "停止数据同步todo" +msgstr "stop data sync todo" -#: backend/flow/consts.py:281 backend/flow/consts.py:424 -msgid "install-monitor" -msgstr "install-monitor" +#: backend/db_services/redis/redis_dts/constants.py:42 +msgid "停止数据同步失败" +msgstr "Failed to stop data sync" -#: backend/flow/consts.py:282 -msgid "deploy-rotate" -msgstr "deploy-rotate" +#: backend/db_services/redis/redis_dts/constants.py:43 +msgid "停止数据同步成功" +msgstr "Stop data synchronization successfully" -#: backend/flow/consts.py:283 backend/flow/consts.py:289 -msgid "semantic-dumpschema" -msgstr "semantic-dumpschema" +#: backend/db_services/redis/redis_dts/constants.py:45 +msgid "强制暂停任务todo" +msgstr "Forcibly suspend task todo" -#: backend/flow/consts.py:284 -msgid "import-sqlfile" -msgstr "import-sqlfile" +#: backend/db_services/redis/redis_dts/constants.py:46 +msgid "强制暂停任务失败" +msgstr "Failed to force suspend task" -#: backend/flow/consts.py:285 -msgid "clone-client-grant" -msgstr "clone-client-grant" +#: backend/db_services/redis/redis_dts/constants.py:47 +msgid "强制暂停任务成功" +msgstr "Succeeded in forcing the task to suspend" -#: backend/flow/consts.py:286 -msgid "clone-proxy-user" -msgstr "clone-proxy-user" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:21 +msgid "集群节点数变更" +msgstr "Change in the number of cluster nodes" -#: backend/flow/consts.py:287 backend/flow/consts.py:426 -msgid "clear-crontab" -msgstr "clear-crontab" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:22 +msgid "集群类型变更" +msgstr "Cluster type change" -#: backend/flow/consts.py:288 -msgid "semantic-check" -msgstr "semantic-check" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:23 +msgid "集群数据复制" +msgstr "Cluster data replication" -#: backend/flow/consts.py:290 -msgid "backup-truncate-database" -msgstr "backup-truncate-database" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:24 +msgid "集群回档数据回写" +msgstr "Cluster archive data write back" -#: backend/flow/consts.py:291 -msgid "restart" -msgstr "restart" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:32 +msgid "业务内" +msgstr "Within business" -#: backend/flow/consts.py:292 -msgid "clean-mysql" -msgstr "clean-mysql" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:33 +msgid "跨业务" +msgstr "Cross-business" -#: backend/flow/consts.py:293 -msgid "backup-database-table" -msgstr "backup-database-table" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:34 +msgid "业务内至第三方" +msgstr "Within business to third parties" -#: backend/flow/consts.py:294 -msgid "set-backend-toward-slave" -msgstr "set-backend-toward-slave" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:35 +msgid "自建集群至业务内" +msgstr "Build your own cluster into your business" -#: backend/flow/consts.py:295 -msgid "pt-table-checksum" -msgstr "pt-table-checksum" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:36 +msgid "构造实例至业务内" +msgstr "Construct an instance into the business" -#: backend/flow/consts.py:296 -msgid "执行分区" -msgstr "execution partition" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:45 +msgid "先删除同名redis key, 再执行写入(如:del $key + hset $key)" +msgstr "First delete the redis key with the same name, and then perform writing (such as: del $key + hset $key)" -#: backend/flow/consts.py:297 -msgid "ibs-recover" -msgstr "ibs-recover" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:47 +msgid "保留同名redis key,追加写入(如hset $key)" +msgstr "Keep the redis key with the same name and write additionally (such as hset $key)" -#: backend/flow/consts.py:298 -msgid "数据修复指令" -msgstr "Data Repair Instructions" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:48 +msgid "先清空目标集群所有数据,在写入(如flushall + hset $key)" +msgstr "First clear all data in the target cluster and then write (such as flushall + hset $key)" -#: backend/flow/consts.py:299 -msgid "flashback-binlog" -msgstr "flashback-binlog" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:63 +msgid "自动切换" +msgstr "auto switch" -#: backend/flow/consts.py:300 -msgid "full-backup" -msgstr "full-backup" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:64 +msgid "用户确认切换" +msgstr "User confirmation switch" -#: backend/flow/consts.py:301 -msgid "install-checksum" -msgstr "install-checksum" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:72 +msgid "复制完成后自动断开同步关系" +msgstr "Automatically disconnect the synchronization relationship after copying is completed" -#: backend/flow/consts.py:302 -msgid "mycnf-change" -msgstr "mycnf-change" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:73 +msgid "复制完成后保持同步关系,定时发送断开同步提醒" +msgstr "After the copy is completed, the synchronization relationship is maintained and the disconnection synchronization reminder is sent regularly." -#: backend/flow/consts.py:303 -msgid "安装mysql-rotatebinlog程序" -msgstr "Install the mysql-rotatebinlog program" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:81 +msgid "每天一次" +msgstr "once a day" -#: backend/flow/consts.py:304 -msgid "安装dba-toolkit程序" -msgstr "Install the dba-toolkit program" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:82 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:102 +msgid "每周一次" +msgstr "once a week" -#: backend/flow/consts.py:305 -msgid "deploy-mysql-crond" -msgstr "deploy-mysql-crond" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:90 +#: backend/ticket/constants.py:559 +msgid "数据校验并修复" +msgstr "Data verification and repair" -#: backend/flow/consts.py:306 -msgid "mysql实例的周边配置清理" -msgstr "Clean up the surrounding configuration of the mysql instance" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:91 +#: backend/ticket/constants.py:560 +msgid "仅进行数据校验,不进行修复" +msgstr "Only data verification is performed, no repair is performed" -#: backend/flow/consts.py:307 -msgid "初始化spider集群节点关系" -msgstr "Initialize the spider cluster node relationship" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:92 +#: backend/ticket/constants.py:561 +msgid "不校验不修复" +msgstr "No verification or repair" -#: backend/flow/consts.py:308 -msgid "添加spider临时节点" -msgstr "Add spider temporary node" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:100 +msgid "复制完成后执行一次" +msgstr "Execute once after copying is complete" -#: backend/flow/consts.py:309 -msgid "restart-spider" -msgstr "restart-spider" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:101 +msgid "每三天一次" +msgstr "Once every three days" -#: backend/flow/consts.py:310 -msgid "添加spider-slave集群的相关路由信息" -msgstr "Add the relevant routing information of the spider-slave cluster" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:110 +#: backend/ticket/builders/common/constants.py:96 +msgid "自动修复" +msgstr "automatic repair" -#: backend/flow/consts.py:311 -msgid "mysql备份请求" -msgstr "mysql backup request" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:111 +msgid "用户确认" +msgstr "User confirmation" -#: backend/flow/consts.py:316 -msgid "install" -msgstr "install" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:119 +msgid "永不超时" +msgstr "Never times out" -#: backend/flow/consts.py:317 -msgid "replica_batch" -msgstr "replica_batch" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:120 +msgid "1小时" +msgstr "1 hour" -#: backend/flow/consts.py:318 -msgid "replicaof" -msgstr "replicaof" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:121 +msgid "3小时" +msgstr "3 hours" -#: backend/flow/consts.py:319 -msgid "clustermeet_slotsassign" -msgstr "clustermeet_slotassign" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:122 +msgid "6小时" +msgstr "6 hours" -#: backend/flow/consts.py:320 -msgid "keyspattern" -msgstr "keyspattern" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:123 +msgid "1天" +msgstr "1 day" -#: backend/flow/consts.py:321 -msgid "keysdelete_regex" -msgstr "keysdelete_regex" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:124 +msgid "2天" +msgstr "2 days" -#: backend/flow/consts.py:322 -msgid "keysdelete_files" -msgstr "keysdelete_files" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:125 +msgid "1周" +msgstr "1 week" -#: backend/flow/consts.py:323 -msgid "backup" -msgstr "backup" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:134 +msgid "增量同步中" +msgstr "Incremental sync in progress" -#: backend/flow/consts.py:324 -msgid "flush_data" -msgstr "flush_data" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:136 +msgid "增量同步失败" +msgstr "Incremental sync failed" -#: backend/flow/consts.py:325 -msgid "shutdown" -msgstr "shutdown" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:138 +msgid "传输已完成" +msgstr "Transfer completed" -#: backend/flow/consts.py:326 -msgid "open" -msgstr "open" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:139 +msgid "传输被终止" +msgstr "transfer terminated" -#: backend/flow/consts.py:327 -msgid "close" -msgstr "close" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:140 +msgid "未知状态" +msgstr "unknown status" -#: backend/flow/consts.py:328 -msgid "operate" -msgstr "operate" +#: backend/db_services/redis/redis_dts/exceptions.py:18 +msgid "DBDts模块异常" +msgstr "DBDts module exception" -#: backend/flow/consts.py:329 -msgid "capturer" -msgstr "capture" +#: backend/db_services/redis/redis_dts/exceptions.py:23 +msgid "获取DTS任务列表异常" +msgstr "Obtaining the DTS task list is abnormal" -#: backend/flow/consts.py:330 -msgid "kill_conn" -msgstr "kill_conn" +#: backend/db_services/redis/redis_dts/exceptions.py:29 +msgid "DTS task操作异常" +msgstr "DTS task operation is abnormal" -#: backend/flow/consts.py:331 -msgid "param_sync" -msgstr "param_sync" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:54 +msgid "cluster:{} 密码已经正确存储" +msgstr "cluster:{} password has been stored correctly" -#: backend/flow/consts.py:332 -msgid "sync_check" -msgstr "sync_check" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:68 +msgid "cluster:{} 密码已存储port不正确,重新存储" +msgstr "cluster:{} The password has been stored and the port is incorrect. Please store it again." -#: backend/flow/consts.py:333 -msgid "dts_datacheck" -msgstr "dts_datacheck" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:79 +msgid "cluster:{} 密码从dbconfig中迁移到密码服务中" +msgstr "cluster:{} password is migrated from dbconfig to password service" -#: backend/flow/consts.py:334 -msgid "dts_datarepaire" -msgstr "dts_datarepaire" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:89 +msgid "cluster:{} 在 dbconfig和密码服务中均不存在" +msgstr "cluster:{} does not exist in both dbconfig and password services" -#: backend/flow/consts.py:338 backend/flow/consts.py:361 -#: backend/flow/consts.py:381 backend/flow/consts.py:400 -#: backend/flow/consts.py:575 -msgid "init" -msgstr "init" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:17 +msgid "锁的唯一标识" +msgstr "Unique ID of the lock" -#: backend/flow/consts.py:339 backend/flow/consts.py:362 -#: backend/flow/consts.py:382 backend/flow/consts.py:401 -#: backend/flow/consts.py:576 -msgid "decompress_pkg" -msgstr "decompress_pkg" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:18 +msgid "锁的持有者" +msgstr "lock holder" -#: backend/flow/consts.py:340 backend/flow/consts.py:363 -#: backend/flow/consts.py:383 backend/flow/consts.py:402 -msgid "install_supervisor" -msgstr "install_supervisor" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:20 +msgid "锁的过期时间" +msgstr "lock expiration time" -#: backend/flow/consts.py:341 -msgid "install_master" -msgstr "install_master" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:18 +msgid "DTS_Server IP" +msgstr "DTS_Server IP" -#: backend/flow/consts.py:342 -msgid "install_hot" -msgstr "install_hot" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:19 +msgid "城市ID" +msgstr "City ID" -#: backend/flow/consts.py:343 -msgid "install_cold" -msgstr "install_cold" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:22 +msgid "最近心跳时间" +msgstr "Last heartbeat time" -#: backend/flow/consts.py:344 -msgid "install_client" -msgstr "install_client" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:28 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:21 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:20 +msgid "单据号" +msgstr "ticket No" -#: backend/flow/consts.py:345 -msgid "init_grant" -msgstr "init_grant" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:29 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:22 +msgid "业务bk_biz_id" +msgstr "Business bk_biz_id" -#: backend/flow/consts.py:346 -msgid "install_exporter" -msgstr "install_exporter" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:30 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:23 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:13 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:13 +msgid "云区域id" +msgstr "cloud region id" -#: backend/flow/consts.py:347 -msgid "install_kibana" -msgstr "install_kibana" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:31 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:21 +msgid "申请人" +msgstr "applicant" -#: backend/flow/consts.py:348 backend/flow/consts.py:385 -msgid "install_telegraf" -msgstr "install_telegraf" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:33 +msgid "DTS单据类型" +msgstr "DTS ticket type" -#: backend/flow/consts.py:349 backend/flow/consts.py:368 -#: backend/flow/consts.py:387 backend/flow/consts.py:409 -msgid "start_process" -msgstr "start_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:36 +msgid "DTS数据复制类型" +msgstr "DTS data replication type" -#: backend/flow/consts.py:350 backend/flow/consts.py:369 -#: backend/flow/consts.py:388 backend/flow/consts.py:410 -msgid "stop_process" -msgstr "stop_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:39 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:26 +msgid "写入模式" +msgstr "write mode" -#: backend/flow/consts.py:351 backend/flow/consts.py:370 -#: backend/flow/consts.py:389 backend/flow/consts.py:411 -msgid "restart_process" -msgstr "restart_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:45 +msgid "在线切换类型" +msgstr "Online switch type" -#: backend/flow/consts.py:352 backend/flow/consts.py:371 -#: backend/flow/consts.py:390 backend/flow/consts.py:412 -msgid "clean_data" -msgstr "clean_data" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:48 +msgid "同步断开类型" +msgstr "Synchronous disconnect type" -#: backend/flow/consts.py:353 -msgid "exclude_node" -msgstr "exclude_node" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:51 +msgid "同步断开提醒频率" +msgstr "Synchronous disconnection reminder frequency" -#: backend/flow/consts.py:354 -msgid "check_shards" -msgstr "check_shards" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:57 +msgid "数据校验修复类型" +msgstr "Data verification repair type" -#: backend/flow/consts.py:355 -msgid "check_connections" -msgstr "check_connections" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:63 +msgid "数据校验修复执行频率" +msgstr "Data verification repair execution frequency" -#: backend/flow/consts.py:356 -msgid "check_nodes" -msgstr "check_nodes" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:66 +msgid "最近一次数据校验与修复 flow id" +msgstr "The most recent data verification and repair flow id" -#: backend/flow/consts.py:357 -msgid "replace_master" -msgstr "replace_master" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:68 +msgid "最近一次数据校验与修复 单据执行时间" +msgstr "The latest data verification and repair document execution time" -#: backend/flow/consts.py:364 backend/flow/consts.py:403 -msgid "install_zookeeper" -msgstr "install_zookeeper" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:70 +msgid "在线切换 flow id" +msgstr "Switch flow id online" -#: backend/flow/consts.py:365 -msgid "init_kafkaUser" -msgstr "init_kafkaUser" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:72 +msgid "目的集群禁用 flow id" +msgstr "Disable flow id in the destination cluster" -#: backend/flow/consts.py:366 backend/flow/consts.py:406 -msgid "install_broker" -msgstr "install_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:73 +msgid "目的集群下架 flow id" +msgstr "The destination cluster removes the flow id" -#: backend/flow/consts.py:367 -msgid "install_manager" -msgstr "install_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:76 +msgid "源集群id" +msgstr "Source cluster id" -#: backend/flow/consts.py:372 -msgid "reduce_broker" -msgstr "reduce_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:78 +msgid "源集群类型" +msgstr "source cluster type" -#: backend/flow/consts.py:373 -msgid "check_reassign" -msgstr "check_reassign" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:79 +msgid "回滚单据号" +msgstr "Rollback ticket number" -#: backend/flow/consts.py:374 -msgid "reconfig_add" -msgstr "reconfig_add" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:80 +msgid "回滚临时环境实例" +msgstr "Rollback a temporary environment instance" -#: backend/flow/consts.py:375 -msgid "restart_broker" -msgstr "restart_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:81 +msgid "目标业务id" +msgstr "target business id" -#: backend/flow/consts.py:376 -msgid "reconfig_remove" -msgstr "reconfig_remove" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:82 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:23 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:54 +msgid "目的集群" +msgstr "destination cluster" -#: backend/flow/consts.py:377 -msgid "replace_broker" -msgstr "replace_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:83 +msgid "目的集群id" +msgstr "destination cluster id" -#: backend/flow/consts.py:384 -msgid "install_influxdb" -msgstr "install_influxdb" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:85 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:52 +msgid "目标集群类型" +msgstr "target cluster type" -#: backend/flow/consts.py:386 -msgid "init_user" -msgstr "init_user" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:86 +msgid "key正则(包含key)" +msgstr "key regular (including key)" -#: backend/flow/consts.py:394 -msgid "check_broker_config" -msgstr "check_broker_config" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:87 +msgid "key正则(排除key)" +msgstr "key regularization (exclude key)" -#: backend/flow/consts.py:395 -msgid "check_namespace_config" -msgstr "check_namespace_config" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:24 +msgid "数据类型" +msgstr "data type" -#: backend/flow/consts.py:396 -msgid "check_under_replicated" -msgstr "check_under_replicated" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:25 +msgid "数据" +msgstr "data" -#: backend/flow/consts.py:397 -msgid "check_ledger_metadata" -msgstr "check_ledger_metadata" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:24 +msgid "执行迁移任务的dts_server" +msgstr "dts_server that executes migration tasks" -#: backend/flow/consts.py:398 -msgid "set_bookie_readonly" -msgstr "set_bookie_readonly" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:29 +msgid "源集群优先级,值越大,优先级越高" +msgstr "Source cluster priority, the larger the value, the higher the priority" -#: backend/flow/consts.py:399 -msgid "decommission_bookie" -msgstr "decommission_bookie" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:30 +msgid "源slave_ip" +msgstr "source slave ip" -#: backend/flow/consts.py:404 -msgid "init_cluster" -msgstr "init_cluster" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:31 +msgid "源slave_port" +msgstr "source slave_port" -#: backend/flow/consts.py:405 -msgid "install_bookkeeper" -msgstr "install_bookkeeper" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:32 +msgid "源实例密码base64值" +msgstr "Source instance password base64 value" -#: backend/flow/consts.py:407 -msgid "install_pulsar_manager" -msgstr "install_pulsar_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:34 +msgid "源slave db类型" +msgstr "Source slave db type" -#: backend/flow/consts.py:408 -msgid "init_pulsar_manager" -msgstr "init_pulsar_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:36 +msgid "源实例数据量大小,单位Byte" +msgstr "Source instance data size, unit Byte" -#: backend/flow/consts.py:413 -msgid "add_hosts" -msgstr "add_hosts" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:38 +msgid "源实例所属segment_start" +msgstr "The segment_start to which the source instance belongs" -#: backend/flow/consts.py:414 -msgid "modify_hosts" -msgstr "modify_hosts" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:39 +msgid "源实例所属segment_end" +msgstr "The segment_end to which the source instance belongs" -#: backend/flow/consts.py:418 -msgid "sysinit-riak" -msgstr "sysinits" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:41 +msgid "源实例权重" +msgstr "Source Instance Weight" -#: backend/flow/consts.py:420 -msgid "join-cluster" -msgstr "join-cluster" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:43 +msgid "源slave_ip上task并发数控制" +msgstr "Task concurrency control on the source slave_ip" -#: backend/flow/consts.py:421 -msgid "commit-cluster-change" -msgstr "commit-cluster-change" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:44 +msgid "源实例所在城市" +msgstr "The time zone where the instance is located" -#: backend/flow/consts.py:422 -msgid "init-bucket-type" -msgstr "init-bucket-type" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:46 +msgid "源实例slave-keep-log-count的旧值" +msgstr "Old value of source instance slave-keep-log-count" -#: backend/flow/consts.py:423 -msgid "remove-node" -msgstr "remove-node" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:47 +msgid "源实例slave-keep-log-count的新值" +msgstr "The new value of the source instance slave-keep-log-count" -#: backend/flow/consts.py:425 -msgid "deploy-riak-crond" -msgstr "deploy-ripple-crond" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:48 +msgid "源实例slave-keep-log-count是否恢复" +msgstr "Whether the source instance slave-keep-log-count is restored" -#: backend/flow/consts.py:435 -msgid "聊天历史记录" -msgstr "chat history" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:49 +msgid "srcRedis是否包含list类型key" +msgstr "Whether srcRedis contains list type key" -#: backend/flow/consts.py:436 -msgid "用户战绩数据" -msgstr "User record data" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:50 +msgid "源twemproxy集群是否开启hash_tag" +msgstr "Whether the source twemproxy cluster has hash_tag enabled" -#: backend/flow/consts.py:437 -msgid "玩家按键快捷键信息" -msgstr "Player key shortcut key information" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:51 +msgid "包含key(正则)" +msgstr "Contains key (regular)" -#: backend/flow/consts.py:438 -msgid "test" -msgstr "test" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:52 +msgid "排除key(正则)" +msgstr "Exclude key (regular)" -#: backend/flow/consts.py:439 -msgid "mixed" -msgstr "mixed" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:55 +msgid "目的密码base64值" +msgstr "Destination password base64 value" -#: backend/flow/consts.py:443 -msgid "NOT_RUNNING" -msgstr "NOT_RUNNING" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:58 +msgid "tendisssd slave上bakup文件位置" +msgstr "bakup file location on tendisssd slave" -#: backend/flow/consts.py:444 backend/flow/consts.py:502 -msgid "RUNNING" -msgstr "RUNNING" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:59 +msgid "backup文件拉取到dts_server本地位置" +msgstr "The backup file is pulled to the local location of dts_server" -#: backend/flow/consts.py:445 backend/flow/consts.py:503 -msgid "SUCCESS" -msgstr "SUCCESS" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:60 +msgid "tendisdumper得到的sql文件夹" +msgstr "The sql folder obtained by tendisdumper" -#: backend/flow/consts.py:446 backend/flow/consts.py:504 -msgid "FAILED" -msgstr "FAILED" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:61 +msgid "redis-sync端口" +msgstr "redis-sync port" -#: backend/flow/consts.py:447 -msgid "SKIPPED" -msgstr "SKIPPED" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:62 +msgid "sync的进程id" +msgstr "sync process id" -#: backend/flow/consts.py:448 -msgid "IGNORED" -msgstr "IGNORED" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:64 +msgid "task重试次数" +msgstr "task retries" -#: backend/flow/consts.py:449 -msgid "WAITING" -msgstr "WAITING" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:66 +msgid "sync操作" +msgstr "sync operation" -#: backend/flow/consts.py:450 -msgid "NORMAL" -msgstr "NORMAL" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:68 +msgid "杀死syncer" +msgstr "kill syncer" -#: backend/flow/consts.py:452 -msgid "步骤强制终止中" -msgstr "The step is forcibly terminated" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:73 +msgid "被忽略的错误" +msgstr "ignored errors" -#: backend/flow/consts.py:453 -msgid "步骤强制终止成功" -msgstr "Step force terminated successfully" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:74 +msgid "sync从该时间点重新同步" +msgstr "sync resynchronizes from this point in time" -#: backend/flow/consts.py:457 -msgid "准备中" -msgstr "preparing" +#: backend/db_services/redis/redis_dts/serializers.py:29 +msgid "页码" +msgstr "page number" -#: backend/flow/consts.py:458 -msgid "运行中" -msgstr "running" +#: backend/db_services/redis/redis_dts/serializers.py:30 +msgid "每页数量" +msgstr "Quantity per page" -#: backend/flow/consts.py:459 -msgid "完成" -msgstr "Finish" +#: backend/db_services/redis/redis_dts/views.py:61 +msgid "获取DTS历史任务以及其对应task cnt" +msgstr "Get DTS historical tasks and their corresponding task cnt" -#: backend/flow/consts.py:460 -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:94 -#: backend/ticket/constants.py:66 backend/ticket/constants.py:76 -msgid "失败" -msgstr "fail" +#: backend/db_services/redis/redis_dts/views.py:83 +msgid "dts job断开同步" +msgstr "dts job disconnects synchronization" -#: backend/flow/consts.py:465 -msgid "available" -msgstr "available" +#: backend/db_services/redis/redis_dts/views.py:94 +msgid "dts job 批量失败重试" +msgstr "Dts job batch failure retry" -#: backend/flow/consts.py:467 -msgid "locked" -msgstr "locked" +#: backend/db_services/redis/redis_dts/views.py:105 +msgid "dts 外部redis连接行测试" +msgstr "dts external redis connection line test" -#: backend/flow/consts.py:471 -msgid "cluster no" -msgstr "cluster no" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:14 +msgid "module名" +msgstr "module name" -#: backend/flow/consts.py:472 -msgid "cluster yes" -msgstr "cluster yes" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:15 +msgid "so文件名" +msgstr "so file name" -#: backend/flow/consts.py:476 backend/flow/consts.py:484 -msgid "create" -msgstr "create" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:18 +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:19 +msgid "Redis module支持" +msgstr "Redis module support" -#: backend/flow/consts.py:477 -msgid "cluster_delete" -msgstr "cluster_delete" +#: backend/db_services/redis/rollback/handlers.py:50 +msgid "无法查找到在时间范围内{}-{},主机{}的全备份日志" +msgstr "Unable to find the full backup log of host {} in the time range {}-{}" -#: backend/flow/consts.py:478 -msgid "recycle_record" -msgstr "recycle_record" +#: backend/db_services/redis/rollback/handlers.py:57 +#: backend/db_services/redis/rollback/handlers.py:148 +msgid "没有找到小于时间点{}附近的备份日志记录,请检查时间点的合法性或稍后重试" +msgstr "No backup log records smaller than the time point {} were found. Please check the validity of the time point or try again later." -#: backend/flow/consts.py:479 backend/flow/consts.py:485 -msgid "update" -msgstr "update" +#: backend/db_services/redis/rollback/handlers.py:140 +msgid "大范围内的查询结果 backup_logs: {}" +msgstr "Query results in a wide range backup_logs: {}" -#: backend/flow/consts.py:480 -msgid "select" -msgstr "select" +#: backend/db_services/redis/rollback/handlers.py:146 +msgid "latest_log:{},start_time:{}" +msgstr "latest_log:{},start_time:{}" -#: backend/flow/consts.py:486 -msgid "delete" -msgstr "delete" +#: backend/db_services/redis/rollback/handlers.py:166 +msgid "backup_logs_cluster_same_batch:{}" +msgstr "backup_logs_cluster_same_batch:{}" -#: backend/flow/consts.py:490 -msgid "kibana" -msgstr "kibana" +#: backend/db_services/redis/rollback/handlers.py:205 +msgid "无法查找到在时间范围内{}-{},主机{}的binlog日志" +msgstr "Unable to find binlog logs for host {} in the time range {}-{}" -#: backend/flow/consts.py:491 -msgid "kafka_manager" -msgstr "kafka_manager" +#: backend/db_services/redis/rollback/handlers.py:238 +#: backend/db_services/redis/rollback/handlers.py:261 +msgid "binlog全部文件信息:{}" +msgstr "All binlog file information:{}" -#: backend/flow/consts.py:492 -msgid "pulsar_manager" -msgstr "pulsar_manager" +#: backend/db_services/redis/rollback/handlers.py:240 +msgid "节点{}:{}的kvstore:{}的binlog 数少于2,不符合预期,请检查error日志" +msgstr "The number of binlogs of kvstore:{} of node {}:{} is less than 2, which is not as expected. Please check the error log." -#: backend/flow/consts.py:493 -msgid "ha_proxy" -msgstr "ha_proxy" +#: backend/db_services/redis/rollback/handlers.py:262 +msgid "节点{}:{}的binlog 数少于2,不符合预期,请检查error日志" +msgstr "The number of binlogs of node {}:{} is less than 2, which is not as expected. Please check the error log." -#: backend/flow/consts.py:497 -msgid "KIBANA_PORT" -msgstr "KIBANA_PORT" +#: backend/db_services/redis/rollback/handlers.py:305 +msgid "文件序号重复: {},文件重复: {}" +msgstr "Duplicate file serial number: {}, Duplicate file: {}" -#: backend/flow/consts.py:498 -msgid "KAFKA_MANAGER_PORT" -msgstr "KAFKA_MANAGER_PORT" +#: backend/db_services/redis/rollback/handlers.py:309 +msgid "缺失时打印当前文件:{}和上一个文件: {}" +msgstr "If missing, print current file: {} and previous file: {}" -#: backend/flow/consts.py:508 -msgid "proxy默认实例个数" -msgstr "The number of proxy default instances" +#: backend/db_services/redis/rollback/handlers.py:357 +msgid "" +"无法找到filter:{}小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "Unable to find log records near filter:{} less than time point {}. Please check the validity of the time point or try again later." -#: backend/flow/consts.py:509 -msgid "redis角色数" -msgstr "Number of redis roles" +#: backend/db_services/redis/rollback/handlers.py:366 +msgid "" +"无法找到filter:{}大于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "Unable to find log records where filter:{} is greater than time point {}. Please check the validity of the time point or try again later." + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:10 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:10 +msgid "单据号,关联单据" +msgstr "Document number, associated document" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:11 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:11 +msgid "业务id" +msgstr "business id" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:16 +msgid "构造源集群类型" +msgstr "Construct source cluster type" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:18 +msgid "构造的源集群,线上环境cluster" +msgstr "Constructed source cluster, online environment cluster" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:19 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:18 +msgid "集群id,cluster.id" +msgstr "Cluster id, cluster.id" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:20 +msgid "源构造的实例范围" +msgstr "Instance scope of source construct" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:23 +msgid "临时集群类型" +msgstr "Temporary cluster type" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:25 +msgid "临时集群proxy密码base64值" +msgstr "Temporary cluster proxy password base64 value" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:26 +msgid "临时集群构造实例范围" +msgstr "Temporary cluster construction instance scope" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:27 +msgid "构造产物访问入口ip:port" +msgstr "Configure product access entrance ip:port" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:29 +msgid "构造源实例和临时实例一一对应关系" +msgstr "Construct a one-to-one correspondence between the source instance and the temporary instance" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:40 +msgid "销毁状态" +msgstr "Destroyed state" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:42 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:42 +msgid "规格需求" +msgstr "Specification requirements" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:43 +msgid "构造的主机数量" +msgstr "Number of hosts constructed" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:44 +msgid "构造到指定时间" +msgstr "Construct to specified time" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:45 +msgid "临时集群redis密码base64值" +msgstr "Temporary cluster redis password base64 value" + +#: backend/db_services/redis/rollback/serializers.py:36 +#: backend/db_services/redis/toolbox/serializers.py:178 +#: backend/db_services/redis/toolbox/serializers.py:185 +msgid "集群id" +msgstr "cluster id" + +#: backend/db_services/redis/rollback/serializers.py:37 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:36 +msgid "master实例列表" +msgstr "master instance list" + +#: backend/db_services/redis/rollback/serializers.py:38 +msgid "构造时间" +msgstr "Construction time" + +#: backend/db_services/redis/rollback/views.py:72 +msgid "构造时间合法性检查" +msgstr "Construction time legality check" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:22 +msgid "扩缩容前实例主从对" +msgstr "Instance master-slave pair before expansion and contraction" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:23 +msgid "扩缩容后实例主从对" +msgstr "Instance master-slave pair after expansion and contraction" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:25 +msgid "扩容新增实例主从对" +msgstr "Expanding capacity and adding new instance master-slave pair" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:27 +msgid "缩容下架实例主从对" +msgstr "Scale down and remove instance master-slave pair" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:28 +msgid "扩缩容前的主机数量" +msgstr "Number of hosts before expansion and contraction" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:29 +msgid "扩缩容后的主机数量" +msgstr "Number of hosts after expansion and contraction" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:31 +msgid "扩容时新增的主从主机" +msgstr "New master and slave hosts added during capacity expansion" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:34 +msgid "特定slots迁移信息" +msgstr "Specific slots migration information" + +#: backend/db_services/redis/toolbox/serializers.py:20 +msgid "集群id/name/domain列表" +msgstr "Cluster id/name/domain list" + +#: backend/db_services/redis/toolbox/serializers.py:187 +msgid "limit" +msgstr "limit" + +#: backend/db_services/redis/toolbox/serializers.py:188 +msgid "offset" +msgstr "offset" + +#: backend/db_services/redis/toolbox/serializers.py:219 +msgid "集群节点类型" +msgstr "Cluster node type" + +#: backend/db_services/redis/toolbox/serializers.py:220 +msgid "请求版本类型" +msgstr "Request version type" + +#: backend/db_services/redis/toolbox/serializers.py:225 +msgid "存储版本" +msgstr "Store version" + +#: backend/db_services/redis/toolbox/serializers.py:226 +msgid "新规格ID" +msgstr "New specification ID" + +#: backend/db_services/redis/toolbox/serializers.py:227 +msgid "申请机器组数量" +msgstr "Number of machine groups to apply for" + +#: backend/db_services/redis/toolbox/serializers.py:228 +msgid "新的分片数量" +msgstr "New number of shards" + +#: backend/db_services/redis/toolbox/views.py:41 +msgid "根据IP/实例查询关联对" +msgstr "Query related pairs based on IP/instance" + +#: backend/db_services/redis/toolbox/views.py:52 +msgid "查询集群下的主机列表" +msgstr "Query the host list under the cluster" + +#: backend/db_services/redis/toolbox/views.py:64 +msgid "根据cluster_id查询主从关系对" +msgstr "Query the master-slave relationship pair based on cluster_id" + +#: backend/db_services/redis/toolbox/views.py:74 +msgid "查询集群版本信息" +msgstr "Query cluster version information" + +#: backend/db_services/redis/toolbox/views.py:88 +msgid "获取集群容量变更所需信息" +msgstr "Obtain information required for cluster capacity changes" + +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "构造 DB 名称" +msgstr "Construct DB name" -#: backend/flow/consts.py:513 -msgid "DB安装目录" -msgstr "DB installation directory" +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "构造后 DB 名称" +msgstr "DB name after construction" -#: backend/flow/consts.py:517 -msgid "gcs 安装路径" -msgstr "gcs installation path" +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "已存在的 DB" +msgstr "Existing DB" -#: backend/flow/consts.py:518 -msgid "key生命周期路径" -msgstr "key lifecycle path" +#: backend/db_services/sqlserver/cluster/handlers.py:77 +msgid "导入的源DB不与集群DB匹配,请检查excel数据" +msgstr "The imported source DB does not match the cluster DB, please check the excel data" -#: backend/flow/consts.py:522 -msgid "truncate_table" -msgstr "truncate_table" +#: backend/db_services/sqlserver/cluster/serializers.py:19 +#: backend/db_services/sqlserver/cluster/serializers.py:47 +msgid "忽略db列表" +msgstr "Ignore db list" + +#: backend/db_services/sqlserver/cluster/serializers.py:29 +#: backend/db_services/sqlserver/rollback/serializers.py:73 +msgid "构造DB的excel文件" +msgstr "Construct DB excel file" + +#: backend/db_services/sqlserver/cluster/serializers.py:30 +#: backend/db_services/sqlserver/rollback/serializers.py:74 +msgid "db列表(逗号分隔)" +msgstr "db list (comma separated)" -#: backend/flow/consts.py:523 -msgid "drop_database" -msgstr "drop_database" +#: backend/db_services/sqlserver/cluster/serializers.py:31 +#: backend/db_services/sqlserver/rollback/serializers.py:75 +msgid "忽略db列表(逗号分割)" +msgstr "Ignore db list (comma separated)" -#: backend/flow/consts.py:524 -msgid "drop_table" -msgstr "drop_table" +#: backend/db_services/sqlserver/cluster/views.py:39 +msgid "通过库表匹配查询db" +msgstr "Query db through database table matching" -#: backend/flow/consts.py:547 -msgid "TendataModuleDefault" -msgstr "TendataModuleDefault" +#: backend/db_services/sqlserver/cluster/views.py:50 +msgid "通过库表匹配批量查询db" +msgstr "Query db in batches through database table matching" -#: backend/flow/consts.py:551 backend/ticket/builders/common/constants.py:38 -msgid "hot" -msgstr "hot" +#: backend/db_services/sqlserver/cluster/views.py:61 +msgid "判断库名是否在集群存在" +msgstr "Determine whether the library name exists in the cluster" -#: backend/flow/consts.py:552 backend/ticket/builders/common/constants.py:39 -msgid "cold" -msgstr "cold" +#: backend/db_services/sqlserver/cluster/views.py:72 +msgid "导入构造DB数据" +msgstr "Import constructed DB data" -#: backend/flow/consts.py:553 backend/ticket/builders/common/constants.py:40 -msgid "client" -msgstr "client" +#: backend/db_services/sqlserver/data_migrate/serializers.py:27 +msgid "请保证单据类型是[SQLServer 增量迁移]" +msgstr "Please ensure that the document type is [SQLServer Incremental Migration]" -#: backend/flow/consts.py:558 -msgid "redis key删除正则方式" -msgstr "Redis key deletion regular method" +#: backend/db_services/sqlserver/data_migrate/serializers.py:29 +msgid "请保证迁移模式是[增量备份迁移]" +msgstr "Please ensure that the migration mode is [Incremental backup migration]" -#: backend/flow/consts.py:559 -msgid "redis key删除文件方式" -msgstr "Redis key delete file method" +#: backend/db_services/sqlserver/data_migrate/serializers.py:43 +msgid "迁移记录{}不存在" +msgstr "Migration record {} does not exist" -#: backend/flow/consts.py:563 -msgid "get" -msgstr "get" +#: backend/db_services/sqlserver/data_migrate/views.py:40 +msgid "手动断开同步" +msgstr "Disconnect sync manually" -#: backend/flow/consts.py:564 -msgid "release" -msgstr "release" +#: backend/db_services/sqlserver/data_migrate/views.py:52 +msgid "强制终止" +msgstr "Forced termination" -#: backend/flow/consts.py:568 -msgid "覆盖写入上下文变量" -msgstr "overwriting context variables" +#: backend/db_services/sqlserver/data_migrate/views.py:63 +msgid "获取迁移记录" +msgstr "Get migration records" -#: backend/flow/consts.py:569 -msgid "追加写入上下文变量" -msgstr "append to context variable" +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:66 +msgid "不存在集群:{}" +msgstr "Cluster does not exist: {}" -#: backend/flow/consts.py:573 -msgid "install-supervisor" -msgstr "install-supervisor" +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:24 +msgid "sqlserver账户规则" +msgstr "sqlserver account rules" -#: backend/flow/consts.py:574 -msgid "render-config" -msgstr "render-config" +#: backend/db_services/sqlserver/rollback/handlers.py:173 +msgid "集群【{}】最近的{}天里找不到日志备份" +msgstr "Cluster [{}] cannot find log backup in the last {} days" -#: backend/flow/consts.py:577 -msgid "install-zookeeper" -msgstr "install-zookeeper" +#: backend/db_services/sqlserver/rollback/handlers.py:194 +msgid "" +"请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取到无关联的日志备份记录[{}]" +msgstr "Please contact the system administrator to recover the unrelated log backup records [{}] pulled from the database [{}] of the cluster [{}]" -#: backend/flow/consts.py:578 -msgid "install-journalnode" -msgstr "install-journalnode" +#: backend/db_services/sqlserver/rollback/handlers.py:212 +msgid "" +"请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取的日志备份存在不连续的情况:" +"the first_lsn [{}]:[{}]; the last_lsn [{}]:[{}]\n" +msgstr "Please contact the system administrator to restore the log backup pulled from the database [{}] of the cluster [{}]. There are discontinuities: the first_lsn [{}]:[{}]; the last_lsn [{}]:[ {}]\n" -#: backend/flow/consts.py:579 -msgid "install-nn1" -msgstr "install-nn1" +#: backend/db_services/sqlserver/rollback/serializers.py:47 +msgid "库匹配模式" +msgstr "library matching pattern" -#: backend/flow/consts.py:580 -msgid "install-nn2" -msgstr "install-nn2" +#: backend/db_services/sqlserver/rollback/serializers.py:48 +msgid "忽略库匹配模式" +msgstr "Ignore library matching pattern" -#: backend/flow/consts.py:581 -msgid "install-dn" -msgstr "install-dn" +#: backend/db_services/sqlserver/rollback/serializers.py:49 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:53 +msgid "备份记录" +msgstr "Backup records" -#: backend/flow/consts.py:582 -msgid "install-zkfc" -msgstr "install-zkfc" +#: backend/db_services/sqlserver/rollback/serializers.py:54 +msgid "请输入备份记录或者备份时间来查询操作库表" +msgstr "Please enter the backup record or backup time to query the operation database table" -#: backend/flow/consts.py:583 -msgid "install-telegraf" -msgstr "install-telegraf" +#: backend/db_services/sqlserver/rollback/serializers.py:60 +msgid "只能选取回滚近15天的时间" +msgstr "You can only choose to roll back the last 15 days" -#: backend/flow/consts.py:584 -msgid "install-haproxy" -msgstr "install-haproxy" +#: backend/db_services/sqlserver/rollback/serializers.py:77 +msgid "备份记录(json转义)" +msgstr "Backup record (json escape)" -#: backend/flow/consts.py:585 -msgid "update-hosts" -msgstr "update-hosts" +#: backend/db_services/sqlserver/rollback/serializers.py:82 +msgid "请保证输入回档信息" +msgstr "Please make sure to enter the rollback information" -#: backend/flow/consts.py:586 -msgid "stop-process" -msgstr "stop-process" +#: backend/db_services/sqlserver/rollback/views.py:43 +msgid "查询集群备份记录" +msgstr "Query cluster backup records" -#: backend/flow/consts.py:587 -msgid "start-component" -msgstr "start-component" +#: backend/db_services/sqlserver/rollback/views.py:57 +msgid "根据回档时间集群最近备份记录" +msgstr "The latest backup records of the cluster based on the rollback time" -#: backend/flow/consts.py:588 -msgid "clean-data" -msgstr "clean-data" +#: backend/db_services/sqlserver/rollback/views.py:73 +msgid "根据备份记录和库匹配模式查询操作库" +msgstr "Query the operation library based on backup records and library matching patterns" -#: backend/flow/consts.py:589 -msgid "dfs-host" -msgstr "dfs-host" +#: backend/db_services/sqlserver/rollback/views.py:85 +msgid "导入构造DB数据(备份信息校验)" +msgstr "Import structural DB data (backup information verification)" -#: backend/flow/consts.py:600 backend/ticket/builders/common/constants.py:45 -msgid "namenode" -msgstr "namenode" +#: backend/db_services/sqlserver/sql_import/views.py:34 +msgid "sql文件导入" +msgstr "sql file import" -#: backend/flow/consts.py:601 backend/ticket/builders/common/constants.py:44 -msgid "datanode" -msgstr "datanode" +#: backend/db_services/sqlserver/sql_import/views.py:44 +msgid "sqlserver语法检查" +msgstr "sqlserver syntax check" -#: backend/flow/consts.py:602 -msgid "journalnode" -msgstr "journalnode" +#: backend/db_services/taskflow/exceptions.py:18 +msgid "任务流程模块异常" +msgstr "Task process module exception" -#: backend/flow/consts.py:604 -msgid "zkfc" -msgstr "zkfc" +#: backend/db_services/taskflow/exceptions.py:23 +msgid "重试节点异常" +msgstr "retry node exception" -#: backend/flow/consts.py:608 backend/ticket/builders/common/constants.py:54 -msgid "bookkeeper" -msgstr "bookkeeper" +#: backend/db_services/taskflow/exceptions.py:28 +msgid "回调节点异常" +msgstr "callback node exception" -#: backend/flow/consts.py:615 -msgid "常规备份" -msgstr "regular backup" +#: backend/db_services/taskflow/exceptions.py:33 +msgid "跳过节点异常" +msgstr "skip node exception" -#: backend/flow/consts.py:616 -msgid "长期备份" -msgstr "long-term backup" +#: backend/db_services/taskflow/exceptions.py:38 +msgid "强制失败节点异常" +msgstr "Force failure node exception" -#: backend/flow/consts.py:620 -msgid "KAFKA_REPLACE" -msgstr "KAFKA_REPLACE" +#: backend/db_services/taskflow/exceptions.py:43 +msgid "撤销流程异常" +msgstr "Abnormal cancellation process" -#: backend/flow/consts.py:621 -msgid "KAFKA_SCALE_UP" -msgstr "KAFKA_SCALE_UP" +#: backend/db_services/taskflow/handlers.py:58 +msgid "pipeline未创建,仅更新FlowTree" +msgstr "pipeline is not created, only FlowTree is updated" -#: backend/flow/consts.py:625 -msgid "INFLUXDB_REPLACE" -msgstr "INFLUXDB_REPLACE" +#: backend/db_services/taskflow/handlers.py:101 +msgid "人工强制失败" +msgstr "Manual forced failure" -#: backend/flow/consts.py:629 -msgid "逻辑备份" -msgstr "logical backup" +#: backend/db_services/taskflow/handlers.py:206 +msgid "节点尚未运行,请稍后查看" +msgstr "The node is not running yet, please check later" -#: backend/flow/consts.py:630 -msgid "物理备份" -msgstr "physical backup" +#: backend/db_services/taskflow/handlers.py:208 +msgid "节点日志仅保留7天" +msgstr "Node logs are only kept for 7 days" -#: backend/flow/consts.py:634 -msgid "全备-保留25天" -msgstr "Fully Prepared - Reserved for 25 days" +#: backend/db_services/taskflow/handlers.py:240 +msgid "日志上报中,请稍后查看" +msgstr "The log is being reported, please check it later" -#: backend/flow/consts.py:635 -msgid "长久存储-保留三年" -msgstr "Long-term storage - keep for three years" +#: backend/db_services/taskflow/serializers.py:21 +#: backend/ticket/serializers.py:91 +msgid "单据类型名称" +msgstr "ticket type name" -#: backend/flow/consts.py:643 -msgid "Mysql的进程名称" -msgstr "Mysql process name" +#: backend/db_services/taskflow/serializers.py:22 +#: backend/ticket/serializers.py:93 backend/ticket/serializers.py:138 +#: backend/ticket/serializers.py:215 +msgid "耗时" +msgstr "time consuming" -#: backend/flow/consts.py:644 -msgid "Mysql-proxy进程名称" -msgstr "Mysql-proxy process name" +#: backend/db_services/taskflow/serializers.py:48 backend/flow/models.py:43 +msgid "节点ID" +msgstr "Node ID" -#: backend/flow/consts.py:645 -msgid "ES的进程名称" -msgstr "ES process name" +#: backend/db_services/taskflow/serializers.py:56 +msgid "回调描述" +msgstr "callback description" -#: backend/flow/consts.py:646 -msgid "HDFS-NameNode的进程名称" -msgstr "HDFS-NameNode process name" +#: backend/db_services/taskflow/serializers.py:60 backend/flow/models.py:24 +#: backend/flow/models.py:42 +msgid "流程ID" +msgstr "Process ID" -#: backend/flow/consts.py:647 -msgid "HDFS-DataNode的进程名称" -msgstr "HDFS-DataNode process name" +#: backend/db_services/taskflow/serializers.py:62 +msgid "是否严格匹配列名" +msgstr "Whether to strictly match column names" -#: backend/flow/consts.py:648 -msgid "Pulsar的进程名称" -msgstr "Pulsar process name" +#: backend/db_services/taskflow/serializers.py:66 +msgid "版本ID" +msgstr "version ID" -#: backend/flow/consts.py:656 -msgid "远程备份+时间" -msgstr "remote backup + time" +#: backend/db_services/taskflow/serializers.py:67 +msgid "是否下载日志" +msgstr "Whether to download logs" -#: backend/flow/consts.py:657 -msgid "远程备份+备份ID" -msgstr "Remote Backup + Backup ID" +#: backend/db_services/taskflow/task.py:74 +msgid "自动重试次数已超过最大重试次数{}, 请重新手动重试" +msgstr "" +"The number of automatic retries has exceeded the maximum number of retries " +"{}, please try again manually" -#: backend/flow/consts.py:658 -msgid "本地备份+时间" -msgstr "local backup + time" +#: backend/db_services/taskflow/task.py:93 +msgid "存在执行互斥,正在进行重试,当前重试次数为{}" +msgstr "" +"There is an execution mutex, and retrying is in progress, and the current " +"number of retries is {}" -#: backend/flow/consts.py:659 -msgid "本地备份+备份ID" -msgstr "Local backup + backup ID" +#: backend/db_services/taskflow/task.py:96 +msgid "执行互斥错误信息: {}" +msgstr "Execution mutex error message: {}" -#: backend/flow/consts.py:667 -msgid "手动单据发起" -msgstr "Manual ticket initiation" +#: backend/db_services/taskflow/task.py:103 +msgid "存在执行互斥将自动进行重试..." +msgstr "Execution mutexes will automatically be retried..." -#: backend/flow/consts.py:668 -msgid "例行校验单据发起" -msgstr "Routine verification ticket initiation" +#: backend/db_services/taskflow/task.py:113 +msgid "重试成功" +msgstr "successful retry" -#: backend/flow/consts.py:674 -msgid "ms" -msgstr "ms" +#: backend/db_services/taskflow/task.py:162 +msgid "未开启bamboo数据清理,跳过..." +msgstr "Bamboo data cleaning is not enabled, skip..." -#: backend/flow/consts.py:684 -msgid "redis slot分隔符" -msgstr "redis slot separator" +#: backend/db_services/taskflow/task.py:168 +msgid "开始清理时间{}前的bamboo数据" +msgstr "Start cleaning bamboo data before {}" -#: backend/flow/consts.py:685 -msgid "redis slot导入分隔符" -msgstr "redis slot import delimiter" +#: backend/db_services/taskflow/task.py:174 +msgid "没有需要清理的bamboo数据,跳过..." +msgstr "There is no bamboo data that needs to be cleaned, skip..." -#: backend/flow/consts.py:686 -msgid "redis slot迁移分隔符" -msgstr "redis slot migration delimiter" +#: backend/db_services/taskflow/task.py:180 +msgid "{}数据清理..." +msgstr "{}Data cleaning..." -#: backend/flow/consts.py:694 -msgid "redis min slot" -msgstr "redis min slot" +#: backend/db_services/taskflow/task.py:185 +msgid "bamboo数据清理成功" +msgstr "Bamboo data cleaning successful" -#: backend/flow/consts.py:695 -msgid "redis max slot" -msgstr "redis max slot" +#: backend/db_services/taskflow/task.py:187 +msgid "bamboo数据清理失败,错误原因: {}" +msgstr "Bamboo data cleanup failed, error reason: {}" -#: backend/flow/consts.py:696 -msgid "redis total slot" -msgstr "redis total slot" +#: backend/db_services/taskflow/views/flow.py:77 +msgid "任务列表" +msgstr "task list" -#: backend/flow/consts.py:704 -msgid "redis PFAIL state" -msgstr "redis PFAIL state" +#: backend/db_services/taskflow/views/flow.py:96 +msgid "任务详情" +msgstr "Task details" -#: backend/flow/consts.py:705 -msgid "redis fail state" -msgstr "redis fail state" +#: backend/db_services/taskflow/views/flow.py:126 +msgid "撤销流程" +msgstr "Rollback process" -#: backend/flow/consts.py:706 -msgid "redis handshake state" -msgstr "redis handshake state" +#: backend/db_services/taskflow/views/flow.py:135 +msgid "重试节点" +msgstr "retry node" -#: backend/flow/consts.py:707 -msgid "redis noaddr state" -msgstr "redis noaddr state" +#: backend/db_services/taskflow/views/flow.py:149 +msgid "批量重试" +msgstr "Batch retry" -#: backend/flow/consts.py:708 -msgid "redis noflags state" -msgstr "redis noflags state" +#: backend/db_services/taskflow/views/flow.py:159 +msgid "跳过节点" +msgstr "skip node" -#: backend/flow/consts.py:716 -msgid "redis master role" -msgstr "redis master role" +#: backend/db_services/taskflow/views/flow.py:169 +msgid "强制失败节点" +msgstr "force failure node" -#: backend/flow/consts.py:717 -msgid "redis slave role" -msgstr "redis slave role" +#: backend/db_services/taskflow/views/flow.py:179 +msgid "节点版本列表" +msgstr "List of node versions" -#: backend/flow/consts.py:718 -msgid "redis unknown role" -msgstr "redis unknown role" +#: backend/db_services/taskflow/views/flow.py:190 +msgid "节点日志" +msgstr "node log" -#: backend/flow/consts.py:726 -msgid "redis master link status up" -msgstr "redis master link status up" +#: backend/db_services/taskflow/views/flow.py:212 +msgid "回调节点" +msgstr "callback node" -#: backend/flow/consts.py:727 -msgid "redis master link status down" -msgstr "redis master link status down" +#: backend/db_services/taskflow/views/flow.py:227 +msgid "流程Excel文件下载" +msgstr "Process Excel file download" -#: backend/flow/consts.py:728 -msgid "redis ssd incrSync state" -msgstr "redis ssd incrSync state" +#: backend/db_services/taskflow/views/flow.py:237 +msgid "获取root_id缓存数据失败" +msgstr "Failed to obtain root_id cache data" -#: backend/flow/consts.py:729 -msgid "redis ssd REPL_FOLLOW state" -msgstr "redis ssd REPL_FOLLOW state" +#: backend/db_services/taskflow/views/redis.py:57 +msgid "结果文件列表" +msgstr "Result file list" -#: backend/flow/consts.py:730 -msgid "redis connected status" -msgstr "redis connected status" +#: backend/db_services/user/serializers.py:16 +msgid "模糊搜索" +msgstr "fuzzy search" -#: backend/flow/consts.py:731 -msgid "redis disconnected status" -msgstr "redis disconnected status" +#: backend/db_services/user/serializers.py:17 +msgid "精确搜索" +msgstr "Exact search" -#: backend/flow/consts.py:739 -msgid "" -"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" +#: backend/db_services/user/serializers.py:19 +msgid "不分页,即将下架,请不要使用,并尽快迁移" msgstr "" -"redis cluster state ok, all slots are covered. Obtained by cluster info " -"command" +"No pagination, it will be discontinued soon, please do not use it, and " +"migrate as soon as possible" -#: backend/flow/consts.py:740 -msgid "" -"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" -msgstr "" -"redis cluster state fail, not all slots are covered. Obtained through the " -"cluster info command" +#: backend/db_services/version/constants.py:24 +msgid "MySQL-5.6" +msgstr "MySQL-5.6" -#: backend/flow/consts.py:749 -msgid "tdbctl" -msgstr "tdbctl" +#: backend/db_services/version/constants.py:25 +msgid "MySQL-5.7" +msgstr "MySQL-5.7" -#: backend/flow/engine/bamboo/engine.py:245 -msgid "获取流程失败" -msgstr "Get process failed" +#: backend/db_services/version/constants.py:26 +msgid "MySQL-8.0" +msgstr "MySQL-8.0" -#: backend/flow/engine/bamboo/engine.py:248 -msgid "获取流程节点失败" -msgstr "Failed to get process node" +#: backend/db_services/version/constants.py:32 +msgid "Spider-1" +msgstr "Spider-1" -#: backend/flow/engine/bamboo/engine.py:251 -msgid "获取节点运行版本失败" -msgstr "Failed to get node running version" +#: backend/db_services/version/constants.py:33 +msgid "Spider-3" +msgstr "Spider-3" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:127 -msgid "下发{}可执行文件包" -msgstr "Deliver {} executable file package" +#: backend/db_services/version/constants.py:34 +msgid "Spider-3.6" +msgstr "Spider-3.6" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:136 -msgid "部署{}服务进程" -msgstr "Deploy {} service process" +#: backend/db_services/version/constants.py:35 +msgid "Spider-3.7" +msgstr "Spider-3.7" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:185 -msgid "下发{}配置文件" -msgstr "Send {} configuration file" +#: backend/db_services/version/constants.py:36 +msgid "Spider-3.8" +msgstr "Spider-3.8" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:311 -msgid "存量集群的权限更新" -msgstr "Permission update for existing clusters" +#: backend/db_services/version/constants.py:42 +msgid "Redis-2" +msgstr "Redis-2" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:339 -msgid "更新服务元信息" -msgstr "Update service meta information" +#: backend/db_services/version/constants.py:43 +msgid "Redis-3" +msgstr "Redis-3" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:364 -msgid "裁撤{}的服务" -msgstr "Cancel {} service" +#: backend/db_services/version/constants.py:44 +msgid "Redis-4" +msgstr "Redis-4" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:387 -msgid "重启nginx服务" -msgstr "Restart the nginx service" +#: backend/db_services/version/constants.py:45 +msgid "Redis-4t" +msgstr "Redis-4t" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:40 -msgid "主机{}部署gm服务" -msgstr "Host{} deploys gm service" +#: backend/db_services/version/constants.py:46 +msgid "Redis-4.0.9" +msgstr "Redis-4.0.9" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:59 -msgid "主机{}部署agent服务" -msgstr "Host {} deploys the agent service" +#: backend/db_services/version/constants.py:47 +msgid "Redis-5" +msgstr "Redis-5" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:76 -msgid "部署dbha-gm服务" -msgstr "Deploy dbha-gm service" +#: backend/db_services/version/constants.py:48 +msgid "Redis-6" +msgstr "Redis-6" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:82 -msgid "部署dbha-agent服务" -msgstr "Deploy dbha-agent service" +#: backend/db_services/version/constants.py:49 +msgid "Redis-7" +msgstr "Redis-7" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:46 -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:75 -msgid "主机{}部署dns服务" -msgstr "Host{} deploys dns service" +#: backend/db_services/version/constants.py:50 +msgid "Redis-7.2" +msgstr "Redis-7.2" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:50 -msgid "部署dns服务" -msgstr "Deploy dns service" +#: backend/db_services/version/constants.py:56 +msgid "Mongodb-4" +msgstr "Mongodb-4" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:65 -msgid "对存量机器的nameserver刷新" -msgstr "Refresh the nameserver of the stock machine" +#: backend/db_services/version/constants.py:62 +msgid "Tendisplus-2.5" +msgstr "Tendisplus-2.5" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:154 -msgid "部署新dns服务流程" -msgstr "Deploy new dns service process" +#: backend/db_services/version/constants.py:63 +msgid "Tendisplus-2.6" +msgstr "Tendisplus-2.6" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:173 -msgid "裁撤旧dns服务流程" -msgstr "Abolish the old dns service process" +#: backend/db_services/version/constants.py:64 +msgid "Tendisplus-2.7" +msgstr "Tendisplus-2.7" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:34 -msgid "部署" -msgstr "deploy" +#: backend/db_services/version/constants.py:70 +msgid "TendisSSD-1.2" +msgstr "TendisSSD-1.2" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:43 -msgid "主机{}部署drs服务" -msgstr "host{} deploy drs service" +#: backend/db_services/version/constants.py:71 +msgid "TendisSSD-1.3" +msgstr "TendisSSD-1.3" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:47 -msgid "{}drs服务" -msgstr "{}drs service" +#: backend/db_services/version/constants.py:77 +msgid "TwemproxyLatest" +msgstr "TwemproxyLatest" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:75 -msgid "重装" -msgstr "reinstall" +#: backend/db_services/version/constants.py:83 +msgid "PredixyLatest" +msgstr "PredixyLatest" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:83 -msgid "安装" -msgstr "Install" +#: backend/db_services/version/constants.py:91 +msgid "2008企业版" +msgstr "2008 Enterprise Edition" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:153 -msgid "部署新drs服务" -msgstr "Deploy new drs service" +#: backend/db_services/version/constants.py:92 +msgid "2012企业版" +msgstr "2012 Enterprise Edition" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:187 -msgid "裁撤旧drs服务" +#: backend/db_services/version/constants.py:93 +msgid "2014企业版" +msgstr "2014 Enterprise Edition" + +#: backend/db_services/version/constants.py:94 +msgid "2016企业版" +msgstr "2016 Enterprise Edition" + +#: backend/db_services/version/constants.py:95 +msgid "2017企业版" +msgstr "2017 Enterprise Edition" + +#: backend/db_services/version/constants.py:96 +msgid "2019企业版" +msgstr "2019 Enterprise Edition" + +#: backend/db_services/version/constants.py:97 +msgid "2022企业版" +msgstr "2022 Enterprise Edition" + +#: backend/db_services/version/views.py:29 +msgid "查询所有数据库的版本列表" +msgstr "Query the version list of all databases" + +#: backend/db_services/version/views.py:39 +#: backend/db_services/version/views.py:52 +msgid "查询数据库版本列表" +msgstr "Query the list of database versions" + +#: backend/db_services/version/views.py:65 +msgid "根据sqlserver部署版本查询可支持的系统版本" +msgstr "Query the supported system version based on the sqlserver deployment version" + +#: backend/dbm_init/management/commands/cloud_component.py:37 +msgid "云区域组件初始化失败,错误信息:{}" +msgstr "Cloud zone component initialization failed, error message: {}" + +#: backend/dbm_tools/management/commands/fix_process_ip.py:23 +msgid "修改指定模块的服务实例进程绑定的ip" +msgstr "Modify the IP bound to the service instance process of the specified module" + +#: backend/dbm_tools/management/commands/fix_process_ip.py:27 +msgid "目标端口" +msgstr "target port" + +#: backend/dbm_tools/management/commands/fix_process_ip.py:28 +msgid "目标ip" +msgstr "target ip" + +#: backend/dbm_tools/management/commands/fix_process_ip.py:29 +msgid "替换方式" +msgstr "Replacement method" + +#: backend/dbm_tools/management/commands/fix_resource_pool.py:27 +msgid "清理资源池主机" +msgstr "Clean up the resource pool host" + +#: backend/dbm_tools/management/commands/fix_resource_pool.py:30 +msgid "资源池模块ID" +msgstr "Resource pool module ID" + +#: backend/exceptions.py:53 +msgid "系统异常" +msgstr "System exception" + +#: backend/exceptions.py:108 +msgid "系统错误" +msgstr "system error" + +#: backend/exceptions.py:118 +msgid "参数验证失败" +msgstr "Parameter validation failed" + +#: backend/exceptions.py:123 +msgid "远程服务请求结果异常" +msgstr "The result of the remote service request is abnormal" + +#: backend/exceptions.py:128 +msgid "组件调用异常" +msgstr "Component call exception" + +#: backend/exceptions.py:133 +msgid "业务不存在" +msgstr "business does not exist" + +#: backend/exceptions.py:138 +msgid "语言不支持" +msgstr "language not supported" + +#: backend/exceptions.py:143 +msgid "权限不足" +msgstr "Insufficient permissions" + +#: backend/exceptions.py:170 +msgid "服务不稳定,请检查组件健康状况" +msgstr "The service is unstable, please check the component health status" + +#: backend/flow/consts.py:159 +msgid "创建态" +msgstr "creation state" + +#: backend/flow/consts.py:160 +msgid "准备态" +msgstr "ready state" + +#: backend/flow/consts.py:161 +msgid "运行态" +msgstr "running state" + +#: backend/flow/consts.py:162 +msgid "暂停态" +msgstr "pause state" + +#: backend/flow/consts.py:163 +msgid "闭塞态" +msgstr "Blocked state" + +#: backend/flow/consts.py:164 +msgid "完成态" +msgstr "Completion" + +#: backend/flow/consts.py:165 +msgid "失败态" +msgstr "failure state" + +#: backend/flow/consts.py:166 +msgid "取消态" +msgstr "cancel state" + +#: backend/flow/consts.py:167 +msgid "已过期" +msgstr "Expired" + +#: backend/flow/consts.py:189 +msgid "共用参数" +msgstr "Shared parameters" + +#: backend/flow/consts.py:190 +msgid "redis共用参数" +msgstr "redis shared parameters" + +#: backend/flow/consts.py:191 +msgid "TenDBHA" +msgstr "TenDBHA" + +#: backend/flow/consts.py:192 +msgid "RedisCache 主从版" +msgstr "RedisCache master-slave version" + +#: backend/flow/consts.py:193 +msgid "twemproxy + RedisInstance架构" +msgstr "twemproxy + RedisInstance architecture" + +#: backend/flow/consts.py:194 +msgid "predixy + tendisplus架构" +msgstr "predixy + tendisplus architecture" + +#: backend/flow/consts.py:195 +msgid "Es" +msgstr "Es" + +#: backend/flow/consts.py:196 +msgid "tendb" +msgstr "tendb" + +#: backend/flow/consts.py:198 +msgid "Hdfs" +msgstr "Hdfs" + +#: backend/flow/consts.py:200 +msgid "Influxdb" +msgstr "Influxdb" + +#: backend/flow/consts.py:201 +msgid "tendbcluster" +msgstr "tendbcluster" + +#: backend/flow/consts.py:203 +msgid "mongodbcommon" +msgstr "mongodbcommon" + +#: backend/flow/consts.py:209 +msgid "初始化帐户" +msgstr "Initialize account" + +#: backend/flow/consts.py:210 +msgid "实例和帐户" +msgstr "instance and account" + +#: backend/flow/consts.py:211 +msgid "系统配置" +msgstr "System Configuration" + +#: backend/flow/consts.py:212 +msgid "实例配置" +msgstr "instance configuration" + +#: backend/flow/consts.py:213 backend/flow/consts.py:239 +msgid "默认配置" +msgstr "default allocation" + +#: backend/flow/consts.py:214 +msgid "proxyconfig" +msgstr "proxyconfig" + +#: backend/flow/consts.py:215 +msgid "ES实例配置" +msgstr "ES instance configuration" + +#: backend/flow/consts.py:216 +msgid "act配置" +msgstr "act configuration" + +#: backend/flow/consts.py:217 +msgid "系统配置类型" +msgstr "system configuration type" + +#: backend/flow/consts.py:218 +msgid "Kafka实例配置" +msgstr "Kafka instance configuration" + +#: backend/flow/consts.py:219 +msgid "HDFS集群配置" +msgstr "HDFS cluster configuration" + +#: backend/flow/consts.py:220 +msgid "HDFS实例hdfs-site配置" +msgstr "HDFS instance hdfs-site configuration" + +#: backend/flow/consts.py:221 +msgid "HDFS实例core-site配置" +msgstr "HDFS instance core-site configuration" + +#: backend/flow/consts.py:222 +msgid "HDFS实例安装配置" +msgstr "HDFS instance installation configuration" + +#: backend/flow/consts.py:223 +msgid "mongod配置" +msgstr "mongod configuration" + +#: backend/flow/consts.py:224 +msgid "mongos配置" +msgstr "mongos configuration" + +#: backend/flow/consts.py:228 +msgid "系统" +msgstr "system" + +#: backend/flow/consts.py:229 +msgid "twemproxy config file" +msgstr "twemproxy config file" + +#: backend/flow/consts.py:230 +msgid "predixy config file" +msgstr "predixy config file" + +#: backend/flow/consts.py:231 +msgid "redis config file" +msgstr "redis config file" + +#: backend/flow/consts.py:232 +msgid "全备配置" +msgstr "full configuration" + +#: backend/flow/consts.py:233 +msgid "增备配置" +msgstr "Additional configuration" + +#: backend/flow/consts.py:234 +msgid "心跳配置" +msgstr "heartbeat configuration" + +#: backend/flow/consts.py:235 +msgid "监控配置" +msgstr "monitoring configuration" + +#: backend/flow/consts.py:236 +msgid "基本配置" +msgstr "basic configuration" + +#: backend/flow/consts.py:237 +msgid "热key配置" +msgstr "Hot key configuration" + +#: backend/flow/consts.py:238 +msgid "大key配置" +msgstr "Big key configuration" + +#: backend/flow/consts.py:240 +msgid "os配置" +msgstr "os configuration" + +#: backend/flow/consts.py:241 +msgid "maxmemory配置" +msgstr "maxmemory configuration" + +#: backend/flow/consts.py:245 +msgid "MASTER" +msgstr "MASTER" + +#: backend/flow/consts.py:246 +msgid "SLAVE" +msgstr "SLAVE" + +#: backend/flow/consts.py:250 backend/flow/consts.py:339 +#: backend/flow/consts.py:1065 backend/flow/consts.py:1136 +msgid "mysql" +msgstr "mysql" + +#: backend/flow/consts.py:251 +msgid "mysql-proxy" +msgstr "mysql-proxy" + +#: backend/flow/consts.py:255 +msgid "dbbackup" +msgstr "dbbackup" + +#: backend/flow/consts.py:256 +msgid "dbbackup-txsql" +msgstr "dbbackup-txsql" + +#: backend/flow/consts.py:257 +msgid "actuator" +msgstr "actuator" + +#: backend/flow/consts.py:258 +msgid "exporter" +msgstr "exporter" + +#: backend/flow/consts.py:259 +msgid "最新版本" +msgstr "The latest version" + +#: backend/flow/consts.py:262 +msgid "redis_tools" +msgstr "redis_tools" + +#: backend/flow/consts.py:263 backend/flow/consts.py:347 +msgid "es" +msgstr "es" + +#: backend/flow/consts.py:264 backend/flow/consts.py:348 +msgid "kafka" +msgstr "kafka" + +#: backend/flow/consts.py:265 backend/flow/consts.py:349 +msgid "hdfs" +msgstr "hdfs" + +#: backend/flow/consts.py:266 backend/flow/consts.py:350 +msgid "pulsar" +msgstr "pulsar" + +#: backend/flow/consts.py:268 +msgid "dbmon" +msgstr "dbmon" + +#: backend/flow/consts.py:269 +msgid "mysql-checksum" +msgstr "mysql-checksum" + +#: backend/flow/consts.py:270 +msgid "Binlog 滚动备份工具" +msgstr "Binlog rotate tool" + +#: backend/flow/consts.py:271 +msgid "DBA 工具集" +msgstr "DBA toolkit" + +#: backend/flow/consts.py:272 +msgid "mysql-crond" +msgstr "mysql-crond" + +#: backend/flow/consts.py:273 +msgid "MySQL 监控" +msgstr "MySQL monitoring" + +#: backend/flow/consts.py:274 +msgid "nginx 服务" +msgstr "nginx service" + +#: backend/flow/consts.py:275 +msgid "dns-bind 服务" +msgstr "dns-bind service" + +#: backend/flow/consts.py:276 +msgid "dns-pull-crond服务" +msgstr "dns-pull-crond service" + +#: backend/flow/consts.py:277 +msgid "cloud-dbha服务" +msgstr "cloud-dbha service" + +#: backend/flow/consts.py:278 +msgid "cloud-drs服务" +msgstr "cloud-drs service" + +#: backend/flow/consts.py:279 +msgid "cloud-drs-tmysqlparse服务" +msgstr "cloud-drs-tmysqlparse service" + +#: backend/flow/consts.py:280 +msgid "spider节点名称" +msgstr "spider node name" + +#: backend/flow/consts.py:281 +msgid "spider中控节点名称" +msgstr "Spider control node name" + +#: backend/flow/consts.py:283 +msgid "riak-monitor" +msgstr "ripple-monitor" + +#: backend/flow/consts.py:284 +msgid "redis-dts" +msgstr "redis-dts" + +#: backend/flow/consts.py:285 +msgid "redis-modules" +msgstr "redis-modules" + +#: backend/flow/consts.py:286 +msgid "tbinlogdumper实例" +msgstr "tbinlogdumper example" + +#: backend/flow/consts.py:287 +msgid "sqlserver实例" +msgstr "sqlserver instance" + +#: backend/flow/consts.py:289 backend/flow/consts.py:360 +msgid "doris" +msgstr "doris" + +#: backend/flow/consts.py:290 backend/flow/consts.py:361 +msgid "vm" +msgstr "vm" + +#: backend/flow/consts.py:294 +msgid "nginx服务" +msgstr "nginx-service" + +#: backend/flow/consts.py:295 +msgid "dns服务" +msgstr "dns service" + +#: backend/flow/consts.py:296 +msgid "drs服务" +msgstr "drs service" + +#: backend/flow/consts.py:297 +msgid "dbha服务" +msgstr "dbha service" + +#: backend/flow/consts.py:298 +msgid "redis 数据传输服务" +msgstr "redis data transfer service" + +#: backend/flow/consts.py:302 +msgid "pull-crond.conf" +msgstr "pull-crond.conf" + +#: backend/flow/consts.py:303 +msgid "ha-gm.conf" +msgstr "ha-gm.conf" + +#: backend/flow/consts.py:304 +msgid "ha-agent.conf" +msgstr "ha-agent.conf" + +#: backend/flow/consts.py:305 +msgid "drs.env" +msgstr "drs.env" + +#: backend/flow/consts.py:309 +msgid "GM" +msgstr "GM" + +#: backend/flow/consts.py:310 +msgid "AGENT" +msgstr "AGENT" + +#: backend/flow/consts.py:311 +msgid "mysql-monitor" +msgstr "mysql-monitor" + +#: backend/flow/consts.py:320 +msgid "nginx服务模块" +msgstr "nginx service module" + +#: backend/flow/consts.py:321 +msgid "dns服务模块" +msgstr "dns service module" + +#: backend/flow/consts.py:322 +msgid "drs服务模块" +msgstr "drs service module" + +#: backend/flow/consts.py:323 +msgid "dbha服务模块" +msgstr "dbha service module" + +#: backend/flow/consts.py:324 +msgid "redis_dts服务模块" +msgstr "redis_dts service module" + +#: backend/flow/consts.py:329 +msgid "蓝盾制品库" +msgstr "Blue Shield Product database" + +#: backend/flow/consts.py:334 +msgid "V1" +msgstr "V1" + +#: backend/flow/consts.py:342 +msgid "tendis" +msgstr "tending" + +#: backend/flow/consts.py:352 +msgid "bkdbmon" +msgstr "bkdbmon" + +#: backend/flow/consts.py:353 +msgid "download" +msgstr "download" + +#: backend/flow/consts.py:355 +msgid "spiderctl" +msgstr "spiderctl" + +#: backend/flow/consts.py:358 +msgid "sqlserer" +msgstr "sqlserer" + +#: backend/flow/consts.py:359 +msgid "sqlserer_check" +msgstr "sqlserer_check" + +#: backend/flow/consts.py:365 backend/flow/consts.py:442 +msgid "sysinit" +msgstr "sysinit" + +#: backend/flow/consts.py:366 backend/flow/consts.py:589 +msgid "deploy" +msgstr "deploy" + +#: backend/flow/consts.py:367 +msgid "append-deploy" +msgstr "append-deploy" + +#: backend/flow/consts.py:368 +msgid "import-schema-to-tdbctl" +msgstr "import-schema-to-tdbctl" + +#: backend/flow/consts.py:369 +msgid "icheck-tdbctl-with-spider-schema" +msgstr "icheck-tdbctl-with-spider-schema" + +#: backend/flow/consts.py:370 +msgid "find-local-backup" +msgstr "find-local-backup" + +#: backend/flow/consts.py:371 +msgid "restore-dr" +msgstr "restore-dr" + +#: backend/flow/consts.py:372 +msgid "recover-binlog" +msgstr "recover-binlog" + +#: backend/flow/consts.py:373 +msgid "grant-repl" +msgstr "grant-repl" + +#: backend/flow/consts.py:374 +msgid "change-master" +msgstr "change-master" + +#: backend/flow/consts.py:375 +msgid "set-backend" +msgstr "set-backend" + +#: backend/flow/consts.py:376 backend/flow/consts.py:600 +msgid "uninstall" +msgstr "uninstall" + +#: backend/flow/consts.py:377 +msgid "deploy-dbbackup" +msgstr "deploy-dbbackup" + +#: backend/flow/consts.py:378 backend/flow/consts.py:597 +msgid "install-monitor" +msgstr "install-monitor" + +#: backend/flow/consts.py:379 backend/flow/consts.py:385 +msgid "semantic-dumpschema" +msgstr "semantic-dumpschema" + +#: backend/flow/consts.py:380 +msgid "import-sqlfile" +msgstr "import-sqlfile" + +#: backend/flow/consts.py:381 +msgid "clone-client-grant" +msgstr "clone-client-grant" + +#: backend/flow/consts.py:382 +msgid "clone-proxy-user" +msgstr "clone-proxy-user" + +#: backend/flow/consts.py:383 backend/flow/consts.py:599 +msgid "clear-crontab" +msgstr "clear-crontab" + +#: backend/flow/consts.py:384 +msgid "semantic-check" +msgstr "semantic-check" + +#: backend/flow/consts.py:386 +msgid "dump" +msgstr "dump" + +#: backend/flow/consts.py:388 backend/flow/consts.py:602 +#: backend/flow/utils/doris/consts.py:35 backend/flow/utils/vm/consts.py:31 +msgid "restart" +msgstr "restart" + +#: backend/flow/consts.py:389 +msgid "clean-mysql" +msgstr "clean-mysql" + +#: backend/flow/consts.py:390 +msgid "backup-database-table" +msgstr "backup-database-table" + +#: backend/flow/consts.py:391 +msgid "set-backend-toward-slave" +msgstr "set-backend-toward-slave" + +#: backend/flow/consts.py:392 +msgid "pt-table-checksum" +msgstr "pt-table-checksum" + +#: backend/flow/consts.py:393 +msgid "执行分区" +msgstr "execution partition" + +#: backend/flow/consts.py:394 +msgid "ibs-recover" +msgstr "ibs-recover" + +#: backend/flow/consts.py:395 +msgid "数据修复指令" +msgstr "Data Repair Instructions" + +#: backend/flow/consts.py:396 +msgid "flashback-binlog" +msgstr "flashback-binlog" + +#: backend/flow/consts.py:397 +msgid "full-backup" +msgstr "full-backup" + +#: backend/flow/consts.py:398 +msgid "install-checksum" +msgstr "install-checksum" + +#: backend/flow/consts.py:399 +msgid "mycnf-change" +msgstr "mycnf-change" + +#: backend/flow/consts.py:400 +msgid "安装mysql-rotatebinlog程序" +msgstr "Install the mysql-rotatebinlog program" + +#: backend/flow/consts.py:401 +msgid "安装dba-toolkit程序" +msgstr "Install the dba-toolkit program" + +#: backend/flow/consts.py:402 +msgid "deploy-mysql-crond" +msgstr "deploy-mysql-crond" + +#: backend/flow/consts.py:403 +msgid "mysql实例的周边配置清理" +msgstr "Clean up the surrounding configuration of the mysql instance" + +#: backend/flow/consts.py:404 +msgid "初始化spider集群节点关系" +msgstr "Initialize the spider cluster node relationship" + +#: backend/flow/consts.py:405 +msgid "添加spider临时节点" +msgstr "Add spider temporary node" + +#: backend/flow/consts.py:406 +msgid "restart-spider" +msgstr "restart-spider" + +#: backend/flow/consts.py:407 +msgid "添加spider-slave集群的相关路由信息" +msgstr "Add the relevant routing information of the spider-slave cluster" + +#: backend/flow/consts.py:408 +msgid "mysql备份请求" +msgstr "mysql backup request" + +#: backend/flow/consts.py:409 +msgid "TenDBCluster集群做后端切换" +msgstr "TenDBCluster cluster backend switching" + +#: backend/flow/consts.py:410 +msgid "TenDBCluster集群做后端的成对迁移" +msgstr "TenDBCluster cluster performs paired migration of backend" + +#: backend/flow/consts.py:411 +msgid "为TBinlogDumper实例导出导入源表结构" +msgstr "Export and import source table structure for TBinlogDumper instance" + +#: backend/flow/consts.py:412 +msgid "执行os命令" +msgstr "Execute os command" + +#: backend/flow/consts.py:413 +msgid "Mysql开区导出库表结构" +msgstr "Mysql open area export library table structure" + +#: backend/flow/consts.py:414 +msgid "Mysql开区导入库表结构" +msgstr "Mysql open area import library table structure" + +#: backend/flow/consts.py:415 +msgid "Mysql开区导出库表数据" +msgstr "Mysql open zone exports database table data" + +#: backend/flow/consts.py:416 +msgid "Mysql开区导入库表数据" +msgstr "Mysql open area imports database table data" + +#: backend/flow/consts.py:417 +msgid "MySQL实例安装tokudb引擎" +msgstr "MySQL instance installation tokudb engine" + +#: backend/flow/consts.py:418 +msgid "标准化MySQL实例" +msgstr "Standardized MySQL instance" + +#: backend/flow/consts.py:419 +msgid "标准化Proxy实例" +msgstr "Standardized Proxy instance" + +#: backend/flow/consts.py:420 +msgid "本地升级" +msgstr "Local upgrade" + +#: backend/flow/consts.py:421 +msgid "Mysql数据迁移导出库" +msgstr "Mysql data migration export library" + +#: backend/flow/consts.py:422 +msgid "Mysql数据迁移导入库" +msgstr "Mysql data migration import library" + +#: backend/flow/consts.py:423 +msgid "修改MySQL配置" +msgstr "Modify MySQL configuration" + +#: backend/flow/consts.py:424 +msgid "TenDBCluster 清档在中控建立备份库表" +msgstr "TenDBCluster clears files and creates a backup database table in the central control" + +#: backend/flow/consts.py:425 +msgid "TenDBCluster 清档在remote预清理备份库" +msgstr "TenDBCluster clears files and pre-cleans the backup library in remote" + +#: backend/flow/consts.py:426 +msgid "MySQL执行清档" +msgstr "MySQL executes cleanup" + +#: backend/flow/consts.py:427 +msgid "中控执行清档" +msgstr "Central Control Execution Clearance" + +#: backend/flow/consts.py:428 +msgid "MySQL执行DB重命名" +msgstr "MySQL performs DB rename" + +#: backend/flow/consts.py:429 +msgid "清档检查库表是否在用" +msgstr "Clear files and check whether the library table is in use" + +#: backend/flow/consts.py:430 +msgid "重命名检查库表是否在用" +msgstr "Rename to check whether the library table is in use" + +#: backend/flow/consts.py:431 +msgid "重命名在中控建立目标库" +msgstr "Rename the target library created in the central control" + +#: backend/flow/consts.py:432 +msgid "TenDBCluster 重命名在remote预清理目标库" +msgstr "TenDBCluster renames the remote pre-clean target library" + +#: backend/flow/consts.py:433 +msgid "TenDBCluster 重命名在中控删除源库" +msgstr "TenDBCluster renames and deletes the source library in the central control" + +#: backend/flow/consts.py:434 +msgid "推送mysql-crond配置" +msgstr "Push mysql-crond configuration" + +#: backend/flow/consts.py:435 +msgid "推送mysql-monitor配置" +msgstr "Push mysql-monitor configuration" + +#: backend/flow/consts.py:436 +msgid "推送mysql-table-checksum配置" +msgstr "Push mysql-table-checksum configuration" + +#: backend/flow/consts.py:437 +msgid "推送备份配置" +msgstr "Push backup configuration" + +#: backend/flow/consts.py:438 +msgid "推送rotatebinlog配置" +msgstr "Push rotatebinlog configuration" + +#: backend/flow/consts.py:443 +msgid "install" +msgstr "install" + +#: backend/flow/consts.py:444 +msgid "replica_batch" +msgstr "replica_batch" + +#: backend/flow/consts.py:445 +msgid "replicaof" +msgstr "replicaof" + +#: backend/flow/consts.py:446 +msgid "clustermeet_slotsassign" +msgstr "clustermeet_slotassign" + +#: backend/flow/consts.py:447 +msgid "keyspattern" +msgstr "keyspattern" + +#: backend/flow/consts.py:448 +msgid "keysdelete_regex" +msgstr "keysdelete_regex" + +#: backend/flow/consts.py:449 +msgid "keysdelete_files" +msgstr "keysdelete_files" + +#: backend/flow/consts.py:451 +msgid "flush_data" +msgstr "flush_data" + +#: backend/flow/consts.py:452 +msgid "shutdown" +msgstr "shutdown" + +#: backend/flow/consts.py:453 +msgid "open" +msgstr "open" + +#: backend/flow/consts.py:454 +msgid "close" +msgstr "close" + +#: backend/flow/consts.py:455 +msgid "operate" +msgstr "operate" + +#: backend/flow/consts.py:456 +msgid "capturer" +msgstr "capture" + +#: backend/flow/consts.py:457 +msgid "change_password" +msgstr "change_password" + +#: backend/flow/consts.py:458 +msgid "kill_conn" +msgstr "kill_conn" + +#: backend/flow/consts.py:459 +msgid "param_sync" +msgstr "param_sync" + +#: backend/flow/consts.py:460 +msgid "sync_check" +msgstr "sync_check" + +#: backend/flow/consts.py:461 +msgid "switch" +msgstr "switch" + +#: backend/flow/consts.py:462 +msgid "cluster_forget" +msgstr "cluster_forget" + +#: backend/flow/consts.py:463 +msgid "dr_restore" +msgstr "dr_restore" + +#: backend/flow/consts.py:464 +msgid "check_backends" +msgstr "check_backends" + +#: backend/flow/consts.py:465 +msgid "dts_datacheck" +msgstr "dts_datacheck" + +#: backend/flow/consts.py:466 +msgid "dts_datarepair" +msgstr "dts_datarepair" + +#: backend/flow/consts.py:467 +msgid "dts_online_switch" +msgstr "dts_online_switch" + +#: backend/flow/consts.py:468 +msgid "add_dts_server" +msgstr "add_dts_server" + +#: backend/flow/consts.py:469 +msgid "remove_dts_server" +msgstr "remove_dts_server" + +#: backend/flow/consts.py:470 +msgid "data_structure" +msgstr "data_structure" + +#: backend/flow/consts.py:471 +msgid "clustermeet_checkfinish" +msgstr "clustermeet_checkfinish" + +#: backend/flow/consts.py:472 +msgid "version_update" +msgstr "version_update" + +#: backend/flow/consts.py:473 +msgid "proxy_version_upgrade" +msgstr "proxy_version_upgrade" + +#: backend/flow/consts.py:474 +msgid "cluster_failover" +msgstr "cluster_failover" + +#: backend/flow/consts.py:475 +msgid "migrate_slots" +msgstr "migrate_slots" + +#: backend/flow/consts.py:476 +msgid "reupload_old_backup_records" +msgstr "reupload_old_backup_records" + +#: backend/flow/consts.py:477 +msgid "predixy_config_servers_rewrite" +msgstr "predixy_config_servers_rewrite" + +#: backend/flow/consts.py:478 +msgid "maxmemory_dynamically_set" +msgstr "maxmemory_dynamically_set" + +#: backend/flow/consts.py:479 +msgid "client_conns_kill" +msgstr "client_conns_kill" + +#: backend/flow/consts.py:480 +msgid "config_set" +msgstr "config_set" + +#: backend/flow/consts.py:481 +msgid "load_modules" +msgstr "load_modules" + +#: backend/flow/consts.py:482 +msgid "predixy_add_modules_cmds" +msgstr "predixy_add_modules_cmds" + +#: backend/flow/consts.py:486 +msgid "os_mongo_init" +msgstr "os_mongo_heat" + +#: backend/flow/consts.py:487 +msgid "mongod_install" +msgstr "mongod_install" + +#: backend/flow/consts.py:488 +msgid "mongos_install" +msgstr "mongos_install" + +#: backend/flow/consts.py:489 +msgid "init_replicaset" +msgstr "init_replicaset" + +#: backend/flow/consts.py:490 +msgid "add_shard_to_cluster" +msgstr "add_shard_to_cluster" + +#: backend/flow/consts.py:491 +msgid "add_user" +msgstr "add_user" + +#: backend/flow/consts.py:492 +msgid "delete_user" +msgstr "delete_user" + +#: backend/flow/consts.py:493 +msgid "mongo_execute_script" +msgstr "mongo_execute_script" + +#: backend/flow/consts.py:494 +msgid "mongodb_backup" +msgstr "mongodb_backup" + +#: backend/flow/consts.py:495 +msgid "mongodb_remove_ns" +msgstr "mongodb_remove_ns" + +#: backend/flow/consts.py:496 +msgid "mongodb_restore" +msgstr "mongodb_restore" + +#: backend/flow/consts.py:497 +msgid "mongodb_pit_restore" +msgstr "mongodb_pit_restore" + +#: backend/flow/consts.py:498 +msgid "mongo_restart" +msgstr "mongo_restart" + +#: backend/flow/consts.py:499 +msgid "mongod_replace" +msgstr "mongod_replace" + +#: backend/flow/consts.py:500 +msgid "mongo_deinstall" +msgstr "mongo_uninstall" + +#: backend/flow/consts.py:501 +msgid "install_dbmon" +msgstr "install_dbmon" + +#: backend/flow/consts.py:502 +msgid "mongo_start" +msgstr "mongo_start" + +#: backend/flow/consts.py:506 backend/flow/consts.py:531 +#: backend/flow/consts.py:551 backend/flow/consts.py:570 +#: backend/flow/consts.py:637 backend/flow/consts.py:831 +#: backend/flow/consts.py:1486 +msgid "init" +msgstr "init" + +#: backend/flow/consts.py:507 backend/flow/consts.py:532 +#: backend/flow/consts.py:552 backend/flow/consts.py:571 +#: backend/flow/consts.py:638 backend/flow/consts.py:832 +#: backend/flow/consts.py:1487 +msgid "decompress_pkg" +msgstr "decompress_pkg" + +#: backend/flow/consts.py:508 backend/flow/consts.py:533 +#: backend/flow/consts.py:553 backend/flow/consts.py:572 +#: backend/flow/consts.py:639 backend/flow/consts.py:1488 +msgid "install_supervisor" +msgstr "install_supervisor" + +#: backend/flow/consts.py:509 +msgid "install_master" +msgstr "install_master" + +#: backend/flow/consts.py:510 +msgid "install_hot" +msgstr "install_hot" + +#: backend/flow/consts.py:511 +msgid "install_cold" +msgstr "install_cold" + +#: backend/flow/consts.py:512 +msgid "install_client" +msgstr "install_client" + +#: backend/flow/consts.py:513 backend/flow/consts.py:642 +msgid "init_grant" +msgstr "init_grant" + +#: backend/flow/consts.py:514 +msgid "install_exporter" +msgstr "install_exporter" + +#: backend/flow/consts.py:515 +msgid "install_kibana" +msgstr "install_kibana" + +#: backend/flow/consts.py:516 backend/flow/consts.py:555 +msgid "install_telegraf" +msgstr "install_telegraf" + +#: backend/flow/consts.py:517 backend/flow/consts.py:538 +#: backend/flow/consts.py:557 backend/flow/consts.py:579 +#: backend/flow/consts.py:643 backend/flow/consts.py:1493 +msgid "start_process" +msgstr "start_process" + +#: backend/flow/consts.py:518 backend/flow/consts.py:539 +#: backend/flow/consts.py:558 backend/flow/consts.py:580 +#: backend/flow/consts.py:645 backend/flow/consts.py:1494 +msgid "stop_process" +msgstr "stop_process" + +#: backend/flow/consts.py:519 backend/flow/consts.py:540 +#: backend/flow/consts.py:559 backend/flow/consts.py:581 +#: backend/flow/consts.py:646 backend/flow/consts.py:1495 +msgid "restart_process" +msgstr "restart_process" + +#: backend/flow/consts.py:520 backend/flow/consts.py:541 +#: backend/flow/consts.py:560 backend/flow/consts.py:582 +#: backend/flow/consts.py:647 backend/flow/consts.py:1496 +msgid "clean_data" +msgstr "clean_data" + +#: backend/flow/consts.py:521 +msgid "exclude_node" +msgstr "exclude_node" + +#: backend/flow/consts.py:522 +msgid "check_shards" +msgstr "check_shards" + +#: backend/flow/consts.py:523 +msgid "check_connections" +msgstr "check_connections" + +#: backend/flow/consts.py:524 +msgid "check_nodes" +msgstr "check_nodes" + +#: backend/flow/consts.py:525 +msgid "replace_master" +msgstr "replace_master" + +#: backend/flow/consts.py:526 +msgid "gen_certificate" +msgstr "gen_certificate" + +#: backend/flow/consts.py:527 +msgid "pack_certificate" +msgstr "pack_certificate" + +#: backend/flow/consts.py:534 backend/flow/consts.py:573 +msgid "install_zookeeper" +msgstr "install_zookeeper" + +#: backend/flow/consts.py:535 +msgid "init_kafkaUser" +msgstr "init_kafkaUser" + +#: backend/flow/consts.py:536 backend/flow/consts.py:576 +msgid "install_broker" +msgstr "install_broker" + +#: backend/flow/consts.py:537 +msgid "install_manager" +msgstr "install_manager" + +#: backend/flow/consts.py:542 +msgid "reduce_broker" +msgstr "reduce_broker" + +#: backend/flow/consts.py:543 +msgid "check_reassign" +msgstr "check_reassign" + +#: backend/flow/consts.py:544 +msgid "reconfig_add" +msgstr "reconfig_add" + +#: backend/flow/consts.py:545 +msgid "restart_broker" +msgstr "restart_broker" + +#: backend/flow/consts.py:546 +msgid "reconfig_remove" +msgstr "reconfig_remove" + +#: backend/flow/consts.py:547 +msgid "replace_broker" +msgstr "replace_broker" + +#: backend/flow/consts.py:554 +msgid "install_influxdb" +msgstr "install_influxdb" + +#: backend/flow/consts.py:556 +msgid "init_user" +msgstr "init_user" + +#: backend/flow/consts.py:564 +msgid "check_broker_config" +msgstr "check_broker_config" + +#: backend/flow/consts.py:565 +msgid "check_namespace_config" +msgstr "check_namespace_config" + +#: backend/flow/consts.py:566 +msgid "check_under_replicated" +msgstr "check_under_replicated" + +#: backend/flow/consts.py:567 +msgid "check_ledger_metadata" +msgstr "check_ledger_metadata" + +#: backend/flow/consts.py:568 +msgid "set_bookie_readonly" +msgstr "set_bookie_readonly" + +#: backend/flow/consts.py:569 +msgid "decommission_bookie" +msgstr "decommission_bookie" + +#: backend/flow/consts.py:574 +msgid "init_cluster" +msgstr "init_cluster" + +#: backend/flow/consts.py:575 +msgid "install_bookkeeper" +msgstr "install_bookkeeper" + +#: backend/flow/consts.py:577 +msgid "install_pulsar_manager" +msgstr "install_pulsar_manager" + +#: backend/flow/consts.py:578 +msgid "init_pulsar_manager" +msgstr "init_pulsar_manager" + +#: backend/flow/consts.py:583 +msgid "add_hosts" +msgstr "add_hosts" + +#: backend/flow/consts.py:584 +msgid "modify_hosts" +msgstr "modify_hosts" + +#: backend/flow/consts.py:588 +msgid "sysinit-riak" +msgstr "sysinits" + +#: backend/flow/consts.py:590 +msgid "get-config" +msgstr "get-config" + +#: backend/flow/consts.py:591 +msgid "join-cluster" +msgstr "join-cluster" + +#: backend/flow/consts.py:592 +msgid "commit-cluster-change" +msgstr "commit-cluster-change" + +#: backend/flow/consts.py:593 +msgid "init-bucket-type" +msgstr "init-bucket-type" + +#: backend/flow/consts.py:594 +msgid "remove-node" +msgstr "remove-node" + +#: backend/flow/consts.py:595 +msgid "transfer" +msgstr "transfer" + +#: backend/flow/consts.py:596 +msgid "check-connections" +msgstr "check-connections" + +#: backend/flow/consts.py:598 +msgid "deploy-riak-crond" +msgstr "deploy-ripple-crond" + +#: backend/flow/consts.py:601 backend/flow/utils/doris/consts.py:33 +#: backend/flow/utils/vm/consts.py:29 +msgid "start" +msgstr "start" + +#: backend/flow/consts.py:603 backend/flow/utils/doris/consts.py:34 +#: backend/flow/utils/vm/consts.py:30 +msgid "stop" +msgstr "stop" + +#: backend/flow/consts.py:604 +msgid "deploy-monitor" +msgstr "deploy-monitor" + +#: backend/flow/consts.py:605 +msgid "start-monitor" +msgstr "start-monitor" + +#: backend/flow/consts.py:606 +msgid "stop-monitor" +msgstr "stop-monitor" + +#: backend/flow/consts.py:610 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:796 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:160 +msgid "机器初始化" +msgstr "Machine initialization" + +#: backend/flow/consts.py:611 +msgid "实例安装" +msgstr "Instance installation" + +#: backend/flow/consts.py:612 +msgid "SQL文件执行" +msgstr "SQL file execution" + +#: backend/flow/consts.py:613 backend/flow/consts.py:614 +msgid "备份数据库" +msgstr "Back up database" + +#: backend/flow/consts.py:615 +msgid "数据库清档" +msgstr "Database cleanup" + +#: backend/flow/consts.py:616 +msgid "恢复全量备份文件" +msgstr "Restore full backup files" + +#: backend/flow/consts.py:617 +msgid "恢复日志备份文件" +msgstr "Restore log backup files" + +#: backend/flow/consts.py:618 +msgid "集群角色互切" +msgstr "Cluster role interaction" + +#: backend/flow/consts.py:619 +msgid "检查非正常的数据库信息" +msgstr "Check for abnormal database information" + +#: backend/flow/consts.py:620 +msgid "检查实例连接情况" +msgstr "Check instance connection status" + +#: backend/flow/consts.py:621 +msgid "实例间克隆用户" +msgstr "Clone users between instances" + +#: backend/flow/consts.py:622 +msgid "实例间克隆定时作业" +msgstr "Clone scheduled jobs between instances" + +#: backend/flow/consts.py:623 +msgid "实例间克隆linkservers" +msgstr "Clone linksservers between instances" + +#: backend/flow/consts.py:624 +msgid "建立数据库的镜像库关系" +msgstr "Establish the mirror library relationship of the database" + +#: backend/flow/consts.py:625 +msgid "为Always-on做别名初始化" +msgstr "Alias ​​initialization for Always-on" + +#: backend/flow/consts.py:626 +msgid "建立Always-on通信" +msgstr "Erection Always-on communication" + +#: backend/flow/consts.py:627 +msgid "数据库加入到Always-on可用组" +msgstr "The database is added to the Always-on availability group" + +#: backend/flow/consts.py:628 +msgid "卸载sqlserver实例" +msgstr "Uninstall sqlserver instance" + +#: backend/flow/consts.py:629 +msgid "判断备份文件是否存在,存在则移动" +msgstr "Determine whether the backup file exists and move it if it exists" + +#: backend/flow/consts.py:630 +msgid "实例接入dbm系统初始化" +msgstr "Instance access to dbm system initialization" + +#: backend/flow/consts.py:631 +msgid "清理实例周边配置。目前支持清理job、linkserver" +msgstr "Clean up the configuration around the instance. Currently supports cleaning jobs and linkserver" + +#: backend/flow/consts.py:632 +msgid "将一些dr移除可用组" +msgstr "Remove some dr from available groups" + +#: backend/flow/consts.py:633 +msgid "部署后需要初始化实例的步骤" +msgstr "Steps required to initialize the instance after deployment" + +#: backend/flow/consts.py:640 +msgid "install_doris" +msgstr "install_doris" + +#: backend/flow/consts.py:641 +msgid "render_config" +msgstr "render_config" + +#: backend/flow/consts.py:644 +msgid "start_fe_by_helper" +msgstr "start_fe_by_helper" + +#: backend/flow/consts.py:648 +msgid "update_metadata" +msgstr "update_metadata" + +#: backend/flow/consts.py:649 +msgid "check_decommission" +msgstr "check_decommission" + +#: backend/flow/consts.py:650 +msgid "check_process_start" +msgstr "check_process_start" + +#: backend/flow/consts.py:658 +msgid "聊天历史记录" +msgstr "chat history" + +#: backend/flow/consts.py:659 +msgid "用户战绩数据" +msgstr "User record data" + +#: backend/flow/consts.py:660 +msgid "玩家按键快捷键信息" +msgstr "Player key shortcut key information" + +#: backend/flow/consts.py:661 +msgid "test" +msgstr "test" + +#: backend/flow/consts.py:662 +msgid "mixed" +msgstr "mixed" + +#: backend/flow/consts.py:666 +msgid "NOT_RUNNING" +msgstr "NOT_RUNNING" + +#: backend/flow/consts.py:667 backend/flow/consts.py:728 +msgid "RUNNING" +msgstr "RUNNING" + +#: backend/flow/consts.py:668 backend/flow/consts.py:729 +msgid "SUCCESS" +msgstr "SUCCESS" + +#: backend/flow/consts.py:669 backend/flow/consts.py:730 +msgid "FAILED" +msgstr "FAILED" + +#: backend/flow/consts.py:670 +msgid "SKIPPED" +msgstr "SKIPPED" + +#: backend/flow/consts.py:671 +msgid "IGNORED" +msgstr "IGNORED" + +#: backend/flow/consts.py:672 +msgid "WAITING" +msgstr "WAITING" + +#: backend/flow/consts.py:673 +msgid "NORMAL" +msgstr "NORMAL" + +#: backend/flow/consts.py:674 +msgid "ABNORMAL" +msgstr "ABNORMAL" + +#: backend/flow/consts.py:675 +msgid "步骤强制终止中" +msgstr "The step is forcibly terminated" + +#: backend/flow/consts.py:676 +msgid "步骤强制终止成功" +msgstr "Step force terminated successfully" + +#: backend/flow/consts.py:680 +msgid "准备中" +msgstr "preparing" + +#: backend/flow/consts.py:681 +msgid "运行中" +msgstr "running" + +#: backend/flow/consts.py:682 backend/ticket/constants.py:633 +#: backend/ticket/constants.py:638 +msgid "完成" +msgstr "Finish" + +#: backend/flow/consts.py:688 +msgid "available" +msgstr "available" + +#: backend/flow/consts.py:690 +msgid "locked" +msgstr "locked" + +#: backend/flow/consts.py:694 +msgid "cluster no" +msgstr "cluster no" + +#: backend/flow/consts.py:695 +msgid "cluster yes" +msgstr "cluster yes" + +#: backend/flow/consts.py:699 backend/flow/consts.py:709 +msgid "create" +msgstr "create" + +#: backend/flow/consts.py:700 +msgid "cluster_delete" +msgstr "cluster_delete" + +#: backend/flow/consts.py:701 +msgid "recycle_record" +msgstr "recycle_record" + +#: backend/flow/consts.py:702 backend/flow/consts.py:710 +msgid "update" +msgstr "update" + +#: backend/flow/consts.py:703 +msgid "select" +msgstr "select" + +#: backend/flow/consts.py:704 +msgid "add_and_delete" +msgstr "add_and_delete" + +#: backend/flow/consts.py:705 +msgid "ip_dns对应记录回收" +msgstr "ip_dns corresponding record recycling" + +#: backend/flow/consts.py:711 +msgid "delete" +msgstr "delete" + +#: backend/flow/consts.py:715 +msgid "kibana" +msgstr "kibana" + +#: backend/flow/consts.py:716 +msgid "kafka_manager" +msgstr "kafka_manager" + +#: backend/flow/consts.py:717 +msgid "pulsar_manager" +msgstr "pulsar_manager" + +#: backend/flow/consts.py:718 +msgid "ha_proxy" +msgstr "ha_proxy" + +#: backend/flow/consts.py:719 +msgid "doris_web_ui" +msgstr "doris_web_ui" + +#: backend/flow/consts.py:723 +msgid "KIBANA_PORT" +msgstr "KIBANA_PORT" + +#: backend/flow/consts.py:724 +msgid "KAFKA_MANAGER_PORT" +msgstr "KAFKA_MANAGER_PORT" + +#: backend/flow/consts.py:734 +msgid "proxy默认实例个数" +msgstr "The number of proxy default instances" + +#: backend/flow/consts.py:735 +msgid "redis角色数" +msgstr "Number of redis roles" + +#: backend/flow/consts.py:739 +msgid "DB安装目录" +msgstr "DB installation directory" + +#: backend/flow/consts.py:743 +msgid "gcs 安装路径" +msgstr "gcs installation path" + +#: backend/flow/consts.py:744 +msgid "key生命周期路径" +msgstr "key lifecycle path" + +#: backend/flow/consts.py:748 +msgid "truncate_table" +msgstr "truncate_table" + +#: backend/flow/consts.py:749 +msgid "drop_database" +msgstr "drop_database" + +#: backend/flow/consts.py:750 +msgid "drop_table" +msgstr "drop_table" + +#: backend/flow/consts.py:802 +msgid "TendataModuleDefault" +msgstr "TendataModuleDefault" + +#: backend/flow/consts.py:803 +msgid "RiakModuleDefault" +msgstr "RiakModuleDefault" + +#: backend/flow/consts.py:807 backend/flow/consts.py:1098 +#: backend/ticket/builders/common/constants.py:49 +#: backend/ticket/builders/common/constants.py:70 +msgid "hot" +msgstr "hot" + +#: backend/flow/consts.py:808 backend/flow/consts.py:1099 +#: backend/ticket/builders/common/constants.py:50 +#: backend/ticket/builders/common/constants.py:71 +msgid "cold" +msgstr "cold" + +#: backend/flow/consts.py:809 backend/ticket/builders/common/constants.py:51 +msgid "client" +msgstr "client" + +#: backend/flow/consts.py:814 +msgid "redis key删除正则方式" +msgstr "Redis key deletion regular method" + +#: backend/flow/consts.py:815 +msgid "redis key删除文件方式" +msgstr "Redis key delete file method" + +#: backend/flow/consts.py:819 +msgid "get" +msgstr "get" + +#: backend/flow/consts.py:820 +msgid "release" +msgstr "release" + +#: backend/flow/consts.py:824 +msgid "覆盖写入上下文变量" +msgstr "overwriting context variables" + +#: backend/flow/consts.py:825 +msgid "追加写入上下文变量" +msgstr "append to context variable" + +#: backend/flow/consts.py:829 +msgid "install-supervisor" +msgstr "install-supervisor" + +#: backend/flow/consts.py:830 +msgid "render-config" +msgstr "render-config" + +#: backend/flow/consts.py:833 +msgid "install-zookeeper" +msgstr "install-zookeeper" + +#: backend/flow/consts.py:834 +msgid "install-journalnode" +msgstr "install-journalnode" + +#: backend/flow/consts.py:835 +msgid "install-nn1" +msgstr "install-nn1" + +#: backend/flow/consts.py:836 +msgid "install-nn2" +msgstr "install-nn2" + +#: backend/flow/consts.py:837 +msgid "install-dn" +msgstr "install-dn" + +#: backend/flow/consts.py:838 +msgid "install-zkfc" +msgstr "install-zkfc" + +#: backend/flow/consts.py:839 +msgid "install-telegraf" +msgstr "install-telegraf" + +#: backend/flow/consts.py:840 +msgid "install-haproxy" +msgstr "install-haproxy" + +#: backend/flow/consts.py:841 +msgid "update-hosts" +msgstr "update-hosts" + +#: backend/flow/consts.py:842 +msgid "stop-process" +msgstr "stop-process" + +#: backend/flow/consts.py:843 +msgid "start-component" +msgstr "start-component" + +#: backend/flow/consts.py:844 +msgid "clean-data" +msgstr "clean-data" + +#: backend/flow/consts.py:845 +msgid "dfs-host" +msgstr "dfs-host" + +#: backend/flow/consts.py:856 backend/ticket/builders/common/constants.py:56 +msgid "namenode" +msgstr "namenode" + +#: backend/flow/consts.py:857 backend/ticket/builders/common/constants.py:55 +msgid "datanode" +msgstr "datanode" + +#: backend/flow/consts.py:858 +msgid "journalnode" +msgstr "journalnode" + +#: backend/flow/consts.py:860 +msgid "zkfc" +msgstr "zkfc" + +#: backend/flow/consts.py:864 backend/ticket/builders/common/constants.py:65 +msgid "bookkeeper" +msgstr "bookkeeper" + +#: backend/flow/consts.py:871 +msgid "常规备份" +msgstr "regular backup" + +#: backend/flow/consts.py:872 +msgid "长期备份" +msgstr "long-term backup" + +#: backend/flow/consts.py:876 +msgid "KAFKA_REPLACE" +msgstr "KAFKA_REPLACE" + +#: backend/flow/consts.py:877 +msgid "KAFKA_SCALE_UP" +msgstr "KAFKA_SCALE_UP" + +#: backend/flow/consts.py:881 +msgid "INFLUXDB_REPLACE" +msgstr "INFLUXDB_REPLACE" + +#: backend/flow/consts.py:885 +msgid "逻辑备份" +msgstr "logical backup" + +#: backend/flow/consts.py:886 +msgid "物理备份" +msgstr "physical backup" + +#: backend/flow/consts.py:903 +msgid "备份1个月" +msgstr "Backup for 1 month" + +#: backend/flow/consts.py:904 +msgid "备份6个月" +msgstr "Backup for 6 months" + +#: backend/flow/consts.py:905 +msgid "备份1年" +msgstr "Backup for 1 year" + +#: backend/flow/consts.py:906 +msgid "备份3年" +msgstr "Backup for 3 years" + +#: backend/flow/consts.py:910 +msgid "常规备份(25天)" +msgstr "Regular backup (25 days)" + +#: backend/flow/consts.py:911 +msgid "长期备份(3年)" +msgstr "Long-term backup (3 years)" + +#: backend/flow/consts.py:919 +msgid "Mysql的进程名称" +msgstr "Mysql process name" + +#: backend/flow/consts.py:920 +msgid "Mysql-proxy进程名称" +msgstr "Mysql-proxy process name" + +#: backend/flow/consts.py:921 +msgid "Redis的进程名称" +msgstr "Redis process name" + +#: backend/flow/consts.py:922 +msgid "MONGODB的进程名称" +msgstr "MONGODB process name" + +#: backend/flow/consts.py:923 +msgid "ES的进程名称" +msgstr "ES process name" + +#: backend/flow/consts.py:924 +msgid "KAFKA的进程名称" +msgstr "KAFKA process name" + +#: backend/flow/consts.py:925 +msgid "HDFS-NameNode的进程名称" +msgstr "HDFS-NameNode process name" + +#: backend/flow/consts.py:926 +msgid "HDFS-DataNode的进程名称" +msgstr "HDFS-DataNode process name" + +#: backend/flow/consts.py:927 +msgid "Pulsar的进程名称" +msgstr "Pulsar process name" + +#: backend/flow/consts.py:928 +msgid "InfluxDB 的进程名称" +msgstr "InfluxDB process name" + +#: backend/flow/consts.py:929 +msgid "Riak的进程名称" +msgstr "Riak process name" + +#: backend/flow/consts.py:937 +msgid "远程备份+时间" +msgstr "remote backup + time" + +#: backend/flow/consts.py:938 +msgid "远程备份+备份ID" +msgstr "Remote Backup + Backup ID" + +#: backend/flow/consts.py:939 +msgid "本地备份+时间" +msgstr "local backup + time" + +#: backend/flow/consts.py:940 +msgid "本地备份+备份ID" +msgstr "Local backup + backup ID" + +#: backend/flow/consts.py:948 +msgid "手动单据发起" +msgstr "Manual ticket initiation" + +#: backend/flow/consts.py:949 +msgid "例行校验单据发起" +msgstr "Routine verification ticket initiation" + +#: backend/flow/consts.py:957 +msgid "msms" +msgstr "msms" + +#: backend/flow/consts.py:974 +msgid "redis slot分隔符" +msgstr "redis slot separator" + +#: backend/flow/consts.py:975 +msgid "redis slot导入分隔符" +msgstr "redis slot import delimiter" + +#: backend/flow/consts.py:976 +msgid "redis slot迁移分隔符" +msgstr "redis slot migration delimiter" + +#: backend/flow/consts.py:984 +msgid "redis min slot" +msgstr "redis min slot" + +#: backend/flow/consts.py:985 +msgid "redis max slot" +msgstr "redis max slot" + +#: backend/flow/consts.py:986 +msgid "redis total slot" +msgstr "redis total slot" + +#: backend/flow/consts.py:994 +msgid "redis PFAIL state" +msgstr "redis PFAIL state" + +#: backend/flow/consts.py:995 +msgid "redis fail state" +msgstr "redis fail state" + +#: backend/flow/consts.py:996 +msgid "redis handshake state" +msgstr "redis handshake state" + +#: backend/flow/consts.py:997 +msgid "redis noaddr state" +msgstr "redis noaddr state" + +#: backend/flow/consts.py:998 +msgid "redis noflags state" +msgstr "redis noflags state" + +#: backend/flow/consts.py:1006 +msgid "redis master role" +msgstr "redis master role" + +#: backend/flow/consts.py:1007 +msgid "redis slave role" +msgstr "redis slave role" + +#: backend/flow/consts.py:1008 +msgid "redis unknown role" +msgstr "redis unknown role" + +#: backend/flow/consts.py:1016 +msgid "redis master link status up" +msgstr "redis master link status up" + +#: backend/flow/consts.py:1017 +msgid "redis master link status down" +msgstr "redis master link status down" + +#: backend/flow/consts.py:1018 +msgid "redis ssd incrSync state" +msgstr "redis ssd incrSync state" + +#: backend/flow/consts.py:1019 +msgid "redis ssd REPL_FOLLOW state" +msgstr "redis ssd REPL_FOLLOW state" + +#: backend/flow/consts.py:1020 +msgid "redis connected status" +msgstr "redis connected status" + +#: backend/flow/consts.py:1021 +msgid "redis disconnected status" +msgstr "redis disconnected status" + +#: backend/flow/consts.py:1029 +msgid "" +"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" +msgstr "" +"redis cluster state ok, all slots are covered. Obtained by cluster info " +"command" + +#: backend/flow/consts.py:1030 +msgid "" +"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" +msgstr "" +"redis cluster state fail, not all slots are covered. Obtained through the " +"cluster info command" + +#: backend/flow/consts.py:1039 +msgid "全部机器替换" +msgstr "All machine replacement" + +#: backend/flow/consts.py:1047 +msgid "bk_biz_id黑名单" +msgstr "bk_biz_id blacklist" + +#: backend/flow/consts.py:1048 +msgid "cluster_id黑名单" +msgstr "cluster_id blacklist" + +#: backend/flow/consts.py:1049 +msgid "used_memory变更阈值" +msgstr "used_memory change threshold" + +#: backend/flow/consts.py:1050 +msgid "used_memory变更百分比" +msgstr "used_memory change percentage" + +#: backend/flow/consts.py:1069 +msgid "from show master status" +msgstr "from show master status" + +#: backend/flow/consts.py:1070 +msgid "from backup file" +msgstr "from backup file" + +#: backend/flow/consts.py:1084 +msgid "北极星" +msgstr "polar star" + +#: backend/flow/consts.py:1093 +msgid "全量同步" +msgstr "Full synchronization" + +#: backend/flow/consts.py:1094 +msgid "增量同步" +msgstr "Incremental synchronization" + +#: backend/flow/consts.py:1100 backend/ticket/builders/common/constants.py:72 +msgid "follower" +msgstr "follower" + +#: backend/flow/consts.py:1101 backend/ticket/builders/common/constants.py:73 +msgid "observer" +msgstr "observer" + +#: backend/flow/consts.py:1118 +msgid "root实例账号" +msgstr "root instance account" + +#: backend/flow/consts.py:1119 +msgid "备份实例账号" +msgstr "Backup instance account" + +#: backend/flow/consts.py:1120 backend/flow/consts.py:1121 +msgid "监控实例账号" +msgstr "Monitor instance accounts" + +#: backend/flow/consts.py:1122 +msgid "MYSQL系统账号" +msgstr "MYSQL system account" + +#: backend/flow/consts.py:1123 +msgid "MYSQL实例同步账号" +msgstr "MYSQL instance synchronization account" + +#: backend/flow/consts.py:1124 +msgid "MYSQL实例只读账号" +msgstr "MYSQL instance read-only account" + +#: backend/flow/consts.py:1125 +msgid "PROXY实例账号" +msgstr "PROXY instance account" + +#: backend/flow/consts.py:1126 +msgid "REDIS默认账号" +msgstr "REDIS default account" + +#: backend/flow/consts.py:1127 +msgid "HDFS默认账号" +msgstr "HDFS default account" + +#: backend/flow/consts.py:1128 +msgid "分区实例账号" +msgstr "Partition instance account" + +#: backend/flow/consts.py:1140 +msgid "redis_proxy" +msgstr "redis_proxy" + +#: backend/flow/consts.py:1141 +msgid "redis_proxy_admin" +msgstr "redis_proxy_admin" + +#: backend/flow/consts.py:1142 +msgid "es_user" +msgstr "en_user" + +#: backend/flow/consts.py:1143 +msgid "kafka_user" +msgstr "kafka_user" + +#: backend/flow/consts.py:1144 +msgid "influxdb_user" +msgstr "influxdb_user" + +#: backend/flow/consts.py:1145 +msgid "hdfs_user" +msgstr "hdfs_user" + +#: backend/flow/consts.py:1146 +msgid "pulsar_user" +msgstr "pulsar_user" + +#: backend/flow/consts.py:1147 +msgid "doris_user" +msgstr "doris_user" + +#: backend/flow/consts.py:1148 +msgid "vm_user" +msgstr "vm_user" + +#: backend/flow/consts.py:1156 +msgid "success" +msgstr "success" + +#: backend/flow/consts.py:1164 +msgid "MongoDB密码规则" +msgstr "MongoDB password rules" + +#: backend/flow/consts.py:1172 backend/flow/consts.py:1444 +msgid "configsvr" +msgstr "configsvr" + +#: backend/flow/consts.py:1173 backend/flow/consts.py:1443 +msgid "shardsvr" +msgstr "shardsvr" + +#: backend/flow/consts.py:1181 backend/flow/consts.py:1470 +msgid "cache_percent" +msgstr "cache_percent" + +#: backend/flow/consts.py:1190 +msgid "m1" +msgstr "m1" + +#: backend/flow/consts.py:1191 +msgid "m2" +msgstr "m2" + +#: backend/flow/consts.py:1192 +msgid "m3" +msgstr "m3" + +#: backend/flow/consts.py:1193 +msgid "m4" +msgstr "m4" + +#: backend/flow/consts.py:1194 +msgid "m5" +msgstr "m5" + +#: backend/flow/consts.py:1195 +msgid "m6" +msgstr "m6" + +#: backend/flow/consts.py:1196 +msgid "m7" +msgstr "m7" + +#: backend/flow/consts.py:1197 +msgid "m8" +msgstr "m8" + +#: backend/flow/consts.py:1198 +msgid "m9" +msgstr "m9" + +#: backend/flow/consts.py:1199 +msgid "m10" +msgstr "m10" + +#: backend/flow/consts.py:1208 backend/ticket/builders/common/constants.py:140 +msgid "KAFKA" +msgstr "KAFKA" + +#: backend/flow/consts.py:1209 backend/ticket/builders/common/constants.py:141 +msgid "L5_AGENT" +msgstr "L5_AGENT" + +#: backend/flow/consts.py:1210 backend/ticket/builders/common/constants.py:142 +msgid "TCP/IP" +msgstr "TCP/IP" + +#: backend/flow/consts.py:1218 +msgid "mssql系统账号" +msgstr "mssql system account" + +#: backend/flow/consts.py:1219 +msgid "sqlserver系统账号,进程启动" +msgstr "sqlserver system account, process startup" + +#: backend/flow/consts.py:1220 +msgid "sa实例账号" +msgstr "sa instance account" + +#: backend/flow/consts.py:1228 +msgid "sqlserver" +msgstr "sqlserver" + +#: backend/flow/consts.py:1236 +msgid "2008服务器版" +msgstr "2008 Server Edition" + +#: backend/flow/consts.py:1237 +msgid "2012服务器版" +msgstr "2012 Server Edition" + +#: backend/flow/consts.py:1238 +msgid "2016服务器版" +msgstr "2016 Server Edition" + +#: backend/flow/consts.py:1239 +msgid "2019服务器版" +msgstr "2019 Server Edition" + +#: backend/flow/consts.py:1240 +msgid "2022服务器版" +msgstr "2022 Server Edition" + +#: backend/flow/consts.py:1296 +msgid "Chinese_PRC_CI_AS" +msgstr "Chinese_PRC_CI_AS" + +#: backend/flow/consts.py:1297 +msgid "Latin1_General_100_CI_AS" +msgstr "Latin1_General_100_CI_AS" + +#: backend/flow/consts.py:1298 +msgid "GBK" +msgstr "GBK" + +#: backend/flow/consts.py:1310 +msgid "镜像同步" +msgstr "Mirror sync" + +#: backend/flow/consts.py:1311 +msgid "Always_on同步" +msgstr "Always_on sync" + +#: backend/flow/consts.py:1329 +msgid "清理表数据" +msgstr "Clean table data" + +#: backend/flow/consts.py:1331 +msgid "删除库" +msgstr "Delete library" + +#: backend/flow/consts.py:1339 +msgid "全量备份" +msgstr "Full backup" + +#: backend/flow/consts.py:1340 +msgid "增量备份" +msgstr "incremental backup" + +#: backend/flow/consts.py:1348 backend/flow/consts.py:1366 +msgid "启动" +msgstr "start up" + +#: backend/flow/consts.py:1349 backend/flow/consts.py:1367 +msgid "关闭" +msgstr "closure" + +#: backend/flow/consts.py:1357 +msgid "选择全量备份恢复" +msgstr "Select full backup and restore" + +#: backend/flow/consts.py:1358 +msgid "选择日志备份恢复" +msgstr "Select log backup and restore" + +#: backend/flow/consts.py:1376 +msgid "完整备份迁移(一次性)" +msgstr "Full backup migration (one-time)" + +#: backend/flow/consts.py:1377 +msgid "增量备份迁移(持续的)" +msgstr "Incremental backup migration (continuous)" + +#: backend/flow/consts.py:1392 +msgid "config_port" +msgstr "config_port" + +#: backend/flow/consts.py:1393 +msgid "shard_start_port" +msgstr "shard_start_port" + +#: backend/flow/consts.py:1399 +msgid "dba" +msgstr "dba" + +#: backend/flow/consts.py:1400 +msgid "appdba" +msgstr "appdba" + +#: backend/flow/consts.py:1401 +msgid "monitor" +msgstr "monitor" + +#: backend/flow/consts.py:1402 +msgid "appmonitor" +msgstr "appmonitor" + +#: backend/flow/consts.py:1423 +msgid "mongodb_init_set" +msgstr "mongodb_init_set" + +#: backend/flow/consts.py:1424 +msgid "mongodb_extra_user_create" +msgstr "mongodb_extra_user_create" + +#: backend/flow/consts.py:1430 +msgid "mongod" +msgstr "mongod" + +#: backend/flow/consts.py:1437 +msgid "admin" +msgstr "admin" + +#: backend/flow/consts.py:1452 +msgid "直接删除表" +msgstr "Delete table directly" + +#: backend/flow/consts.py:1453 +msgid "将表暂时重命名" +msgstr "Temporarily rename the table" + +#: backend/flow/consts.py:1462 +msgid "shard" +msgstr "shard" + +#: backend/flow/consts.py:1474 +msgid "全备-保留1个月" +msgstr "Fully prepared - retained for 1 month" + +#: backend/flow/consts.py:1475 +msgid "全备-保留6个月" +msgstr "Fully prepared - retained for 6 months" + +#: backend/flow/consts.py:1476 +msgid "全备-保留1年" +msgstr "Fully prepared - retained for 1 year" + +#: backend/flow/consts.py:1477 +msgid "全备-保留3年" +msgstr "Fully prepared - retained for 3 years" + +#: backend/flow/consts.py:1478 +msgid "增量备份-保留15天" +msgstr "Incremental backups - retained for 15 days" + +#: backend/flow/consts.py:1489 +msgid "install_vmstorage" +msgstr "install_vmstorage" + +#: backend/flow/consts.py:1490 +msgid "install_vminsert" +msgstr "install_vminsert" + +#: backend/flow/consts.py:1491 +msgid "install_vmselect" +msgstr "install_vmselect" + +#: backend/flow/consts.py:1492 +msgid "install_vmauth" +msgstr "install_vmauth" + +#: backend/flow/consts.py:1497 +msgid "reload_vmselect" +msgstr "reload_vmselect" + +#: backend/flow/consts.py:1498 +msgid "reload_vminsert" +msgstr "reload_vminsert" + +#: backend/flow/engine/bamboo/engine.py:278 +msgid "获取流程失败" +msgstr "Get process failed" + +#: backend/flow/engine/bamboo/engine.py:281 +msgid "获取流程节点失败" +msgstr "Failed to get process node" + +#: backend/flow/engine/bamboo/engine.py:284 +msgid "获取节点运行版本失败" +msgstr "Failed to get node running version" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:124 +msgid "[batch{}]{}" +msgstr "[batch{}]{}" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:162 +msgid "下发{}可执行文件包" +msgstr "Deliver {} executable file package" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:171 +msgid "部署{}服务进程" +msgstr "Deploy {} service process" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:220 +msgid "下发{}配置文件" +msgstr "Send {} configuration file" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:362 +msgid "存量集群的权限更新" +msgstr "Permission update for existing clusters" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:390 +msgid "更新服务元信息" +msgstr "Update service meta information" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:415 +msgid "裁撤{}的服务" +msgstr "Cancel {} service" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:438 +msgid "重启nginx服务" +msgstr "Restart the nginx service" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:45 +msgid "主机{}部署gm服务" +msgstr "Host{} deploys gm service" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:67 +msgid "主机{}部署agent服务" +msgstr "Host {} deploys the agent service" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:84 +msgid "部署dbha-gm服务" +msgstr "Deploy dbha-gm service" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:90 +msgid "部署dbha-agent服务" +msgstr "Deploy dbha-agent service" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:48 +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:70 +msgid "主机{}部署dns服务" +msgstr "Host{} deploys dns service" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:54 +msgid "部署dns服务" +msgstr "Deploy dns service" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:71 +msgid "对存量机器的nameserver刷新" +msgstr "Refresh the nameserver of the stock machine" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:160 +msgid "部署新dns服务流程" +msgstr "Deploy new dns service process" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:179 +msgid "裁撤旧dns服务流程" +msgstr "Abolish the old dns service process" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:34 +msgid "部署" +msgstr "deploy" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:43 +msgid "主机{}部署drs服务" +msgstr "host{} deploy drs service" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:47 +msgid "{}drs服务" +msgstr "{}drs service" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:74 +msgid "重装" +msgstr "reinstall" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:82 +msgid "安装" +msgstr "Install" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:154 +msgid "部署新drs服务" +msgstr "Deploy new drs service" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:187 +msgid "裁撤旧drs服务" msgstr "Abolition of the old drs service" -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:84 -msgid "串行化部署DNS服务" -msgstr "Serialized deployment of DNS services" +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:79 +msgid "串行化部署DNS服务" +msgstr "Serialized deployment of DNS services" + +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:80 +msgid "部署DBHA服务" +msgstr "Deploy DBHA service" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:37 +msgid "主机{}部署redis dts服务 s" +msgstr "Host {} deploys redis dts service s" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:41 +msgid "部署redis dts服务" +msgstr "Deploy redis dts service" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:122 +msgid "部署新redis dts服务流程" +msgstr "Deploy new redis dts service process" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:140 +msgid "裁撤旧redis dts服务流程" +msgstr "Abolish the old redis dts service process" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:48 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:65 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:170 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:60 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:54 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:48 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:104 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:57 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:118 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:37 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:119 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:52 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:52 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:64 +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:79 +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:187 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:98 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:70 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:145 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:525 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:746 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:793 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:208 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:643 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:137 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:117 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:210 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:581 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:719 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:135 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:102 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:134 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:234 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:100 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:88 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:107 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:333 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:127 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:158 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:300 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:65 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:343 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:160 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:357 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:164 +msgid "初始化配置" +msgstr "Initial configuration" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:61 +msgid "获取/etc/resolv.conf: {}" +msgstr "Get /etc/resolv.conf: {}" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:70 +msgid "检查/etc/resolv.conf: {}" +msgstr "Check /etc/resolv.conf: {}" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:79 +msgid "{}修改DNS配置" +msgstr "{}Modify DNS configuration" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:86 +msgid "{}配置DNS子流程" +msgstr "{}Configure DNS sub-process" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:47 +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:45 +msgid "执行sa空闲检查" +msgstr "Perform sa idle check" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:67 +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:54 +msgid "执行sa初始化" +msgstr "Execute sa initialization" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:89 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:47 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:777 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:110 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:126 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:240 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:682 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:273 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:99 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:96 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:136 +msgid "安装[{}]插件" +msgstr "Install [{}] plugin" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:105 +msgid "构建init_machine_sub子流程失败,联系系统管理员, new_ips is null" +msgstr "Failed to build the init_machine_sub sub-process, contact the system administrator, new_ips is null" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:129 +msgid "机器空闲检查及初始化" +msgstr "Machine idle check and initialization" + +#: backend/flow/engine/bamboo/scene/common/builder.py:157 +msgid "传入的acts_list参数不合法,请检测" +msgstr "The passed acts_list parameter is illegal, please check" + +#: backend/flow/engine/bamboo/scene/common/builder.py:199 +msgid "传入的sub_flow_list参数不合法,请检测" +msgstr "The sub_flow_list parameter passed in is illegal, please check" + +#: backend/flow/engine/bamboo/scene/common/builder.py:238 +msgid "部署bamboo流程任务创建失败,任务结束" +msgstr "Deploying bamboo process task creation failed, the task ended" + +#: backend/flow/engine/bamboo/scene/common/download_dbactor.py:27 +#: backend/flow/engine/bamboo/scene/common/download_dbactor.py:37 +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:156 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:133 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:116 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:118 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:143 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:176 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:260 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:316 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:148 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:167 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:217 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:304 +msgid "下发actuator介质" +msgstr "Deliver the actuator medium" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:43 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:174 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:217 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:147 +msgid "下发文件" +msgstr "Distribute files" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:56 +msgid "ip[{}]下载文件" +msgstr "ip[{}] download file" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:58 +msgid "构建下载文件流程成功" +msgstr "Build download file process successfully" + +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:61 +#: backend/ticket/constants.py:443 +msgid "资源池导入" +msgstr "Resource pool import" + +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:73 +msgid "主机转移至资源池空闲模块" +msgstr "The host is transferred to the resource pool idle module" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:63 +msgid "迁移的集群必须在同一个云区域" +msgstr "The migrated cluster must be in the same cloud region" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:65 +msgid "迁移的集群必须在同一个业务" +msgstr "The migrated cluster must be in the same business" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:74 +msgid "clone权限规则" +msgstr "clone permission rules" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:80 +msgid "迁移元数据" +msgstr "Migrate metadata" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:89 +msgid "请先跑一下集群标准化,完成之后确认" +msgstr "Please run cluster standardization first and confirm after completion." + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:92 +msgid "更新dns记录归属业务" +msgstr "Update dns record ownership business" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:66 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:63 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:63 +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:61 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:97 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:95 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:59 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:55 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:55 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:71 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:66 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:73 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:73 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:69 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:65 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:67 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:60 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:59 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:159 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:87 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:71 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:61 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:60 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:73 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:64 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:55 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:81 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:60 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:60 +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:69 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:79 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:82 +msgid "获取集群部署配置" +msgstr "Get cluster deployment configuration" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:134 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:102 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:100 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:93 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:76 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:104 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:78 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:78 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:65 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:76 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:213 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:137 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:91 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:69 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:59 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:80 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:83 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:69 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:76 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:86 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:102 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:84 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:87 +msgid "获取机器信息" +msgstr "Get machine information" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:138 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:199 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:107 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:106 +msgid "下发DORIS介质" +msgstr "Deliver DORIS media" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:124 +msgid "启动Master FE {}" +msgstr "Start Master FE {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:131 +msgid "检查Master FE {}是否正常启动" +msgstr "Check whether Master FE {} starts normally" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:138 +msgid "账号权限初始化" +msgstr "Account permission initialization" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:149 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:121 +msgid "集群元数据更新" +msgstr "Cluster metadata updates" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:166 +msgid "插入Doris WebUI实例信息" +msgstr "Insert Doris WebUI instance information" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:173 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:211 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:223 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:100 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:138 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:126 +msgid "回写集群配置信息" +msgstr "Write back cluster configuration information" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:184 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:177 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:148 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:222 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:198 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:161 +msgid "添加域名" +msgstr "add domain name" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:191 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:166 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:137 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:229 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:202 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:173 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:159 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:229 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:180 +msgid "添加到DBMeta" +msgstr "Add to DBMeta" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:201 +msgid "DorisFollower主机数不为{},当前选择数量为{}" +msgstr "The number of DorisFollower hosts is not {}, and the currently selected number is {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:209 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:168 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:166 +msgid "DorisObserver主机数不能为{}" +msgstr "The number of DorisObserver hosts cannot be {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:216 +msgid "Doris数据节点(hot+cold)数量不能为{}" +msgstr "The number of Doris data nodes (hot+cold) cannot be {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:205 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:142 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:162 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:133 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:185 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:232 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:179 +msgid "节点初始化-{}" +msgstr "node init - {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:212 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:151 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:171 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:142 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:191 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:238 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:186 +msgid "解压缩介质包-{}" +msgstr "unzip media package - {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:219 +msgid "渲染集群配置-{}" +msgstr "Rendering cluster configuration-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:227 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:160 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:180 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:151 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:198 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:245 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:194 +msgid "安装supervisor-{}" +msgstr "install supervisor-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:231 +msgid "安装Doris {}-{}子流程" +msgstr "Install Doris {}-{} subprocess" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:252 +msgid "启动初始化-{}-{}" +msgstr "Start initialization-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:258 +msgid "启动-{}-{}" +msgstr "start up-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:263 +msgid "安装DorisFE {}-{}子流程" +msgstr "Install DorisFE {}-{} subprocess" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:279 +msgid "启动DorisBE-{}-{}" +msgstr "Start DorisBE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:294 +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:330 +msgid "获取集群Payload" +msgstr "Get cluster payload" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:305 +msgid "停止DorisFE-{}-{}" +msgstr "StopDorisFE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:316 +msgid "集群元数据更新-drop-fe" +msgstr "Cluster metadata update-drop-fe" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:336 +msgid "集群元数据更新-退役-BE" +msgstr "Cluster metadata update-retirement-BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:343 +msgid "检查数据节点是否退役" +msgstr "Check whether the data node is retired" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:350 +msgid "集群元数据更新-删除-BE" +msgstr "Cluster metadata update-delete-BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:363 +msgid "停止DorisBE-{}-{}" +msgstr "Stop DorisBE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:72 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:69 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:69 +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:66 +msgid "下发doris actuator" +msgstr "Issue doris actuator" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:81 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:219 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:139 +msgid "Doris集群节点清理-{}" +msgstr "Doris cluster node cleanup-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:92 +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:97 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:97 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:64 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:88 +msgid "删除域名" +msgstr "delete domain name" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:104 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:121 +msgid "删除PULSAR_MANAGER实例信息" +msgstr "Delete PULSAR_MANAGER instance information" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:110 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:89 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:79 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:79 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:114 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:90 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:144 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:83 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:84 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:90 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:90 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:127 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:87 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:94 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:84 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:84 +msgid "修改Meta" +msgstr "Modify Meta" + +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:79 +msgid "停止Doris集群进程-{}" +msgstr "Stop the Doris cluster process-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:79 +msgid "启动Doris集群进程-{}" +msgstr "Start the Doris cluster process-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:77 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:81 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:69 +#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:72 +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:84 +msgid "重启实例-{}" +msgstr "restart instance - {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:129 +msgid "获取Payload" +msgstr "GetPayload" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:182 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:227 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:204 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:232 +msgid "扩容子流程" +msgstr "Expansion sub-process" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:192 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:237 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:241 +msgid "获取缩容流程集群部署配置" +msgstr "Obtain the cluster deployment configuration of the shrinking process" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:205 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:125 +msgid "缩容管理节点FE" +msgstr "Shrink management node FE" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:210 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:130 +msgid "缩容数据节点BE" +msgstr "Shrink data node BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:228 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:148 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:134 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:267 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:159 +msgid "更新DBMeta" +msgstr "Update DBMeta" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:239 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:117 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:257 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:203 +msgid "更新域名" +msgstr "update domain name" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:243 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:373 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:256 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:270 +msgid "缩容子流程" +msgstr "Shrink subprocess" + +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:161 +msgid "DorisFollower不支持扩容,当前选择扩容机器数量为{}" +msgstr "DorisFollower does not support expansion. The number of machines currently selected for expansion is {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:159 +msgid "DorisFollower不支持缩容,当前选择缩容机器数量为{}" +msgstr "DorisFollower does not support scaling. The number of machines currently selected for scaling is {}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:18 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:18 +msgid "Flow模块Doris异常" +msgstr "Flow module Doris exception" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:47 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:47 +msgid "机器数量异常" +msgstr "Abnormal number of machines" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:30 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:30 +msgid "Doris集群角色{doris_role}数量不能为{machine_count}" +msgstr "The number of Doris cluster roles {doris_role} cannot be {machine_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:36 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:36 +msgid "Doris集群角色{doris_role}机器数量必须为{must_count}" +msgstr "The number of Doris cluster role {doris_role} machines must be {must_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:42 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:42 +#, python-brace-format +msgid "Doris集群数据节点(热+冷)机器数量之和不能为{must_count}" +msgstr "The sum of the number of Doris cluster data node (hot + cold) machines cannot be {must_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:48 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:48 +#, python-brace-format +msgid "Doris集群Follower不支持扩容, 当前选择扩容机器数量为{machine_count}" +msgstr "Doris cluster Follower does not support expansion. The number of machines currently selected for expansion is {machine_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:53 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:53 +msgid "Doris替换机器数量不一致" +msgstr "The number of Doris replacement machines is inconsistent" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:54 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:54 +#, python-brace-format +msgid "" +"Doris集群替换角色{doris_role}数量不一致,已选旧节点个数{old_count},新节点个数" +"{new_count}" +msgstr "The number of Doris cluster replacement roles {doris_role} is inconsistent, the number of old nodes selected is {old_count}, and the number of new nodes is {new_count}" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:106 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:117 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:90 +msgid "下发ES介质" +msgstr "Issue ES media" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:114 +msgid "生成证书" +msgstr "Generate certificate" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:119 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:139 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:110 +msgid "分发证书" +msgstr "Distribute certificate" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:171 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:191 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:162 +msgid "安装ES {}-{}节点" +msgstr "install ES {}-{} node" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:176 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:196 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:167 +msgid "安装ES {}-{}子流程" +msgstr "install ES {}-{} subprocess" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:184 +msgid "初始化鉴权插件" +msgstr "Initialize the authentication plugin" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:192 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:284 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:124 +msgid "安装kibana" +msgstr "install kibana" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:204 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:91 +msgid "插入kibana实例信息" +msgstr "Insert kibana instance information" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:65 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:61 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:71 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:58 +#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:73 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:68 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:66 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:66 +msgid "下发actuator" +msgstr "Issue the actuator" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:74 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:341 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:182 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:187 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:85 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:324 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:441 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:196 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:126 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:243 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:99 +msgid "节点清理-{}" +msgstr "node cleanup -{}" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:89 +msgid "删除kibana实例信息" +msgstr "Delete kibana instance information" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:103 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:85 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:114 +msgid "清理Meta" +msgstr "Clean up Meta" + +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:70 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:73 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:178 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:80 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:316 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:433 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:179 +msgid "停止进程-{}" +msgstr "stop process - {}" + +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:70 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:74 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:80 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:77 +msgid "启动进程-{}" +msgstr "start process - {}" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:97 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:95 +msgid "获取扩容流程集群部署配置" +msgstr "Obtain the cluster deployment configuration of the expansion process" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:124 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:246 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:83 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:120 +msgid "下发dbactuator" +msgstr "Issue dbactuator" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:132 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:105 +msgid "打包证书" +msgstr "Package certificate" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:213 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:265 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:184 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:102 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:229 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:85 +msgid "更新域名映射" +msgstr "update domain mapping" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:222 +msgid "校验扩容结果" +msgstr "Verify expansion results" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:252 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:89 +msgid "排斥缩容节点" +msgstr "Repulsion and shrinkage nodes" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:298 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:138 +msgid "更新kibana实例信息" +msgstr "Update kibana instance information" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:306 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:147 +msgid "校验搬迁状态" +msgstr "Check relocation status" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:318 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:158 +msgid "校验连接状态" +msgstr "Check connection status" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:327 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:167 +msgid "停止节点-{}" +msgstr "stop-node-{}" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:332 +msgid "停止ES子流程" +msgstr "Stop the ES subprocess" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:351 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:190 +msgid "清理DBMeta" +msgstr "Clean up DBMeta" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:366 +msgid "{}-替换master ip" +msgstr "{} - replace master ip" + +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:97 +msgid "原有机器下发dbactuator" +msgstr "The original machine issues dbactuator" + +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:171 +msgid "停止ES-{}子流程" +msgstr "stop ES-{} subprocess" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:18 +msgid "Flow模块HDFS异常" +msgstr "Flow module HDFS exception" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:29 +msgid "手动部署选择机器数量异常" +msgstr "The number of machines selected for manual deployment is abnormal" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:30 +#, python-brace-format +msgid "HDFS集群角色{hdfs_role}数量不能为{machine_count}" +msgstr "The number of HDFS cluster roles {hdfs_role} cannot be {machine_count}" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:35 +msgid "替换旧机器不能为空" +msgstr "replace old machine cannot be empty" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:36 +msgid "HDFS集群替换旧机器不能为空" +msgstr "HDFS cluster to replace the old machine cannot be empty" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:41 +msgid "HDFS替换新旧机器数量不一致" +msgstr "The number of new and old machines replaced by HDFS is inconsistent" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:42 +#, python-brace-format +msgid "HDFS集群替换角色{hdfs_role}数量不一致" +msgstr "" +"The number of HDFS cluster replacement roles {hdfs_role} is inconsistent" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:94 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:96 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:75 +msgid "下发hdfs介质包" +msgstr "Deliver hdfs media package" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:102 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:762 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:257 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:245 +msgid "初始化机器" +msgstr "Initialize the machine" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:107 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:83 +msgid "解压缩文件" +msgstr "unzip the file" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:112 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:87 +msgid "渲染集群配置" +msgstr "Rendering cluster configuration" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:113 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:117 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:91 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:113 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:249 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:175 +msgid "安装supervisor" +msgstr "install supervisor" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:123 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:162 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:269 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:147 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:128 +msgid "安装zookeeper-{}" +msgstr "install zookeeper-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:133 +msgid "安装JournalNode" +msgstr "Install JournalNodes" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:141 +msgid "安装NN1" +msgstr "Install NN1" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:147 +msgid "安装NN2" +msgstr "Install NN2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:153 +msgid "安装ZKFC" +msgstr "Install ZKFC" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:161 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:152 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:124 +msgid "安装DataNode-{}" +msgstr "Install DataNodes - {}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:171 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:162 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:134 +msgid "安装HAProxy" +msgstr "Install HAProxy" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:185 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:80 +msgid "插入haproxy实例信息" +msgstr "Insert haproxy instance information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:205 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:151 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:219 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:95 +msgid "添加元数据到DBMeta" +msgstr "Add metadata to DBMeta" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:210 +msgid "回写集群部署配置" +msgstr "Write back cluster deployment configuration" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:221 +msgid "NameNode主机数不为2" +msgstr "The number of NameNode hosts is not 2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:225 +msgid "ZooKeeper主机数不为3" +msgstr "The number of ZooKeeper hosts is not 3" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:229 +msgid "DataNode主机数少于2" +msgstr "The number of DataNode hosts is less than 2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:256 +msgid "复用NN主机 {} 作为ZK" +msgstr "Reuse NN host{} as ZK" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:65 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:63 +msgid "检查集群状态" +msgstr "Check cluster status" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:73 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:65 +msgid "下发hdfs actuator" +msgstr "Issue hdfs actuator" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:84 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:242 +msgid "HDFS集群节点清理-{}" +msgstr "HDFS cluster node cleaning -{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:99 +msgid "删除haproxy实例信息" +msgstr "Delete haproxy instance information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:80 +msgid "停止HDFS集群进程-{}" +msgstr "Stop HDFS cluster process -{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:83 +msgid "启动HDFS集群ZK-{}" +msgstr "Start HDFS cluster ZK-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:97 +msgid "启动HDFS集群JN-{}" +msgstr "Start HDFS cluster JN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:112 +msgid "启动HDFS集群NN-{}" +msgstr "Start HDFS cluster NN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:121 +msgid "启动HDFS集群ZKFC-{}" +msgstr "Start HDFS cluster ZKFC-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:125 +msgid "启动HDFS集群NN服务-{}子流程" +msgstr "Start HDFS cluster NN service-{} sub-process" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:135 +msgid "启动HDFS集群DN-{}" +msgstr "Start HDFS cluster DN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:86 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:154 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_fake_apply_flow.py:64 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:196 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:238 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:106 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:449 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:209 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:244 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:284 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:202 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:129 +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:95 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:137 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:176 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:389 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:622 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:101 +msgid "更新DBMeta元信息" +msgstr "Update DBMeta meta information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:90 +msgid "回写hdfs集群配置" +msgstr "Write back hdfs cluster configuration" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:76 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:76 +msgid "重启实例-{}-{}" +msgstr "restart instance-{}-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:65 +msgid "集群DN替换-扩容DN" +msgstr "Cluster DN replacement - expansion DN" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:69 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:62 +msgid "集群DN替换-缩容DN" +msgstr "Cluster DN replacement - shrinking DN" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:146 +msgid "没有需要替换的角色IP" +msgstr "There are no character IPs to replace" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:152 +msgid "替换HDFS DataNode角色IP不一致" +msgstr "Inconsistent IP addresses for replacing HDFS DataNode roles" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:126 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:99 +msgid "更新主机映射" +msgstr "Update host mapping" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:135 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:107 +msgid "include增加数据节点" +msgstr "include to increase the data node" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:143 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:115 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:172 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:195 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:210 +msgid "刷新节点配置" +msgstr "Refresh node configuration" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:175 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:146 +msgid "添加新DN到域名" +msgstr "Add new DN to domain name" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:181 +msgid "元数据DBMeta更新及转移主机" +msgstr "Metadata DBMeta update and transfer host" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:63 +msgid "添加DN获取机器信息" +msgstr "Add DN to get machine information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:164 +msgid "添加数据节点到exclude" +msgstr "Add data nodes to exclude" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:178 +msgid "检查节点退役信息" +msgstr "Check node decommissioning information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:187 +msgid "include剔除数据节点" +msgstr "include removes data nodes" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:202 +msgid "exclude剔除数据节点" +msgstr "exclude removes data nodes" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:230 +msgid "更新haproxy实例信息" +msgstr "Update haproxy instance information" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:264 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:252 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:108 +msgid "DBMeta删除下架IP" +msgstr "DBMeta deletes the off-the-shelf IP" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:74 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:79 +msgid "下发influxdb介质" +msgstr "Deliver influxdb media" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:80 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:87 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:129 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:233 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:159 +msgid "初始化节点" +msgstr "initialize node" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:103 +msgid "解压influxdb包" +msgstr "Unzip the influxdb package" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:113 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:130 +msgid "安装influxdb-{}" +msgstr "install influxdb-{}" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:130 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:146 +msgid "{}-初始化User" +msgstr "{} - Initialize User" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:146 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:162 +msgid "安装telegraf-{}" +msgstr "install telegraf-{}" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:158 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_fake_apply_flow.py:68 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:200 +msgid "回写influxdb集群配置" +msgstr "Write back the influxdb cluster configuration" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:63 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:63 +msgid "下发influxdb actuator" +msgstr "Issue influxdb actuator" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:79 +msgid "清理Influxdb {}子流程" +msgstr "Clean up Influxdb{} subprocesses" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:77 +msgid "禁用Influxdb {}子流程" +msgstr "disable influxdb{} subprocess" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:78 +msgid "启用Influxdb {}子流程" +msgstr "enable influxdb{} subprocess" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:167 +msgid "安装Influxdb {}子流程" +msgstr "install influxdb {} subprocess" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:191 +msgid "下架Influxdb {}子流程" +msgstr "Delist Influxdb{} subprocess" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:123 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:227 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:152 +msgid "下发kafka介质" +msgstr "Send kafka media" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:137 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:241 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:167 +msgid "解压kafka包" +msgstr "Unzip the kafka package" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:173 +msgid "初始化系统kafkaUser" +msgstr "Initialize the system kafkaUser" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:180 +msgid "初始化kafkaUser" +msgstr "Initialize kafkaUser" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:194 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:346 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:189 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:274 +msgid "安装broker-{}" +msgstr "install broker-{}" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:207 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:369 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:224 +msgid "安装kafka manager" +msgstr "install kafka-manager" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:220 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:100 +msgid "插入manager实例信息" +msgstr "Insert manager instance information" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:163 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:197 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:123 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:192 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:370 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:376 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:609 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:101 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:203 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:141 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:101 +msgid "添加集群域名" +msgstr "Add cluster domain name" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:242 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:110 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:332 +msgid "回写kafka集群配置" +msgstr "Write back kafka cluster configuration" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:70 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:70 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:129 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:218 +msgid "下发dbacuator" +msgstr "Issue dbacuator" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:89 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:200 +msgid "清理Kafka {}子流程" +msgstr "Clean up Kafka{} subprocesses" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:99 +msgid "删除manager实例信息" +msgstr "Delete manager instance information" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:84 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:183 +msgid "禁用Kafka {}子流程" +msgstr "Disable Kafka{} subprocess" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:84 +msgid "启用Kafka {}子流程" +msgstr "Enable Kafka {} subprocess" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:280 +msgid "增加zookeeper节点" +msgstr "Add zookeeper nodes" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:290 +#, python-brace-format +msgid "滚动重启broker节点-{ip}" +msgstr "Rolling restart broker node -{ip}" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:301 +msgid "移除zookeeper节点" +msgstr "Remove the zookeeper node" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:328 +msgid "下架zookeeper-{}子流程" +msgstr "Remove zookeeper-{} sub-process" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:382 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:237 +msgid "更新manager实例信息" +msgstr "Update manager instance information" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:395 +msgid "更新集群域名" +msgstr "Update the cluster domain name" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:408 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:139 +msgid "Kafka搬迁数据" +msgstr "Kafka migration data" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:418 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:150 +msgid "Kafka检查搬迁进度" +msgstr "Kafka checks the progress of the relocation" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:445 +msgid "下架broker-{}子流程" +msgstr "Remove broker-{} sub-process" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:163 +msgid "删除broker的域名记录" +msgstr "Delete the domain name record of the broker" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:170 +msgid "停止进程" +msgstr "stop process" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:188 +msgid "清理数据" +msgstr "clean data" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_backup.py:114 +msgid "MongoDB-备份-{}" +msgstr "MongoDB-Backup-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_backup.py:119 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_deinstall.py:49 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_enable_disable.py:49 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:85 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:161 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:56 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:48 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:52 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:45 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:52 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:41 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:47 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:51 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:53 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:56 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:43 +msgid "MongoDB-介质下发" +msgstr "MongoDB-media delivery" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_deinstall.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_enable_disable.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:91 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:62 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:54 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:70 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:58 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:63 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:58 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:47 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:53 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:57 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:59 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:61 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:62 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:49 +msgid "MongoDB-创建原子任务执行目录" +msgstr "MongoDB-Create atomic task execution directory" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_fake_install.py:93 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:214 +msgid "MongoDB--添加关系到meta" +msgstr "MongoDB--Add relationship to meta" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:97 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:68 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:76 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:65 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:67 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:68 +msgid "MongoDB-机器初始化" +msgstr "MongoDB-machine initialization" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:139 +msgid "MongoDB--添加复制集{}-{}关系到meta" +msgstr "MongoDB--Add replica set {}-{} related to meta" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:165 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:76 +msgid "MongoDB--获取管理员用户密码" +msgstr "MongoDB--get administrator user password" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:206 +msgid "MongoDB--添加shards到cluster" +msgstr "MongoDB--Add shards to cluster" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:221 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:100 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:121 +msgid "MongoDB--添加domain到dns" +msgstr "MongoDB--Add domain to dns" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install_dbmon.py:97 +msgid "dbmon-{}" +msgstr "dbmon-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install_dbmon.py:102 +msgid "CpFile: actuator+dbmon+dbtools+toolkit" +msgstr "CpFile: actuator+dbmon+dbtools+toolkit" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_remove_ns.py:93 +msgid "清档-{}" +msgstr "Clear files-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_remove_ns.py:98 +msgid "MongoDB-介质下发({}个IP)" +msgstr "MongoDB-media delivery ({} IPs)" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:128 +msgid "下载备份文件-{}" +msgstr "Download backup file-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:137 +msgid "执行回档命令-{}" +msgstr "Execute rollback command-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:150 +msgid "MongoDB-预处理" +msgstr "MongoDB-preprocessing" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/backup.py:60 +msgid "oplog为True时, 不支持partial备份" +msgstr "When oplog is True, partial backup is not supported." + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/backup.py:110 +msgid "MongoDB-备份-[{}:{}]" +msgstr "MongoDB-Backup-[{}:{}]" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:59 +msgid "MongoDB-{}:{}-mongod开启进程" +msgstr "MongoDB-{}:{}-mongod starts the process" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:72 +msgid "MongoDB-{}:{}-mongos开启进程" +msgstr "MongoDB-{}:{}-mongos starts the process" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:91 +msgid "MongoDB-{}:{}-mongod关闭进程" +msgstr "MongoDB-{}:{}-mongod shutdown process" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:109 +msgid "MongoDB-{}:{}-mongos关闭进程" +msgstr "MongoDB-{}:{}-mongos shutdown process" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:119 +msgid "修改meta" +msgstr "Modify meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:124 +msgid "MongoDB--cluster-{}" +msgstr "MongoDB--cluster-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:107 +msgid "MongoDB--{}增加节点" +msgstr "MongoDB--{}add node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:82 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:73 +msgid "MongoDB--{}减少节点" +msgstr "MongoDB--{}reduce nodes" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:120 +msgid "MongoDB-{}-mongos修改参数" +msgstr "MongoDB-{}-mongos modify parameters" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:144 +msgid "MongoDB-mongos修改meta" +msgstr "MongoDB-mongos modify meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:146 +msgid "MongoDB--cluster整机替换" +msgstr "MongoDB--cluster whole machine replacement" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:81 +msgid "MongoDB--cluster:{}容量变更" +msgstr "MongoDB--cluster:{} capacity change" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:39 +msgid "MongoDB-{}-{}卸载" +msgstr "MongoDB-{}-{}Uninstall" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:114 +msgid "MongoDB-删除域名" +msgstr "MongoDB-delete domain name" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:122 +msgid "MongoDB-删除密码" +msgstr "MongoDB - remove password" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:131 +msgid "MongoDB-删除db_meta关系" +msgstr "MongoDB - delete db_meta relationship" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:136 +msgid "MongoDB--卸载--cluster_id:{}" +msgstr "MongoDB--uninstall--cluster_id:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py:71 +msgid "下载备份文件 {} {}" +msgstr "Download backup file{} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:70 +msgid "MongoDB-cluster_id:{}-执行脚本" +msgstr "MongoDB-cluster_id:{}-Execute script" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:76 +msgid "MongoDB--执行脚本--cluster_id:{}-{}" +msgstr "MongoDB--Execute script--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:94 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:54 +msgid "MongoDB-{}-mongod安装" +msgstr "MongoDB-{}-mongod installation" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:102 +msgid "MongoDB-添加node" +msgstr "MongoDB-add node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:111 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:148 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:105 +msgid "MongoDB-添加新实例的domain到dns" +msgstr "MongoDB-Add the domain of the new instance to dns" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:126 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:176 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:133 +msgid "MongoDB-保存新实例的dba用户及额外管理用户密码" +msgstr "MongoDB-save the dba user and additional administrative user passwords for the new instance" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:132 +msgid "MongoDB--{}增加node{}:{}" +msgstr "MongoDB--{}Add node{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:108 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:88 +msgid "MongoDB--修改meta" +msgstr "MongoDB--Modify meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:113 +msgid "MongoDB--{}增加mongos" +msgstr "MongoDB--{}add mongos" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/install_dbmon_sub.py:105 +msgid "node-{}" +msgstr "node-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/install_dbmon_sub.py:169 +msgid "prepare_instance_info:{} ip" +msgstr "prepare_instance_info:{} ip" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:63 +msgid "MongoDB-cluster_id:{}-ip:{}-port:{}--重启实例" +msgstr "MongoDB-cluster_id:{}-ip:{}-port:{}--Restart the instance" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:71 +msgid "MongoDB--重启实例--ip:{}" +msgstr "MongoDB--restart instance--ip:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:46 +msgid "检查cluster目标端是否存在" +msgstr "Check if the cluster target exists" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:51 +msgid "检查目标端机器规格" +msgstr "Check target machine specifications" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:59 +msgid "保存配置" +msgstr "storage arrangement" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:63 +msgid "更新dba" +msgstr "updatedba" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:68 +msgid "迁移meta" +msgstr "Migrate meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:75 +msgid "保存密码" +msgstr "save password" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:79 +msgid "更新dns的app" +msgstr "Update dns app" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:95 +msgid "添加clb到meta" +msgstr "Add clb to meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:102 +msgid "MongoDB--{}-meta迁移-{}-{}" +msgstr "MongoDB--{}-meta migration-{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:130 +msgid "MongoDB-mongod安装-{}:{}" +msgstr "MongoDB-mongod installation-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:138 +msgid "MongoDB-mongod替换" +msgstr "MongoDB-mongod replacement" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:155 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:112 +msgid "MongoDB-删除老实例的domain指向" +msgstr "MongoDB-Delete the domain point of the old instance" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:183 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:140 +msgid "MongoDB-删除老实例的dba用户及额外管理用户密码" +msgstr "MongoDB-Delete the dba user and additional management user password of the old instance" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:192 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:109 +msgid "MongoDB-mongod修改meta" +msgstr "MongoDB-mongod modifies meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:204 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:153 +msgid "MongoDB-老实例下架-{}:{}" +msgstr "MongoDB-old instance removed-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:210 +msgid "MongoDB--mongod替换--{}:{}" +msgstr "MongoDB--mongod replacement--{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:44 +msgid "MongoDB-{}-mongos安装" +msgstr "MongoDB-{}-mongos installation" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:66 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:102 +msgid "MongoDB--保存dba用户及额外管理用户密码" +msgstr "MongoDB--save dba user and additional management user passwords" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:75 +msgid "MongoDB--安装mongos--{}-{}" +msgstr "MongoDB--Install mongos--{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:96 +msgid "MongoDB-mongos安装-{}:{}" +msgstr "MongoDB-mongos installation-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:158 +msgid "MongoDB--mongos替换--{}:{}" +msgstr "MongoDB--mongos replacement--{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/multi_replicaset_migrate_meta.py:47 +msgid "MongoDB--复制集迁移元数据" +msgstr "MongoDB--replication set migration metadata" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:80 +msgid "MongoDB-移除node" +msgstr "MongoDB-remove node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:90 +msgid "MongoDB-{}-mongod下架" +msgstr "MongoDB-{}-mongod removed from shelves" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:99 +msgid "MongoDB-删除node的domain指向" +msgstr "MongoDB-Delete the domain pointed to by the node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:107 +msgid "MongoDB-删除node的dba用户及额外管理用户密码" +msgstr "MongoDB-Delete the node's dba user and additional management user password" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:115 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:81 +msgid "MongoDB-修改meta" +msgstr "MongoDB-modify meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:121 +msgid "MongoDB--{}减少node{}:{}" +msgstr "MongoDB--{}Reduce node{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:93 +msgid "MongoDB--{}减少mongos" +msgstr "MongoDB--{}reduce mongos" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/remove_ns.py:93 +msgid "清档 {} {}" +msgstr "Clear files {} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:64 +msgid "MongoDB-{}-replicaset初始化" +msgstr "MongoDB-{}-replicaset initialization" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:82 +msgid "MongoDB--创建dba用户" +msgstr "MongoDB--Create dba user" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:88 +msgid "MongoDB--创建额外管理用户" +msgstr "MongoDB--Create additional administrative users" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:112 +msgid "MongoDB-{}-db初始设置" +msgstr "MongoDB-{}-db initial setup" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:130 +msgid "MongoDB--安装复制集--{}-{}" +msgstr "MongoDB--Install replica set--{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:95 +msgid "MongoDB-mongod修改meta-port:{}" +msgstr "MongoDB-mongod modifies meta-port:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:112 +msgid "MongoDB--{}整机替换--ip:{}" +msgstr "MongoDB--{} whole machine replacement--ip:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:96 +msgid "MongoDB--{}容量变更" +msgstr "MongoDB--{} capacity change" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:87 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:86 +msgid "MongoDB--{}增加node" +msgstr "MongoDB--{}add node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:70 +msgid "MongoDB-修改meta-{}:{}" +msgstr "MongoDB-modify meta-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/restore_sub.py:92 +msgid "{} {}" +msgstr "{} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:55 +msgid "MongoDB-cluster_id:{}-创建用户:{}" +msgstr "MongoDB-cluster_id:{}-Create user:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:57 +msgid "MongoDB--创建用户--cluster_id:{}-{}" +msgstr "MongoDB--Create user--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:60 +msgid "MongoDB-cluster_id:{}-删除用户:{}" +msgstr "MongoDB-cluster_id:{}-Delete user:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:62 +msgid "MongoDB--删除用户--cluster_id:{}-{}" +msgstr "MongoDB--delete user--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:110 +msgid "执行ip信息为空" +msgstr "The execution ip information is empty" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:129 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:125 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:99 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:168 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:98 +msgid "下发MySQL周边程序介质" +msgstr "Distribute MySQL peripheral program media" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:196 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:157 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:184 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:190 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:161 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:226 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:490 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:200 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:200 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:212 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:642 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:130 +msgid "安装backup-client工具" +msgstr "Install backup-client tool" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:210 +msgid "安装MySql周边程序" +msgstr "Install MySql peripheral program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:229 +msgid "Master[{}]安装rotate_binlog程序" +msgstr "Master[{}] installs the rotate_binlog program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:245 +msgid "Master[{}]安装mysql-monitor" +msgstr "Master[{}] install mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:262 +msgid "Master[{}]安装备份程序" +msgstr "Master[{}] install backup program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:281 +msgid "Master[{}]安装校验程序" +msgstr "Master[{}] installs the verification program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:298 +msgid "Master[{}]安装DBATools工具箱" +msgstr "Master[{}] installs the DBATools toolbox" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:330 +msgid "Slave[{}]安装rotate_binlog程序" +msgstr "Slave[{}] installs the rotate_binlog program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:346 +msgid "Slave[{}]安装mysql-monitor" +msgstr "Slave[{}] install mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:363 +msgid "Slave[{}]安装备份程序" +msgstr "Slave[{}] install backup program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:382 +msgid "Slave[{}]安装校验程序" +msgstr "Slave[{}] installation verification program" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:399 +msgid "Slave[{}]安装DBATools工具箱" +msgstr "Slave[{}] installs the DBATools toolbox" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:424 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:274 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:320 +msgid "Proxy安装mysql-monitor" +msgstr "Proxy install mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:471 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:213 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:524 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:263 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:417 +msgid "新增repl帐户" +msgstr "Add repl account" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:491 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:222 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:223 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:539 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:278 +msgid "建立主从关系" +msgstr "Establish a master-slave relationship" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:503 +msgid "建立主从同步[{}]" +msgstr "Create master-slave synchronization[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:570 +msgid "获取旧实例系统参数" +msgstr "Get the old instance system parameters" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:592 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:610 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:132 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:219 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:480 +msgid "下发MySQL介质包" +msgstr "Deliver the MySQL media package" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:631 +msgid "部署mysql-crond {}" +msgstr "deploy mysql-crond {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:648 +msgid "安装MySQL实例 {}" +msgstr "Install MySQL instance {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:655 +msgid "安装mysql实例flow" +msgstr "Install mysql instance flow" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:679 +msgid "构建子流程失败,联系系统管理员, check_client_conn_inst is null" +msgstr "Failed to build subprocess, contact system administrator, check_client_conn_inst is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:681 +msgid "构建子流程失败,联系系统管理员, verify_checksum_tuples is null" +msgstr "Failed to build subprocess, contact system administrator, verify_checksum_tuples is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:687 +msgid "检测客户端连接情况" +msgstr "Check client connection status" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:701 +msgid "检测checksum结果" +msgstr "Detect checksum results" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:718 +msgid "[{}]预检测" +msgstr "[{}]Pre-detection" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:742 +msgid "" +"构建init_machine_sub子流程失败,联系系统管理员, sys_init_ips & " +"init_check_ips & yum_install_perl_ips is null" +msgstr "Failed to build the init_machine_sub sub-process, contact the system administrator, sys_init_ips & init_check_ips & yum_install_perl_ips is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:752 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:85 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:120 +msgid "空闲检查[{}]" +msgstr "Idle check[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:787 +msgid "安装MySQL Perl相关依赖" +msgstr "Install MySQL Perl related dependencies" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:810 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:832 +msgid "获取机器系统信息" +msgstr "Get machine system information" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:822 +msgid "更新主机system info" +msgstr "Update host system info" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:864 +msgid "修改{}上实例的的my.cnf配置" +msgstr "Modify the my.cnf configuration of the instance on {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:877 +msgid "同步修改my.cnf配置" +msgstr "Synchronously modify the my.cnf configuration" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:17 +msgid "Flow模块TenDB 异常" +msgstr "Flow module TenDB exception" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:28 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:28 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:52 +msgid "获取备份失败" +msgstr "Failed to get backup" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:34 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:34 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:58 +msgid "获取binlog失败" +msgstr "Failed to obtain binlog" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_binlog_backup.py:26 +msgid "备份时间点:{} 大于 回滚时间点:{}" +msgstr "Backup time point: {} is greater than rollback time point: {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_binlog_backup.py:54 +msgid "原备份节点节点{} 的binlog失败" +msgstr "The binlog of the original backup node node {} failed" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_local_backup.py:109 +msgid "使用的备份信息: {}" +msgstr "Backup information used: {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:111 +msgid "给master添加切换临时账号" +msgstr "Add and switch temporary account to master" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:119 +msgid "给新slave添加切换临时账号" +msgstr "Add and switch temporary account to new slave" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:141 +msgid "新master克隆旧master权限,新slave克隆旧slave权限" +msgstr "The new master clones the old master's permissions, and the new slave clones the old slave's permissions" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:305 +msgid "执行集群切换" +msgstr "Perform a cluster switchover" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:179 +msgid "其余slave节点同步新master数据" +msgstr "The rest of the slave nodes synchronize the new master data" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:189 +msgid "回收旧slave的域名映射" +msgstr "Recycle the domain name mapping of the old slave" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:207 +msgid "对新slave添加域名映射" +msgstr "Add domain name mapping to new slave" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:223 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:195 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:340 +msgid "联动TBinlogDumper切换单据" +msgstr "Linkage TBinlogDumper to switch documents" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:236 +msgid "{}集群执行成对切换" +msgstr "{} cluster performs pairwise switchover" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:63 +msgid "获取集群 {} 的本地备份信息失败" +msgstr "Failed to obtain local backup information for cluster {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:73 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:187 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:287 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:92 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:154 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:307 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:46 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:150 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:67 +msgid "创建目录 {}" +msgstr "create directory{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:98 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:333 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:326 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:297 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:272 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:393 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:100 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:370 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:339 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:377 +msgid "下发db-actor到节点{}" +msgstr "Send db-actor to node {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:94 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:308 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:194 +msgid "本地备份文件下载" +msgstr "Local backup file download" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:118 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:216 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:351 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:136 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:142 +msgid "恢复新从节点数据 {}:{}" +msgstr "Restore new slave node data{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:133 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:367 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:395 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:151 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:158 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:186 +msgid "新增repl帐户{}" +msgstr "add repl account{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:146 +msgid "建立主从关系 {}:{}" +msgstr "Establish master-slave relationship{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:150 +msgid "用本地备份恢复数据{}" +msgstr "Restore data using local backup{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:177 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:277 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:72 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:227 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:52 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:139 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:119 +msgid "获取集群 {} 的备份信息失败" +msgstr "Failed to obtain backup information of cluster {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:197 +msgid "下载备份到{}" +msgstr "Download backup to {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:108 +msgid "下载定点恢复的binlog到{}" +msgstr "Download the binlog of fixed-point recovery to {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:251 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:115 +msgid "定点恢复之前滚binlog{}" +msgstr "Roll binlog{} before fixed-point recovery" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:256 +msgid "用本地备份恢复数据{}:{}" +msgstr "Restore data using local backup{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:293 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:296 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:73 +msgid "下发db-actor到节点" +msgstr "Send db-actor to the node" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:334 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:125 +msgid "恢复新主节点数据 {}:{}" +msgstr "Restore new master node data{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:382 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:173 +msgid "建立主从关系:新从库指向新主库 {} {}:" +msgstr "Establish a master-slave relationship: the new slave library points to the new master library {} {}:" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:409 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:165 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:200 +msgid "建立主从关系:新主库指向旧主库 {}:{}" +msgstr "Establish a master-slave relationship: the new master library points to the old master library {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:413 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:204 +msgid "RemoteDB主从节点成对迁移子流程{}" +msgstr "RemoteDB master-slave node pair migration sub-process{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:78 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:185 +msgid "获取remotedb分片 {} 的备份信息不存在" +msgstr "Obtaining the backup information of remotedb fragment {} does not exist" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:187 +msgid "获取remotedb分片 {} 的备份信息为空" +msgstr "Obtaining the backup information of remotedb fragment {} is empty" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:120 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:97 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:105 +msgid "下载全库备份介质到 {}" +msgstr "Download full database backup media to {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:170 +msgid "{}:{}从节点重建" +msgstr "{}:{}Rebuild from node" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:54 +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:59 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:119 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:116 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:136 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:93 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:202 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:219 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:317 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:192 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:207 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:376 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:104 +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:82 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:602 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:777 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:113 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:126 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:124 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:179 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:99 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:158 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:109 +msgid "下发db-actuator介质" +msgstr "Deliver db-actuator media" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:86 +msgid "新从库加入checksum记录 {}" +msgstr "Add checksum record {} to the new slave library" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:118 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:529 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:495 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:826 +msgid "克隆权限" +msgstr "Clone permissions" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:128 +msgid "先添加新从库域名{}:{}" +msgstr "First add the new slave domain name {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:144 +msgid "再删除旧从库域名{}" +msgstr "Then delete the old slave domain name {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:154 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:837 +msgid "[{}]成对切换" +msgstr "[{}] Switch in pairs" + +#: backend/flow/engine/bamboo/scene/mysql/common/uninstall_instance.py:40 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:222 +msgid "卸载MySQL实例:{}:{}" +msgstr "Uninstall the MySQL instance: {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/uninstall_instance.py:53 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:236 +msgid "Remote node {} 卸载整机实例" +msgstr "Remote node {} uninstalls the entire instance" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:71 +msgid "运行数据导出任务" +msgstr "Run data export task" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:107 +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:246 +msgid "查询不到可执行的实例!!!" +msgstr "Executable instance could not be found! ! !" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:136 +msgid "DRS查询主从延迟失败:{}" +msgstr "DRS query master-slave delay failed: {}" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:89 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:91 +msgid "下发db-actuator介质[云区域ID:{}]" +msgstr "Deliver db-actuator media [cloud area ID: {}]" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:102 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:104 +msgid "下发SQL文件[云区域ID:{}]" +msgstr "Send SQL file [cloud area ID: {}]" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:129 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:128 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:152 +msgid "执行SQL导入" +msgstr "Execute SQL import" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:142 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:141 +msgid "[{}]执行SQL变更" +msgstr "[{}] Execute SQL Alteration" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:156 +msgid "查询不到可执行的集群!!!" +msgstr "No executable cluster found! ! !" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:181 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:167 +msgid "给模板集群下发db-actuator" +msgstr "Deliver db-actuator to the template cluster" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:193 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:179 +msgid "备份测试库表结构" +msgstr "Backup test database table structure" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:206 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:192 +msgid "对SQL文件进行语义测试" +msgstr "Semantic testing of SQL files" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:226 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:210 +msgid "创建SQL执行单据" +msgstr "Create SQL execution tickets" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_authorize_rules.py:42 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:293 +msgid "添加mysql规则授权" +msgstr "Add mysql rule authorization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:126 +msgid "检查元数据信息是否存在主备关系" +msgstr "" +"Check whether the metadata information has a master-backup relationship" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:131 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:58 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:137 +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:97 +#: backend/ticket/constants.py:475 +msgid "定时" +msgstr "timing" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:149 +msgid "创建临时用户" +msgstr "create temporary user" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:178 +msgid "actuator执行checksum" +msgstr "Actuator executes checksum" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:191 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:200 +msgid "删除临时用户" +msgstr "delete temporary user" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:210 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:219 +msgid "生成校验报告" +msgstr "Generate verification report" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:216 +msgid "master[{}{}{}],slave[{}{}{}]的校验结果" +msgstr "Check result of master[{}{}{}],slave[{}{}{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:229 +msgid "master[{}{}{}]的校验任务" +msgstr "Verification task of master[{}{}{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:235 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:251 +msgid "构建checksum流程成功" +msgstr "Build the checksum process successfully" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_clone_rules.py:41 +msgid "添加mysql权限克隆" +msgstr "Add mysql permission to clone" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:64 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:86 +msgid "集群实例类型不适用于开区" +msgstr "Cluster instance type is not applicable to open zones" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:144 +msgid "下发db_actuator介质" +msgstr "Deliver db_actuator media" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:157 +msgid "从源实例{}#{}获取库" +msgstr "Get library from source instance {}#{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:176 +msgid "下发库表文件到目标实例" +msgstr "Deliver database table files to the target instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:194 +msgid "向目标实例:{}#{}导入库" +msgstr "Import the library into the target instance:{}#{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:210 +msgid "数据迁移流程" +msgstr "Data migration process" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:67 +msgid "下发db-actor到集群主从节点{}" +msgstr "Send db-actor to the master and slave nodes of the cluster {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:82 +msgid "修改mysql实例配置{}" +msgstr "Modify the mysql instance configuration {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:97 +msgid "开始修改mysql配置" +msgstr "Start to modify the mysql configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:42 +msgid "串行1" +msgstr "serial 1" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:43 +msgid "串行2" +msgstr "serial 2" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:44 +msgid "串行3" +msgstr "Serial 3" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:48 +msgid "并行1" +msgstr "Parallel 1" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:53 +msgid "并行2" +msgstr "Parallel 2" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:58 +msgid "错误并行3" +msgstr "error parallel 3" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:65 +msgid "串行结束" +msgstr "end of serial" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:114 +msgid "获取回档库表" +msgstr "Get the archive table" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:87 +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:39 +msgid "检查库表是否在用" +msgstr "Check if the library table is in use" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:93 +msgid "下发db-actor到集群主节点{}" +msgstr "Send db-actor to the cluster master node {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:110 +msgid "flashback启动恢复数据中{}" +msgstr "flashback starts restoring data {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:122 +msgid "flash开始恢复数据" +msgstr "flash starts to restore data" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:145 +msgid "下发Proxy介质包" +msgstr "Deliver the proxy media package" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:226 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:291 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:159 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:168 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:125 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:272 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:253 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:514 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:294 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:213 +msgid "部署mysql-crond" +msgstr "Deploy mysql-crond" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:178 +msgid "安装proxy实例" +msgstr "Install proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:188 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:152 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:267 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:528 +msgid "安装MySQL实例" +msgstr "Install MySQL instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:233 +msgid "proxy配置后端实例" +msgstr "proxy configuration backend instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:98 +msgid "添加主集群域名" +msgstr "Add the main cluster domain name" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:255 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:117 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:119 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:219 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:153 +msgid "添加从集群域名" +msgstr "Add slave cluster domain name" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:270 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:426 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:662 +msgid "{}集群部署" +msgstr "{} cluster deployment" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:310 +msgid "部署MySQL高可用集群" +msgstr "Deploy MySQL HA Cluster" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:100 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:94 +msgid "{} standby slave 不存在" +msgstr "{} standby slave does not exist" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:121 +msgid "构造mydumper正则" +msgstr "Construct mydumper regular" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:170 +msgid "检查正则匹配" +msgstr "Check for regular matches" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:145 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:128 +msgid "执行库表备份" +msgstr "Execute database table backup" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:159 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:143 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:134 +msgid "关联备份id" +msgstr "Associated backup id" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:133 +msgid "{} 库表备份" +msgstr "{} database table backup" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:167 +msgid "构建库表备份流程成功" +msgstr "Build database table backup process successfully" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:364 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:93 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:590 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:114 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:73 +msgid "删除注册CC系统的服务实例" +msgstr "Delete the service instance registered with the CC system" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:137 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:159 +msgid "清理实例周边配置" +msgstr "Clean up the configuration around the instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:146 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:398 +msgid "卸载proxy实例" +msgstr "Uninstall proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:168 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:130 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:183 +msgid "卸载mysql实例" +msgstr "Uninstall mysql instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:177 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:144 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:656 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:192 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:128 +msgid "清理db_meta元信息" +msgstr "Clean up db_meta meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:191 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:142 +msgid "清理机器级别配置" +msgstr "Clean up machine-level configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:197 +msgid "下架MySQL高可用集群[{}]" +msgstr "Remove MySQL HA Cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:89 +msgid "检测Proxy端连接情况" +msgstr "Detect Proxy side connection status" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:104 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:111 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:102 +msgid "删除集群域名" +msgstr "Delete the cluster domain name" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:131 +msgid "重启proxy实例" +msgstr "Restart the proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:148 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:156 +msgid "集群变更OFFLINE状态" +msgstr "Cluster changes to OFFLINE state" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:159 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:166 +msgid "禁用MySQL高可用集群[{}]" +msgstr "Disable MySQL HA Cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:133 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:93 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:135 +msgid "集群变更ONLINE状态" +msgstr "Change the status of the cluster to ONLINE" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:144 +msgid "启动MySQL高可用集群[{}]" +msgstr "Start MySQL high availability cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:96 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:124 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:131 +msgid "不支持的备份位置 {}" +msgstr "Unsupported backup location {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:148 +msgid "{} 全库备份" +msgstr "{} full database backup" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:151 +msgid "构建全库备份流程成功" +msgstr "The process of building a full database backup is successful" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:44 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:39 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:39 +msgid "写入元数据" +msgstr "Write metadata" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:49 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:180 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:289 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:103 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:517 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:483 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:303 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:44 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:93 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:114 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:44 +#: backend/ticket/builders/__init__.py:366 +#: backend/ticket/builders/common/constants.py:97 +#: backend/ticket/builders/mysql/mysql_checksum.py:197 +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +#: backend/ticket/constants.py:469 backend/ticket/constants.py:496 +msgid "人工确认" +msgstr "manual confirmation" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:52 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:47 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:47 +msgid "修改集群状态" +msgstr "Modify cluster status" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:55 +msgid "TenDBHA 元数据导入" +msgstr "TenDBHA metadata import" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:57 +msgid "构建TenDBHA元数据导入流程成功" +msgstr "Building TenDBHA metadata import process successfully" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:114 +msgid "构建TenDBHA集群标准化流程成功" +msgstr "The standardization process for building TenDBHA cluster was successful" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:192 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:122 +msgid "安装{}插件" +msgstr "Install{}plugin" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:212 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:142 +msgid "cloud {} 下发文件" +msgstr "cloud {} delivers files" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:151 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:156 +msgid "模块标准化" +msgstr "Module standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:186 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:154 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:159 +msgid "{} CC 模块标准化" +msgstr "{} CC module standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:190 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:158 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:163 +msgid "CC标准化" +msgstr "CC standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:199 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:136 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:172 +msgid "实例化配置" +msgstr "Instantiation configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:201 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:138 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:174 +msgid "实例化 {} 配置" +msgstr "instantiation{} configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:205 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:142 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:178 +msgid "实例化集群配置" +msgstr "Instantiate cluster configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:213 +msgid "标准化proxy" +msgstr "Standardized proxy" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:239 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:304 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:307 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:226 +msgid "部署监控程序" +msgstr "Deployment monitoring program" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:251 +msgid "{} 部署dba工具" +msgstr "{} Deploy dba tools" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:256 +msgid "接入层标准化" +msgstr "Access layer standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:272 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:194 +msgid "实例标准化" +msgstr "Instance normalization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:317 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:320 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:239 +msgid "部署备份程序" +msgstr "Deploy backup procedures" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:330 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:333 +msgid "部署rotate binlog" +msgstr "Deploy rotate binlog" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:343 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:346 +msgid "部署数据校验程序" +msgstr "Deploy data verification program" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:356 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:359 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:252 +msgid "部署DBA工具箱" +msgstr "Deploy DBA Toolbox" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:368 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:243 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:263 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:264 +msgid "{} 标准化" +msgstr "{} standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:372 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:268 +msgid "存储层标准化" +msgstr "Storage layer standardization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:159 +msgid "执行集群主故障转移" +msgstr "Perform cluster master failover" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:174 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:319 +msgid "salve节点同步新master数据" +msgstr "The salve node synchronizes the new master data" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:207 +msgid "{}集群执行主故障切换" +msgstr "{} cluster performs master failover" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:214 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:359 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:150 +msgid "变更db_meta元信息" +msgstr "Change db_meta meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:237 +msgid "主故障切换流程[整机切换]" +msgstr "Main failover process [whole machine switchover]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:102 +msgid "the is_stand_by of new-master-instance [{}] is False " +msgstr "the is_stand_by of new-master-instance [{}] is False" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:144 +msgid "回收新master的域名映射" +msgstr "Recycle the domain name mapping of the new master" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:159 +msgid "对旧master添加域名映射" +msgstr "Add domain name mapping to the old master" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:269 +msgid "旧master添加切换临时账号" +msgstr "Old master add switch temporary account" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:284 +msgid "新master克隆旧master权限" +msgstr "The new master clones the old master permission" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:352 +msgid "{}集群执行主从切换" +msgstr "{} Cluster performs master-slave switchover" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:382 +msgid "主从切换流程[整机切换]" +msgstr "Master-slave switching process [whole machine switching]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:173 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:179 +msgid "安装完毕,写入初始化实例的db_meta元信息" +msgstr "After the installation is completed, write the db_meta meta information of the initialization instance." + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:203 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:209 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:183 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:180 +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:268 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:220 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:187 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:231 +msgid "安装临时备份程序" +msgstr "Install temporary backup program" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:207 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:213 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:139 +msgid "安装实例" +msgstr "Installation example" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:257 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:251 +msgid "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" +msgstr "" +"After the data is restored, write the metadata of the relationship chain " +"between the new master node and the old master node" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:267 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:261 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:221 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:298 +msgid "恢复实例数据" +msgstr "restore instance data" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:306 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:300 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:305 +msgid "集群切换完成,写入 {} 的元信息" +msgstr "The cluster switch is completed and the meta information of {} is written." + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:317 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:311 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:317 +msgid "集群 {} 切换" +msgstr "cluster{} switch" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:345 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:338 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:116 +msgid "清理实例级别周边配置" +msgstr "Clean up instance-level perimeter configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:365 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:285 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:261 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:328 +msgid "卸载实例前先删除元数据" +msgstr "Delete metadata before uninstalling an instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:377 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:370 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:329 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:309 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:283 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:155 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:393 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:351 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:401 +msgid "清理机器配置" +msgstr "Clean up machine configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:392 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:385 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:330 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:302 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:408 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:366 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:416 +msgid "卸载remote节点{}" +msgstr "Uninstall remote node{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:415 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:409 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:353 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:324 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:320 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:240 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:418 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:376 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:425 +msgid "人工确认切换" +msgstr "Manual confirmation switch" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:445 +msgid "更新集群模块" +msgstr "Update cluster module" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:459 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:454 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:370 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:341 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:424 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:382 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:431 +msgid "人工确认卸载实例" +msgstr "Manually confirm the uninstallation instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:463 +msgid "集群{}开始成对迁移" +msgstr "Cluster {} starts migrating in pairs" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:358 +msgid "实例卸载前删除元数据" +msgstr "Delete metadata before instance uninstallation" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:440 +msgid "更新集群db模块" +msgstr "Update cluster db module" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:457 +msgid "集群开始成对迁移" +msgstr "Clusters start migrating in pairs" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:356 +msgid "从源实例:{}#{}获取开区所需库表结构" +msgstr "Obtain the library table structure required for the development zone from the source instance: {}#{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:250 +msgid "下发开区库表文件" +msgstr "Distribute development zone database table files" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:269 +msgid "向目标实例:{}#{}导入库表结构" +msgstr "Import the library table structure to the target instance:{}#{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:282 +msgid "目标集群开区导入表结构流程" +msgstr "Target cluster development zone import table structure process" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:330 +msgid "上传开区参数文件" +msgstr "Upload zone parameter file" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:341 +msgid "下发开区参数文件" +msgstr "Distribute development zone parameter file" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:374 +msgid "下发开区库表数据文件" +msgstr "Deliver development zone database table data files" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:393 +msgid "向目标实例:{}#{}导入库表数据" +msgstr "Import database table data to target instance:{}#{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:408 +msgid "开区数据迁移流程" +msgstr "Open zone data migration process" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:93 +msgid "上传sql文件" +msgstr "upload sql file" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:104 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:117 +msgid "下发sql文件" +msgstr "Send sql file" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:131 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:56 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:59 +msgid "actuator执行partition" +msgstr "Actuator executes partition" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:147 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:71 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:74 +msgid "生成分区执行报告" +msgstr "Generate partition execution report" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:153 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:177 +msgid "cluster[{}]的分区任务" +msgstr "Partition task of cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:156 +msgid "构建mysql partition流程成功" +msgstr "Build mysql partition process successfully" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:75 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:78 +msgid "ip[{}]的分区任务" +msgstr "Partition task for ip[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:77 +msgid "构建mysql partition 定时任务流程成功" +msgstr "The scheduled task process of building mysql partition was successful" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:146 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:154 +msgid "下发proxy安装介质" +msgstr "Deliver proxy installation media" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:166 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:175 +msgid "部署proxy实例" +msgstr "Deploy proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:206 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:221 +msgid "新的proxy配置后端实例" +msgstr "New proxy configuration backend instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:214 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:231 +msgid "克隆proxy用户白名单" +msgstr "Clone proxy user whitelist" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:227 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:244 +msgid "集群对新的proxy添加权限" +msgstr "The cluster adds permissions to the new proxy" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:239 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:256 +msgid "增加新proxy域名映射" +msgstr "Add new proxy domain name mapping" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:254 +msgid "{}集群添加proxy实例" +msgstr "{}Cluster add proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:261 +msgid "添加db_meta元信息" +msgstr "Add db_meta meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:279 +msgid "添加proxy子流程" +msgstr "Add proxy subprocess" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:271 +msgid "{}集群替换proxy实例" +msgstr "{} cluster replaces the proxy instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:278 +msgid "新proxy记录元数据" +msgstr "New proxy record metadata" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:307 +msgid "回收旧proxy机器的元数据信息" +msgstr "Recycle the metadata information of the old proxy machine" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:334 +msgid "替换proxy子流程" +msgstr "Replace proxy subprocess" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:391 +msgid "清理proxy实例级别周边配置" +msgstr "Clean up proxy instance level peripheral configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:404 +msgid "回收对应proxy集群映射" +msgstr "Recycle the corresponding proxy cluster mapping" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:415 +msgid "[{}:{}]下线" +msgstr "[{}:{}] offline" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:75 +msgid "根据cluster ids:{}法找到对应的proxy实例" +msgstr "Find the corresponding proxy instance according to the cluster ids:{} method" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:89 +msgid "待升级版本大于等于新版本,请确认升级的版本" +msgstr "The version to be upgraded is greater than or equal to the new version. Please confirm the version to be upgraded." + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:105 +msgid "本地升级proxy版本" +msgstr "Upgrade proxy version locally" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:124 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:389 +msgid "下发升级的安装包" +msgstr "Distribute the upgraded installation package" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:141 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:416 +msgid "执行本地升级" +msgstr "Perform a local upgrade" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:147 +msgid "更新proxy version meta信息" +msgstr "Update proxy version meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:156 +msgid "{}proxy实例升级" +msgstr "{}proxy instance upgrade" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:86 +msgid "下发actuator介质 云区域ID: {}" +msgstr "Deliver actuator media cloud area ID: {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:114 +msgid "下发mysql-crond配置 {}" +msgstr "Deliver mysql-crond configuration {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:131 +msgid "下发MySQL rotatebinlog配置" +msgstr "Deliver MySQL rotatebinlog configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:161 +msgid "配置推送" +msgstr "Configuration push" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:162 +msgid "构建配置推送流程完成" +msgstr "The build configuration push process is completed" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:182 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:227 +msgid "{}下发mysql-monitor配置" +msgstr "{}Delivery mysql-monitor configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:204 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:269 +msgid "{}下发备份配置" +msgstr "{}Delivery backup configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:248 +msgid "{}下发mysql-table-checksum配置" +msgstr "{}Delivery mysql-table-checksum configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:294 +msgid "{} 推送周边配置" +msgstr "{} Push peripheral configuration" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_random_password.py:50 +msgid "mysql密码随机化" +msgstr "mysql password randomization" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:94 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:114 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:97 +msgid "下发actuator介质[云区域ID: {}" +msgstr "Deliver actuator media [cloud region ID: {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:128 +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:138 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:149 +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:50 +msgid "{} 检查库表是否在用" +msgstr "{} Check if the database table is in use" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:146 +msgid "{} 执行 rename" +msgstr "{} execute rename" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:163 +msgid "{} 重命名数据库" +msgstr "{} rename database" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:271 +msgid "DB重命名" +msgstr "DB rename" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:169 +msgid "构建重命名数据库流程成功" +msgstr "build rename database process succeeded" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:152 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:455 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:556 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:149 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:406 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:524 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:122 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:213 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:188 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:156 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:153 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:171 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:227 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:248 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:201 +msgid "写入初始化实例的db_meta元信息" +msgstr "Write the db_meta meta information of the initialized instance" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:188 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:185 +msgid "安装从节点" +msgstr "Install slave node" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:211 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:238 +msgid "同步完毕,写入主从关系,设置节点为running状态" +msgstr "After synchronization is completed, the master-slave relationship is written and the node is set to running state." + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:268 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:246 +msgid "slave切换完毕,修改集群 {} 数据" +msgstr "After the slave switch is complete, modify the cluster {} data" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:278 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:256 +msgid "切换到新从节点" +msgstr "Switch to new slave node" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:376 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:346 +msgid "slave重建迁移{}" +msgstr "slave rebuild migration{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:424 +msgid "下发db-actor到节点{} {}" +msgstr "Send db-actor to node {} {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:468 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:434 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:150 +msgid "屏蔽监控 {}" +msgstr "Block monitoring{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:480 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:446 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:162 +msgid "从库reset slave {}" +msgstr "reset slave {} from the library" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:500 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:460 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:176 +msgid "slave重建之清理从库{}" +msgstr "Slave reconstruction to clean up the slave {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:539 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:506 +msgid "添加从库域名{}:{}" +msgstr "Add slave domain name {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:579 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:259 +msgid "slave原地重建{}" +msgstr "slave rebuilds in situ {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:547 +msgid "{}slave原地重建" +msgstr "{}slave rebuilt in situ" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:205 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:358 +msgid "rollback_type不存在" +msgstr "rollback_type does not exist" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:207 +msgid "定点恢复" +msgstr "fixed point recovery" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:259 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:128 +msgid "回档集群 {} 空闲检查不通过,请确认回档集群是否存在非系统数据库" +msgstr "The rollback cluster {} failed the idle check. Please confirm whether there is a non-system database in the rollback cluster." + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:362 +msgid "定点回档到{}:{}" +msgstr "Fixed point return to {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:367 +msgid "定点回档到{}" +msgstr "Return to {} at fixed point" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:75 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:153 +msgid "下载定点恢复的全库备份介质到{}" +msgstr "Download the full database backup media of fixed-point recovery to {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:83 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:161 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:210 +msgid "定点恢复之恢复数据{}" +msgstr "Fixed-point recovery restore data{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:120 +msgid "{}:{}定点回滚数据 REMOTE_AND_TIME " +msgstr "{}:{} Fixed-point rollback data REMOTE_AND_TIME" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:168 +msgid "{}:{}定点回滚数据 REMOTE_AND_BACKUPID " +msgstr "{}:{} Fixed-point rollback data REMOTE_AND_BACKUPID" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:217 +msgid "{}:{}定点回滚数据 LOCAL_AND_BACKUPID " +msgstr "{}:{} Fixed-point rollback data LOCAL_AND_BACKUPID" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:130 +msgid "下发MySQL介质" +msgstr "Deliver MySQL media" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:180 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:146 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:76 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:158 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:175 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:117 +msgid "录入db_meta元信息" +msgstr "Enter db_meta meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:204 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:139 +msgid "部署单节点集群" +msgstr "Deploy a single-node cluster" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:207 +msgid "部署子流程" +msgstr "Deployment subprocess" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:168 +msgid "下架MySQL单节点集群[{}]" +msgstr "Remove MySQL single-node cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:58 +msgid "检测实例连接情况" +msgstr "Check instance connection status" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:69 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:115 +msgid "回收集群域名" +msgstr "Recycle the cluster domain name" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:90 +msgid "禁用MySQL单节点集群[{}]" +msgstr "Disable MySQL single-node cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:104 +msgid "启动MySQL单节点集群[{}]" +msgstr "Start MySQL single-node cluster[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:155 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:249 +msgid "{} 执行清档" +msgstr "{} Execute file clearing" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:173 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:287 +msgid "生成删除备份库sql" +msgstr "Generate and delete backup database sql" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:297 +msgid "{} 清档" +msgstr "{} clear file" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:188 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:302 +msgid "生成删除备份库变更SQL单据" +msgstr "Generate SQL documents for deleting backup database changes" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:193 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:307 +#: backend/ticket/builders/redis/redis_purge.py:56 +msgid "集群清档" +msgstr "Cluster cleanup" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:194 +msgid "构建清档流程成功" +msgstr "Build clearance process succeeded" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:51 +msgid "不允许跨多个大版本升级" +msgstr "Upgrading across multiple major versions is not allowed" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:58 +msgid "当前集群MySQL升级版本大于等于新版本,请确认" +msgstr "The current cluster MySQL upgrade version is greater than or equal to the new version, please confirm" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:110 +msgid "查询集群{}stanb_by slave实例为None" +msgstr "Query cluster {}stanb_by slave instance is None" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:117 +msgid "请先升级{}stanb_by的其他slave实例" +msgstr "Please upgrade other slave instances of {}stanb_by first" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:120 +msgid "{}升级前后字符集不一致,原字符集:{},新模块的字符集{}" +msgstr "{}The character set before and after the upgrade is inconsistent, the original character set: {}, the character set of the new module {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:173 +msgid "当前集群,请确认" +msgstr "Current cluster, please confirm" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:176 +msgid "必须把主机关联的集群都选上,请确认" +msgstr "All clusters associated with the host must be selected, please confirm" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:233 +msgid "无法找到对应的从实例记录" +msgstr "Unable to find the corresponding slave instance record" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:242 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:353 +msgid "集群的master应该同属于一个机器,当前分布在{}" +msgstr "The masters of the cluster should belong to the same machine and are currently distributed in {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:340 +msgid "[TendbHa]本地升级MySQL版本" +msgstr "[TendbHa] Upgrade MySQL version locally" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:365 +msgid "[TendbSingle]本地升级MySQL版本" +msgstr "[TendbSingle] Upgrade MySQL version locally" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:367 +msgid "不支持的集群类型" +msgstr "Unsupported cluster type" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:405 +msgid "执行本地升级前置检查" +msgstr "Perform local upgrade pre-checks" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:422 +msgid "更新mysql instance version meta信息" +msgstr "Update mysql instance version meta information" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:431 +msgid "MySQL实例升级" +msgstr "MySQL instance upgrade" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:94 +msgid "修复单据找不到可修复的存储对" +msgstr "The repair document cannot find a repairable storage pair." + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:122 +msgid "执行数据修复" +msgstr "perform data repair" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:135 +msgid "{}:{}做数据修复" +msgstr "{}:{} do data repair" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:140 +msgid "{}数据修复" +msgstr "{} data repair" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:143 +msgid "修复单据找不到可修复的集群" +msgstr "The repair document cannot find a repairable cluster." + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:51 +msgid "创建clb" +msgstr "create clb" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:55 +msgid "clb信息写入meta" +msgstr "clb information is written to meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:61 +msgid "clb域名添加到dns,clb域名信息写入meta" +msgstr "The clb domain name is added to dns, and the clb domain name information is written into meta." + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:80 +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:184 +msgid "主域名解绑clb ip" +msgstr "Unbind clb ip from main domain name" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:86 +msgid "dns删除clb域名,从meta删除clb域名信息" +msgstr "dns deletes the clb domain name and deletes the clb domain name information from meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:92 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:164 +msgid "删除clb" +msgstr "delete clb" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:96 +msgid "从meta删除clb信息" +msgstr "Remove clb information from meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:115 +msgid "创建polaris" +msgstr "create polaris" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:121 +msgid "polaris信息写入meta" +msgstr "polaris information written to meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:140 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:211 +msgid "删除polaris" +msgstr "remove polaris" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:146 +msgid "从meta删除polaris信息" +msgstr "Remove polaris information from meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:165 +msgid "主域名绑定clb ip" +msgstr "The main domain name is bound to clb ip" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:18 +msgid "Flow模块Pulsar集群异常" +msgstr "Flow module Pulsar cluster exception" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:29 +msgid "Pulsar-Broker异常" +msgstr "Pulsar-Broker exception" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:30 +msgid "Pulsar集群Broker数量不能为0" +msgstr "The number of Brokers in the Pulsar cluster cannot be 0" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:105 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:97 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:163 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:82 +msgid "下发pulsar介质" +msgstr "Issue Pulsar media" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:121 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:69 +msgid "添加ZK域名" +msgstr "Add ZK domain name" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:133 +msgid "仅非DNS环境使用-添加broker hosts" +msgstr "Only used in non-DNS environments - add broker hosts" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:170 +msgid "初始化集群配置-{}" +msgstr "Init cluster config-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:185 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:184 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:107 +msgid "分发密钥及token" +msgstr "Distribute secretkey and token" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:201 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:307 +msgid "安装pulsar manager" +msgstr "Install pulsar-manager" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:214 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:83 +msgid "插入pulsar manager实例信息" +msgstr "Insert pulsar manager instance information" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:230 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:315 +msgid "初始化pulsar manager" +msgstr "Initialize pulsar-manager" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:205 +msgid "仅非DNS环境使用-添加zookeeper hosts" +msgstr "Only used in non-DNS environment - add zookeeper hosts" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:210 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:249 +msgid "安装Pulsar-{}-common子流程" +msgstr "Install Pulsar-{}-common subprocess" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:259 +msgid "安装bookkeeper-{}" +msgstr "Install bookkeeper-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:289 +msgid "缩容Pulsar-Broker-{}" +msgstr "Shrink Pulsar-Broker-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:319 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:193 +msgid "检查Broker配置-{}" +msgstr "Check Broker Configuration - {}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:330 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:205 +msgid "检查NameSpace配置-{}" +msgstr "Check NameSpace Configuration - {}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:337 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:216 +msgid "检查未复制ledger-{}" +msgstr "check not replicated ledger-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:344 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:274 +msgid "停止BookKeeper服务-{}" +msgstr "Stop BookKeeper service - {}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:350 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:280 +msgid "退役BookKeeper-{}" +msgstr "Decommissioned BookKeeper-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:355 +msgid "缩容Pulsar-BookKeeper-{}-子流程" +msgstr "Shrinking Pulsar-BookKeeper-{}-subprocesses" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:67 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:67 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:65 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:66 +msgid "下发pulsar actuator" +msgstr "Issue the pulsar actuator" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:86 +msgid "Pulsar集群节点清理-{}" +msgstr "Pulsar cluster node cleanup -{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:110 +msgid "删除ZK域名" +msgstr "Delete ZK domain name" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:78 +msgid "停止Pulsar集群进程-{}-{}" +msgstr "Stop Pulsar cluster process -{}-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:90 +msgid "写入token" +msgstr "write token" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:116 +msgid "替换pulsar manager子流程" +msgstr "Replace pulsar manager subprocess" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:143 +msgid "替换ZooKeeper子流程" +msgstr "Replace ZooKeeper subprocess" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:216 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:73 +msgid "缩容BookKeeper子流程" +msgstr "Shrink the BookKeeper sub-process" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:283 +msgid "更新pulsar_manager实例信息" +msgstr "Update pulsar_manager instance information" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:296 +msgid "仅非DNS环境使用-添加broker域名" +msgstr "Only used in non-DNS environment - add broker domain name" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:86 +msgid "停止ZooKeeper服务-{}" +msgstr "stop ZooKeeper service - {}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:100 +msgid "更新ZK域名" +msgstr "Update ZK domain name" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:117 +msgid "仅非DNS环境使用-更新ZK映射" +msgstr "Only used in non-DNS environments - update ZK mapping" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:133 +msgid "替换Pulsar-ZooKeeper-{}-子流程" +msgstr "Replace Pulsar-ZooKeeper-{}-subprocess" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:230 +msgid "检查Ledger Metadata-{}" +msgstr "Check Ledger Metadata - {}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:243 +msgid "修改Bookie参数为ReadOnly-{}" +msgstr "Modify the Bookie parameter to ReadOnly-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:257 +msgid "滚动重启BookKeeper-{}" +msgstr "Rolling Restart BookKeeper -{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:264 +msgid "等待数据过期" +msgstr "wait for data to expire" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:44 +msgid "添加域名映射" +msgstr "Add domain name mapping" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:69 +msgid "域名变更子流程" +msgstr "Domain name change sub-process" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:96 +msgid "add_ips 和 del_ips 不能同时为空" +msgstr "add_ips and del_ips cannot be empty at the same time" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:107 +msgid "添加记录{}" +msgstr "add record{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:118 +msgid "删除记录{}" +msgstr "delete record{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:122 +msgid "更新域名{}" +msgstr "Update domain name {}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:139 +msgid "clb添加rs" +msgstr "clbaddrs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:153 +msgid "clb剔除rs" +msgstr "clb cull rs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:169 +msgid "CLB变更子流程" +msgstr "CLB change sub-process" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:186 +msgid "polaris添加rs" +msgstr "polarisaddrs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:200 +msgid "polaris剔除rs" +msgstr "polaris removers" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:216 +msgid "北极星变更子流程" +msgstr "Polaris change sub-process" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:284 +msgid "{}-{}-dns/clb 接入层子任务" +msgstr "{}-{}-dns/clb access layer subtask" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:71 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:69 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:63 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:57 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:113 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:66 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:127 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:61 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:55 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:219 +msgid "{}-下发介质包" +msgstr "{}-Delivery media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:86 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:72 +msgid "请求检查-{}" +msgstr "Request Check-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:100 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:197 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:87 +msgid "卸载监控-{}" +msgstr "Uninstall monitoring-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:114 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:129 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:415 +msgid "干掉非活跃链接-{}" +msgstr "Kill inactive links-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:126 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:141 +msgid "下架实例-{}" +msgstr "Delisting example-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:138 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:99 +msgid "清理元数据-{}" +msgstr "Clean metadata-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:143 +msgid "Redis-{}-下架原子任务" +msgstr "Redis-{}-offset atomic task" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:183 +msgid "Proxy-{}-下发介质包" +msgstr "Proxy-{}-deliver media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:211 +msgid "Proxy-{}-卸载实例" +msgstr "Proxy-{}-Uninstall instance" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:222 +msgid "Proxy-{}-删除元数据" +msgstr "Proxy-{}-remove metadata" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:227 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:126 +msgid "Proxy-{}-卸载原子任务" +msgstr "Proxy-{}-offload atomic tasks" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:88 +msgid "{}-rewrite配置servers" +msgstr "{}-rewrite configuration servers" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:95 +msgid "{}-predixy rewrite配置servers" +msgstr "{}-predixy rewrite configuration servers" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:80 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:73 +msgid "Proxy-001-{}-下发介质包" +msgstr "Proxy-001-{}-deliver media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:87 +msgid "Proxy-002-{}-初始化机器" +msgstr "Proxy-002-{}-initialize machine" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:96 +msgid "Proxy-002-{}-安装backup-client工具" +msgstr "Proxy-002-{}-Install backup-client tool" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:158 +msgid "Proxy-003-{}-安装实例" +msgstr "Proxy-003-{}-Installation example" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:169 +msgid "Proxy-004-{}-写入元数据" +msgstr "Proxy-004-{}-write metadata" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:192 +msgid "Proxy-005-{}-安装监控" +msgstr "Proxy-005-{}-installation monitoring" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:197 +msgid "Proxy-{}-安装原子任务" +msgstr "Proxy-{}-install atomic tasks" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:95 +msgid "Proxy-002-{}-卸载监控" +msgstr "Proxy-002-{}-Uninstall monitoring" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:108 +msgid "Proxy-003-{}-卸载实例" +msgstr "Proxy-003-{}-Uninstall instance" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:121 +msgid "Proxy-004-{}-删除元数据" +msgstr "Proxy-004-{}-Remove metadata" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:83 +msgid "{}-proxy版本升级" +msgstr "{}-proxy version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:90 +msgid "{}-集群proxy版本升级" +msgstr "{}-Cluster proxy version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:58 +msgid "修改{}配置中心密码" +msgstr "Modify {} configuration center password" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:74 +msgid "修改实例密码: {}:{}" +msgstr "Change instance password: {}:{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:80 +msgid "redis集群修改密码子任务" +msgstr "redis cluster modify codon subtask" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:75 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:131 +msgid "{}-kill客户端连接" +msgstr "{}-kill client connection" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:82 +msgid "{}-集群机器kill客户端连接" +msgstr "{}-Cluster machine kill client connection" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:138 +msgid "{}-集群kill客户端连接" +msgstr "{}-Cluster kill client connection" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:209 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:219 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:205 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:515 +msgid "{}-刷新监控" +msgstr "{}-Refresh monitoring" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:245 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:386 +msgid "主从替换-{}" +msgstr "Master-slave replacement-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:340 +msgid "元数据角色互换-{}" +msgstr "Metadata role swap-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:177 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:472 +msgid "Redis-新节点加入集群" +msgstr "Redis-new node joins the cluster" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:189 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:170 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:192 +msgid "刷新域名-{}" +msgstr "Refresh domain name-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:217 +msgid "Redis-更新sbind_entry元数据" +msgstr "Redis - update sbind_entry metadata" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:241 +msgid "Redis-初始化nodes域名" +msgstr "Redis-initialize nodes domain name" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:279 +msgid "-e \"s/{}{}{}/{}{}{}/\"" +msgstr "-e \"s/{}{}{}/{}{}{}/\"" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:299 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:501 +msgid "刷新Predixy本地配置" +msgstr "Refresh Predixy local configuration" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:320 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:544 +msgid "Slave替换-{}" +msgstr "Slave replacement-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:85 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:146 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:359 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:800 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:812 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:494 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:319 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:346 +msgid "{}-安装bkdbmon" +msgstr "{}-install bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:92 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:153 +msgid "{}-集群机器安装bkdbmon" +msgstr "{}-Cluster machine installation bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:59 +msgid "{}磁盘信息 " +msgstr "{}disk information" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:67 +msgid "redis dts前置检查,{}->{}" +msgstr "redis dts pre-check,{}->{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:74 +msgid "redis dts发起任务并等待至增量同步阶段" +msgstr "" +"redis dts initiates a task and waits until the incremental synchronization " +"phase" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:78 +msgid "redis dts任务发起并等待同步完成" +msgstr "The redis dts task is initiated and waits for synchronization to complete" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:121 +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:83 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:103 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:217 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:122 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:107 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:140 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:105 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:94 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:338 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:69 +msgid "下发介质包" +msgstr "Deliver the media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:129 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:145 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:133 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:173 +msgid "redis备份: {}" +msgstr "redis backup: {}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:144 +msgid "redis 清档: {}" +msgstr "redis clear file: {}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:155 +msgid "redis 备份后清档" +msgstr "Clear files after redis backup" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:88 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:65 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:248 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:92 +msgid "下发介质" +msgstr "Deliver media" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:93 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:113 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:651 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:242 +msgid "Redis-{}-下发介质包" +msgstr "Redis-{}-deliver media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:101 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:660 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:251 +msgid "Redis-{}-初始化机器" +msgstr "Redis-{}-initialize the machine" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:108 +msgid "|安装插件" +msgstr "|Install plugin" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:668 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:259 +msgid "Redis-{}-安装backup-client工具" +msgstr "Redis-{}-install backup-client tool" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:155 +msgid "{}-{}-安装实例" +msgstr "{}-{}-Installation Example" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:173 +msgid "{}-{}-写入元数据" +msgstr "{}-{}-Write metadata" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:199 +msgid "Redis-{}-安装监控" +msgstr "Redis-{}-installation monitoring" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:204 +msgid "Redis-{}-{}" +msgstr "Redis-{}-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:83 +msgid "master:{}-加载module" +msgstr "master:{}-load module" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:99 +msgid "slave:{}-加载module" +msgstr "slave:{}-load module" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:122 +msgid "predixy:{}-加载module命令" +msgstr "predixy:{}-load module command" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:134 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:171 +msgid "更新集群dbconfig配置" +msgstr "Update cluster dbconfig configuration" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:140 +msgid "{}-集群加载modules" +msgstr "{}-Cluster loading modules" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:63 +msgid "下发介质包-{}" +msgstr "Deliver media package-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:84 +msgid "卸载dbmon-{}" +msgstr "Uninstall dbmon-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:132 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:147 +msgid "拉起dbmon-{}" +msgstr "Pull up dbmon-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:152 +msgid "Redis-{}-创建同步关系原子任务" +msgstr "Redis-{}-Create a synchronization relational atomic task" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:177 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:197 +msgid "建立主从关系-{}" +msgstr "Establish master-slave relationship-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:259 +msgid "发起备份-{}" +msgstr "Initiate backup-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:270 +msgid "发送备份文件-{}==>>{}" +msgstr "Send backup file-{}==>>{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:282 +msgid "恢复备份-{}" +msgstr "Restore backup-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:312 +msgid "加入集群-{}" +msgstr "Join cluster-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:330 +msgid "同步数据-{}" +msgstr "Sync data-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:80 +msgid "{}-设置maxmemory" +msgstr "{}-set maxmemory" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:87 +msgid "{}-集群设置maxmemory" +msgstr "{}-cluster settings maxmemory" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:47 +msgid "Redis-301-{}-下发介质包" +msgstr "Redis-301-{}-deliver media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:62 +msgid "Redis-302-{}-检查同步状态" +msgstr "Redis-302-{}-check sync status" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:116 +msgid "踢掉旧节点-{}" +msgstr "Kick off old nodes-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:146 +msgid "Redis-{}-下架" +msgstr "Redis-{}-removed" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:148 +msgid "Redis-{}-{}-下架" +msgstr "Redis-{}-{}-removed" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:104 +msgid "Redis-元数据加入集群" +msgstr "Redis-metadata join the cluster" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:123 +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:556 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:573 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:645 +msgid "Redis-人工确认" +msgstr "Redis-manual confirmation" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:146 +msgid "Redis-{}-实例切换" +msgstr "Redis-{}-instance switching" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:158 +msgid "{}-检查切换状态" +msgstr "{} - Check switching status" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:226 +msgid "元数据切换" +msgstr "metadata switch" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:241 +msgid "刷新-{}-dbmon" +msgstr "refresh-{}-dbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:249 +msgid "{}-实例切换" +msgstr "{}-instance switching" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:71 +msgid "{}下发介质包" +msgstr "{}Delivery media package" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:84 +msgid "{}-gcs备份记录获取并保存到本地文件" +msgstr "{}-gcs backup records are obtained and saved to local files" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:105 +msgid "{}-备份记录上报到bklog" +msgstr "{}-Backup records are reported to bklog" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:109 +msgid "{}-重新上报备份记录" +msgstr "{}-Re-submit backup records" + +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:17 +msgid "Flow模块Tendis 异常" +msgstr "Flow module Tendis exception" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:73 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:59 +msgid "DTS_Server-{}-下发介质" +msgstr "DTS_Server-{}-deliver media" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:88 +msgid "DTS_Server-{}-部署" +msgstr "DTS_Server-{}-Deployment" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:94 +msgid "DTS_Server-{}-写入dbmeta" +msgstr "DTS_Server-{}-write dbmeta" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:99 +msgid "ADD DTS_SERVER" +msgstr "ADD DTS_SERVER" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:425 +msgid "Redis集群扩缩容" +msgstr "Redis cluster expansion and contraction" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:517 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:405 +msgid "更新storageinstance_bind_entry元数据" +msgstr "Update storageinstance_bind_entry metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:551 +msgid "初始化新增nodes域名" +msgstr "Initialize the new nodes domain name" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:597 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:520 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:827 +msgid "{}-重装bkdbmon" +msgstr "{}-Reinstall bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:609 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:528 +msgid "Redis-更新dbconfig中集群版本" +msgstr "Redis-Update the cluster version in dbconfig" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:626 +msgid "{}backend扩缩容" +msgstr "{}backend expansion and contraction" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:286 +msgid "slave:{}:{} 实例安装" +msgstr "slave:{}:{} instance installation" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:301 +msgid "new_slave 写入元数据" +msgstr "new_slave writes metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:371 +msgid "同步关系 {}:{} -> {}:{}" +msgstr "Synchronization relationship {}:{} -> {}:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:420 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:116 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:211 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:160 +msgid "初始化配置-{}" +msgstr "Initialization configuration-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:467 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:468 +msgid "元数据更新" +msgstr "Metadata updates" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:538 +msgid "Redis-{}-新建从库" +msgstr "Redis-{}-new slave library" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:119 +msgid "集群[{}]备份" +msgstr "cluster[{}] backup" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:85 +msgid "下发介质包,ips:{}" +msgstr "Deliver media package,ips:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:97 +msgid "redis dts数据校验: {}" +msgstr "Redis dts data verification: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:107 +msgid "数据修复人工确认" +msgstr "Data repair manual confirmation" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:116 +msgid "redis dts数据修复: {}" +msgstr "redis dts data repair: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:125 +msgid "数据校验与修复,源集群:{} 目的集群:{}" +msgstr "Data verification and repair, source cluster: {} destination cluster: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:186 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:877 +msgid "断开同步关系" +msgstr "Disconnect synchronization relationship" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:203 +msgid "数据复制:{}->{}" +msgstr "Data copy:{}->{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:232 +msgid "bk_cloud_id:{} 未找到DNS nameserver" +msgstr "bk_cloud_id:{} DNS nameserver not found" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:235 +msgid "bk_cloud_id:{} DNS nameserver ip 为空" +msgstr "bk_cloud_id:{} DNS nameserver ip is empty" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:247 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:378 +msgid "源集群{}重复了" +msgstr "Source cluster {} is duplicated" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:268 +msgid "目标集群 {} 不存在" +msgstr "Target cluster{} does not exist" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:285 +msgid "" +"回档任务(src_cluster:{} recovery_time_point:" +"{} destroyed_status:0) 不存在?" +msgstr "The rollback task (src_cluster:{} recovery_time_point:{} destroyed_status:0) does not exist?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:304 +msgid "回档临时环境如何(temp_cluster_proxy:{}) ping 失败, {}" +msgstr "How to roll back the temporary environment (temp_cluster_proxy:{}) ping failed, {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:318 +msgid "数据构造临时集群存在 redis 访问失败的情况,临时集群 redis:{}, {}" +msgstr "There is a redis access failure in the temporary cluster of data structure. Temporary cluster redis: {}, {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:390 +msgid "集群当前分片数:{} 等于 目标分片数:{}" +msgstr "The current number of shards in the cluster: {} is equal to the target number of shards: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:397 +msgid "集群:{} 当前running_master个数:{} 等于 目标分片数:{}" +msgstr "Cluster: {} Current number of running_masters: {} equal to target number of shards: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:404 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:426 +msgid "集群:{} 目标版本:{} 不在 集群类型:{} 版本列表:{}中" +msgstr "Cluster:{} Target version:{} Not in cluster type:{} Version list:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:414 +msgid "当前集群类型:{} == 目标集群类型:{}" +msgstr "Current cluster type: {} == Target cluster type: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:418 +msgid "目标集群类型:{} == 集群:{} 当前类型:{}" +msgstr "Target cluster type: {} == Cluster: {} Current type: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:423 +msgid "集群:{} 目标版本为空" +msgstr "Cluster:{} target version is empty" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:534 +msgid "集群:{}安装任务并检测任务状态" +msgstr "Cluster:{}Install tasks and detect task status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:544 +msgid "集群:{}清档任务并检测任务状态" +msgstr "Cluster:{}Clear tasks and detect task status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:576 +msgid "在线切换任务并检测任务状态" +msgstr "Switch tasks online and detect task status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:581 +msgid "集群:{}禁用任务并检测任务状态" +msgstr "Cluster: {} disable tasks and detect task status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:586 +msgid "集群:{}下架任务并检测任务状态" +msgstr "Cluster:{}Remove tasks and check task status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:763 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:783 +msgid "{} 前置检查" +msgstr "{} Pre-check" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:804 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:814 +msgid "{} proxys下发介质" +msgstr "{} Proxies deliver media" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:825 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:835 +msgid "{} backend下发介质" +msgstr "{} backend delivers media" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:864 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:904 +msgid "{} 执行在线切换" +msgstr "{} Perform online switching" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:918 +msgid "交换源集群、目标集群的storageinstance 元数据" +msgstr "Exchange storage instance metadata of source cluster and target cluster" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:930 +msgid "更新源集群、目标集群的nodes域名" +msgstr "Update the node domain names of the source cluster and target cluster" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:952 +msgid "交换源集群、目标集群的 redis 配置" +msgstr "Exchange the redis configuration of the source cluster and target cluster" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:974 +msgid "交换源集群、目标集群的 proxy 版本信息" +msgstr "Exchange proxy version information of source cluster and target cluster" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1031 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1048 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1088 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1105 +msgid "{} 重装 dbmon" +msgstr "{} Reinstall dbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:104 +msgid "REDIS-实例下架" +msgstr "REDIS-Instance removed from shelves" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:162 +msgid "实例下架-{}" +msgstr "Instance removed from shelves-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_load_modules.py:62 +msgid "cluster:{} major_version:{} redis module {}" +msgstr "cluster:{} major_version:{} redis module {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:147 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:629 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:372 +msgid "{}-更新redis状态" +msgstr "{}-Update redis status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:159 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:146 +msgid "{}-更新proxy状态" +msgstr "{}-Update proxy status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:199 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:635 +msgid "{}更新状态子任务" +msgstr "{}Update status subtask" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:274 +msgid "Proxy写入元数据" +msgstr "Proxy writes metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:296 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:702 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:371 +msgid "Redis-{}-写入元数据" +msgstr "Redis-{}-write metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:310 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:725 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:393 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:200 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:236 +msgid "redis建立主从 元数据" +msgstr "Redis establishes master-slave metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:347 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:240 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:275 +msgid "建立集群 元数据" +msgstr "Create cluster metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:372 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:761 +msgid "更新业务NOSQL DBA" +msgstr "Update business NOSQL DBA" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:383 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:850 +msgid "clb元数据写入" +msgstr "clb metadata writing" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:393 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:860 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:251 +msgid "polairs元数据写入" +msgstr "polars metadata writing" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:447 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:254 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:296 +msgid "回写集群配置[Redis]" +msgstr "Write back cluster configuration [Redis]" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:465 +msgid "回写集群proxy配置" +msgstr "Write back cluster proxy configuration" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:496 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:865 +msgid "{}迁移子任务" +msgstr "{}Migrate subtask" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:748 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:414 +msgid "{}-主从实例集群元数据" +msgstr "{}-Master-slave instance cluster metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:784 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:444 +msgid "{}-回写集群配置[Redis]" +msgstr "{}-writeback cluster configuration [Redis]" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:52 +msgid "redis集群 {} 目标版本文件为空?" +msgstr "redis cluster{} target version file is empty?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:68 +msgid "redis集群:{} cluster_type:{} 不认识" +msgstr "redis cluster:{} cluster_type:{} Don't know" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:73 +msgid "redis集群:{} 目标版本文件:{} 与'版本文件'中文件名称:{} 不同" +msgstr "redis cluster: {} Target version file: {} is different from the file name in 'version file': {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:115 +msgid "cluster_id:{} 当前域名已经是{},无需重命名" +msgstr "cluster_id:{} The current domain name is already {}, no need to rename it" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:158 +msgid "更新元数据和cc模块" +msgstr "Update metadata and cc modules" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:189 +msgid "删除旧域名记录{}" +msgstr "Delete old domain name record{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:206 +msgid "删除旧nodes域名记录{}" +msgstr "Delete old nodes domain name records{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:218 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:232 +msgid "添加新域名记录{}" +msgstr "Add new domain name record{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:264 +msgid "集群:{}重命名域名为{}" +msgstr "Cluster:{}Rename the domain name to {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:199 +msgid "REDIS-故障自愈" +msgstr "REDIS-fault self-healing" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:252 +msgid "故障自愈-{}" +msgstr "Fault self-healing-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:301 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:341 +msgid "Proxy-加入集群-{}" +msgstr "Proxy-join cluster-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:338 +msgid "提交Proxy下架单-{}" +msgstr "Submit Proxy removal order-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:358 +msgid "Proxy自愈-{}" +msgstr "Proxy self-healing-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:523 +msgid "提交Redis下架单-{}" +msgstr "Submit Redis delisting order-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:212 +msgid "REDIS-整机替换" +msgstr "REDIS-whole machine replacement" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:240 +msgid "初始化-{}" +msgstr "initialization-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:292 +msgid "整机替换-{}" +msgstr "Whole machine replacement-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:376 +msgid "旧Proxy下架-等待确认" +msgstr "The old Proxy has been removed from the shelves - waiting for confirmation" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:145 +msgid "REDIS-主从切换" +msgstr "REDIS-master-slave switching" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:247 +msgid "Redis-{}-角色互换" +msgstr "Redis-{}-role reversal" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:283 +msgid "Redis-{}-刷新监控" +msgstr "Redis-{}-Refresh Monitoring" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:292 +msgid "Redis-{}-主从切换" +msgstr "Redis-{}-master-slave switching" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:131 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:118 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:152 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:121 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:349 +msgid "redis请求检查: {}" +msgstr "redis request check: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:189 +msgid "{}卸载bkdbmon" +msgstr "{}Uninstall bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:208 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:191 +msgid "{}下架proxy实例" +msgstr "{}Remove the proxy instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:220 +msgid "{}下架redis实例" +msgstr "{}Remove the redis instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:235 +msgid "删除集群元数据" +msgstr "delete cluster metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:103 +msgid "redis集群 {} 目标版本为空?" +msgstr "redis cluster{} target version is empty?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:115 +msgid "redis集群 {},节点类型:{},目标版本 {} 不合法,合法的版本:{}" +msgstr "redis cluster {}, node type: {}, target version {} is illegal, legal version: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:127 +msgid "集群{} proxy当前版本{} == 目标版本:{},无需升级" +msgstr "Cluster {} proxy current version {} == target version: {}, no upgrade required" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:133 +msgid "集群{} storage当前版本{} == 目标版本:{},无需升级" +msgstr "Cluster {} storage current version {} == target version: {}, no upgrade required" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:137 +msgid "集群{} storage当前版本{} > 目标版本:{},不支持降级" +msgstr "Cluster {} storage current version {} > Target version: {}, downgrade is not supported" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:222 +msgid "主从所有IP 下发介质包" +msgstr "Master and slave deliver media packages to all IPs" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:255 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:624 +msgid "old_slave:{} 版本升级" +msgstr "old_slave:{} version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:273 +msgid "{} 集群:{}执行 cluster failover" +msgstr "{} Cluster:{}Execute cluster failover" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:295 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:383 +msgid "new slave:{} 版本升级" +msgstr "new slave:{} version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:319 +msgid "集群:{} 主从切换" +msgstr "Cluster:{} master-slave switching" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:329 +msgid "Redis-{}-检查切换状态" +msgstr "Redis-{}-check switch status" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:347 +msgid "old_master:{} 删除slaveof配置" +msgstr "old_master:{} delete slaveof configuration" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:359 +msgid "old_slave:{} 删除slaveof配置" +msgstr "old_slave:{} delete slaveof configuration" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:406 +msgid "old_master:{} 清档" +msgstr "old_master:{} Clear files" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:486 +msgid "Redis-元数据切换" +msgstr "Redis-metadata switching" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:498 +msgid "master:{}-slave:{}-主从交换" +msgstr "master:{}-slave:{}-master-slave exchange" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:513 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:793 +msgid "Redis-元数据更新集群版本" +msgstr "Redis-metadata update cluster version" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:548 +msgid "集群{}版本在线升级" +msgstr "Cluster {} version online upgrade" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:578 +msgid "master ip:{} 包含了两种角色{}" +msgstr "master ip:{} contains two roles{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:594 +msgid "主从IP 下发介质包" +msgstr "Master-slave IP delivers media package" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:607 +msgid "{}-暂停bkdbmon" +msgstr "{}-pause bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:639 +msgid "old_slave:{} slave-read-only设置为yes" +msgstr "old_slave:{} slave-read-only is set to yes" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:656 +msgid "cluster:{} 域名指向修改" +msgstr "cluster:{} domain name pointer modification" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:689 +msgid "{}-slave提升为master" +msgstr "{}-slave promoted to master" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:706 +msgid "new_slave:{} 版本升级" +msgstr "new_slave:{} version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:717 +msgid "cluster:{} 元数据master和slave互换" +msgstr "cluster:{} Metadata master and slave exchange" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:741 +msgid "old master:{} ports:{} 清档" +msgstr "old master:{} ports:{} clear files" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:812 +msgid "{}-dbconfig更新版本" +msgstr "{}-dbconfig updated version" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:833 +msgid "{}-主从集群版本升级" +msgstr "{}-Master-slave cluster version upgrade" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:122 +msgid "REDIS_DATA_STRUCTURE" +msgstr "REDIS_DATA_STRUCTURE" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:144 +msgid "是否是集群维度:is_cluster_all:{}" +msgstr "Whether it is a cluster dimension: is_cluster_all:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:149 +msgid "" +"tendisplus 需要按集群维度进行数据构造,请检查传入的节点:cluster_type is :{}," +"传入节点:master_instances is:{},redis_master_set is :{}" +msgstr "tendisplus needs to construct data according to the cluster dimension, please check the incoming node: cluster_type is: {}, the incoming node: master_instances is: {}, redis_master_set is: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:165 +msgid "redis_data_structure_flow 从db_meta 查询的备份节点信息" +msgstr "redis_data_structure_flow backup node information queried from db_meta" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:171 +msgid "redis_data_structure_flow 从bklog查询的备份节点信息" +msgstr "redis_data_structure_flow backup node information queried from bklog" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:174 +msgid "这个值和部署proxy有关系 redis_instance_set: {}" +msgstr "This value is related to the deployment of proxy redis_instance_set: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:219 +msgid "" +"redis_data_structure_flow 源集群和临时集群的节点一一对应关系node_pairs: {}" +msgstr "redis_data_structure_flow One-to-one correspondence between the nodes of the source cluster and the temporary cluster node_pairs: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:229 +msgid "Redis-{}-下发actuator包" +msgstr "Redis-{}-distribute actuator package" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:260 +msgid "Redis-安装backup-client工具-{}" +msgstr "Redis-install backup-client tool-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:291 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:139 +msgid "获取磁盘使用情况: {}" +msgstr "Get disk usage: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:307 +msgid "redis_data_structure_flow acts_list_push_json: {}" +msgstr "redis_data_structure_flow acts_list_push_json: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:351 +msgid "Redis-临时节点加入源集群cc模块" +msgstr "Redis-temporary node joins the source cluster cc module" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:365 +msgid "建立meet关系" +msgstr "Establish a meet relationship" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:391 +msgid "{}proxy下发介质包" +msgstr "{}proxy delivers media package" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:409 +msgid "{}安装proxy实例" +msgstr "{} install proxy instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:426 +msgid "meet建立集群关系并检查集群状态" +msgstr "meet establishes cluster relationships and checks cluster status" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:454 +msgid "写入构造记录元数据" +msgstr "Writing construction record metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:458 +msgid "集群[{}]数据构造" +msgstr "Cluster[{}] data structure" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:474 +msgid "generate_acts_list_disk_check_data_params: {}" +msgstr "generate_acts_list_disk_check_data_params: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:478 +msgid "generate_acts_list_disk_check full: {}" +msgstr "generate_acts_list_disk_check full: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:486 +msgid "generate_acts_list_disk_check binlog: {}" +msgstr "generate_acts_list_disk_check binlog: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:495 +msgid "redis 数据构造前置磁盘检查" +msgstr "Redis data structure pre-disk check" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:545 +msgid "len(master_instances):{} != len(all_master_instances):{}" +msgstr "len(master_instances):{} != len(all_master_instances):{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:566 +msgid "" +"cluster_type:{}、master_instances_set:{}、all_master_instances_set:{}-> " +"diff:{}" +msgstr "cluster_type:{}、master_instances_set:{}、all_master_instances_set:{}-> diff:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:580 +msgid "获取的同一批次备份信息_instance_backup: {}" +msgstr "Obtained backup information of the same batch_instance_backup: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:594 +msgid "" +"备份文件中没有上报shard_value,集群维度的场景需要校验shard_value信息,请检查" +"备份情况!备份文件:{}" +msgstr "The shard_value is not reported in the backup file. In cluster-dimensional scenarios, the shard_value information needs to be verified. Please check the backup situation! Backup file: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:602 +msgid "实例 segment 对应关系,instance_shard_dict: {}" +msgstr "Instance segment correspondence, instance_shard_dict: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:604 +msgid "重复的instance值,duplicate_instances: {}" +msgstr "Duplicate instance values, duplicate_instances: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:606 +msgid "没有重复的instance值,cluster_id: {}" +msgstr "There are no duplicate instance values, cluster_id: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:622 +msgid "" +"cluster_id:{},缺失的shard_value值missing_ranges:{},可以从instance_shard_dict" +"中看出:{}" +msgstr "cluster_id:{}, missing shard_value missing_ranges:{}, which can be seen from instance_shard_dict: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:628 +msgid "没有缺失的shard_value值,cluster_id: {}" +msgstr "No missing shard_value, cluster_id: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:634 +msgid "cluster_id: {},所有的instance:{}" +msgstr "cluster_id: {}, all instances: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:635 +msgid "cluster_id: {},所有的redis_instance_set:{}" +msgstr "cluster_id: {}, all redis_instance_set: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:701 +msgid "__init_builder_cluster_info: {}" +msgstr "__init_builder_cluster_info: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:834 +msgid "get_prod_temp_instance_pairs rollback_time: {}" +msgstr "get_prod_temp_instance_pairs rollback_time: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:853 +msgid "new_temp_node_pairs: {}" +msgstr "new_temp_node_pairs: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:856 +msgid "len(source_ip_map) > 1, source_ip_map: {}" +msgstr "len(source_ip_map) > 1, source_ip_map: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:869 +msgid "source_ip_map_source_ports: {}" +msgstr "source_ip_map_source_ports: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:890 +msgid "get_prod_temp_instance_pairs len(source_ip_map) = 1" +msgstr "get_prod_temp_instance_pairs len(source_ip_map) = 1" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:913 +msgid "redis_data_structure_flow_full_backupinfo: {}" +msgstr "redis_data_structure_flow_full_backupinfo: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:914 +msgid "redis_data_structure_flow_binlog_backupinfo: {}" +msgstr "redis_data_structure_flow_binlog_backupinfo: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:974 +msgid "源{}构造到临时机{}" +msgstr "source {} constructed into temporary machine {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:976 +msgid "源{}payload json下发到临时机{}" +msgstr "Source{}payload json is delivered to the temporary machine{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:55 +msgid "下载{}全备文件到{}" +msgstr "Download {}full file to{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:65 +msgid "集群类型为:{},但是下载的binlog备份信息为0,不符合预期,最少有2个binlog" +msgstr "The cluster type is: {}, but the downloaded binlog backup information is 0, which is not as expected. There are at least 2 binlogs." + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:80 +msgid "下载{}binlog文件到{}" +msgstr "Download {}binlog file to {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:85 +msgid "下载备份文件到{}" +msgstr "Download backup file to {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:131 +msgid "更新构造记录为销毁中" +msgstr "Update the construction record to be destroyed" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:157 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:72 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:203 +msgid "Redis-{}-下发工具包" +msgstr "Redis-{}-delivery toolkit" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:206 +msgid "更新构造记录为已销毁" +msgstr "Update the construction record to be destroyed" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:210 +msgid "集群[{}]数据构造销毁" +msgstr "Cluster[{}] data structure destruction" + +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:146 +msgid "redis清档: {}" +msgstr "redis file clear: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:154 +msgid "集群[{}]清档" +msgstr "Cluster[{}] clear file" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:90 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:286 +msgid "存在不同的cluster_type。 {} and {}" +msgstr "There are different cluster_types. {} and {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:207 +msgid "删除集群{}元数据" +msgstr "Delete cluster{} metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:221 +msgid "{}下架redis实例{}" +msgstr "{}Delete the redis instance{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:237 +msgid "{}-卸载bkdbmon" +msgstr "{}-Uninstall bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:302 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:312 +msgid "Redis-{}:{}-安装实例" +msgstr "Redis-{}:{}-Installation instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:381 +msgid "建立主从关系-{}-{}" +msgstr "Establish master-slave relationship-{}-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:462 +msgid "主注册域名" +msgstr "Primary registered domain name" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:479 +msgid "从注册域名" +msgstr "Register a domain name from" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:501 +msgid "Redis主从安装-{}" +msgstr "Redis master-slave installation-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:115 +msgid "按正则删除key: {}" +msgstr "Delete key according to regex: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:123 +msgid "集群[{}]按正则删除keys" +msgstr "Cluster[{}] deletes keys according to the rules" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:148 +msgid "获取磁盘空闲最大机器" +msgstr "Get disk free max machine" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:158 +msgid "按文件删除key" +msgstr "Delete key by file" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:163 +msgid "集群[{}]按文件删除keys" +msgstr "cluster[{}] delete keys by file" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:103 +msgid "提取key: {}" +msgstr "Extract key: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:110 +msgid "集群[{}提取keys" +msgstr "cluster[{} extract keys" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:179 +msgid "[{}]卸载bkdbmon" +msgstr "[{}] uninstall bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:181 +msgid "[{}]安装bkdbmon" +msgstr "[{}] install bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:201 +msgid "集群[{}]启停" +msgstr "Cluster[{}] starts and stops" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:210 +msgid "更新集群状态" +msgstr "update cluster status" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:431 +msgid "更新集群状态-{}" +msgstr "Update cluster status-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:183 +msgid "建立集群meet关系" +msgstr "Establish a cluster meet relationship" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:274 +msgid "回写集群配置[predixy]" +msgstr "Write back cluster configuration [predixy]" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:290 +msgid "nodes注册域名" +msgstr "nodes registered domain name" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:304 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:331 +msgid "proxy注册域名" +msgstr "Register domain name with proxy" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:195 +msgid "proxy加入集群元数据" +msgstr "proxy joins cluster metadata" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:210 +msgid "{}新增proxy实例" +msgstr "{}Add proxy instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:322 +msgid "{}卸载proxy实例" +msgstr "{}Uninstall proxy instance" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:74 +msgid "DTS_Server-{}-删除" +msgstr "DTS_Server-{}-delete" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:80 +msgid "DTS_Server-{}-清理dbmeta" +msgstr "DTS_Server-{}-clean dbmeta" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:85 +msgid "REMOVE DTS_SERVER" +msgstr "REMOVE DTS_SERVER" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:120 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:181 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:226 +msgid "REDIS_SLOTS_MIGRATE" +msgstr "REDIS_SLOTS_MIGRATE" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:136 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:235 +msgid "{}slots 迁移" +msgstr "{}slots migration" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:191 +msgid "{}slots迁移扩容" +msgstr "{}slots migration and expansion" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:91 +msgid "迁移特定slots子任务-{}" +msgstr "Migrate specific slots subtask-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:111 +msgid "写入slots 迁移记录数据" +msgstr "Write slots migration record data" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:117 +msgid "迁移slots{}" +msgstr "Migrate slots{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:171 +msgid "缩容组数: {}小于1 ,pelase check!" +msgstr "Number of shrinking groups: {} is less than 1, pelase check!" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:179 +msgid "+===+++++===缩容节点 contraction_instance: {} +++++===++++ " +msgstr "+====++++++===Shrink node contraction_instance: {} +++++===++++" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:186 +msgid "+===+++++===下架实例shutdown_ip_ports: {} +++++===++++ " +msgstr "+====++++++===Shutdown_ip_ports: {} +++++===++++" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:223 +msgid "集群迁移slots缩容-{}" +msgstr "Cluster migration slots reduction-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:250 +msgid "集群关系清理" +msgstr "Cluster relationship cleanup" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:297 +msgid "写入slots 迁移缩容记录数据" +msgstr "Write slots and migrate the shrinkage record data" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:303 +msgid "迁移slots缩容{}" +msgstr "Migrate slots and shrink {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:408 +msgid "+===+++++===新部署节点new_ins_pair_map: {} +++++===++++ " +msgstr "+====++++++===New deployment node new_ins_pair_map: {} +++++===++++" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:414 +msgid "新节点加入源集群和做主从-{}" +msgstr "New nodes join the source cluster and act as master-slave-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:440 +msgid "集群reblance扩容-{}" +msgstr "Cluster reblance expansion-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:503 +msgid "写入slots 迁移扩容记录数据" +msgstr "Write slots migration expansion record data" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:508 +msgid "迁移slots扩容{}" +msgstr "Migrate slots and expand {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:316 +msgid "回写集群配置[Twemproxy]" +msgstr "Write back cluster configuration [Twemproxy]" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:109 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:99 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:60 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:106 +msgid "下发actuator以及riak介质" +msgstr "Deliver actuator and riak media" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:121 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:132 +msgid "actuator_riak系统配置初始化" +msgstr "actuator_riak system configuration initialization" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:135 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:145 +msgid "actuator_riak部署节点" +msgstr "actuator_riak deployment node" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:149 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:158 +msgid "actuator_riak节点加入集群" +msgstr "The actuator_riak node joins the cluster" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:163 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:124 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:171 +msgid "actuator_集群变更生效" +msgstr "actuator_cluster changes take effect" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:176 +msgid "actuator_初始化bucket_type" +msgstr "actuator_init bucket_type" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:190 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:102 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:115 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:113 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:163 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:197 +msgid "riak修改元数据" +msgstr "riak modify metadata" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:209 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:132 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:216 +msgid "actuator_{}部署定时任务和riak监控" +msgstr "actuator_{} deploys scheduled tasks and riak monitoring" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:215 +msgid "部署Riak集群" +msgstr "Deploy the Riak cluster" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:70 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:77 +msgid "获取集群中的节点" +msgstr "Get the nodes in the cluster" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:76 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:76 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:85 +msgid "actuator_连接检查" +msgstr "actuator_connection check" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:150 +msgid "actuator_下架" +msgstr "actuator_removed" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:112 +msgid "Riak集群下架" +msgstr "Riak cluster removed" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:98 +msgid "actuator_关闭riak监控" +msgstr "actuator_turn off riak monitoring" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:102 +msgid "actuator_关闭riak实例" +msgstr "actuator_close riak instance" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:125 +msgid "Riak集群禁用" +msgstr "Riak cluster disabled" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:76 +msgid "actuator_开启riak实例" +msgstr "actuator_Open riak instance" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:100 +msgid "actuator_开启riak监控" +msgstr "actuator_turn on riak monitoring" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:112 +msgid "Riak集群启用" +msgstr "Riak cluster enabled" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:137 +msgid "集群[{}]的迁移任务" +msgstr "Migration tasks for cluster [{}]" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:139 +msgid "构建riak集群迁移流程成功" +msgstr "The migration process of building riak cluster was successful" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:72 +msgid "actuator_重启riak实例" +msgstr "actuator_restart riak instance" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:84 +msgid "Riak重启实例" +msgstr "Riak restart instance" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:111 +msgid "actuator_riak集群剔除节点" +msgstr "actuator_riak cluster culling nodes" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:137 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:184 +msgid "actuator_检查数据搬迁进度" +msgstr "actuator_Check data migration progress" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:173 +msgid "Riak集群缩容" +msgstr "Riak cluster scaling down" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:118 +msgid "actuator_riak获取集群配置" +msgstr "actuator_riak gets cluster configuration" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:222 +msgid "Riak集群扩容" +msgstr "Riak cluster expansion" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:162 +msgid "DRS查询集群系统密码失败:{}" +msgstr "DRS failed to query the cluster system password: {}" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:165 +msgid "查询原系统账户存在多个或者不存在,暂时与dbm系统不兼容" +msgstr "Query whether there are multiple or non-existent accounts in the original system. It is temporarily incompatible with the dbm system." + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:183 +msgid "DRS查询字符集失败:{}" +msgstr "DRS query character set failed: {}" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:187 +msgid "获取字符集为空..." +msgstr "Get charset is empty..." + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:188 +msgid "获取字符集为空" +msgstr "get character set is empty" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:216 +msgid "至少需要2个以上的spider节点" +msgstr "At least 2 spider nodes are required" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:223 +msgid "沒有发现remote节点" +msgstr "No remote node found" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:255 +msgid "下发tdbCtl介质包" +msgstr "Deliver tdbCtl media package" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:293 +msgid "安装Tdbctl集群中控实例" +msgstr "Install Tdbctl cluster central control instance" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:312 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:357 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:588 +msgid "集群内部节点间授权" +msgstr "Inter-node authorization within the cluster" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:330 +msgid "初始化中控tdbctl节点间关系" +msgstr "Initialize the relationship between central control tdbctl nodes" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:349 +msgid "从本地spider复制表结构到Master中控节点" +msgstr "Copy the table structure from the local spider to the Master central control node" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:358 +msgid "校验spider和tdbctl节点表的数量" +msgstr "Verify the number of spider and tdbctl node tables" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:369 +msgid "初始化中控节与spider,remote点间关系" +msgstr "Initialize the relationship between the central control node and spider and remote points" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:375 +msgid "[{}]追加部署tdbctl&迁移表结构" +msgstr "[{}]Additional deployment of tdbctl&migration table structure" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:108 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:255 +msgid "下发spider安装介质" +msgstr "Deliver the spider installation media" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:141 +msgid "安装Spider_slave实例" +msgstr "Install the spider_slave instance" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:157 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:320 +msgid "克隆权限到spider节点[{}]" +msgstr "Clone permissions to the spider node [{}]" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:177 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:344 +msgid "添加对应路由关系" +msgstr "Add corresponding routing relationship" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:204 +msgid "集群[{}]添加spider slave节点" +msgstr "Cluster [{}] add spider slave node" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:288 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:302 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:563 +msgid "安装Spider实例" +msgstr "Install the Spider instance" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:304 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:318 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:579 +msgid "安装Spider集群中控实例" +msgstr "Install the control instance of the Spider cluster" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:383 +msgid "集群[{}]添加spider {}节点" +msgstr "Cluster [{}] adds spider {} node" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:411 +msgid "下发Spider周边程序介质" +msgstr "Deliver Spider peripheral program media" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:438 +msgid "spider[{}]安装DBATools工具箱" +msgstr "spider[{}] installs the DBATools toolbox" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:454 +msgid "spider[{}]安装mysql-monitor" +msgstr "spider[{}] install mysql-monitor" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:474 +msgid "spider[{}]安装备份程序" +msgstr "spider[{}] install backup program" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:503 +msgid "安装Spider周边程序" +msgstr "Install the Spider peripheral program" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:553 +msgid "建立spider-ctl数据同步" +msgstr "Establish spider-ctl data synchronization" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:621 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:155 +msgid "卸载spider实例" +msgstr "Uninstall the spider instance" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:647 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:169 +msgid "卸载中控实例" +msgstr "Uninstall the central control instance" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:669 +msgid "清理机器周边配置" +msgstr "Clean up machine peripheral configuration" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:674 +msgid "下架spider节点" +msgstr "Remove spider node" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:704 +msgid "切换ctl中控集群" +msgstr "Switch ctl central control cluster" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:719 +msgid "卸载中控实例路由[{}]" +msgstr "Uninstall central control instance routing[{}]" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:732 +msgid "删除中控的路由节点" +msgstr "Delete the routing node of the central control" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:832 +msgid "执行成对切换" +msgstr "Perform pairwise switching" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:17 +msgid "Flow模块TenDB Cluster异常" +msgstr "Flow Module TenDB Cluster Abnormal" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:28 +msgid "添加spider-master节点是分配incr初始值失败" +msgstr "Adding a spider-master node fails to assign the initial value of incr" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:34 +msgid "添加spider节点路由失败" +msgstr "Failed to add spider node route" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:40 +msgid "中控集群切换失败" +msgstr "Central control cluster switching failed" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:46 +msgid "删除spider节点路由失败" +msgstr "Failed to delete spider node route" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:64 +msgid "获取集群信息失败" +msgstr "Failed to obtain cluster information" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:248 +msgid "查询remotedb version 失败" +msgstr "Query remotedb version failed" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:254 +msgid "backend remote 存在多个版本:{}" +msgstr "There are multiple versions of backend remote:{}" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:264 +msgid "查询spider version 失败" +msgstr "Query spider version failed" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:273 +msgid "spider中存在多个大版本不一致的情况:{},请找DBA处理下" +msgstr "There are inconsistencies between multiple major versions in the spider: {}, please ask the DBA to handle it" + +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:225 +msgid "{} shard {} 原地重建" +msgstr "{} shard {} Rebuild in place" + +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:242 +msgid "切换回原slave节点" +msgstr "Switch back to the original slave node" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:224 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:235 +msgid "安装remote主从节点" +msgstr "Install remote master-slave nodes" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:255 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:264 +msgid "获取集群分片 {} shard {} 的备份信息失败" +msgstr "Failed to obtain backup information of cluster shard {} shard {}" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:279 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:288 +msgid "同步完毕,写入数据节点的主从关系" +msgstr "After synchronization is completed, the master-slave relationship of the data node is written." + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:290 +msgid "恢复分片{}数据" +msgstr "Restore shard {} data" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:319 +msgid "remote机器切换完毕后修改元数据指向" +msgstr "Modify the metadata pointer after the remote machine is switched." + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:329 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:332 +msgid "切换remote node 节点" +msgstr "Switch remote node node" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:347 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:306 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:352 +msgid "新机器安装周边组件" +msgstr "New machine installation peripheral components" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:362 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:320 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:368 +msgid "切换后重新安装周边组件" +msgstr "Reinstall peripheral components after switching" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:382 +msgid "整机卸载成功前删除元数据" +msgstr "Delete metadata before successful uninstallation of the entire machine" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:428 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:386 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:435 +msgid "集群迁移{}" +msgstr "Cluster migration{}" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:138 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:173 +msgid "执行切换" +msgstr "Execute switch" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:173 +msgid "[{}]集群后端切换" +msgstr "[{}]Cluster backend switching" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:191 +msgid "安装remote从节点" +msgstr "Install remote slave node" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:250 +msgid "{}:{}恢复实例数据" +msgstr "{}:{}Restore instance data" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:273 +msgid "切换到新SLAVE机器" +msgstr "Switch to new SLAVE machine" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:279 +msgid "SLAVE切换完毕后修改元数据指向" +msgstr "After the SLAVE switch is completed, modify the metadata pointer" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:289 +msgid "切换SLAVE节点" +msgstr "Switch SLAVE node" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:111 +msgid "{}添加spider_mnt节点流程" +msgstr "{}Add spider_mnt node process" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:100 +msgid "[{}]The cluster has not added a slave cluster, skip" +msgstr "[{}]The cluster has not added a slave cluster, skip" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:106 +msgid "[{}]This type of role addition is not supported" +msgstr "[{}]This type of role addition is not supported" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:109 +msgid "build spider-add-nodes-pipeline failed" +msgstr "build spider-add-nodes-pipeline failed" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:153 +msgid "[{}]添加spider-master节点流程" +msgstr "[{}] Add spider-master node process" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:192 +msgid "[{}]添加spider-slave节点流程" +msgstr "[{}] Add spider-slave node process" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:171 +msgid "分片{}:创建临时用户" +msgstr "Shard{}: create temporary user" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:225 +msgid "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" +msgstr "Verification results of fragment {}:master[{}{}{}],slave[{}{}{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:240 +msgid "分片{}:master[{}{}{}]的校验任务" +msgstr "Fragment {}:master[{}{}{}] verification task" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:248 +msgid "集群[{}]的校验任务" +msgstr "Validation task for cluster [{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:137 +msgid "构造库表备份流程成功" +msgstr "The database table backup process is successful" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:164 +msgid "构造 spider/ctl mydumper正则" +msgstr "Construct spider/ctl mydumper regular" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:188 +msgid "spider 执行库表备份" +msgstr "spider performs database table backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:200 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:191 +msgid "spider/ctl备份库表结构" +msgstr "spider/ctl backup database table structure" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:254 +msgid "构造remote mydumper正则" +msgstr "Construct remote mydumper regular" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:272 +msgid "remote 执行库表备份" +msgstr "Remote performs database table backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:284 +msgid "remote 备份库表" +msgstr "remote backup database table" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:310 +msgid "构造运维节点正则" +msgstr "Construct operation and maintenance node rules" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:328 +msgid "运维节点执行库表备份" +msgstr "The operation and maintenance node performs database table backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:339 +msgid "spider_mnt库表备份" +msgstr "spider_mnt database table backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:93 +msgid "" +"传入参数有异常,请检查!len(remote_group)*remote_shard_num != " +"cluster_shard_num" +msgstr "There is an exception in the parameters passed in, please check! len(remote_group)*remote_shard_num != cluster_shard_num" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:232 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:493 +msgid "下发Spider/tdbCtl介质包" +msgstr "Deliver the Spider/tdbCtl media package" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:283 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:544 +msgid "安装tokudb引擎" +msgstr "Install tokudb engine" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:369 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:602 +msgid "初始化集群节点间关系" +msgstr "Initialize the relationship between cluster nodes" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:203 +msgid "下架TenDB-Cluster集群[{}]" +msgstr "Remove the TenDB-Cluster cluster[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:97 +msgid "检测Spider端连接情况" +msgstr "Detect Spider side connection status" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:140 +msgid "重启spider实例" +msgstr "Restart the spider instance" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:146 +msgid "启用spider集群[{}]" +msgstr "Enable spider cluster[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:173 +msgid "端口 {} 执行闪回" +msgstr "Port{} perform flashback" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:189 +msgid "{} 闪回" +msgstr "{} Flashback" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:193 +msgid "{} flashback" +msgstr "{} flashback" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:197 +msgid "构造flashback流程成功" +msgstr "Constructing flashback process successfully" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:139 +msgid "{} 全备" +msgstr "{} full recovery" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:142 +msgid "构造全库备份流程成功" +msgstr "The process of constructing the full database backup is successful" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:179 +msgid "spider 执行全库备份" +msgstr "The spider performs a full database backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:229 +msgid "remote 执行全库备份" +msgstr "remote perform full database backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:242 +msgid "remote 全库备份" +msgstr "remote full database backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:316 +msgid "运维节点执行全库备份" +msgstr "The operation and maintenance node performs full database backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:328 +msgid "spider_mnt全库备份" +msgstr "spider_mnt full database backup" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:52 +msgid "构建TenDB Cluster元数据导入流程成功" +msgstr "Building TenDB Cluster metadata import process successfully" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:101 +#: backend/flow/plugins/components/collections/mysql/mysql_rollback_data_download_binlog.py:55 +msgid "获取实例 {} 的备份信息失败" +msgstr "Failed to obtain backup information for instance {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:108 +msgid "下发actuator工具 {}" +msgstr "Distribute actuator tool{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:122 +msgid "获取spider节点备份信息不存在" +msgstr "Obtaining spider node backup information does not exist" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:124 +msgid "获取spider节点备份信息为空" +msgstr "Obtaining spider node backup information is empty" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:182 +msgid "恢复spider节点数据" +msgstr "Restore spider node data" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:258 +msgid "恢复remote节点数据" +msgstr "Restore remote node data" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:262 +msgid "集群回档: src:{} desc:{}" +msgstr "Cluster rollback: src:{} desc:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:126 +msgid "构建TenDBCluster集群标准化流程成功" +msgstr "The standardization process for building TenDBCluster cluster was successful" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:220 +msgid "spider master 标准化" +msgstr "spider master standardization" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:223 +msgid "spider slave 标准化" +msgstr "spider slave standardization" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:226 +msgid "spider mnt 标准化" +msgstr "spider mnt standardization" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:247 +msgid "remote 标准化" +msgstr "remote standardization" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:275 +msgid "系统库表权限标准化" +msgstr "Standardization of system library table permissions" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:183 +msgid "在中控建立备份库表" +msgstr "Create a backup database table in the central control" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:221 +msgid "{} 预清理备份库" +msgstr "{} Pre-clean backup library" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:273 +msgid "在中控执行清档" +msgstr "Perform clearance in central control" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:308 +msgid "构造清档流程成功" +msgstr "Construction cleanup process succeeded" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:104 +msgid "partition_sql_file_{}_{}.json" +msgstr "partition_sql_file_{}_{}.json" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:106 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:117 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:132 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:169 +msgid "{}: {}" +msgstr "{}: {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:132 +msgid "下发dbactor文件" +msgstr "Distribute dbactor files" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:187 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:82 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:86 +msgid "录入分区日志" +msgstr "Enter partition log" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:188 +msgid "构建spider partition流程成功" +msgstr "Build the spider partition process successfully" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:87 +msgid "构建spider partition 定时任务流程成功" +msgstr "The scheduled task process of building spider partition was successful" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:67 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:165 +msgid "下载定点恢复的全库备份介质到{}:{}" +msgstr "Download the full database backup media for fixed-point recovery to {}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:75 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:173 +msgid "定点恢复之恢复数据{}:{}" +msgstr "Fixed-point recovery of recovered data{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:101 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:199 +msgid "下载定点恢复的binlog到{}:{}" +msgstr "Download the binlog of fixed-point recovery to {}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:109 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:206 +msgid "定点恢复之前滚binlog{}:{}" +msgstr "Roll binlog{}:{} before fixed-point recovery" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:114 +msgid "spider恢复:{}" +msgstr "spider recovery:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:211 +msgid "定点恢复 {}:{}" +msgstr "Fixed point recovery{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:216 +msgid "Remote node {} 恢复: 主 {} 从 {} " +msgstr "Remote node {} recovery: master {} slave {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:68 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:144 +msgid "删除spider的路由关系" +msgstr "Delete spider's routing relationship" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:81 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:157 +msgid "回收对应spider集群映射" +msgstr "Recycle the corresponding spider cluster mapping" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:105 +msgid "[{}]下架spider运维节点流程" +msgstr "[{}] Process of delisting spider operation and maintenance nodes" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:74 +msgid "集群最后不能少于{}个spider_master实例,或者不能大于集群存量[{}]" +msgstr "The final cluster cannot have less than {} spider_master instances, or cannot be larger than the cluster stock [{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:84 +msgid "集群最后不能少于{}个spider_slave实例,或者不能大于集群存量[{}]" +msgstr "The final cluster cannot have less than {} spider_slave instances, or cannot be larger than the cluster stock [{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:182 +msgid "[{}]减少spider节点流程" +msgstr "[{}] Reduce spider node process" + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:135 +msgid "{}集群分片计算错误 remote_shard_num:{} x remote_group:{} != {}" +msgstr "{}Cluster shard calculation error remote_shard_num:{} x remote_group:{} != {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:322 +msgid "整集群切换完毕后修改元数据指向" +msgstr "After the entire cluster is switched, modify the metadata pointer." + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:389 +msgid "整机卸载前删除元数据" +msgstr "Delete metadata before uninstalling the entire machine" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:169 +msgid "在中控建立目标库表" +msgstr "Create a target database table in the central control" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:204 +msgid "{} 预清理目标库" +msgstr "{} Pre-clean target library" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:232 +msgid "{} 执行重命名" +msgstr "{} perform rename" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:253 +msgid "在中控执行重命名" +msgstr "Perform rename in central control" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:266 +msgid "{} 库表重命名" +msgstr "{} rename database table" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:272 +msgid "构造数据库重命名流程成功" +msgstr "Construction database renaming process succeeded" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:117 +msgid "[{}]添加slave集群" +msgstr "[{}]Add slave cluster" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:89 +msgid "删除spider路由关系" +msgstr "Delete spider routing relationship" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:138 +msgid "只读接入层[{}]下架" +msgstr "Read-only access layer [{}] removed" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:61 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:145 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:78 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:79 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:111 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:176 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:110 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:322 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:137 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:122 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:330 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:140 +msgid "create job user" +msgstr "create job user" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:191 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:130 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:139 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:157 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:260 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:287 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:259 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:426 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:196 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:139 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:256 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:454 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:165 +msgid "drop job user" +msgstr "drop job user" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:98 +msgid "{}集群建立数据库同步" +msgstr "{}Cluster establishment database synchronization" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:97 +msgid "流程中安装机器【{}】没有存入bk_host_id,请联系系统管理员\n" +msgstr "The installation machine [{}] during the process did not save bk_host_id, please contact the system administrator\n" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:149 +msgid "下发安装包介质" +msgstr "Distribute installation package media" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:173 +msgid "安装Sqlserver实例:{}" +msgstr "Install Sqlserver instance:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:189 +msgid "初始化Sqlserver实例:{}" +msgstr "Initialize Sqlserver instance:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:200 +msgid "安装sqlserver实例" +msgstr "Install sqlserver instance" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:230 +msgid "[{}]替换主域名映射" +msgstr "[{}]Replace primary domain name mapping" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:247 +msgid "[{}]替换从域名映射" +msgstr "[{}] Replacement from domain name mapping" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:261 +msgid "变更集群[{}]域名映射" +msgstr "Change cluster [{}] domain name mapping" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:296 +msgid "检查实例{}:{}是否存在没有同步的数据库" +msgstr "Check if there is an unsynchronized database in instance {}:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:305 +msgid "检查实例{}:{}是否有异常状态DB" +msgstr "Check whether the instance {}:{} has an abnormal status DB" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:319 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:102 +msgid "检查实例{}:{}是否有业务链接" +msgstr "Check whether the instance {}:{} has a business link" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:330 +msgid "预检测" +msgstr "pretest" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:343 +msgid "克隆实例周边配置" +msgstr "Clone instance peripheral configuration" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:375 +msgid "克隆Users" +msgstr "CloneUsers" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:389 +msgid "克隆LinkServer" +msgstr "CloneLinkServer" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:403 +msgid "克隆Jobs" +msgstr "Clone Jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:424 +msgid "建立数据库同步子流程" +msgstr "Establish database synchronization sub-process" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:466 +msgid "禁用backup jobs" +msgstr "Disable backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:474 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:100 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:115 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:85 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:91 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:123 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:78 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:131 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:334 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:82 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:115 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:134 +msgid "下发执行器" +msgstr "Issue executor" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:485 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:112 +msgid "执行数据库备份" +msgstr "Perform database backup" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:502 +msgid "执行数据库日志备份" +msgstr "Perform database log backup" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:519 +msgid "传送文件到目标机器" +msgstr "Transfer files to target machine" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:535 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:244 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:198 +msgid "恢复全量备份数据[{}]" +msgstr "Restore full backup data[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:556 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:221 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:388 +msgid "恢复增量备份数据[{}]" +msgstr "Restore incremental backup data[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:582 +msgid "在master建立数据同步[{}]" +msgstr "Establish data synchronization on master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:594 +msgid "启动backup jobs" +msgstr "Start backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:661 +msgid "集群[{}]初始化app_setting表" +msgstr "Cluster[{}] initialize app_setting table" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:678 +msgid "install_surrounding_apps_sub_flow的子流程列表为空" +msgstr "The subprocess list for install_surrounding_apps_sub_flow is empty" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:681 +msgid "部署sqlserver周边程序" +msgstr "Deploy sqlserver peripheral programs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:726 +msgid "[{}]为alwaysOn做别名初始化" +msgstr "[{}] Do alias initialization for alwaysOn" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:747 +msgid "[{}]集群配置可用组" +msgstr "[{}]Cluster configuration available group" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:764 +msgid "集群[{}]建立AlwaysOn可用组" +msgstr "Cluster [{}] creates AlwaysOn availability group" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:774 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:801 +msgid "下载备份文件" +msgstr "Download backup file" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:787 +msgid "判断备份文件存在本地机器" +msgstr "Determine whether the backup file exists on the local machine" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:202 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:465 +msgid "[{}]集群与新slave建立关系" +msgstr "[{}]The cluster establishes a relationship with the new slave" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:209 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:208 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:472 +msgid "变更元信息" +msgstr "Change meta information" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:232 +msgid "添加slave[{}]" +msgstr "add slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_authorize_rules.py:40 +msgid "添加sqlserver规则授权" +msgstr "Add sqlserver rule authorization" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:89 +msgid "检查需要备份的库是否存在" +msgstr "Check whether the library to be backed up exists" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:135 +msgid "{}执行备份" +msgstr "{}Perform backup" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:104 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:104 +msgid "检查需要清理的库是否存在" +msgstr "Check whether the library that needs to be cleaned exists" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:127 +msgid "执行数据库清档" +msgstr "Perform database cleanup" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:144 +msgid "{}集群执行清档" +msgstr "{}Cluster execution cleanup" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:100 +msgid "卸载实例[{}:{}]" +msgstr "Uninstall instance[{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:127 +msgid "清理元信息" +msgstr "Clean up meta information" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:136 +msgid "{}集群下架" +msgstr "{}Cluster removed" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:118 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:664 +msgid "[{}]禁用业务账号" +msgstr "[{}]Disable business account" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:133 +msgid "主动在实例{}:{}kill业务链接" +msgstr "Actively kill business links in instance {}:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:162 +msgid "{}集群禁用" +msgstr "{}Cluster disabled" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:61 +msgid "[{}]启动业务账号" +msgstr "[{}]Activate business account" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:85 +msgid "{}集群启动" +msgstr "{}Cluster startup" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:141 +msgid "[{}]清理Job/LinkServer" +msgstr "[{}]Clean up Job/LinkServer" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:163 +msgid "[{}]清理业务账号" +msgstr "[{}]Clear business account" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:179 +msgid "清理数据库" +msgstr "Clean database" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:191 +msgid "回收集群的旧域名" +msgstr "Recycle the old domain name of the cluster" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:235 +msgid "重置集群元信息" +msgstr "Reset cluster meta information" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:265 +msgid "{}集群重置" +msgstr "{}Cluster reset" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:102 +msgid "实例接入标准化[{}:{}]" +msgstr "Instance access standardization [{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:120 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:135 +msgid "添加域名{}" +msgstr "Add domain name{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:151 +msgid "集群标准化[{}]" +msgstr "Cluster normalization[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:177 +msgid "集群标准化" +msgstr "cluster normalization" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:188 +msgid "下发执行器到目标集群master[{}]" +msgstr "Send the executor to the target cluster master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:209 +msgid "下载全量备份文件到目标集群master[{}]" +msgstr "Download the full backup file to the target cluster master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:233 +msgid "下载日志备份文件到目标集群master[{}]" +msgstr "Download the log backup file to the target cluster master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:264 +msgid "恢复日志备份数据[{}]" +msgstr "Restore log backup data[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:294 +msgid "[{}]->[{}]数据构造流程" +msgstr "[{}]->[{}]Data construction process" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:122 +msgid "禁用源master[{}]的backup jobs" +msgstr "Disable backup jobs for source master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:146 +msgid "在源集群[{}]执行数据库备份" +msgstr "Perform database backup on source cluster [{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:164 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:349 +msgid "在源集群[{}]执行数据库日志备份" +msgstr "Perform database log backup on source cluster [{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:182 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:367 +msgid "传送文件到目标机器[{}]" +msgstr "Transfer files to target machine[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:240 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:407 +msgid "启动源master[{}]的backup jobs" +msgstr "Start backup jobs of source master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:248 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:415 +msgid "更新任务状态" +msgstr "Update task status" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:266 +msgid "[{}]->[{}]全量数据迁移流程" +msgstr "[{}]->[{}] Full data migration process" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:433 +msgid "[{}]->[{}]增量数据迁移流程" +msgstr "[{}]->[{}]Incremental data migration process" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:454 +msgid "启动backup jobs cluster:{}" +msgstr "Start backup jobs cluster:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:167 +msgid "部署HA集群[{}]" +msgstr "Deploy HA cluster[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:197 +msgid "部署主从集群" +msgstr "Deploy master-slave cluster" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:201 +msgid "{}集群互切" +msgstr "{}Cluster mutual switching" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:231 +msgid "切换子流程" +msgstr "Switch subprocess" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:127 +msgid "执行数据库重命名" +msgstr "Perform database rename" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:144 +msgid "{}集群执行重命名" +msgstr "{}Cluster execution rename" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:147 +msgid "[{}]重建可用组" +msgstr "[{}]Rebuild available groups" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:173 +msgid "清理slave实例数据库" +msgstr "Clean the slave instance database" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:231 +msgid "实例设置running状态" +msgstr "Instance settings running status" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:263 +msgid "{}集群slave[{}:{}]原地重建" +msgstr "{}cluster slave[{}:{}] is rebuilt in place" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:496 +msgid "人工确认[{}]" +msgstr "Manual confirmation[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:507 +msgid "删除注册CC系统的服务实例[{}:{}]" +msgstr "Delete the service instance registered in the CC system [{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:522 +msgid "下发执行器在旧slave[{}]" +msgstr "Issue the executor to the old slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:534 +msgid "卸载实例[{}]" +msgstr "Uninstall instance[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:547 +msgid "回收旧slave的元信息" +msgstr "Recycle old slave’s meta information" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:558 +msgid "{}->{}新机重建" +msgstr "{}->{}New machine reconstruction" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:587 +msgid "回收master[{}]的域名映射" +msgstr "Recycle the domain name mapping of master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:602 +msgid "回收slave[{}]的域名映射" +msgstr "Recycle the domain name mapping of slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:620 +msgid "添加slave[{}]的域名映射" +msgstr "Add domain name mapping for slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:641 +msgid "处理[{}]的域名关系" +msgstr "Process the domain name relationship of [{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:679 +msgid "移除可用组" +msgstr "Remove available group" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:692 +msgid "移除可用组[{}]" +msgstr "Remove available group[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:109 +msgid "下发SQL文件" +msgstr "Send the SQL file" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:170 +msgid "{}SQL文件导入" +msgstr "{}SQL file import" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:112 +msgid "非法上架特性,请联系系统管理员:add_type:{}" +msgstr "Illegal listing of features, please contact the system administrator: add_type:{}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:117 +msgid "写入实例元信息" +msgstr "Write instance meta information" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:127 +msgid "[{}]集群添加TBinlogDumper实例" +msgstr "[{}]Add TBinlogDumper instance to the cluster" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:131 +msgid "计算不到需要上架的实例,拼装TBinlogDumper上架流程失败" +msgstr "The instances that need to be put on the shelf cannot be calculated, and the assembly process of TBinlogDumper fails." + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:97 +msgid "下发TBinlogDumper介质包" +msgstr "Deliver TBinlogDumper media package" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:110 +msgid "安装TBinlogDumper实例" +msgstr "Install TBinlogDumper instance" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:122 +msgid "安装TBinlogDumper实例flow" +msgstr "Install TBinlogDumper instance flow" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:154 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:48 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:49 +msgid "传入的TBinlogDumper进程信息已不存在[{}],请联系系统管理员" +msgstr "The incoming TBinlogDumper process information no longer exists [{}], please contact the system administrator" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:174 +msgid "卸载TBinlogDumper实例[{}:{}]" +msgstr "Uninstall TBinlogDumper instance [{}:{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:189 +msgid "云区域[{}]卸载TBinlogDumper实例flow" +msgstr "Cloud region [{}] uninstall TBinlogDumper instance flow" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:235 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:338 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:403 +msgid "导入相关表结构" +msgstr "Import related table structure" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:249 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:64 +msgid "中断同步" +msgstr "Interrupt synchronization" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:297 +msgid "切换到新实例[{}:{}]" +msgstr "Switch to new instance [{}:{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:303 +msgid "集群[{}]切换TBinlogDumper" +msgstr "Cluster[{}] switch TBinlogDumper" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:365 +msgid "实例TBinlogDumper[{}:{}]做增量同步" +msgstr "Instance TBinlogDumper[{}:{}] does incremental synchronization" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:433 +msgid "在slave[{}:{}]备份数据" +msgstr "Back up data on slave[{}:{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:449 +msgid "传输备份文件到TBinlogDumper[{}]" +msgstr "Transfer backup files to TBinlogDumper[{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:465 +msgid "导入备份数据" +msgstr "Import backup data" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:479 +msgid "实例TBinlogDumper[{}:{}]做全量同步" +msgstr "Instance TBinlogDumper[{}:{}] does full synchronization" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:506 +msgid "安装L5agent" +msgstr "Install L5agent" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:530 +msgid "初始化tbinlogdumper机器" +msgstr "Initialize the tbinlogdumper machine" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:17 +msgid "Flow模块TBinlogDumper异常" +msgstr "Flow module TBinlogDumper exception" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:52 +msgid "获取预安装端口失败, 期望生成端口数:{},实际生成端口数:{}" +msgstr "Failed to obtain pre-installed ports, expected number of generated ports: {}, actual number of generated ports: {}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:72 +msgid "get charset failed: {}" +msgstr "get charset failed: {}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:88 +msgid "非TenDB-HA架构不支持添加TBinlogDumper实例" +msgstr "Non-TenDB-HA architecture does not support adding TBinlogDumper instances" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:107 +msgid "get server_id failed: {}" +msgstr "get server_id failed: {}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:76 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:78 +msgid "变更实例状态" +msgstr "Change instance status" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:86 +msgid "[{}:{}]实例禁用" +msgstr "[{}:{}]Instance disabled" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:66 +msgid "启动同步" +msgstr "Start sync" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:88 +msgid "[{}:{}]实例启动同步" +msgstr "[{}:{}]Instance starts synchronization" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:70 +msgid "删除实例元信息" +msgstr "Delete instance metainformation" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:80 +msgid "云区域[{}]下架TBinlogDumper实例" +msgstr "The TBinlogDumper instance has been removed from cloud region [{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:84 +msgid "找不到需要下架的实例,拼装TBinlogDumper下架流程失败" +msgstr "The instance that needs to be removed cannot be found, and the removal process of assembling TBinlogDumper failed." + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:202 +msgid "变更实例元信息" +msgstr "Change instance metainformation" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:213 +msgid "[{}]集群迁移TBinlogDumper实例" +msgstr "[{}]Cluster migration TBinlogDumper instance" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:217 +msgid "没检测到需要迁移的实例,拼装TBinlogDumper迁移部署流程失败" +msgstr "The instance that needs to be migrated is not detected, and the migration and deployment process of assembling TBinlogDumper fails." + +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:52 +msgid "构建 TenDB Single 元数据导入流程成功" +msgstr "Constructing TenDB Single metadata import process successfully" + +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:87 +msgid "构建TenDBSingle集群标准化流程成功" +msgstr "The standardization process for building TenDBSingle cluster was successful" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:91 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:108 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:89 +msgid "下发vm介质和dbactuator" +msgstr "Deliver vm media and dbactuator" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:138 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:180 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:158 +msgid "添加vminsert域名" +msgstr "Add vminsert domain name" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:152 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:209 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:173 +msgid "添加vmselect域名" +msgstr "Add vmselect domain name" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:198 +msgid "安装Vm {}-{}子流程" +msgstr "Install Vm {}-{} subprocess" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:211 +msgid "安装vmstorage-{}" +msgstr "Install vmstorage-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:228 +msgid "安装vminsert-{}" +msgstr "Install vminsert-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:248 +#, python-brace-format +msgid "PreInstall {role}-{vm_ip}" +msgstr "PreInstall {role}-{vm_ip}" + +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:77 +msgid "vm集群节点清理-{}" +msgstr "VM cluster node cleanup-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:75 +msgid "停止vm集群进程-{}" +msgstr "Stop vm cluster process-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:75 +msgid "启动vm集群进程-{}" +msgstr "Start vm cluster process-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:74 +msgid "下发 actuator" +msgstr "Issue actuator" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:155 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:135 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:131 +msgid "Reload vmselect" +msgstr "Reload vmselect" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:164 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:143 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:139 +msgid "Reload vminsert" +msgstr "Reload vminsert" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:193 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:105 +msgid "回收vminsert实例域名记录" +msgstr "Recycle vminsert instance domain name records" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:222 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:120 +msgid "回收vmselect实例域名记录" +msgstr "Recycle vmselect instance domain name records" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:258 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:151 +msgid "Vm集群节点清理-{}" +msgstr "Vm cluster node cleanup-{}" + +#: backend/flow/engine/exceptions.py:28 +msgid "组件服务未部署" +msgstr "Component Services is not deployed" + +#: backend/flow/engine/exceptions.py:32 +msgid "MySQL备份位置异常" +msgstr "The MySQL backup location is abnormal" + +#: backend/flow/engine/exceptions.py:37 +msgid "MySQL备份方式和位置不兼容" +msgstr "MySQL backup method and location are incompatible" + +#: backend/flow/engine/exceptions.py:38 +#, python-brace-format +msgid "MySQL备份方式{backup_type}和位置{backup_local}不兼容" +msgstr "" +"MySQL backup method {backup_type} and location {backup_local} are " +"incompatible" + +#: backend/flow/models.py:22 +msgid "组件类型" +msgstr "Component type" + +#: backend/flow/models.py:25 +msgid "流程树" +msgstr "process tree" + +#: backend/flow/models.py:27 backend/ticket/serializers.py:133 +msgid "流程状态" +msgstr "process status" + +#: backend/flow/models.py:29 +msgid "流程创建人" +msgstr "Process Creator" + +#: backend/flow/models.py:30 +msgid "启动时间" +msgstr "Start Time" + +#: backend/flow/models.py:31 +msgid "流程结束时间" +msgstr "process end time" + +#: backend/flow/models.py:32 backend/flow/models.py:52 +msgid "是否已经过期" +msgstr "Has it expired?" + +#: backend/flow/models.py:32 backend/flow/models.py:52 +msgid "运行时被定期清理即为过期" +msgstr "It is expired if it is cleaned regularly during runtime." + +#: backend/flow/models.py:44 +msgid "当前版本ID" +msgstr "current version id" + +#: backend/flow/models.py:46 +msgid "节点状态" +msgstr "node status" + +#: backend/flow/models.py:48 +msgid "节点运行时IP" +msgstr "Node runtime IP" + +#: backend/flow/models.py:50 +msgid "开始执行时间" +msgstr "start execution time" + +#: backend/flow/plugins/components/collections/cloud/exec_service_script.py:57 +msgid "该节点{}获取到执行ip信息为空,请联系系统管理员" +msgstr "" +"The execution ip information obtained by the node {} is empty, please " +"contact the system administrator" + +#: backend/flow/plugins/components/collections/cloud/push_config_file.py:55 +#: backend/flow/plugins/components/collections/cloud/trans_files.py:59 +#: backend/flow/plugins/components/collections/doris/trans_files.py:63 +#: backend/flow/plugins/components/collections/es/trans_files.py:63 +#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:70 +#: backend/flow/plugins/components/collections/mongodb/send_media.py:58 +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:106 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:85 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:126 +#: backend/flow/plugins/components/collections/redis/redis_trans_files.py:69 +#: backend/flow/plugins/components/collections/redis/trans_flies.py:78 +#: backend/flow/plugins/components/collections/riak/trans_files.py:99 +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:80 +#: backend/flow/plugins/components/collections/vm/trans_files.py:63 +msgid "[{}] 下发介质包参数:{}" +msgstr "[{}] Delivery media package parameters: {}" + +#: backend/flow/plugins/components/collections/cloud/trans_files.py:44 +msgid "该节点{}获取到执行ip信息为空,请联系系统管理员{}" +msgstr "" +"The execution ip information obtained by the node {} is empty, please " +"contact the system administrator {}" + +#: backend/flow/plugins/components/collections/common/L5_agent_install.py:41 +msgid "安装L5 agent" +msgstr "Install L5 agent" + +#: backend/flow/plugins/components/collections/common/L5_agent_install.py:70 +msgid "L5agent安装" +msgstr "L5agent installation" + +#: backend/flow/plugins/components/collections/common/base_service.py:132 +msgid "该数据{}:{}无法被序列化,跳过此次缓存" +msgstr "The data {}:{} cannot be serialized, skip this cache" + +#: backend/flow/plugins/components/collections/common/base_service.py:156 +msgid "下载excel文件失败,未获取到{}相关的数据" +msgstr "Failed to download excel file, no data related to {} was obtained." + +#: backend/flow/plugins/components/collections/common/base_service.py:166 +msgid "下载excel文件失败,获取数据格式错误" +msgstr "Failed to download excel file, the data format is wrong" + +#: backend/flow/plugins/components/collections/common/base_service.py:185 +msgid "[{}] 运行成功" +msgstr "[{}] ran successfully" + +#: backend/flow/plugins/components/collections/common/base_service.py:189 +msgid "[{}] 失败: {}" +msgstr "[{}] fail: {}" + +#: backend/flow/plugins/components/collections/common/base_service.py:316 +msgid "[写入上下文结果失败] failed: {}" +msgstr "[Failed to write context result] failed: {}" + +#: backend/flow/plugins/components/collections/common/base_service.py:352 +msgid "[{}] 任务正在执行🤔" +msgstr "[{}] Task is executing 🤔" + +#: backend/flow/plugins/components/collections/common/base_service.py:376 +msgid "[{}] 任务调度失败😱" +msgstr "[{}] Task scheduling failed 😱" + +#: backend/flow/plugins/components/collections/common/base_service.py:388 +msgid "[{}]任务调度成功🥳︎" +msgstr "[{}] Task scheduling succeeded 🥳︎" + +#: backend/flow/plugins/components/collections/common/base_service.py:397 +msgid "[{}]该节点需要获取执行后日志,赋值到流程上下文" +msgstr "[{}] This node needs to obtain the post-execution log and assign it to the process context." + +#: backend/flow/plugins/components/collections/common/base_service.py:410 +msgid "[{}] 获取执行后写入流程上下文失败,ip:[{}]" +msgstr "[{}] Failed to write process context after obtaining execution, ip:[{}]" + +#: backend/flow/plugins/components/collections/common/base_service.py:442 +msgid "任务失败" +msgstr "Task failed" + +#: backend/flow/plugins/components/collections/common/base_service.py:444 +msgid "任务状态异常{}" +msgstr "The task status is abnormal {}" + +#: backend/flow/plugins/components/collections/common/base_service.py:446 +msgid "查询日志失败" +msgstr "Failed to query log" + +#: backend/flow/plugins/components/collections/common/bigdata_manager_service.py:120 +msgid "无法找到Manager处理类型,请联系系统管理员:{}" +msgstr "" +"Unable to find Manager processing type, please contact the system " +"administrator: {}" + +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:42 +#: backend/flow/plugins/components/collections/common/clb_manage.py:43 +#: backend/flow/plugins/components/collections/common/clb_manage.py:59 +#: backend/flow/plugins/components/collections/common/clb_manage.py:68 +#: backend/flow/plugins/components/collections/common/dns_server.py:88 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:43 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:67 +#: backend/flow/plugins/components/collections/doris/doris_dns_manage.py:62 +#: backend/flow/plugins/components/collections/es/es_dns_manage.py:61 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:37 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:48 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:75 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:57 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:69 +#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:29 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:43 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:87 +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:46 +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:282 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:57 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:69 +msgid "该节点获取到执行ip信息为空,请联系系统管理员" +msgstr "" +"The node obtained execution ip information is empty, please contact the " +"system administrator" + +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:100 +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:102 +msgid "/etc/resolv.conf 不为空 {}" +msgstr "/etc/resolv.conf is not empty{}" + +#: backend/flow/plugins/components/collections/common/clb_manage.py:77 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:76 +#: backend/flow/plugins/components/collections/doris/doris_dns_manage.py:146 +#: backend/flow/plugins/components/collections/es/es_dns_manage.py:146 +#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:71 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:93 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:96 +#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:61 +#: backend/flow/plugins/components/collections/pulsar/pulsar_zk_dns_manage.py:51 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:93 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:89 +msgid "无法适配到传入的域名处理类型,请联系系统管理员:{}" +msgstr "" +"Unable to adapt to the incoming domain name processing type, please contact " +"the system administrator: {}" + +#: backend/flow/plugins/components/collections/common/clone_priv_rules_to_other_biz.py:32 +msgid "从{}复制权限规则到业务{}成功" +msgstr "Copy permission rules from {} to business {} successfully" + +#: backend/flow/plugins/components/collections/common/clone_priv_rules_to_other_biz.py:34 +msgid "复制权限规则异常,相关信息: {}" +msgstr "Copy permission rule exception, related information: {}" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:49 +msgid "在[{}]创建添加账号成功" +msgstr "Create and add account successfully in [{}]" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:51 +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:215 +#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:24 +msgid "[{}]添加用户接口异常,相关信息: {}" +msgstr "[{}] Add user interface exception, related information: {}" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:129 +msgid "不支持改实例的主机类型授权[{}]: machine_type: {}" +msgstr "Changing the instance's host type authorization is not supported [{}]: machine_type: {}" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:38 +msgid "未在输入参数或者上下文参数中找到提单数据" +msgstr "Bill of lading data not found in input parameters or context parameters" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:48 +msgid "未知单据类型, {}不存在于已知单据类型中" +msgstr "Unknown ticket type, {} does not exist in known ticket types" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:53 +msgid "不允许自动创建单据,单据创建流程结束" +msgstr "" +"Automatic ticket creation is not allowed, and the ticket creation process " +"ends" + +#: backend/flow/plugins/components/collections/common/external_service.py:39 +msgid "第三方接口: {} 请求成功! 返回参数为: {}" +msgstr "" +"Third-party interface: {} The request is successful! The return parameter " +"is: {}" + +#: backend/flow/plugins/components/collections/common/external_service.py:41 +msgid "第三方接口:{} 调用失败!错误信息为: {}" +msgstr "Third-party interface: {} call failed! The error message is: {}" + +#: backend/flow/plugins/components/collections/common/external_service.py:44 +msgid "请求遇到未知错误!错误信息为: {}" +msgstr "The request encountered an unknown error! The error message is: {}" + +#: backend/flow/plugins/components/collections/common/pause.py:44 +msgid "【{}】流程待确认,是否继续?" +msgstr "【{}】The process is pending confirmation, do you want to continue?" + +#: backend/flow/plugins/components/collections/common/pause.py:78 +msgid "回调数据" +msgstr "callback data" + +#: backend/flow/plugins/components/collections/common/pause.py:87 +msgid "暂停" +msgstr "pause" + +#: backend/flow/plugins/components/collections/common/sa_idle_check.py:59 +msgid "空闲检查FOR_DBM" +msgstr "Idle check FOR_DBM" + +#: backend/flow/plugins/components/collections/common/sa_idle_check.py:80 +msgid "sa空闲检查" +msgstr "sa idle check" + +#: backend/flow/plugins/components/collections/common/sa_init.py:28 +msgid "SA初始化" +msgstr "SA initialization" + +#: backend/flow/plugins/components/collections/common/sa_init.py:47 +msgid "sa初始化" +msgstr "sa initialization" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:34 +msgid "定时时间" +msgstr "Timing" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:37 +#, python-format +msgid "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" +msgstr "Timing time, the format is seconds (s) or (%%Y-%%m-%%d %%H:%%M:%%S)" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:40 +msgid "是否强制晚于当前时间" +msgstr "Whether to force later than the current time" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:43 +msgid "" +"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" +msgstr "" +"Whether to force the time to be later than the current time when the user " +"enters the date format, only valid for timing input in the date format" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:65 +msgid "定时时间需晚于当前时间" +msgstr "The timing time needs to be later than the current time" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:53 +msgid "迁移集群元数据" +msgstr "Migrate cluster metadata" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:75 +msgid "更新dns记录成功" +msgstr "Updated dns record successfully" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:77 +msgid "更新dns记录异常,相关信息: {}" +msgstr "Exception in updating dns record, related information: {}" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:84 +msgid "更新dns记录" +msgstr "Update dns records" + +#: backend/flow/plugins/components/collections/common/transfer_host_service.py:39 +msgid "主机{}转移目标模块{}失败, {}" +msgstr "Host {} failed to transfer target module {}, {}" + +#: backend/flow/plugins/components/collections/doris/exec_doris_actuator_script.py:65 +#: backend/flow/plugins/components/collections/doris/trans_files.py:47 +#: backend/flow/plugins/components/collections/es/exec_es_actuator_script.py:65 +#: backend/flow/plugins/components/collections/es/trans_files.py:47 +#: backend/flow/plugins/components/collections/hdfs/exec_actuator_script.py:69 +#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:53 +#: backend/flow/plugins/components/collections/influxdb/exec_actuator_script.py:62 +#: backend/flow/plugins/components/collections/kafka/exec_actuator_script.py:62 +#: backend/flow/plugins/components/collections/mongodb/exec_actuator_job.py:147 +#: backend/flow/plugins/components/collections/mongodb/exec_actuator_job2.py:74 +#: backend/flow/plugins/components/collections/mongodb/fast_exec_script.py:73 +#: backend/flow/plugins/components/collections/mysql/exec_actuator_script.py:82 +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:60 +#: backend/flow/plugins/components/collections/pulsar/exec_actuator_script.py:66 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:46 +#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:80 +#: backend/flow/plugins/components/collections/redis/exec_data_structure_actuator_script.py:87 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:85 +#: backend/flow/plugins/components/collections/redis/trans_flies.py:60 +#: backend/flow/plugins/components/collections/riak/exec_actuator_script.py:80 +#: backend/flow/plugins/components/collections/riak/trans_files.py:60 +#: backend/flow/plugins/components/collections/sqlserver/exec_actuator_script.py:66 +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:41 +#: backend/flow/plugins/components/collections/vm/exec_vm_actuator_script.py:64 +#: backend/flow/plugins/components/collections/vm/trans_files.py:47 +msgid "该节点获取到执行ip信息为空,请联系系统管理员{}" +msgstr "" +"The execution ip information obtained by this node is empty, please contact " +"the system administrator {}" + +#: backend/flow/plugins/components/collections/doris/get_doris_resource.py:56 +#: backend/flow/plugins/components/collections/es/get_es_resource.py:55 +#: backend/flow/plugins/components/collections/kafka/get_kafka_resource.py:50 +#: backend/flow/plugins/components/collections/vm/get_vm_resource.py:56 +msgid "获取机器资源成功成功。 {}" +msgstr "Acquiring the machine resource was successful. {}" + +#: backend/flow/plugins/components/collections/hdfs/get_hdfs_resource.py:57 +#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:51 +msgid "获取机器资源成功。 {}" +msgstr "Acquiring machine resource successfully. {}" + +#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:48 +msgid "获取DNS操作IP为空" +msgstr "Get DNS operation IP is empty" + +#: backend/flow/plugins/components/collections/hdfs/update_hdfs_resource.py:67 +msgid "更新机器资源成功成功。 {}" +msgstr "Updating the machine resource succeeded successfully. {}" + +#: backend/flow/plugins/components/collections/influxdb/trans_flies.py:52 +#: backend/flow/plugins/components/collections/kafka/trans_flies.py:52 +msgid " 下发介质包参数:{}" +msgstr "Send media package parameters: {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:64 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:46 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:56 +msgid "调起下载 {}" +msgstr "Call up download{}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:86 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:57 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:65 +msgid "下载单据ID {}" +msgstr "Download document ID {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:88 +msgid "下载单据ID {} resp: {}" +msgstr "Download document ID {} ​​resp: {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:93 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:68 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:70 +msgid "{} 下载成功" +msgstr "{} Download successful" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:97 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:72 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:74 +msgid "{} 下载失败" +msgstr "{} Download failed" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:102 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:77 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:79 +msgid "{} 下载中: todo {}" +msgstr "{} Downloading: todo {}" + +#: backend/flow/plugins/components/collections/mongodb/send_media.py:64 +msgid "下发介质包失败,resp:{}" +msgstr "Failed to deliver media package, resp:{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:44 +msgid "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" +msgstr "{}. Account rule: {}-{}, source ip: {}, target cluster: {}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:76 +msgid "" +"授权规则明细:\n" +"{}\n" +msgstr "" +"Authorization rule details:\n" +"{}\n" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:91 +msgid "「授权接口调用异常」{}" +msgstr "Authorization interface call exception {}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:92 +msgid "授权异常,相关信息: {}\n" +msgstr "Authorization exception, related information: {}\n" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:99 +msgid "授权整体结果{}" +msgstr "Authorization overall result{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:103 +msgid "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" +msgstr "" +"The number of Excel import authorization lines: {}, the number of successful " +"authorization: {}, the number of failed authorization: {}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:114 +msgid "" +"授权结果详情请下载excel: excel 下载" +msgstr "Please download excel for details of authorization results: excel download" + +#: backend/flow/plugins/components/collections/mysql/build_database_table_filter_regex.py:46 +msgid "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" +msgstr "[{}] Success: db_table_filter_regex: {}, db_filter_regex: {}" + +#: backend/flow/plugins/components/collections/mysql/check_client_connections.py:61 +msgid "" +"检测结果详情请下载excel:excel 下载" +msgstr "For details of the test results, please download excel: excel download" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:46 +msgid "机器还在系统中注册,暂不用清理[{}]" +msgstr "" +"The machine is still registered in the system, there is no need to clean " +"up[{}]" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:51 +msgid "本次操作没有机器可以清理,提前结束活动节点" +msgstr "" +"There is no machine to clean up in this operation, and the active node is " +"terminated early" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:91 +msgid "输入了不是 tendbcluster 的 ip: {} {}" +msgstr "An ip that is not tendbcluster was entered: {} {}" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:95 +msgid "「权限克隆异常」{}" +msgstr "Permission cloning exception{}" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:97 +msgid "权限克隆失败,错误信息: {}\n" +msgstr "Permission clone failed, error message: {}\n" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:104 +msgid "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" +msgstr "" +"The overall execution result of permission cloning—total: {}, success: {}, " +"failure: {}\n" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:110 +msgid "" +"详情请下载excel: excel 下载" +msgstr "" +"For details, please download excel: excel " +"download" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:71 +msgid "「权限克隆返回结果异常」{}" +msgstr "The return result of permission cloning is abnormal {}" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:73 +msgid "「权限克隆调用异常」{}" +msgstr "Privilege clone call exception {}" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:74 +msgid "执行克隆失败!" +msgstr "Failed to execute clone!" + +#: backend/flow/plugins/components/collections/mysql/cluster_standardize_trans_module.py:33 +msgid "[{}] CC 模块标准化完成" +msgstr "[{}] CC module standardization completed" + +#: backend/flow/plugins/components/collections/mysql/create_user.py:48 +msgid "在「{}」创建临时用户「{}@{}」成功" +msgstr "Successfully created temporary user {}@{} at {}" + +#: backend/flow/plugins/components/collections/mysql/create_user.py:50 +msgid "创建用户接口异常,相关信息: {}" +msgstr "Create user interface exception, related information: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:38 +msgid "在「{}」执行sql失败,相关信息: {}" +msgstr "Failed to execute sql in \"{}\", related information: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:42 +msgid "在「{}」执行sql{}失败,相关信息: {}" +msgstr "Failed to execute sql{} in \"{}\", related information: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:49 +msgid "删除用户接口异常,相关信息: {}" +msgstr "Delete user interface exception, related information: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:52 +msgid "在「{}」删除临时用户「{}@{}」成功" +msgstr "Successfully deleted temporary user {}@{} at {}" + +#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:44 +msgid "这是一个fake的模拟执行" +msgstr "This is a simulated execution of a fake" + +#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:54 +msgid "语义检查执行成功" +msgstr "Semantic check performed successfully" + +#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:95 +msgid "[{}] 过滤所得库表: {}" +msgstr "[{}] Filtered database table: {}" + +#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:98 +msgid "[{}] 未匹配到任何库" +msgstr "[{}] did not match any libraries" + +#: backend/flow/plugins/components/collections/mysql/generate_drop_stage_db_sql.py:79 +msgid "" +"清档自动发起的变更SQL单据\n" +"关联单据:{}" +msgstr "Clear the change SQL document automatically initiated\nAssociated document: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:57 +msgid "在{}执行sql失败,相关信息: {}" +msgstr "Failed to execute sql in {}, related information: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:62 +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:69 +msgid "在{}执行sql{}失败,相关信息: {}" +msgstr "Failed to execute sql{} in {}, related information: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:88 +msgid "查询数据库接口异常,相关信息: {}" +msgstr "Query database interface exception, related information: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:91 +msgid "uid:{}" +msgstr "uid:{}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:123 +msgid "ERROR 数据不一致的表的数量: {}" +msgstr "ERROR Number of tables with inconsistent data: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:124 +msgid "WARNING 被跳过校验的表的数量: {}" +msgstr "WARNING Number of tables skipped for validation: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:125 +msgid "SUCCESS 数据一致的表的数量: {}" +msgstr "Number of tables with consistent SUCCESS data: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:130 +msgid "ERROR 校验失败,数据不一致的表:" +msgstr "ERROR Validation failed, table with inconsistent data:" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:136 +msgid "WARNING 校验程序没有校验的表:" +msgstr "WARNING Table not validated by validator:" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:142 +msgid "SUCCESS 校验成功,数据一致的表:" +msgstr "SUCCESS verification is successful, the table with consistent data:" + +#: backend/flow/plugins/components/collections/mysql/mysql_cluster_instantiate_config.py:43 +msgid "[{}] 实例化 {} 配置成功: {}" +msgstr "[{}] Instantiated {} configuration successfully: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_crond_control.py:41 +msgid "执行ip信息为空,请联系系统管理员" +msgstr "The execution IP information is empty, please contact the system administrator." + +#: backend/flow/plugins/components/collections/mysql/mysql_db_meta.py:41 +#: backend/flow/plugins/components/collections/redis/get_redis_payload.py:45 +#: backend/flow/plugins/components/collections/redis/redis_db_meta.py:45 +#: backend/flow/plugins/components/collections/spider/spider_db_meta.py:40 +msgid "集群元信息:{}" +msgstr "Cluster meta information: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:101 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:93 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:190 +msgid "[{}] get trans_data: {}" +msgstr "[{}] get trans_data: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:146 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:140 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:220 +msgid "[{}] cluster ids = {}" +msgstr "[{}] cluster ids = {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:150 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:144 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:224 +msgid "[{}] 元数据写入完成" +msgstr "[{}] Metadata writing completed" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_modify_cluster_phase.py:34 +msgid "[{}] 修改集群状态完成" +msgstr "[{}] Modification of cluster status completed" + +#: backend/flow/plugins/components/collections/mysql/mysql_link_backup_id_bill_id.py:26 +msgid "[{}] 备份 id: {}" +msgstr "[{}] backup id: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_master_slave_relationship_check.py:72 +msgid "主备关系校验成功" +msgstr "Master-standby relationship verification succeeded" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:62 +#: backend/flow/plugins/components/collections/spider/spider_partition_callback.py:58 +msgid "不支持的状态类型: [{}]" +msgstr "Unsupported status types: [{}]" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:78 +#: backend/flow/plugins/components/collections/spider/spider_partition_callback.py:68 +msgid "callback分区create_log接口异常: {}" +msgstr "callback partition create_log interface exception: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:95 +msgid "不支持的单据类型: [{}]" +msgstr "Unsupported document types: [{}]" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:107 +msgid "ERROR 执行失败的分区规则的数量: {}" +msgstr "ERROR Number of partition rules that failed to execute: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:108 +msgid "SUCCESS 执行成功的分区规则的数量: {}" +msgstr "SUCCESS The number of successfully executed partition rules: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:113 +msgid "ERROR 执行失败的分区规则:" +msgstr "ERROR Partition rule that failed to execute:" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:119 +msgid "SUCCESS 执行成功的分区规则:" +msgstr "SUCCESS Partition rules executed successfully:" + +#: backend/flow/plugins/components/collections/mysql/mysql_rds_execute.py:30 +msgid "传入参数:{}" +msgstr "Incoming parameters:{}" + +#: backend/flow/plugins/components/collections/mysql/rename_database_confirm_empty_from.py:69 +#: backend/flow/plugins/components/collections/mysql/truncate_data_confirm_empty.py:64 +msgid "确认源数据库已空完成" +msgstr "Confirm that the source database is empty" + +#: backend/flow/plugins/components/collections/mysql/rename_database_drop_from.py:51 +msgid "删除源数据库完成" +msgstr "Delete source database complete" + +#: backend/flow/plugins/components/collections/mysql/rename_database_prepare_param.py:27 +msgid "[{}] 构造 old_new_map 完成: {}" +msgstr "[{}] Construct old_new_map completed: {}" + +#: backend/flow/plugins/components/collections/mysql/rollback_trans_flies.py:52 +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:66 +msgid "没有符合的备份文件提供定点恢复" +msgstr "There is no matching backup file to provide fixed-point recovery" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:50 +msgid "创建模拟执行任务resp{}" +msgstr "Create a simulated execution task resp{}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:54 +msgid "创建模拟任务失败:{}" +msgstr "Failed to create mock task: {}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:56 +msgid "创建模拟任务成功" +msgstr "Create mock task successfully" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:60 +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:62 +msgid "「执行语义分析任务异常」{}" +msgstr "Execution of semantic analysis task exception {}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:63 +msgid "创建模拟任务失败!" +msgstr "Failed to create simulation task!" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:42 +msgid "仅在主库查找备份源" +msgstr "Find the backup source only in the master" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:46 +msgid "在主、从库查找备份源" +msgstr "Find the backup source in the master and slave libraries" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:53 +msgid "从备份源中筛选符合的备份" +msgstr "Filter matching backups from backup sources" + +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:66 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:52 +#: backend/flow/plugins/components/collections/riak/trans_files.py:66 +msgid "" +"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" +msgstr "" +"Select the file transfer mode between servers. The machine ip list that " +"should be the source file cannot be empty. Please contact the system " +"administrator{}" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_create_stage_database.py:54 +msgid "建立备份库完成" +msgstr "Create a backup db complete" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_drop.py:47 +msgid "删除据库完成" +msgstr "Database deletion completed" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_drop_stage_database.py:48 +msgid "删除备份库完成" +msgstr "Deleting the backup repository is complete" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_generate_stage_database_name.py:31 +msgid "生成备份库名完成" +msgstr "Generate backup db name complete" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_recreate_table.py:61 +msgid "重建表成功" +msgstr "rebuild table successfully" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_rename_table.py:68 +msgid "[{}] 备份清档表完成" +msgstr "[{}] Backup cleanup table completed" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:38 +msgid "分区sql为空无需上传" +msgstr "Partition sql is empty and no need to upload" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:43 +msgid "单据id{}" +msgstr "ticket id {}" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:44 +msgid "分区sql文件上传成功" +msgstr "Partition sql file uploaded successfully" + +#: backend/flow/plugins/components/collections/pulsar/blank_schedule_service.py:66 +msgid "successfully enter blank schedule, interval times: {}" +msgstr "successfully enter blank schedule, interval times: {}" + +#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:98 +#: backend/flow/plugins/components/collections/redis/exec_data_structure_actuator_script.py:105 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:103 +msgid "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" +msgstr "" +"[{}] kwargs['payload'] is incomplete, you need to add {} content to " +"payload" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:115 +msgid "无符合要求机器" +msgstr "No matching machine" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:119 +msgid "获取最大磁盘空闲机器失败:{}" +msgstr "Failed to get max disk free machines: {}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:191 +msgid "源Redis服务器:{} {} 磁盘使用率:{}% > 85%" +msgstr "Source Redis server: {} {} Disk usage: {}% > 85%" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:201 +msgid "源Redis服务器:{} 磁盘使用情况:{}+Redis数据大小:{} 将会 >=90%" +msgstr "Source Redis server: {} Disk usage: {}+Redis data size: {} will >=90%" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:216 +msgid "所有临时Redis服务器的备份目录都相同:{}" +msgstr "The backup directory for all temporary Redis servers is the same: {}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:218 +msgid "备份目录的值不一致:{}" +msgstr "The backup directory has inconsistent values: {}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:223 +msgid "检查源Redis服务器磁盘使用情况:{}" +msgstr "Check source Redis server disk usage: {}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:241 +msgid "redis 临时机器:{} 磁盘空间检查通过" +msgstr "redis temporary machine: {} disk space check passed" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:132 +msgid "包含key正则:{} 不合法" +msgstr "Contains key regular: {} is illegal" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:136 +msgid "排除key正则:{} 不合法" +msgstr "Exclude key regularity:{} is illegal" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:143 +msgid "包含key正则:{} 不合法,err:{}" +msgstr "Containing key regular: {} is illegal, err: {}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:150 +msgid "排除key正则:{} 不合法,err:{}" +msgstr "Exclude key regular: {} is illegal, err: {}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:163 +msgid "源redis集群{}存在{}个非running状态的slave" +msgstr "There are {} non-running slaves in the source redis cluster {}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:223 +msgid "所有源redis slave机器:{} 磁盘空间检查通过" +msgstr "All source redis slave machines: {} disk space check passed" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:234 +msgid "src_cluster:{} type:{} 无需检查cluster nodes是否ok" +msgstr "" +"src_cluster:{} type:{} No need to check whether the cluster nodes are ok" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:311 +msgid "src_cluster:{} 类型是:{} 无需检查cluster state" +msgstr "src_cluster: {} type is: {} no need to check cluster state" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:546 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了同步task" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} All tasks were successful and the synchronization task was terminated" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:557 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} Some tasks migration failed" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:567 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" +msgstr "" +"bill_id:{} src_cluster:{} dst_cluster:{} All tasks are incremental " +"synchronization" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:575 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 开始新的校验修复" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} Start a new verification repair" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:587 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复正在进行中...,flow_id:{}" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} The last verification repair is in progress..., flow_id:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:599 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复失败,flow_id:{},请处理该" +"失败信息而后再到当前页面重试" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} The last verification and repair failed, flow_id:{}, please handle the failure information and try again on the current page." + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:611 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复已完成,flow_id:{}" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} The last verification repair has been completed, flow_id:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:623 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,后续将断开同步关系..." +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} Data synchronization is ok, the synchronization relationship will be disconnected later..." + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:637 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,校验修复已完成,将继续" +"执行等待切换步骤..." +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} Data synchronization is ok, verification repair is completed, and the waiting for switching step will continue..." + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:648 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks开始断开同步关系" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} All tasks begin to disconnect the synchronization relationship" + +#: backend/flow/plugins/components/collections/redis/redis_ticket.py:43 +msgid "自愈发起-实例下架-{}" +msgstr "Self-healing initiated-instance removed-{}" + +#: backend/flow/plugins/components/collections/redis/trans_flies.py:86 +msgid "下发介质包失败: [{}/{}] resp:{}" +msgstr "Failed to deliver media package: [{}/{}] resp:{}" + +#: backend/flow/plugins/components/collections/riak/get_riak_cluster_node.py:47 +msgid "获取集群所有节点成功。{}" +msgstr "Successfully obtained all nodes of the cluster. {}" + +#: backend/flow/plugins/components/collections/riak/get_riak_cluster_node.py:76 +msgid "获取集群中running节点成功。{}" +msgstr "Successfully obtained the running node in the cluster. {}" + +#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:48 +msgid "获取机器资源失败,新建集群至少选择3台机器,扩容或缩容至少选择1台机器" +msgstr "Failed to obtain machine resources. Select at least 3 machines for new cluster and at least 1 machine for expansion or reduction." + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:113 +#: backend/flow/plugins/components/collections/spider/ctl_drop_routing.py:48 +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:151 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:66 +msgid "select mysql.servers failed: {}" +msgstr "select mysql.servers failed: {}" + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:204 +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:212 +#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:22 +msgid "在[{}]创建添加内置账号成功" +msgstr "Created and added built-in account in [{}] successfully" + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:262 +msgid "This spider-role is not supported,check" +msgstr "This spider-role is not supported,check" + +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:45 +msgid "{} {} 检查库表是否在用" +msgstr "{} {} Check if the database table is in use" + +#: backend/flow/plugins/components/collections/spider/clear_database_on_remote_service.py:55 +msgid "remote drop 新库完成" +msgstr "remote drop new database completed" + +#: backend/flow/plugins/components/collections/spider/create_database_like_via_ctl.py:118 +msgid "建立集群备份库表完成" +msgstr "The establishment of the cluster backup database table is completed" + +#: backend/flow/plugins/components/collections/spider/ctl_drop_routing.py:68 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:86 +msgid "exec TDBCTL-DROP-NODE failed: {}" +msgstr "exec TDBCTL-DROP-NODE failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:50 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:29 +msgid "select processlist failed: {}" +msgstr "select processlist failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:85 +msgid "" +"After two detections, there are still non-sleep state threads in the instance" +msgstr "After two detections, there are still non-sleep state threads in the instance" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:103 +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:172 +msgid "exec TDBCTL-DISABLE-PRIMARY failed: {}" +msgstr "exec TDBCTL-DISABLE-PRIMARY failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:123 +msgid "exec [{ctl.ip_port}] stop slave failed: {res[0]['error_msg']}" +msgstr "exec [{ctl.ip_port}] stop slave failed: {res[0]['error_msg']}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:163 +msgid "exec reset-slave-all failed: {}" +msgstr "exec reset-slave-all failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:209 +msgid "在[{}]创建添加同步账号成功" +msgstr "Successfully created and added synchronization account in [{}]" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:231 +msgid "exec change master failed: {res[0]['error_msg']}" +msgstr "exec change master failed: {res[0]['error_msg']}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:250 +msgid "预检测成功" +msgstr "Pre-test successful" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:258 +msgid "关闭所有从节点的主从同步成功" +msgstr "Close master-slave synchronization of all slave nodes successfully" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:265 +msgid "在其余节点同步新的primary节点[{}]成功" +msgstr "Synchronization of the new primary node [{}] on the remaining nodes was successful" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:269 +msgid "节点[{}]提升自己为primary成功" +msgstr "Node [{}] promoted itself to primary successfully" + +#: backend/flow/plugins/components/collections/spider/drop_spider_table_via_ctl.py:49 +msgid "删除老数据库完成" +msgstr "Delete the old database complete" + +#: backend/flow/plugins/components/collections/spider/truncate_database_drop_stage_db_via_ctl.py:47 +msgid "清理备份库完成" +msgstr "Clean up the backup database is complete" + +#: backend/flow/plugins/components/collections/spider/truncate_database_on_spider_via_ctl.py:145 +msgid "处理集群表完成" +msgstr "Processing cluster table complete" + +#: backend/flow/plugins/components/collections/sqlserver/exec_sqlserver_login.py:33 +msgid "集群[{}]没有对应填入的ip[{}]的实例,请联系系统管理员" +msgstr "Cluster [{}] does not have an instance corresponding to the filled in ip [{}]. Please contact the system administrator." + +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:48 +msgid "" +"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理" +"员: source_hosts:{}" +msgstr "Select the file transfer mode between servers. The machine IP list of the source file cannot be empty. Please contact the system administrator: source_hosts:{}" + +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:53 +msgid "" +"选择服务器之间文件传输模式,目标路径不能为空,请联系系统管理员: " +"file_target_path:{}" +msgstr "Select the file transfer mode between servers. The target path cannot be empty. Please contact the system administrator: file_target_path:{}" + +#: backend/flow/signal/handlers.py:34 +msgid "【状态信号捕获】{} root_id={}, node_id={}, status:{}" +msgstr "【Status signal capture】{} root_id={}, node_id={}, status:{}" + +#: backend/flow/signal/handlers.py:45 +msgid "【状态信号捕获】未查找到FlowTree root_id={}" +msgstr "[Status signal capture] FlowTree root_id={} not found" + +#: backend/flow/signal/handlers.py:74 +msgid "【状态信号捕获】污点池处理/回调单据 发生错误,错误信息{}" +msgstr "[Status signal capture] An error occurred in the taint pool processing/callback document, error message {}" + +#: backend/flow/utils/cloud/cloud_act_payload.py:52 +msgid "单据中不包含DRS的部署信息" +msgstr "The ticket does not contain the deployment information of DRS" + +#: backend/flow/utils/cloud/cloud_act_payload.py:60 +msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" +msgstr "" +"The DNS service has not been deployed, please deploy the service after the " +"DNS service is deployed" + +#: backend/flow/utils/cloud/cloud_act_payload.py:68 +msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" +msgstr "" +"The Nginx service is not deployed, please deploy the service after the Nginx " +"service is deployed" + +#: backend/flow/utils/cloud/cloud_act_payload.py:192 +msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" +msgstr "The Nginx service has not been deployed. Please deploy the service after the Nginx service is deployed." + +#: backend/flow/utils/cloud/cloud_act_payload.py:199 +msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" +msgstr "The DNS service has not been deployed. Please deploy the service after the DNS service is deployed." + +#: backend/flow/utils/cloud/cloud_db_proxy.py:53 +msgid "找不到单据类型需要变更的proxy函数,服务信息入库失败" +msgstr "" +"The proxy function that needs to be changed in the ticket type cannot be " +"found, and the service information storage fails" + +#: backend/flow/utils/cloud/cloud_module_operate.py:73 +msgid "主机{}转移{}失败,转移参数:{}, 错误信息:{}" +msgstr "Host {} transfer {} failed, transfer parameters: {}, error message: {}" + +#: backend/flow/utils/cloud/cloud_module_operate.py:134 +msgid "主机{}转移待回收失败,错误信息:{}" +msgstr "The transfer of host {} to be recycled failed, error message: {}" + +#: backend/flow/utils/doris/consts.py:17 +msgid "fe http端口" +msgstr "fe http port" + +#: backend/flow/utils/doris/consts.py:18 +msgid "fe query 端口" +msgstr "fe query port" + +#: backend/flow/utils/doris/consts.py:19 +msgid "fe" +msgstr "fe" + +#: backend/flow/utils/doris/consts.py:20 +msgid "be" +msgstr "be" + +#: backend/flow/utils/doris/consts.py:21 +msgid "访问Doris 管理员账户名" +msgstr "Access Doris administrator account name" + +#: backend/flow/utils/doris/consts.py:22 +msgid "访问Doris 管理员密码" +msgstr "Access Doris administrator password" + +#: backend/flow/utils/doris/consts.py:26 backend/flow/utils/vm/consts.py:22 +msgid "ADD" +msgstr "ADD" + +#: backend/flow/utils/doris/consts.py:27 backend/flow/utils/vm/consts.py:23 +msgid "DROP" +msgstr "DROP" + +#: backend/flow/utils/doris/consts.py:28 backend/flow/utils/vm/consts.py:24 +msgid "DECOMMISSION" +msgstr "DECOMMISSION" + +#: backend/flow/utils/doris/consts.py:29 backend/flow/utils/vm/consts.py:25 +msgid "DROPP" +msgstr "DRIP" + +#: backend/flow/utils/doris/doris_db_meta.py:105 +#: backend/flow/utils/es/es_db_meta.py:101 +#: backend/flow/utils/vm/vm_db_meta.py:106 +msgid "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" +msgstr "" +"The cmdb function {} that needs to be changed cannot be found, please " +"contact the system administrator" + +#: backend/flow/utils/hdfs/hdfs_db_meta.py:58 +#: backend/flow/utils/influxdb/influxdb_db_meta.py:126 +#: backend/flow/utils/kafka/kafka_db_meta.py:180 +#: backend/flow/utils/redis/redis_db_meta.py:89 +msgid "找不到单据类型需要变更的cmdb函数,请联系系统管理员" +msgstr "" +"The cmdb function that needs to be changed cannot be found, please contact " +"the system administrator" + +#: backend/flow/utils/mongodb/db_table_filter.py:41 +#: backend/flow/utils/mysql/db_table_filter/filter.py:42 +msgid "include patterns 不能为空" +msgstr "include patterns cannot be empty" + +#: backend/flow/utils/mongodb/db_table_filter.py:48 +msgid "exclude patterns 要么同时为空, 要么都不为空" +msgstr "" +"exclude patterns are either empty at the same time, or none of them are empty" + +#: backend/flow/utils/mongodb/db_table_filter.py:65 +msgid "{}校验不成功! 只能包含字母、数字或通配*且不超过最大长度" +msgstr "{}Verification failed! Can only contain letters, numbers or wildcards* and does not exceed the maximum length" + +#: backend/flow/utils/mongodb/migrate_meta.py:40 +msgid "找不到单据类型,请联系系统管理员" +msgstr "Document type not found, please contact the system administrator" + +#: backend/flow/utils/mysql/db_resource.py:106 +msgid " 获取资源失败: {}" +msgstr "Failed to fetch resource: {}" + +#: backend/flow/utils/mysql/db_table_filter/exception.py:18 +msgid "库表过滤异常" +msgstr "Database table filtering exception" + +#: backend/flow/utils/mysql/db_table_filter/exception.py:23 +msgid "输入校验异常" +msgstr "input validation exception" + +#: backend/flow/utils/mysql/db_table_filter/filter.py:50 +msgid "exclude patterns 不能包含 *" +msgstr "exclude patterns cannot contain *" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:30 +msgid "使用通配符时, 只能有一个模式: {}" +msgstr "When using wildcards, there can only be one pattern: {}" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:33 +msgid "% ? 不能独立使用" +msgstr "% ? cannot be used independently" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:36 +msgid "* 只能独立使用" +msgstr "* can only be used independently" + +#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:27 +msgid "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" +msgstr "" +"The exec_ip variable and the get_trans_data_ip_var variable cannot be " +"assigned at the same time" + +#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:29 +msgid "exec_ip变量和get_trans_data_ip_var变量不能同时为None" +msgstr "" +"The exec_ip variable and the get_trans_data_ip_var variable cannot be None " +"at the same time" + +#: backend/flow/utils/mysql/mysql_act_playload.py:187 +msgid "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" +msgstr "" +"The incoming mysql port list is empty or an illegal value, please contact " +"the system administrator" + +#: backend/flow/utils/mysql/mysql_act_playload.py:241 +msgid "传入的安装spider端口列表为空或者非法值,请联系系统管理员" +msgstr "" +"The incoming installation spider port list is empty or an illegal value, " +"please contact the system administrator" + +#: backend/flow/utils/mysql/mysql_act_playload.py:600 +#: backend/flow/utils/mysql/mysql_act_playload.py:679 +#: backend/flow/utils/mysql/mysql_act_playload.py:2093 +msgid "不支持的机器类型: {}" +msgstr "Unsupported machine type: {}" + +#: backend/flow/utils/mysql/mysql_act_playload.py:2043 +msgid "start binlog {} not exist" +msgstr "start binlog {} not exist" + +#: backend/flow/utils/mysql/mysql_commom_query.py:34 +msgid "DRS{}:{}查询变量失败,返回为空值" +msgstr "DRS{}:{} failed to query variables and returned a null value" + +#: backend/flow/utils/mysql/mysql_commom_query.py:37 +msgid "DRS查询字符集失败:{}" +msgstr "DRS query character set failed: {}" + +#: backend/flow/utils/pulsar/consts.py:21 +msgid "broker默认分区数" +msgstr "broker default number of partitions" + +#: backend/flow/utils/pulsar/consts.py:22 +msgid "broker认证配置" +msgstr "Broker authentication configuration" + +#: backend/flow/utils/pulsar/consts.py:23 +msgid "默认bookie池大小" +msgstr "Default bookie pool size" + +#: backend/flow/utils/pulsar/consts.py:24 +msgid "写入副本数" +msgstr "Write replicas" + +#: backend/flow/utils/pulsar/consts.py:25 +msgid "确认写入副本数" +msgstr "Acknowledge the number of replicas written" + +#: backend/flow/utils/pulsar/consts.py:26 +msgid "数据保留时间,单位为分钟" +msgstr "Data retention time, in minutes" + +#: backend/flow/utils/pulsar/consts.py:27 +#: backend/flow/utils/pulsar/consts.py:30 +msgid "broker服务端口" +msgstr "broker service port" + +#: backend/flow/utils/pulsar/consts.py:28 +msgid "访问Pulsar Manager账户名" +msgstr "Access Pulsar Manager account name" + +#: backend/flow/utils/pulsar/consts.py:29 +msgid "访问Pulsar Manager密码" +msgstr "Access Pulsar Manager Password" + +#: backend/flow/utils/redis/redis_act_playload.py:327 +msgid "开始交换源集群和目标集群的redis配置" +msgstr "Start exchanging the redis configuration of the source cluster and the target cluster" + +#: backend/flow/utils/redis/redis_act_playload.py:335 +msgid "获取源集群:{} redis配置" +msgstr "Get the source cluster: {} redis configuration" + +#: backend/flow/utils/redis/redis_act_playload.py:359 +msgid "获取目标集群:{} redis配置" +msgstr "Get the target cluster: {} redis configuration" + +#: backend/flow/utils/redis/redis_act_playload.py:405 +msgid "删除源集群:{} redis配置,upsert_param:{}" +msgstr "Delete source cluster: {} redis configuration, upsert_param: {}" + +#: backend/flow/utils/redis/redis_act_playload.py:413 +msgid "删除目标集群:{} redis配置,upsert_param:{}" +msgstr "Delete target cluster: {} redis configuration, upsert_param: {}" + +#: backend/flow/utils/redis/redis_act_playload.py:421 +msgid "更新源集群redis配置 为 目标集群的配置,upsert_param:{}" +msgstr "Update the source cluster redis configuration to the target cluster configuration, upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:428 +msgid "更新目标集群redis配置 为 源集群的配置,upsert_param:{}" +msgstr "Update the redis configuration of the target cluster to the configuration of the source cluster, upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:550 +msgid "交换源集群和目标集群 dbconfig 中的proxy版本信息" +msgstr "Exchange the proxy version information in the dbconfig of the source cluster and the target cluster" + +#: backend/flow/utils/redis/redis_act_playload.py:558 +msgid "获取源集群:{} proxy配置" +msgstr "Get the source cluster:{} proxy configuration" + +#: backend/flow/utils/redis/redis_act_playload.py:571 +msgid "获取目标集群:{} proxy配置" +msgstr "Get the target cluster:{} proxy configuration" + +#: backend/flow/utils/redis/redis_act_playload.py:617 +msgid "src_conf_upsert_items==>{}" +msgstr "src_conf_upsert_items==>{}" + +#: backend/flow/utils/redis/redis_act_playload.py:618 +msgid "dst_conf_upsert_items==>{}" +msgstr "dst_conf_upsert_items==>{}" + +#: backend/flow/utils/redis/redis_act_playload.py:647 +msgid "删除源集群:{} proxy配置,src_remove_param:{}" +msgstr "Delete source cluster:{} proxy configuration, src_remove_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:661 +msgid "删除目标集群:{} proxy配置,dst_remove_param:{}" +msgstr "Delete target cluster:{} proxy configuration,dst_remove_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:672 +msgid "更新源集群:{} dbconfig 中proxy版本等信息,src_upsert_param:{}" +msgstr "Update source cluster: {} proxy version and other information in dbconfig, src_upsert_param: {}" + +#: backend/flow/utils/redis/redis_act_playload.py:685 +msgid "更新目标集群:{} dbconfig 中proxy版本等信息,dst_upsert_param:{}" +msgstr "Update the target cluster: {} proxy version and other information in dbconfig, dst_upsert_param: {}" + +#: backend/flow/utils/redis/redis_act_playload.py:1209 +msgid "集群{}中没有找到{}相关实例" +msgstr "No related instance of {} found in cluster {}" + +#: backend/flow/utils/redis/redis_act_playload.py:2054 +msgid "删除集群:{} redis配置,upsert_param:{}" +msgstr "Delete cluster: {} redis configuration, upsert_param: {}" + +#: backend/flow/utils/redis/redis_act_playload.py:2062 +msgid "更新集群:{} redis配置 为 目标集群的配置,upsert_param:{}" +msgstr "Update cluster: {} redis configuration is the configuration of the target cluster, upsert_param: {}" + +#: backend/flow/utils/redis/redis_db_meta.py:97 +msgid "找不到单据类型需要查询的cmdb函数,请联系系统管理员" +msgstr "" +"The cmdb function that needs to be queried for the ticket type cannot be " +"found, please contact the system administrator" + +#: backend/flow/utils/redis/redis_db_meta.py:1420 +#, python-format +msgid "redis集群:%s cluster_type:%s 新增 %s cluster_entry" +msgstr "redis cluster:%s cluster_type:%s new %s cluster_entry" + +#: backend/flow/utils/redis/redis_db_meta.py:1430 +#, python-format +msgid "redis集群:%s cluster_type:%s 更新 cluster_entry:%s" +msgstr "redis cluster:%s cluster_type:%s update cluster_entry:%s" + +#: backend/flow/utils/redis/redis_db_meta.py:1440 +#, python-format +msgid "redis集群:%s cluster_type:%s 删除 cluster_entry:%s" +msgstr "redis cluster:%s cluster_type:%s delete cluster_entry:%s" + +#: backend/flow/utils/redis/redis_db_meta.py:1466 +msgid "" +"dts_online_switch_swap_two_cluster_storage 1111 first get src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 1111 first get src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1471 +msgid "" +"dts_online_switch_swap_two_cluster_storage 1111 first get src dst_inst_list:" +msgstr "dts_online_switch_swap_two_cluster_storage 1111 first get src dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1493 +msgid "dts 交换两个集群的 cluster_type 等信息" +msgstr "dts exchanges cluster_type and other information between two clusters" + +#: backend/flow/utils/redis/redis_db_meta.py:1505 +msgid "dts 交换两个集群的 storageinstances" +msgstr "dts exchanges storage instances of two clusters" + +#: backend/flow/utils/redis/redis_db_meta.py:1515 +msgid "" +"dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance" +"完成 src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 2222 Swap two clusters storageinstance to complete src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1520 +msgid "" +"dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance" +"完成 dst_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 2222 Swap two cluster storageinstance to complete dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1526 +msgid "dts 交换两个集群的 nosqlstoragesetdtl" +msgstr "dts swaps nosqlstoragesetdtl between two clusters" + +#: backend/flow/utils/redis/redis_db_meta.py:1536 +msgid "dts 交换两个集群 proxy 的 storageinstances" +msgstr "dts exchanges storage instances of two cluster proxies" + +#: backend/flow/utils/redis/redis_db_meta.py:1564 +msgid "dts 交换两个集群的 cc module" +msgstr "dts exchanges the cc module of two clusters" + +#: backend/flow/utils/redis/redis_db_meta.py:1567 +msgid "" +"dts_online_switch_swap_two_cluster_storage 3333 转移目标机器模块到源集群下," +"src_cluster:{} dst_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 3333 Transfer the target machine module to the source cluster, src_cluster:{} dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1573 +msgid "" +"dts_online_switch_swap_two_cluster_storage 3333 转移源机器模块到目标集群下," +"dst_cluster:{} src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 3333 Transfer the source machine module to the target cluster, dst_cluster:{} src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1804 +msgid "redis集群:{} cluster_type:{} 新增 {} cluster_entry" +msgstr "redis cluster:{} cluster_type:{} add {} cluster_entry" + +#: backend/flow/utils/redis/redis_db_meta.py:1814 +msgid "redis集群:{} cluster_type:{} 更新 cluster_entry:{}" +msgstr "redis cluster:{} cluster_type:{} update cluster_entry:{}" + +#: backend/flow/utils/redis/redis_proxy_util.py:382 +#: backend/flow/utils/redis/redis_proxy_util.py:410 +#: backend/flow/utils/redis/redis_proxy_util.py:490 +msgid "集群类型:{} 不是一个 redis 集群类型?" +msgstr "Cluster type: {} is not a redis cluster type?" + +#: backend/flow/utils/redis/redis_proxy_util.py:637 +msgid "redis集群 {} 没有running_master??" +msgstr "redis cluster{} does not have running_master??" + +#: backend/flow/utils/redis/redis_proxy_util.py:720 +msgid "分片数 不能被 机器组数 整除" +msgstr "The number of shards is not divisible by the number of machine groups" + +#: backend/flow/utils/redis/redis_proxy_util.py:729 +msgid "集群机器规格、分片数、机器组数都没变,只是版本变了.请使用 版本升级 单据" +msgstr "The cluster machine specifications, number of shards, and number of machine groups have not changed, but the version has changed. Please use the version upgrade document" + +#: backend/flow/utils/redis/redis_proxy_util.py:750 +msgid "集群版本变更时,分片数不能变,请先使用 版本升级 单据" +msgstr "When the cluster version changes, the number of shards cannot be changed. Please use the version upgrade document first." + +#: backend/flow/utils/redis/redis_proxy_util.py:758 +msgid "当前集群规格、版本、分片数、机器组数均已满足,无需变更" +msgstr "The current cluster specifications, versions, number of shards, and number of machine groups are all met and no changes are required." + +#: backend/flow/utils/redis/redis_proxy_util.py:765 +msgid "redis 集群协议类型,机器组数不能小于3" +msgstr "redis cluster protocol type, the number of machine groups cannot be less than 3" + +#: backend/flow/utils/redis/redis_proxy_util.py:791 +msgid "" +"tendisplus集群 分片数变多,不允许机器数不变 or 变少。如果有需要,请使用 集群分" +"片数变更 单据" +msgstr "The number of tendisplus cluster shards increases, and the number of machines is not allowed to remain the same or decrease. If necessary, please use the cluster shard number change document" + +#: backend/flow/utils/redis/redis_proxy_util.py:804 +msgid "" +"tendisplus集群 分片数变少,不允许机器数 变多。如果有需要,请使用 集群分片数变" +"更 单据" +msgstr "The number of tendisplus cluster shards is reduced and the number of machines is not allowed to increase. If necessary, please use the cluster shard number change document" + +#: backend/flow/utils/redis/redis_proxy_util.py:1027 +msgid "集群{}不存在DRS可访问的实例" +msgstr "There is no instance accessible to DRS in cluster {}" + +#: backend/flow/utils/redis/redis_proxy_util.py:1036 +msgid "redis集群 {} 不存在" +msgstr "redis cluster{} does not exist" + +#: backend/flow/utils/redis/redis_proxy_util.py:1041 +msgid "redis集群 {} 存在 {} 个状态非 running 的 proxy" +msgstr "There are {} non-running proxies in the redis cluster {}." + +#: backend/flow/utils/redis/redis_proxy_util.py:1047 +msgid "redis集群 {} 存在 {} 个状态非 running 的 redis" +msgstr "The redis cluster {} has {} redis in non-running status." + +#: backend/flow/utils/redis/redis_proxy_util.py:1063 +msgid "redis集群:{} proxy:{} ping失败" +msgstr "redis cluster:{} proxy:{} ping failed" + +#: backend/flow/utils/redis/redis_proxy_util.py:1077 +msgid "redis集群:{} redis:{} ping失败" +msgstr "redis cluster:{} redis:{} ping failed" + +#: backend/flow/utils/redis/redis_proxy_util.py:1080 +msgid "redis集群 {} 没有master??" +msgstr "redis cluster{} has no master??" + +#: backend/flow/utils/redis/redis_proxy_util.py:1084 +msgid "redis集群{} master {} 没有 slave" +msgstr "redis cluster {} master {} no slave" + +#: backend/flow/utils/spider/get_spider_incr.py:42 +msgid "select spider_auto_increment failed: {}" +msgstr "select spider_auto_increment failed: {}" + +#: backend/flow/utils/spider/get_spider_incr.py:46 +msgid "select spider_auto_increment is null, check " +msgstr "select spider_auto_increment is null, check" + +#: backend/flow/utils/spider/get_spider_incr.py:55 +msgid "there are several different self incrementing steps" +msgstr "there are several different self incrementing steps" + +#: backend/flow/utils/spider/get_spider_incr.py:69 +msgid "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" +msgstr "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" + +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:56 +msgid "找不到对应版本的install key" +msgstr "The install key for the corresponding version cannot be found" + +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:72 +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:106 +msgid "" +"传入的安装sqlserver端口列表为空或者非法值,请联系系统管理员: install_ports {}" +msgstr "The incoming installation sqlserver port list is empty or an illegal value, please contact the system administrator: install_ports {}" + +#: backend/flow/utils/tbinlogdumper/tbinlogdumper_act_payload.py:111 +msgid "非法协议,请联系系统管理员:protocol_type:{}" +msgstr "Illegal protocol, please contact the system administrator: protocol_type:{}" + +#: backend/flow/utils/vm/consts.py:17 +msgid "数据过期时间" +msgstr "Data expiration time" + +#: backend/flow/utils/vm/consts.py:18 +msgid "数据副本数" +msgstr "Number of data copies" + +#: backend/flow/views/append_deploy_ctl.py:30 +msgid "开始执行迁移后置操作,部署tdbctl中控" +msgstr "Start performing migration post-operation and deploy tdbctl central control" + +#: backend/flow/views/base.py:39 backend/flow/views/base.py:51 +msgid "权限不足,无法访问!" +msgstr "Insufficient permissions to access!" + +#: backend/flow/views/cloud_dbha_apply.py:39 +#: backend/flow/views/cloud_dns_bind_apply.py:39 +msgid "开始部署dns-bind服务场景" +msgstr "Start deploying the dns-bind service scenario" + +#: backend/flow/views/cloud_drs_apply.py:44 +msgid "开始部署drs服务场景" +msgstr "Start deploying the drs service scenario" + +#: backend/flow/views/cloud_nginx_apply.py:44 +msgid "开始部署nginx服务场景" +msgstr "Start deploying nginx service scenarios" -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:85 -msgid "部署DBHA服务" -msgstr "Deploy DBHA service" +#: backend/flow/views/cloud_nginx_apply.py:54 +msgid "开始替换nginx服务场景" +msgstr "Start to replace the nginx service scenario" -#: backend/flow/engine/bamboo/scene/common/builder.py:118 -msgid "传入的acts_list参数不合法,请检测" -msgstr "The passed acts_list parameter is illegal, please check" +#: backend/flow/views/cloud_redis_dts_server_apply.py:43 +msgid "开始部署redis dts服务场景" +msgstr "Start deploying redis dts service scenario" -#: backend/flow/engine/bamboo/scene/common/builder.py:185 -msgid "部署bamboo流程任务创建失败,任务结束" -msgstr "Deploying bamboo process task creation failed, the task ended" +#: backend/flow/views/cloud_redis_dts_server_apply.py:69 +msgid "删除redis dts服务场景" +msgstr "Delete redis dts service scenario" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:44 -msgid "执行sa空闲检查" -msgstr "Perform sa idle check" +#: backend/flow/views/doris_apply.py:64 +msgid "开始部署Doris场景" +msgstr "Start deploying the Doris scene" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:57 -msgid "执行sa初始化" -msgstr "Execute sa initialization" +#: backend/flow/views/doris_destroy.py:39 +msgid "开始删除Doris集群场景" +msgstr "Start deleting the Doris cluster scenario" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:64 -#: backend/ticket/constants.py:240 -msgid "资源池导入" -msgstr "Resource pool import" +#: backend/flow/views/doris_disable.py:39 +msgid "开始禁用Doris集群场景" +msgstr "Start disabling the Doris cluster scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:81 -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:59 -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:55 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:55 -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:66 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:65 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:71 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:72 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:69 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:65 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:67 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:60 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:111 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:204 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:69 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:72 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:86 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:71 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:61 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:61 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:60 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:72 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:63 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:55 -msgid "获取集群部署配置" -msgstr "Get cluster deployment configuration" +#: backend/flow/views/doris_enable.py:39 +msgid "开始启用Doris集群场景" +msgstr "Start enabling the Doris cluster scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:86 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:98 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:70 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:77 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:102 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:190 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:106 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:90 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:76 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:68 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:59 -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:79 -msgid "获取机器信息" -msgstr "Get machine information" +#: backend/flow/views/doris_reboot.py:46 +msgid "开始重启Doris节点场景" +msgstr "Start restarting the Doris node scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:91 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:103 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:202 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:75 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:83 -msgid "下发ES介质" -msgstr "Issue ES media" +#: backend/flow/views/doris_replace.py:69 +msgid "开始替换Doris集群场景" +msgstr "Start replacing the Doris cluster scenario" + +#: backend/flow/views/doris_scale_up.py:52 +msgid "开始扩容Doris场景" +msgstr "Start expanding the Doris scene" + +#: backend/flow/views/doris_shrink.py:52 +msgid "开始缩容Doris集群场景" +msgstr "Start scaling down the Doris cluster scenario" + +#: backend/flow/views/es_apply.py:63 +#: backend/flow/views/migrate_views/es_fake_apply.py:66 +msgid "开始部署ES场景" +msgstr "Start deploying ES scenarios" + +#: backend/flow/views/es_destroy.py:39 +msgid "开始下架ES场景" +msgstr "Start to remove the ES scene" + +#: backend/flow/views/es_disable.py:39 +msgid "开始禁用ES场景" +msgstr "Start disabling ES scenes" + +#: backend/flow/views/es_enable.py:39 +msgid "开始启用ES场景" +msgstr "Start to enable ES scene" + +#: backend/flow/views/es_reboot.py:47 +msgid "开始重启ES节点场景" +msgstr "Start restarting the ES node scenario" + +#: backend/flow/views/es_replace.py:63 backend/flow/views/es_scale_up.py:52 +msgid "开始扩容ES场景" +msgstr "Start to expand the ES scene" + +#: backend/flow/views/es_shrink.py:52 +msgid "开始缩容ES场景" +msgstr "Start shrinking the ES scene" + +#: backend/flow/views/hdfs_apply.py:61 +msgid "开始部署HDFS场景" +msgstr "Start deploying HDFS scenarios" + +#: backend/flow/views/hdfs_destroy.py:39 +msgid "开始HDFS集群销毁场景" +msgstr "Start the HDFS cluster destruction scenario" + +#: backend/flow/views/hdfs_disable.py:39 +msgid "开始HDFS集群禁用场景" +msgstr "Start HDFS cluster disable scenario" + +#: backend/flow/views/hdfs_enable.py:39 +msgid "开始HDFS集群启用场景" +msgstr "Start the HDFS cluster enablement scenario" + +#: backend/flow/views/hdfs_reboot.py:55 +msgid "开始重启HDFS场景" +msgstr "Start to restart the HDFS scene" + +#: backend/flow/views/hdfs_replace.py:65 +msgid "开始替换HDFS场景" +msgstr "Start to replace the HDFS scene" + +#: backend/flow/views/hdfs_scale_up.py:42 +msgid "开始扩容HDFS场景" +msgstr "Start expanding the HDFS scene" + +#: backend/flow/views/hdfs_shrink.py:42 +msgid "开始HDFS集群缩容场景" +msgstr "Start the HDFS cluster shrinking scenario" + +#: backend/flow/views/influxdb_apply.py:57 +#: backend/flow/views/migrate_views/influxdb_fake_apply.py:60 +msgid "开始部署influxdb场景" +msgstr "Start deploying the influxdb scene" + +#: backend/flow/views/influxdb_destroy.py:39 +msgid "开始下架Influxdb场景" +msgstr "Start to remove the Influxdb scene" + +#: backend/flow/views/influxdb_disable.py:39 +msgid "开始禁用Influxdb场景" +msgstr "Start disabling the Influxdb scene" + +#: backend/flow/views/influxdb_enable.py:39 +msgid "开始启用Influxdb场景" +msgstr "Start enabling the Influxdb scene" + +#: backend/flow/views/influxdb_reboot.py:47 +msgid "开始重启Influxdb节点场景" +msgstr "Start restarting the Influxdb node scenario" + +#: backend/flow/views/influxdb_replace.py:49 +msgid "开始替换influxdb场景" +msgstr "Start to replace the influxdb scene" + +#: backend/flow/views/kafka_apply.py:70 +#: backend/flow/views/migrate_views/kafka_fake_apply.py:73 +msgid "开始部署kafka场景" +msgstr "Start deploying kafka scenarios" + +#: backend/flow/views/kafka_destroy.py:39 +msgid "开始下架Kafka场景" +msgstr "Start to remove the Kafka scene" + +#: backend/flow/views/kafka_disable.py:39 +msgid "开始禁用Kafka场景" +msgstr "Start disabling the Kafka scene" + +#: backend/flow/views/kafka_enable.py:39 +msgid "开始启用Kafka场景" +msgstr "Start to enable the Kafka scene" + +#: backend/flow/views/kafka_reboot.py:47 +msgid "开始重启Kafka节点场景" +msgstr "Start restarting the Kafka node scenario" + +#: backend/flow/views/kafka_replace.py:51 +msgid "开始替换kafka场景" +msgstr "Start to replace the kafka scene" + +#: backend/flow/views/kafka_scale_up.py:49 +msgid "开始扩容kafka场景" +msgstr "Start to expand the kafka scene" + +#: backend/flow/views/kafka_shrink.py:44 +msgid "开始缩容kafka场景" +msgstr "Start shrinking the kafka scene" + +#: backend/flow/views/migrate_views/hdfs_fake_apply.py:66 +msgid "开始部署hdfs场景" +msgstr "Start deploying hdfs scene" + +#: backend/flow/views/migrate_views/riak_migrate.py:65 +msgid "开始迁移RIAK场景" +msgstr "Start migrating RIAK scenarios" + +#: backend/flow/views/mysql_add_slave.py:44 +#: backend/flow/views/mysql_add_slave_remote.py:44 +msgid "开始添加slave" +msgstr "Start adding slaves" + +#: backend/flow/views/mysql_edit_config.py:60 +msgid "开始下发修改的参数" +msgstr "Start sending the modified parameters" + +#: backend/flow/views/mysql_flashback.py:49 +msgid "开始flashback" +msgstr "start flashback" + +#: backend/flow/views/mysql_ha_db_table_backup.py:32 +msgid "开始库表备份场景" +msgstr "Start database table backup scenario" + +#: backend/flow/views/mysql_ha_destroy.py:31 +msgid "开始回收mysql主从版场景" +msgstr "Start to recycle the mysql master-slave version scenario" + +#: backend/flow/views/mysql_ha_destroy.py:49 +msgid "开始禁用mysql主从版场景" +msgstr "Start to disable the mysql master-slave version scenario" + +#: backend/flow/views/mysql_ha_destroy.py:65 +msgid "开始启动mysql主从版场景" +msgstr "Start the mysql master-slave version scenario" + +#: backend/flow/views/mysql_ha_full_backup.py:32 +msgid "开始全库备份场景" +msgstr "Start the full database backup scenario" + +#: backend/flow/views/mysql_ha_master_fail_over.py:30 +msgid "开始执行主故障切换[整机切换]的任务" +msgstr "" +"Start the task of performing the main failover [whole machine switchover]" + +#: backend/flow/views/mysql_ha_rename_database.py:30 +#: backend/flow/views/mysql_ha_truncate_data.py:30 +msgid "开始TenDBHA清档场景" +msgstr "Start the TenDBHA clearing scene" + +#: backend/flow/views/mysql_ha_switch.py:30 +msgid "开始执行主从切换[整机切换]的任务" +msgstr "Start the task of master-slave switching [whole machine switching]" + +#: backend/flow/views/mysql_migrate_cluster.py:46 +#: backend/flow/views/mysql_migrate_cluster_remote.py:46 +#: backend/flow/views/mysql_restore_slave.py:49 +#: backend/flow/views/mysql_restore_slave_remote.py:49 +msgid "开始重建slave" +msgstr "Start rebuilding the slave" + +#: backend/flow/views/mysql_proxy_add.py:30 +msgid "开始添加mysql_proxy实例场景" +msgstr "Start adding mysql_proxy instance scenarios" + +#: backend/flow/views/mysql_proxy_reduce.py:30 +msgid "开始回收mysql_proxy实例场景" +msgstr "Start to recycle the mysql_proxy instance scenario" + +#: backend/flow/views/mysql_proxy_switch.py:30 +msgid "开始替换mysql_proxy实例场景" +msgstr "Start to replace the mysql_proxy instance scenario" + +#: backend/flow/views/mysql_proxy_upgrade.py:30 +msgid "开始测试本地升级mysql_proxy实例场景" +msgstr "Start testing the local upgrade mysql_proxy instance scenario" + +#: backend/flow/views/mysql_pt_table_sync.py:30 +msgid "开始执行数据修复" +msgstr "Start data recovery" + +#: backend/flow/views/mysql_push_peripheral_config.py:25 +msgid "开始下发周边配置场景" +msgstr "Start delivering peripheral configuration scenarios" + +#: backend/flow/views/mysql_restore_local_remote.py:44 +#: backend/flow/views/mysql_restore_local_slave.py:44 +msgid "开始原地重建slave" +msgstr "Start rebuilding the slave in situ" + +#: backend/flow/views/mysql_rollback_data.py:48 +msgid "开始重建定点回档数据" +msgstr "Start to rebuild the fixed-point archive data" + +#: backend/flow/views/mysql_rollback_to_cluster.py:49 +msgid "定点回档到指定集群" +msgstr "Fixed point rollback to the specified cluster" + +#: backend/flow/views/mysql_single_apply.py:57 +msgid "开始部署mysql单实例场景" +msgstr "Start deploying mysql single instance scenario" + +#: backend/flow/views/mysql_single_destroy.py:30 +msgid "开始回收mysql单节点版场景" +msgstr "Start to recycle mysql single-node version scenario" + +#: backend/flow/views/mysql_single_destroy.py:46 +msgid "开始禁用mysql单节点版场景" +msgstr "Start disabling the mysql single-node version scenario" + +#: backend/flow/views/mysql_single_destroy.py:62 +msgid "开始启动mysql单节点版场景" +msgstr "Start the mysql single-node version scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:104 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:116 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:88 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:167 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:214 -msgid "节点初始化-{}" -msgstr "node init - {}" +#: backend/flow/views/mysql_single_rename_database.py:30 +#: backend/flow/views/mysql_single_truncate_data.py:30 +msgid "开始TenDBSingle清档场景" +msgstr "Start the TenDBSingle clearing scene" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:113 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:125 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:97 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:173 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:220 -msgid "解压缩介质包-{}" -msgstr "unzip media package - {}" +#: backend/flow/views/mysql_upgrade.py:30 +msgid "开始测试本地升级mysql实例场景" +msgstr "Start testing the local upgrade mysql instance scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:122 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:134 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:106 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:180 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:227 -msgid "安装supervisor-{}" -msgstr "install supervisor-{}" +#: backend/flow/views/mysql_upgrade.py:46 +msgid "开始测试迁移升级mysql实例场景" +msgstr "Start testing the migration and upgrade mysql instance scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:133 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:145 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:117 -msgid "安装ES {}-{}节点" -msgstr "install ES {}-{} node" +#: backend/flow/views/pulsar_destroy.py:39 +msgid "开始pulsar集群销毁场景" +msgstr "Start the pulsar cluster destruction scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:138 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:150 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:122 -msgid "安装ES {}-{}子流程" -msgstr "install ES {}-{} subprocess" +#: backend/flow/views/pulsar_disable.py:39 +msgid "开始PULSAR集群禁用场景" +msgstr "Start PULSAR cluster disable scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:146 -msgid "初始化鉴权插件" -msgstr "Initialize the authentication plugin" +#: backend/flow/views/pulsar_enable.py:39 +msgid "开始PULSAR集群启用场景" +msgstr "Start the PULSAR cluster enablement scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:154 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:239 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:120 -msgid "安装kibana" -msgstr "install kibana" +#: backend/flow/views/pulsar_reboot.py:55 +msgid "开始重启PULSAR场景" +msgstr "Start restarting the PULSAR scene" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:166 -msgid "插入kibana实例信息" -msgstr "Insert kibana instance information" +#: backend/flow/views/pulsar_replace.py:24 +msgid "开始PULSAR集群替换场景" +msgstr "Start the PULSAR cluster replacement scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:173 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:214 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:127 -msgid "回写集群配置信息" -msgstr "Write back cluster configuration information" +#: backend/flow/views/pulsar_shrink.py:28 +msgid "开始PULSAR集群缩容场景" +msgstr "Start the PULSAR cluster shrinking scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:184 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:187 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:77 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:152 -msgid "添加域名" -msgstr "add domain name" +#: backend/flow/views/spider_cluster_database_table_backup.py:30 +msgid "开始TenDBCluster库表备份场景" +msgstr "Start TenDBCluster database table backup scenario" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:191 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:156 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:128 -msgid "添加到DBMeta" -msgstr "Add to DBMeta" +#: backend/flow/views/spider_cluster_destroy.py:34 +msgid "开始禁用spider集群场景" +msgstr "Start to disable the spider cluster scenario" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:65 -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:61 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:61 -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:71 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:58 -#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:61 -msgid "下发actuator" -msgstr "Issue the actuator" +#: backend/flow/views/spider_cluster_destroy.py:53 +msgid "开始启用spider集群场景" +msgstr "Start to enable the spider cluster scenario" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:295 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:177 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:64 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:187 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:293 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:410 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:170 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:115 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:222 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:99 -msgid "节点清理-{}" -msgstr "node cleanup -{}" +#: backend/flow/views/spider_cluster_flashback.py:26 +msgid "开始TenDBCluster Flashback场景" +msgstr "Start TenDBCluster Flashback scene" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:89 -msgid "删除kibana实例信息" -msgstr "Delete kibana instance information" +#: backend/flow/views/spider_cluster_full_backup.py:30 +msgid "开始TenDBCluster全库备份场景" +msgstr "Start TenDBCluster full database backup scenario" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:97 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:107 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:96 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:97 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:157 -msgid "删除域名" -msgstr "delete domain name" +#: backend/flow/views/spider_cluster_rename_database.py:30 +msgid "开始TenDBCluster数据库重命名场景" +msgstr "Start the TenDBCluster database renaming scenario" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:103 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:103 -msgid "清理Meta" -msgstr "Clean up Meta" +#: backend/flow/views/spider_cluster_standardize.py:30 +msgid "开始TenDBCluster标准化" +msgstr "Start TenDBCluster standardization" -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:70 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:64 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:178 -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:68 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:285 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:402 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:153 -msgid "停止进程-{}" -msgstr "stop process - {}" +#: backend/flow/views/spider_cluster_truncate_database.py:30 +msgid "开始TenDBCluster清档场景" +msgstr "Start the TenDBCluster clearing scene" -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:79 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:79 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:114 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:90 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:144 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:74 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:78 -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:78 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:127 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:89 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:87 -msgid "修改Meta" -msgstr "Modify Meta" +#: backend/flow/views/tendb_ha_standardize.py:30 +msgid "开始TenDBHA标准化" +msgstr "Start TenDBHA standardization" -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:70 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:64 -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:68 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:77 -msgid "启动进程-{}" -msgstr "start process - {}" +#: backend/flow/views/vm_apply.py:65 +msgid "开始部署Vm场景" +msgstr "Start deploying Vm scenario" -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:81 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:69 -#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:72 -msgid "重启实例-{}" -msgstr "restart instance - {}" +#: backend/flow/views/vm_destroy.py:39 +msgid "开始下架vm场景" +msgstr "Start removing vm scenes" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:91 -msgid "获取扩容流程集群部署配置" -msgstr "Obtain the cluster deployment configuration of the expansion process" +#: backend/flow/views/vm_disable.py:39 +msgid "开始禁用VM场景" +msgstr "Start disabling VM scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:167 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:221 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:139 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:102 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:208 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:85 -msgid "更新域名映射" -msgstr "update domain mapping" +#: backend/flow/views/vm_enable.py:39 +msgid "开始启用VM场景" +msgstr "Start enabling VM scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:176 -msgid "校验扩容结果" -msgstr "Verify expansion results" +#: backend/flow/views/vm_reboot.py:45 +msgid "开始重启VM节点场景" +msgstr "Start restarting VM node scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:181 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:183 -msgid "扩容子流程" -msgstr "Expansion sub-process" +#: backend/flow/views/vm_replace.py:68 +msgid "开始替换VM场景" +msgstr "Start replacing VM scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:191 -msgid "获取缩容流程集群部署配置" -msgstr "Obtain the cluster deployment configuration of the shrinking process" +#: backend/flow/views/vm_scale_up.py:55 +msgid "开始扩容VM场景" +msgstr "Start expanding the VM scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:208 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:89 -msgid "排斥缩容节点" -msgstr "Repulsion and shrinkage nodes" +#: backend/flow/views/vm_shrink.py:54 +msgid "开始缩容VM场景" +msgstr "Start shrinking VM scenario" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:253 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:134 -msgid "更新kibana实例信息" -msgstr "Update kibana instance information" +#: backend/iam_app/constans.py:20 +msgid "业务只读" +msgstr "Business read only" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:261 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:142 -msgid "校验搬迁状态" -msgstr "Check relocation status" +#: backend/iam_app/constans.py:21 +msgid "业务运维" +msgstr "Business operation and maintenance" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:272 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:153 -msgid "校验连接状态" -msgstr "Check connection status" +#: backend/iam_app/constans.py:22 +msgid "外部开发商专用" +msgstr "Exclusively for external developers" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:281 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:162 -msgid "停止节点-{}" -msgstr "stop-node-{}" +#: backend/iam_app/constans.py:24 +msgid "MySQL SQL变更" +msgstr "MySQL SQL changes" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:286 -msgid "停止ES子流程" -msgstr "Stop the ES subprocess" +#: backend/iam_app/constans.py:25 +msgid "MySQL DB授权" +msgstr "MySQL DB authorization" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:305 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:185 -msgid "清理DBMeta" -msgstr "Clean up DBMeta" +#: backend/iam_app/constans.py:27 +msgid "TendbCluster SQL变更" +msgstr "TendbCluster SQL changes" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:320 -msgid "{}-替换master ip" -msgstr "{} - replace master ip" +#: backend/iam_app/constans.py:28 +msgid "TendbCluster DB授权" +msgstr "TendbCluster DB authorization" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:327 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:235 -msgid "缩容子流程" -msgstr "Shrink subprocess" +#: backend/iam_app/constans.py:30 +msgid "Kafka获取访问方式" +msgstr "Kafka gets access method" -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:166 -msgid "停止ES-{}子流程" -msgstr "stop ES-{} subprocess" +#: backend/iam_app/constans.py:31 +msgid "ES获取访问方式" +msgstr "ES gets access method" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:18 -msgid "Flow模块HDFS异常" -msgstr "Flow module HDFS exception" +#: backend/iam_app/constans.py:32 +msgid "HDFS获取访问方式" +msgstr "HDFS gets access method" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:29 -msgid "手动部署选择机器数量异常" -msgstr "The number of machines selected for manual deployment is abnormal" +#: backend/iam_app/dataclass/__init__.py:67 +#: backend/iam_app/dataclass/resources.py:607 +#: backend/iam_app/dataclass/resources.py:661 +msgid "{} 列表" +msgstr "{} list" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:30 -#, python-brace-format -msgid "HDFS集群角色{hdfs_role}数量不能为{machine_count}" -msgstr "The number of HDFS cluster roles {hdfs_role} cannot be {machine_count}" +#: backend/iam_app/dataclass/actions.py:48 +msgid "动作ID{}长度超过{},无法注册iam,请重新命名" +msgstr "The length of the action ID {} ​​exceeds {}. Unable to register iam. Please rename it." -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:35 -msgid "替换旧机器不能为空" -msgstr "replace old machine cannot be empty" +#: backend/iam_app/dataclass/actions.py:111 +msgid "业务访问" +msgstr "business visit" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:36 -msgid "HDFS集群替换旧机器不能为空" -msgstr "HDFS cluster to replace the old machine cannot be empty" +#: backend/iam_app/dataclass/actions.py:133 +msgid "全局设置访问" +msgstr "Global settings access" + +#: backend/iam_app/dataclass/actions.py:138 +#: backend/iam_app/dataclass/actions.py:162 +#: backend/iam_app/dataclass/actions.py:231 +#: backend/iam_app/dataclass/actions.py:243 +#: backend/iam_app/dataclass/actions.py:255 +#: backend/iam_app/dataclass/actions.py:1609 +#: backend/iam_app/dataclass/actions.py:1633 +#: backend/iam_app/dataclass/actions.py:1657 +#: backend/iam_app/dataclass/actions.py:1693 +#: backend/iam_app/dataclass/actions.py:1717 +#: backend/iam_app/dataclass/actions.py:1740 +#: backend/iam_app/dataclass/actions.py:1752 +#: backend/iam_app/dataclass/actions.py:1764 +#: backend/iam_app/dataclass/actions.py:1776 +#: backend/iam_app/dataclass/actions.py:1824 +#: backend/iam_app/dataclass/actions.py:1836 +#: backend/iam_app/dataclass/actions.py:1848 +#: backend/iam_app/dataclass/actions.py:1860 +#: backend/iam_app/dataclass/actions.py:1884 +#: backend/iam_app/dataclass/actions.py:1896 +msgid "全局设置" +msgstr "Global settings" + +#: backend/iam_app/dataclass/actions.py:145 +msgid "单据查看" +msgstr "Document view" + +#: backend/iam_app/dataclass/actions.py:151 +#: backend/iam_app/dataclass/actions.py:196 +#: backend/iam_app/dataclass/resources.py:271 +msgid "单据" +msgstr "tickets" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:41 -msgid "HDFS替换新旧机器数量不一致" -msgstr "The number of new and old machines replaced by HDFS is inconsistent" +#: backend/iam_app/dataclass/actions.py:157 +msgid "全局单据流程设置" +msgstr "Global document process settings" + +#: backend/iam_app/dataclass/actions.py:168 +msgid "业务单据流程设置" +msgstr "Business document process settings" + +#: backend/iam_app/dataclass/actions.py:173 +#: backend/iam_app/dataclass/actions.py:207 +#: backend/iam_app/dataclass/actions.py:219 +#: backend/iam_app/dataclass/actions.py:1561 +#: backend/iam_app/dataclass/actions.py:1573 +#: backend/iam_app/dataclass/actions.py:1585 +#: backend/iam_app/dataclass/actions.py:1597 +#: backend/iam_app/dataclass/actions.py:1621 +#: backend/iam_app/dataclass/actions.py:1645 +#: backend/iam_app/dataclass/actions.py:1669 +#: backend/iam_app/dataclass/actions.py:1681 +#: backend/iam_app/dataclass/actions.py:1705 +#: backend/iam_app/dataclass/actions.py:1729 +#: backend/iam_app/dataclass/actions.py:1872 +msgid "业务配置" +msgstr "Business configuration" + +#: backend/iam_app/dataclass/actions.py:178 +msgid "资源管理访问" +msgstr "Resource management access" + +#: backend/iam_app/dataclass/actions.py:183 +#: backend/iam_app/dataclass/actions.py:1503 +#: backend/iam_app/dataclass/actions.py:1515 +#: backend/iam_app/dataclass/actions.py:1527 +#: backend/iam_app/dataclass/actions.py:1788 +#: backend/iam_app/dataclass/actions.py:1800 +#: backend/iam_app/dataclass/actions.py:1812 +msgid "资源管理" +msgstr "Resource management" + +#: backend/iam_app/dataclass/actions.py:190 +msgid "任务流程管理" +msgstr "Task process management" + +#: backend/iam_app/dataclass/actions.py:202 +msgid "数据库配置查看" +msgstr "Database configuration view" + +#: backend/iam_app/dataclass/actions.py:214 +msgid "数据库配置编辑" +msgstr "Database configuration editor" + +#: backend/iam_app/dataclass/actions.py:226 +msgid "全局数据库配置编辑" +msgstr "Global database configuration editor" + +#: backend/iam_app/dataclass/actions.py:238 +msgid "全局数据库配置新增" +msgstr "Global database configuration new" + +#: backend/iam_app/dataclass/actions.py:250 +msgid "全局数据库配置删除" +msgstr "Global database configuration deletion" + +#: backend/iam_app/dataclass/actions.py:262 +msgid "MySQL 部署" +msgstr "MySQL deployment" + +#: backend/iam_app/dataclass/actions.py:268 +#: backend/iam_app/dataclass/actions.py:280 +#: backend/iam_app/dataclass/actions.py:320 +#: backend/iam_app/dataclass/actions.py:336 +#: backend/iam_app/dataclass/actions.py:347 +#: backend/iam_app/dataclass/actions.py:371 +#: backend/iam_app/dataclass/actions.py:631 +#: backend/iam_app/dataclass/actions.py:663 +#: backend/iam_app/dataclass/actions.py:679 +#: backend/iam_app/dataclass/actions.py:874 +#: backend/iam_app/dataclass/actions.py:887 +#: backend/iam_app/dataclass/actions.py:912 +#: backend/iam_app/dataclass/actions.py:928 +#: backend/iam_app/dataclass/actions.py:944 +#: backend/iam_app/dataclass/actions.py:952 +#: backend/iam_app/dataclass/actions.py:965 +#: backend/iam_app/dataclass/actions.py:1013 +#: backend/iam_app/dataclass/actions.py:1025 +#: backend/iam_app/dataclass/actions.py:1037 +#: backend/iam_app/dataclass/actions.py:1049 +#: backend/iam_app/dataclass/actions.py:1056 +#: backend/iam_app/dataclass/actions.py:1069 +#: backend/iam_app/dataclass/actions.py:1081 +#: backend/iam_app/dataclass/actions.py:1093 +#: backend/iam_app/dataclass/actions.py:1105 +#: backend/iam_app/dataclass/actions.py:1117 +#: backend/iam_app/dataclass/actions.py:1124 +#: backend/iam_app/dataclass/actions.py:1137 +#: backend/iam_app/dataclass/actions.py:1144 +#: backend/iam_app/dataclass/actions.py:1157 +#: backend/iam_app/dataclass/actions.py:1169 +#: backend/iam_app/dataclass/actions.py:1181 +#: backend/iam_app/dataclass/actions.py:1188 +#: backend/iam_app/dataclass/actions.py:1201 +#: backend/iam_app/dataclass/actions.py:1213 +#: backend/iam_app/dataclass/actions.py:1225 +#: backend/iam_app/dataclass/actions.py:1233 +#: backend/iam_app/dataclass/actions.py:1246 +#: backend/iam_app/dataclass/actions.py:1258 +#: backend/iam_app/dataclass/actions.py:1270 +#: backend/iam_app/dataclass/actions.py:1282 +#: backend/iam_app/dataclass/actions.py:1294 +#: backend/iam_app/dataclass/actions.py:1306 +#: backend/iam_app/dataclass/actions.py:1387 +#: backend/iam_app/dataclass/actions.py:1399 +#: backend/iam_app/dataclass/actions.py:1410 +#: backend/iam_app/dataclass/actions.py:1492 backend/ticket/constants.py:233 +#: backend/ticket/constants.py:234 backend/ticket/constants.py:263 +#: backend/ticket/constants.py:281 backend/ticket/constants.py:282 +#: backend/ticket/constants.py:283 backend/ticket/constants.py:284 +#: backend/ticket/constants.py:285 backend/ticket/constants.py:286 +#: backend/ticket/constants.py:289 backend/ticket/constants.py:290 +#: backend/ticket/constants.py:291 backend/ticket/constants.py:292 +#: backend/ticket/constants.py:297 backend/ticket/constants.py:298 +#: backend/ticket/constants.py:299 backend/ticket/constants.py:333 +#: backend/ticket/constants.py:334 backend/ticket/constants.py:335 +#: backend/ticket/constants.py:336 backend/ticket/constants.py:339 +#: backend/ticket/constants.py:342 backend/ticket/constants.py:343 +#: backend/ticket/constants.py:344 backend/ticket/constants.py:345 +#: backend/ticket/constants.py:348 backend/ticket/constants.py:351 +#: backend/ticket/constants.py:352 backend/ticket/constants.py:353 +#: backend/ticket/constants.py:354 backend/ticket/constants.py:357 +#: backend/ticket/constants.py:360 backend/ticket/constants.py:361 +#: backend/ticket/constants.py:362 backend/ticket/constants.py:363 +#: backend/ticket/constants.py:366 backend/ticket/constants.py:377 +#: backend/ticket/constants.py:378 backend/ticket/constants.py:379 +#: backend/ticket/constants.py:380 backend/ticket/constants.py:383 +#: backend/ticket/constants.py:387 backend/ticket/constants.py:388 +#: backend/ticket/constants.py:389 backend/ticket/constants.py:392 +#: backend/ticket/constants.py:393 backend/ticket/constants.py:397 +#: backend/ticket/constants.py:408 backend/ticket/constants.py:410 +#: backend/ticket/constants.py:448 backend/ticket/constants.py:449 +#: backend/ticket/constants.py:450 backend/ticket/constants.py:451 +#: backend/ticket/constants.py:454 +msgid "集群管理" +msgstr "Cluster management" + +#: backend/iam_app/dataclass/actions.py:274 +msgid "MySQL 集群详情查看" +msgstr "View MySQL cluster details" + +#: backend/iam_app/dataclass/actions.py:291 +#: backend/iam_app/dataclass/actions.py:642 backend/ticket/constants.py:169 +#: backend/ticket/constants.py:170 backend/ticket/constants.py:214 +#: backend/ticket/constants.py:218 backend/ticket/constants.py:219 +msgid "SQL 任务" +msgstr "SQL tasks" + +#: backend/iam_app/dataclass/actions.py:299 +#: backend/iam_app/dataclass/actions.py:359 +#: backend/iam_app/dataclass/actions.py:383 +#: backend/iam_app/dataclass/actions.py:395 +#: backend/iam_app/dataclass/actions.py:407 +#: backend/iam_app/dataclass/actions.py:419 +#: backend/iam_app/dataclass/actions.py:431 +#: backend/iam_app/dataclass/actions.py:438 +#: backend/iam_app/dataclass/actions.py:690 +#: backend/iam_app/dataclass/actions.py:702 +#: backend/iam_app/dataclass/actions.py:714 +#: backend/iam_app/dataclass/actions.py:726 +#: backend/iam_app/dataclass/actions.py:738 +#: backend/iam_app/dataclass/actions.py:748 +#: backend/iam_app/dataclass/actions.py:758 +#: backend/iam_app/dataclass/actions.py:770 +#: backend/iam_app/dataclass/actions.py:1317 +#: backend/iam_app/dataclass/actions.py:1328 +#: backend/iam_app/dataclass/actions.py:1340 +#: backend/iam_app/dataclass/actions.py:1352 +#: backend/iam_app/dataclass/actions.py:1364 +#: backend/iam_app/dataclass/actions.py:1376 +#: backend/iam_app/dataclass/actions.py:1421 +#: backend/iam_app/dataclass/actions.py:1432 +#: backend/iam_app/dataclass/actions.py:1444 +#: backend/iam_app/dataclass/actions.py:1456 +#: backend/iam_app/dataclass/actions.py:1468 +#: backend/iam_app/dataclass/actions.py:1480 backend/ticket/constants.py:180 +#: backend/ticket/constants.py:181 backend/ticket/constants.py:183 +#: backend/ticket/constants.py:239 backend/ticket/constants.py:240 +#: backend/ticket/constants.py:241 backend/ticket/constants.py:242 +#: backend/ticket/constants.py:276 backend/ticket/constants.py:277 +#: backend/ticket/constants.py:412 backend/ticket/constants.py:413 +msgid "权限管理" +msgstr "Permission management" + +#: backend/iam_app/dataclass/actions.py:307 +#: backend/iam_app/dataclass/actions.py:650 backend/ticket/constants.py:185 +#: backend/ticket/constants.py:187 backend/ticket/constants.py:194 +#: backend/ticket/constants.py:199 backend/ticket/constants.py:200 +#: backend/ticket/constants.py:209 backend/ticket/constants.py:215 +#: backend/ticket/constants.py:248 backend/ticket/constants.py:249 +#: backend/ticket/constants.py:262 backend/ticket/constants.py:273 +#: backend/ticket/constants.py:274 backend/ticket/constants.py:275 +#: backend/ticket/constants.py:399 +msgid "数据处理" +msgstr "Data processing" + +#: backend/iam_app/dataclass/actions.py:314 +msgid "MySQL Webconsole执行" +msgstr "MySQL Webconsole execution" + +#: backend/iam_app/dataclass/actions.py:330 +msgid "MySQL 临时密码修改" +msgstr "MySQL temporary password change" + +#: backend/iam_app/dataclass/actions.py:341 +msgid "MySQL 集群禁用和启用" +msgstr "MySQL cluster disabling and enabling" + +#: backend/iam_app/dataclass/actions.py:353 backend/ticket/constants.py:182 +msgid "MySQL 客户端权限克隆" +msgstr "MySQL Client Privileged Clone" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:42 -#, python-brace-format -msgid "HDFS集群替换角色{hdfs_role}数量不一致" -msgstr "" -"The number of HDFS cluster replacement roles {hdfs_role} is inconsistent" +#: backend/iam_app/dataclass/actions.py:365 +msgid "MySQL 集群删除" +msgstr "MySQL cluster deletion" + +#: backend/iam_app/dataclass/actions.py:377 +msgid "MySQL 账号创建" +msgstr "MySQL account creation" + +#: backend/iam_app/dataclass/actions.py:389 +msgid "MySQL 账号删除" +msgstr "MySQL account deletion" + +#: backend/iam_app/dataclass/actions.py:401 +msgid "MySQL账号规则创建" +msgstr "Create MySQL account rules" + +#: backend/iam_app/dataclass/actions.py:413 +msgid "MySQL 账号规则查看" +msgstr "View MySQL account rules" + +#: backend/iam_app/dataclass/actions.py:425 +msgid "MySQL授权" +msgstr "MySQL authorization" + +#: backend/iam_app/dataclass/actions.py:445 +msgid "MySQL 分区策略创建" +msgstr "MySQL partition strategy creation" + +#: backend/iam_app/dataclass/actions.py:457 +msgid "MySQL 分区策略更新" +msgstr "MySQL partitioning strategy update" + +#: backend/iam_app/dataclass/actions.py:469 +msgid "MySQL 分区策略删除" +msgstr "MySQL partition policy deletion" + +#: backend/iam_app/dataclass/actions.py:481 +msgid "MySQL 分区策略禁用启用" +msgstr "MySQL partitioning policy disable enable" + +#: backend/iam_app/dataclass/actions.py:493 +#: backend/ticket/builders/mysql/mysql_openarea.py:73 +msgid "MySQL 开区执行" +msgstr "MySQL open zone execution" + +#: backend/iam_app/dataclass/actions.py:499 +#: backend/iam_app/dataclass/actions.py:511 +#: backend/iam_app/dataclass/actions.py:523 +#: backend/iam_app/dataclass/actions.py:535 +#: backend/iam_app/dataclass/actions.py:782 +#: backend/iam_app/dataclass/actions.py:794 +#: backend/iam_app/dataclass/actions.py:806 +#: backend/iam_app/dataclass/actions.py:818 backend/ticket/constants.py:198 +#: backend/ticket/constants.py:208 +msgid "克隆开区" +msgstr "Clone zone" + +#: backend/iam_app/dataclass/actions.py:505 +msgid "MySQL 开区模板创建" +msgstr "MySQL zone template creation" + +#: backend/iam_app/dataclass/actions.py:517 +msgid "MySQL 开区模板编辑" +msgstr "MySQL zone template editing" + +#: backend/iam_app/dataclass/actions.py:529 +msgid "MySQL 开区模板删除" +msgstr "MySQL zone template deletion" + +#: backend/iam_app/dataclass/actions.py:541 +msgid "Dumper 订阅规则详情查看" +msgstr "View Dumper subscription rules details" + +#: backend/iam_app/dataclass/actions.py:547 +#: backend/iam_app/dataclass/actions.py:559 +#: backend/iam_app/dataclass/actions.py:571 +#: backend/iam_app/dataclass/actions.py:583 +#: backend/iam_app/dataclass/actions.py:595 +#: backend/iam_app/dataclass/actions.py:607 +#: backend/iam_app/dataclass/actions.py:619 +msgid "Dumper管理" +msgstr "Dumper management" + +#: backend/iam_app/dataclass/actions.py:553 +msgid "Dumper 订阅规则编辑" +msgstr "Dumper subscription rules editor" + +#: backend/iam_app/dataclass/actions.py:565 +msgid "Dumper 订阅规则删除" +msgstr "Dumper subscription rule deletion" + +#: backend/iam_app/dataclass/actions.py:577 +msgid "Dumper 实例创建" +msgstr "Dumper instance creation" + +#: backend/iam_app/dataclass/actions.py:589 +msgid "Dumper 实例禁用与启用" +msgstr "Dumper instance disabling and enabling" + +#: backend/iam_app/dataclass/actions.py:601 +msgid "Dumper 实例迁移" +msgstr "Dumper instance migration" + +#: backend/iam_app/dataclass/actions.py:613 +msgid "Dumper 实例删除" +msgstr "Dumper instance deletion" + +#: backend/iam_app/dataclass/actions.py:625 +msgid "TenDB Cluster 集群详情查看" +msgstr "TenDB Cluster cluster details view" + +#: backend/iam_app/dataclass/actions.py:657 +msgid "TendbCluster Webconsole执行" +msgstr "TendbCluster Webconsole execution" + +#: backend/iam_app/dataclass/actions.py:673 +msgid "TenDB Cluster 临时密码修改" +msgstr "TenDB Cluster temporary password change" + +#: backend/iam_app/dataclass/actions.py:684 +msgid "TenDB Cluster 账号创建" +msgstr "TenDB Cluster account creation" + +#: backend/iam_app/dataclass/actions.py:696 +msgid "TenDB Cluster 账号删除" +msgstr "TenDB Cluster account deletion" + +#: backend/iam_app/dataclass/actions.py:708 +msgid "TenDB Cluster 账号规则创建" +msgstr "TenDB Cluster account rule creation" + +#: backend/iam_app/dataclass/actions.py:720 +msgid "TenDB Cluster 账号规则查看" +msgstr "TenDB Cluster account rules view" + +#: backend/iam_app/dataclass/actions.py:732 backend/ticket/constants.py:241 +msgid "TenDB Cluster 授权" +msgstr "TenDB Cluster authorization" + +#: backend/iam_app/dataclass/actions.py:744 +msgid "TenDB Cluster Excel授权" +msgstr "TenDB Cluster Excel authorization" + +#: backend/iam_app/dataclass/actions.py:754 backend/ticket/constants.py:239 +msgid "TenDB Cluster 客户端权限克隆" +msgstr "TenDB Cluster client permission cloning" + +#: backend/iam_app/dataclass/actions.py:764 backend/ticket/constants.py:240 +msgid "TenDB Cluster DB实例权限克隆" +msgstr "TenDB Cluster DB instance permission cloning" + +#: backend/iam_app/dataclass/actions.py:776 +msgid "TenDB Cluster 开区执行" +msgstr "TenDB Cluster open zone execution" + +#: backend/iam_app/dataclass/actions.py:788 +msgid "TenDB Cluster 开区模板创建" +msgstr "TenDB Cluster zone template creation" + +#: backend/iam_app/dataclass/actions.py:800 +msgid "TenDB Cluster 开区模板编辑" +msgstr "TenDB Cluster zone template editing" + +#: backend/iam_app/dataclass/actions.py:812 +msgid "TenDB Cluster 开区模板删除" +msgstr "TenDB Cluster zone template deletion" + +#: backend/iam_app/dataclass/actions.py:824 +msgid "TenDB Cluster 分区管理创建" +msgstr "TenDB Cluster partition management creation" + +#: backend/iam_app/dataclass/actions.py:836 +msgid "TenDB Cluster 分区管理更新" +msgstr "TenDB Cluster Partition Management Update" + +#: backend/iam_app/dataclass/actions.py:848 +msgid "TenDB Cluster 分区管理删除" +msgstr "TenDB Cluster partition management deletion" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:83 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:119 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:82 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:76 -msgid "下发hdfs介质包" -msgstr "Deliver hdfs media package" +#: backend/iam_app/dataclass/actions.py:860 +msgid "TenDB Cluster 分区管理禁用启用" +msgstr "TenDB Cluster partition management disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:87 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:123 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:88 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:159 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:139 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:145 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:343 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:120 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:140 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:89 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:227 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:99 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:223 -msgid "初始化机器" -msgstr "Initialize the machine" +#: backend/iam_app/dataclass/actions.py:881 +msgid "TenDB Cluster 集群禁用启用" +msgstr "TenDB Cluster cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:92 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:127 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:93 -msgid "解压缩文件" -msgstr "unzip the file" +#: backend/iam_app/dataclass/actions.py:894 +msgid "TenDB Cluster 下架只读接入层" +msgstr "TenDB Cluster removes read-only access layer" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:97 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:131 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:98 -msgid "渲染集群配置" -msgstr "Rendering cluster configuration" +#: backend/iam_app/dataclass/actions.py:906 +msgid "Redis 集群详情查看" +msgstr "View Redis cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:102 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:135 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:103 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:98 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:113 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:130 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:218 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:135 -msgid "安装supervisor" -msgstr "install supervisor" +#: backend/iam_app/dataclass/actions.py:922 +msgid "Redis Webconsole执行" +msgstr "Redis Webconsole execution" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:112 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:147 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:238 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:138 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:128 -msgid "安装zookeeper-{}" -msgstr "install zookeeper-{}" +#: backend/iam_app/dataclass/actions.py:938 +msgid "Redis 获取访问方式" +msgstr "Redis gets access method" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:122 -msgid "安装JournalNode" -msgstr "Install JournalNodes" +#: backend/iam_app/dataclass/actions.py:959 +msgid "Redis 集群禁用启用" +msgstr "Redis cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:130 -msgid "安装NN1" -msgstr "Install NN1" +#: backend/iam_app/dataclass/actions.py:1007 backend/ticket/constants.py:350 +msgid "ES 集群部署" +msgstr "ES cluster deployment" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:136 -msgid "安装NN2" -msgstr "Install NN2" +#: backend/iam_app/dataclass/actions.py:1012 +#: backend/iam_app/dataclass/actions.py:1024 +#: backend/iam_app/dataclass/actions.py:1036 +#: backend/iam_app/dataclass/actions.py:1048 +msgid "ES" +msgstr "ES" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:142 -msgid "安装ZKFC" -msgstr "Install ZKFC" +#: backend/iam_app/dataclass/actions.py:1019 +msgid "ES 集群详情查看" +msgstr "View ES cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:150 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:168 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:138 -msgid "安装DataNode-{}" -msgstr "Install DataNodes - {}" +#: backend/iam_app/dataclass/actions.py:1031 +msgid "ES 获取访问方式" +msgstr "ES Get access method" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:160 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:178 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:148 -msgid "安装HAProxy" -msgstr "Install HAProxy" +#: backend/iam_app/dataclass/actions.py:1043 +msgid "ES 集群禁用启用" +msgstr "ES cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:174 -msgid "插入haproxy实例信息" -msgstr "Insert haproxy instance information" +#: backend/iam_app/dataclass/actions.py:1063 +msgid "Doris 集群详情查看" +msgstr "View Doris cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:194 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:195 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:210 -msgid "添加元数据到DBMeta" -msgstr "Add metadata to DBMeta" +#: backend/iam_app/dataclass/actions.py:1075 +msgid "Doris 获取访问方式" +msgstr "Doris Get access" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:199 -msgid "回写集群部署配置" -msgstr "Write back cluster deployment configuration" +#: backend/iam_app/dataclass/actions.py:1087 +msgid "Doris 集群禁用启用" +msgstr "Doris cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:210 -msgid "NameNode主机数不为2" -msgstr "The number of NameNode hosts is not 2" +#: backend/iam_app/dataclass/actions.py:1099 +msgid "Kafka 集群详情查看" +msgstr "View Kafka cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:214 -msgid "ZooKeeper主机数不为3" -msgstr "The number of ZooKeeper hosts is not 3" +#: backend/iam_app/dataclass/actions.py:1111 +msgid "Kafka 获取访问方式" +msgstr "Kafka gets access method" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:218 -msgid "DataNode主机数少于2" -msgstr "The number of DataNode hosts is less than 2" +#: backend/iam_app/dataclass/actions.py:1131 +msgid "Kafka 集群禁用启用" +msgstr "Kafka cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:245 -msgid "复用NN主机 {} 作为ZK" -msgstr "Reuse NN host{} as ZK" +#: backend/iam_app/dataclass/actions.py:1151 +msgid "HDFS 集群详情查看" +msgstr "View HDFS cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:65 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:61 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:63 -msgid "检查集群状态" -msgstr "Check cluster status" +#: backend/iam_app/dataclass/actions.py:1163 +msgid "HDFS 获取访问方式" +msgstr "HDFS Get access method" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:75 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:71 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:73 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:65 -msgid "下发hdfs actuator" -msgstr "Issue hdfs actuator" +#: backend/iam_app/dataclass/actions.py:1175 +msgid "HDFS 集群禁用启用" +msgstr "HDFS cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:84 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:261 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:156 -msgid "HDFS集群节点清理-{}" -msgstr "HDFS cluster node cleaning -{}" +#: backend/iam_app/dataclass/actions.py:1195 +msgid "Pulsar 集群详情查看" +msgstr "View Pulsar cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:99 -msgid "删除haproxy实例信息" -msgstr "Delete haproxy instance information" +#: backend/iam_app/dataclass/actions.py:1207 +msgid "Pulsar 获取访问方式" +msgstr "Pulsar Get access method" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:80 -msgid "停止HDFS集群进程-{}" -msgstr "Stop HDFS cluster process -{}" +#: backend/iam_app/dataclass/actions.py:1219 +msgid "Pulsar 集群禁用启用" +msgstr "Pulsar cluster disable enable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:83 -msgid "启动HDFS集群ZK-{}" -msgstr "Start HDFS cluster ZK-{}" +#: backend/iam_app/dataclass/actions.py:1240 +msgid "Riak 集群详情查看" +msgstr "View Riak cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:97 -msgid "启动HDFS集群JN-{}" -msgstr "Start HDFS cluster JN-{}" +#: backend/iam_app/dataclass/actions.py:1252 +msgid "Riak 获取访问方式" +msgstr "Riak Get access" + +#: backend/iam_app/dataclass/actions.py:1264 +msgid "Riak 集群禁用启用" +msgstr "Riak cluster disable enable" + +#: backend/iam_app/dataclass/actions.py:1276 +msgid "Mongodb 集群详情查看" +msgstr "View Mongodb cluster details" + +#: backend/iam_app/dataclass/actions.py:1288 +msgid "MongoDB 部署" +msgstr "MongoDB deployment" + +#: backend/iam_app/dataclass/actions.py:1300 +msgid "MongoDB 集群禁用启用" +msgstr "MongoDB cluster disable enable" + +#: backend/iam_app/dataclass/actions.py:1312 +msgid "MongoDB 账号创建" +msgstr "MongoDB account creation" + +#: backend/iam_app/dataclass/actions.py:1323 +msgid "MongoDB 删除账号" +msgstr "MongoDB delete account" + +#: backend/iam_app/dataclass/actions.py:1334 +msgid "MongoDB 账号规则创建" +msgstr "MongoDB account rule creation" + +#: backend/iam_app/dataclass/actions.py:1346 +msgid "MongoDB 账号规则查看" +msgstr "View MongoDB account rules" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:112 -msgid "启动HDFS集群NN-{}" -msgstr "Start HDFS cluster NN-{}" +#: backend/iam_app/dataclass/actions.py:1358 +msgid "MongoDB 集群授权" +msgstr "MongoDB cluster authorization" + +#: backend/iam_app/dataclass/actions.py:1370 +msgid "MongoDB Excel集群授权" +msgstr "MongoDB Excel cluster authorization" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:121 -msgid "启动HDFS集群ZKFC-{}" -msgstr "Start HDFS cluster ZKFC-{}" +#: backend/iam_app/dataclass/actions.py:1382 +msgid "SQLServer 集群详情查看" +msgstr "View SQLServer cluster details" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:125 -msgid "启动HDFS集群NN服务-{}子流程" -msgstr "Start HDFS cluster NN service-{} sub-process" +#: backend/iam_app/dataclass/actions.py:1393 +msgid "SQLServer 临时密码修改" +msgstr "SQLServer temporary password change" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:135 -msgid "启动HDFS集群DN-{}" -msgstr "Start HDFS cluster DN-{}" +#: backend/iam_app/dataclass/actions.py:1404 +msgid "SQLServer 部署" +msgstr "SQLServer deployment" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:76 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:76 -msgid "重启实例-{}-{}" -msgstr "restart instance-{}-{}" +#: backend/iam_app/dataclass/actions.py:1416 +msgid "SQLServer 账号创建" +msgstr "SQLServer account creation" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:77 -msgid "集群DN替换-扩容DN" -msgstr "Cluster DN replacement - expansion DN" +#: backend/iam_app/dataclass/actions.py:1427 +msgid "SQLServer 删除账号" +msgstr "SQLServer delete account" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:80 -msgid "集群DN替换-缩容DN" -msgstr "Cluster DN replacement - shrinking DN" +#: backend/iam_app/dataclass/actions.py:1438 +msgid "SQLServer 账号规则创建" +msgstr "SQLServer account rule creation" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:99 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:145 -msgid "更新haproxy实例信息" -msgstr "Update haproxy instance information" +#: backend/iam_app/dataclass/actions.py:1450 +msgid "SQLServer 账号规则查看" +msgstr "View SQLServer account rules" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:115 -msgid "添加DN获取机器信息" -msgstr "Add DN to get machine information" +#: backend/iam_app/dataclass/actions.py:1462 backend/ticket/constants.py:276 +msgid "SQLServer 集群授权" +msgstr "SQLServer cluster authorization" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:143 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:112 -msgid "更新主机映射" -msgstr "Update host mapping" +#: backend/iam_app/dataclass/actions.py:1474 +msgid "SQLServer Excel授权" +msgstr "SQLServer Excel authorization" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:151 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:121 -msgid "include增加数据节点" -msgstr "include to increase the data node" +#: backend/iam_app/dataclass/actions.py:1486 +msgid "SQLServer 集群禁用和启用" +msgstr "SQLServer cluster disabling and enabling" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:159 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:217 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:239 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:252 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:129 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:90 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:112 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:125 -msgid "刷新节点配置" -msgstr "Refresh node configuration" +#: backend/iam_app/dataclass/actions.py:1498 +msgid "资源池管理" +msgstr "Resource pool management" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:190 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:161 -msgid "添加新DN到域名" -msgstr "Add new DN to domain name" +#: backend/iam_app/dataclass/actions.py:1510 +msgid "资源池操作记录查看" +msgstr "View resource pool operation records" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:209 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:82 -msgid "添加数据节点到exclude" -msgstr "Add data nodes to exclude" +#: backend/iam_app/dataclass/actions.py:1522 +msgid "污点池管理" +msgstr "Taint pool management" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:223 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:96 -msgid "检查节点退役信息" -msgstr "Check node decommissioning information" +#: backend/iam_app/dataclass/actions.py:1534 +msgid "健康报告查看" +msgstr "Health report view" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:231 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:104 -msgid "include剔除数据节点" -msgstr "include removes data nodes" +#: backend/iam_app/dataclass/actions.py:1539 +#: backend/iam_app/dataclass/actions.py:1550 +msgid "可观测" +msgstr "observable" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:244 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:117 -msgid "exclude剔除数据节点" -msgstr "exclude removes data nodes" +#: backend/iam_app/dataclass/actions.py:1545 +msgid "DBHA切换事件查看" +msgstr "DBHA switching event view" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:276 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:172 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:163 -msgid "更新域名" -msgstr "update domain name" +#: backend/iam_app/dataclass/actions.py:1556 +msgid "告警组查看" +msgstr "Alarm group view" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:283 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:179 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:231 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:108 -msgid "DBMeta删除下架IP" -msgstr "DBMeta deletes the off-the-shelf IP" +#: backend/iam_app/dataclass/actions.py:1568 +msgid "告警组新建" +msgstr "Create a new alarm group" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:349 -msgid "没有需要替换的角色IP" -msgstr "There are no character IPs to replace" +#: backend/iam_app/dataclass/actions.py:1580 +msgid "告警组编辑" +msgstr "Alarm group editor" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:355 -msgid "替换HDFS DataNode角色IP不一致" -msgstr "Inconsistent IP addresses for replacing HDFS DataNode roles" +#: backend/iam_app/dataclass/actions.py:1592 +msgid "告警组删除" +msgstr "Alarm group deletion" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:167 -msgid "元数据DBMeta更新及转移主机" -msgstr "Metadata DBMeta update and transfer host" +#: backend/iam_app/dataclass/actions.py:1604 +msgid "全局告警组编辑" +msgstr "Global alarm group editing" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:74 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:79 -msgid "下发influxdb介质" -msgstr "Deliver influxdb media" +#: backend/iam_app/dataclass/actions.py:1616 +msgid "监控策略查看" +msgstr "Monitoring strategy view" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:80 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:87 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:114 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:202 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:119 -msgid "初始化节点" -msgstr "initialize node" +#: backend/iam_app/dataclass/actions.py:1628 +msgid "全局监控策略查看" +msgstr "Global monitoring policy view" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:88 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:103 -msgid "解压influxdb包" -msgstr "Unzip the influxdb package" +#: backend/iam_app/dataclass/actions.py:1640 +msgid "监控策略编辑" +msgstr "Monitoring strategy editor" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:113 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:130 -msgid "安装influxdb-{}" -msgstr "install influxdb-{}" +#: backend/iam_app/dataclass/actions.py:1652 +msgid "全局监控策略编辑" +msgstr "Global monitoring strategy editor" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:130 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:146 -msgid "{}-初始化User" -msgstr "{} - Initialize User" +#: backend/iam_app/dataclass/actions.py:1664 +msgid "监控策略删除" +msgstr "Monitoring policy deletion" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:146 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:162 -msgid "安装telegraf-{}" -msgstr "install telegraf-{}" +#: backend/iam_app/dataclass/actions.py:1676 +msgid "监控策略启停" +msgstr "Monitoring strategy start and stop" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:154 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:196 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:223 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:418 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:169 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:214 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:290 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:181 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:120 -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:125 -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:162 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:348 -#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:91 -msgid "更新DBMeta元信息" -msgstr "Update DBMeta meta information" +#: backend/iam_app/dataclass/actions.py:1688 +msgid "全局监控策略启停" +msgstr "Global monitoring strategy start and stop" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:158 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:200 -msgid "回写influxdb集群配置" -msgstr "Write back the influxdb cluster configuration" +#: backend/iam_app/dataclass/actions.py:1700 +msgid "监控策略克隆" +msgstr "Monitoring policy cloning" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:68 -msgid "清理Influxdb {}子流程" -msgstr "Clean up Influxdb{} subprocesses" +#: backend/iam_app/dataclass/actions.py:1712 +msgid "全局数据库配置查看" +msgstr "Global database configuration view" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:68 -msgid "禁用Influxdb {}子流程" -msgstr "disable influxdb{} subprocess" +#: backend/iam_app/dataclass/actions.py:1724 +msgid "DBA人员设置" +msgstr "DBA personnel settings" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:68 -msgid "启用Influxdb {}子流程" -msgstr "enable influxdb{} subprocess" +#: backend/iam_app/dataclass/actions.py:1735 +msgid "全局DBA人员设置" +msgstr "Global DBA personnel settings" + +#: backend/iam_app/dataclass/actions.py:1747 +msgid "版本文件查看" +msgstr "Version file view" + +#: backend/iam_app/dataclass/actions.py:1753 +#: backend/iam_app/dataclass/actions.py:1765 +msgid "版本文件" +msgstr "version file" + +#: backend/iam_app/dataclass/actions.py:1759 +msgid "版本文件管理" +msgstr "Version file management" + +#: backend/iam_app/dataclass/actions.py:1771 +msgid "密码安全规则设置" +msgstr "Password security rule settings" + +#: backend/iam_app/dataclass/actions.py:1783 +msgid "资源规格新建" +msgstr "New resource specification" + +#: backend/iam_app/dataclass/actions.py:1789 +#: backend/iam_app/dataclass/actions.py:1801 +#: backend/iam_app/dataclass/actions.py:1813 +#: backend/ticket/builders/influxdb/influxdb_apply.py:42 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:33 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:38 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:37 +#: backend/ticket/builders/mysql/mysql_add_slave.py:29 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:29 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:36 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:28 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:37 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:37 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:34 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:30 +msgid "资源规格" +msgstr "resource specification" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:167 -msgid "安装Influxdb {}子流程" -msgstr "install influxdb {} subprocess" +#: backend/iam_app/dataclass/actions.py:1795 +msgid "资源规格编辑" +msgstr "Resource specification editor" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:191 -msgid "下架Influxdb {}子流程" -msgstr "Delist Influxdb{} subprocess" +#: backend/iam_app/dataclass/actions.py:1807 +msgid "资源规格删除" +msgstr "Resource specification delete" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:108 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:196 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:112 -msgid "下发kafka介质" -msgstr "Send kafka media" +#: backend/iam_app/dataclass/actions.py:1819 +msgid "轮值策略查看" +msgstr "View rotation strategy" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:122 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:210 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:127 -msgid "解压kafka包" -msgstr "Unzip the kafka package" +#: backend/iam_app/dataclass/actions.py:1825 +#: backend/iam_app/dataclass/actions.py:1837 +#: backend/iam_app/dataclass/actions.py:1849 +#: backend/iam_app/dataclass/actions.py:1861 +#: backend/iam_app/dataclass/actions.py:1897 +msgid "轮值策略" +msgstr "rotation strategy" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:158 -msgid "初始化系统kafkaUser" -msgstr "Initialize the system kafkaUser" +#: backend/iam_app/dataclass/actions.py:1831 +msgid "轮值策略新增" +msgstr "New rotation strategy" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:165 -msgid "初始化kafkaUser" -msgstr "Initialize kafkaUser" +#: backend/iam_app/dataclass/actions.py:1843 +msgid "轮值策略编辑" +msgstr "Rotation strategy editor" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:179 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:315 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:149 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:256 -msgid "安装broker-{}" -msgstr "install broker-{}" +#: backend/iam_app/dataclass/actions.py:1855 +msgid "轮值策略删除" +msgstr "Rotation policy deletion" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:192 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:338 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:194 -msgid "安装kafka manager" -msgstr "install kafka-manager" +#: backend/iam_app/dataclass/actions.py:1867 +msgid "授权白名单管理" +msgstr "Authorization whitelist management" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:205 -msgid "插入manager实例信息" -msgstr "Insert manager instance information" +#: backend/iam_app/dataclass/actions.py:1879 +msgid "全局授权白名单管理" +msgstr "Global authorization whitelist management" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:217 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:145 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:176 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:114 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:164 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:332 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:335 -msgid "添加集群域名" -msgstr "Add cluster domain name" +#: backend/iam_app/dataclass/actions.py:1903 +msgid "集群入口配置修改" +msgstr "Cluster entry configuration modification" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:227 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:301 -msgid "回写kafka集群配置" -msgstr "Write back kafka cluster configuration" +#: backend/iam_app/dataclass/actions.py:1913 +msgid "临时密码生效实例查看" +msgstr "View an example of temporary password taking effect" -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:78 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:174 -msgid "清理Kafka {}子流程" -msgstr "Clean up Kafka{} subprocesses" +#: backend/iam_app/dataclass/actions.py:1926 +msgid "动作ID不存在: {}" +msgstr "Action ID does not exist: {}" -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:88 -msgid "删除manager实例信息" -msgstr "Delete manager instance information" +#: backend/iam_app/dataclass/resources.py:208 +msgid "单据分类" +msgstr "Document classification" -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:72 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:157 -msgid "禁用Kafka {}子流程" -msgstr "Disable Kafka{} subprocess" +#: backend/iam_app/dataclass/resources.py:215 +#: backend/iam_app/views/ticket_group_provider.py:29 +#: backend/iam_app/views/ticket_group_provider.py:34 +msgid "其他" +msgstr "other" -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:72 -msgid "启用Kafka {}子流程" -msgstr "Enable Kafka {} subprocess" +#: backend/iam_app/dataclass/resources.py:225 +msgid "任务流程" +msgstr "Task flow" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:249 -msgid "增加zookeeper节点" -msgstr "Add zookeeper nodes" +#: backend/iam_app/dataclass/resources.py:346 +msgid "MySQL集群" +msgstr "MySQL cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:259 -#, python-brace-format -msgid "滚动重启broker节点-{ip}" -msgstr "Rolling restart broker node -{ip}" +#: backend/iam_app/dataclass/resources.py:362 +msgid "Redis集群" +msgstr "Redis cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:270 -msgid "移除zookeeper节点" -msgstr "Remove the zookeeper node" +#: backend/iam_app/dataclass/resources.py:378 +msgid "DORIS集群" +msgstr "DORIS cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:297 -msgid "下架zookeeper-{}子流程" -msgstr "Remove zookeeper-{} sub-process" +#: backend/iam_app/dataclass/resources.py:394 +msgid "HDFS集群" +msgstr "HDFS cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:351 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:207 -msgid "更新manager实例信息" -msgstr "Update manager instance information" +#: backend/iam_app/dataclass/resources.py:418 +msgid "Mongodb集群" +msgstr "Mongodb cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:364 -msgid "更新集群域名" -msgstr "Update the cluster domain name" +#: backend/iam_app/dataclass/resources.py:426 +msgid "SQLServer集群" +msgstr "SQLServer cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:377 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:114 -msgid "Kafka搬迁数据" -msgstr "Kafka migration data" +#: backend/iam_app/dataclass/resources.py:458 +msgid "InfluxDB实例" +msgstr "InfluxDB instance" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:387 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:124 -msgid "Kafka检查搬迁进度" -msgstr "Kafka checks the progress of the relocation" +#: backend/iam_app/dataclass/resources.py:510 +msgid "MySQL 账号" +msgstr "MySQL account" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:414 -msgid "下架broker-{}子流程" -msgstr "Remove broker-{} sub-process" +#: backend/iam_app/dataclass/resources.py:518 +msgid "SQLServer 账号" +msgstr "SQLServer account" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:104 -msgid "下发dbacuator" -msgstr "Issue dbacuator" +#: backend/iam_app/dataclass/resources.py:526 +msgid "MongoDB 账号" +msgstr "MongoDB account" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:137 -msgid "删除broker的域名记录" -msgstr "Delete the domain name record of the broker" +#: backend/iam_app/dataclass/resources.py:534 +msgid "TendbCluster 账号" +msgstr "TendbCluster account" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:144 -msgid "停止进程" -msgstr "stop process" +#: backend/iam_app/dataclass/resources.py:542 +msgid "VM集群" +msgstr "VM cluster" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:162 -msgid "清理数据" -msgstr "clean data" +#: backend/iam_app/dataclass/resources.py:601 +msgid "全局监控策略" +msgstr "Global monitoring strategy" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:61 -msgid "执行ip信息为空" -msgstr "The execution ip information is empty" +#: backend/iam_app/dataclass/resources.py:655 +msgid "全局告警组" +msgstr "Global alarm group" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:69 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:366 -msgid "下发MySQL周边程序介质" -msgstr "Distribute MySQL peripheral program media" +#: backend/iam_app/dataclass/resources.py:676 +msgid "开区模板" +msgstr "Open area template" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:86 -msgid "Master[{}]安装备份程序" -msgstr "Master[{}] install backup program" +#: backend/iam_app/dataclass/resources.py:699 +msgid "数据订阅规则" +msgstr "Data subscription rules" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:99 -msgid "Master[{}]安装rotate_binlog程序" -msgstr "Master[{}] installs the rotate_binlog program" +#: backend/iam_app/dataclass/resources.py:755 +msgid "资源类型ID不存在: {}" +msgstr "Resource type ID does not exist: {}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:112 -msgid "Master[{}]安装mysql-monitor" -msgstr "Master[{}] install mysql-monitor" +#: backend/iam_app/exceptions.py:51 +#, python-brace-format +msgid "当前用户无 [{action_name}] 权限" +msgstr "The current user does not have permission for [{action_name}]" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:131 -msgid "Master[{}]安装校验程序" -msgstr "Master[{}] installs the verification program" +#: backend/iam_app/handlers/drf_perm/account.py:41 +msgid "账号动作:{} 不存在/未实现" +msgstr "Account action:{} does not exist/is not implemented" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:148 -msgid "Master[{}]安装DBATools工具箱" -msgstr "Master[{}] installs the DBATools toolbox" +#: backend/iam_app/handlers/drf_perm/monitor.py:49 +msgid "不合法的告警组任务ID:{}" +msgstr "Illegal alarm group task ID: {}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:167 -msgid "Slave[{}]安装备份程序" -msgstr "Slave[{}] install backup program" +#: backend/iam_app/handlers/drf_perm/monitor.py:71 +msgid "未找到策略ID,无法决定告警组相关动作鉴权。请保证参数包含策略ID" +msgstr "The policy ID was not found and the action authentication related to the alarm group could not be determined. Please ensure that the parameter contains the policy ID" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:180 -msgid "Slave[{}]安装rotate_binlog程序" -msgstr "Slave[{}] installs the rotate_binlog program" +#: backend/iam_app/handlers/drf_perm/openarea.py:49 +msgid "{}没有找到相关动作鉴权" +msgstr "{}No relevant action authentication found" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:193 -msgid "Slave[{}]安装mysql-monitor" -msgstr "Slave[{}] install mysql-monitor" +#: backend/iam_app/handlers/drf_perm/proxypass.py:39 +msgid "db_cloud_token:{}解密失败,请检查token是否合法" +msgstr "db_cloud_token: {} decryption failed, please check whether the token is legal." -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:212 -msgid "Slave[{}]安装校验程序" -msgstr "Slave[{}] installation verification program" +#: backend/iam_app/handlers/drf_perm/proxypass.py:44 +msgid "解析的云区域(ID:{})与请求参数的云区域(ID:{})不相同,请检查token是否合法" +msgstr "The parsed cloud area (ID: {}) is different from the cloud area (ID: {}) of the request parameter. Please check whether the token is legal." -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:229 -msgid "Slave[{}]安装DBATools工具箱" -msgstr "Slave[{}] installs the DBATools toolbox" +#: backend/iam_app/handlers/drf_perm/storage.py:47 +msgid "不允许同时操作业务临时文件和介质文件" +msgstr "Simultaneous operation of business temporary files and media files is not allowed" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:247 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:260 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:291 -msgid "Proxy安装mysql-monitor" -msgstr "Proxy install mysql-monitor" +#: backend/iam_app/handlers/drf_perm/storage.py:62 +msgid "文件操作路径{}不合法,请联系管理员" +msgstr "The file operation path {} is illegal, please contact the administrator" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:262 -msgid "安装MySql周边程序" -msgstr "Install MySql peripheral program" +#: backend/iam_app/handlers/drf_perm/ticket.py:147 +msgid "单据动作ID:{} 不存在" +msgstr "Document action ID:{} does not exist" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:297 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:219 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:450 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:400 -msgid "新增repl帐户" -msgstr "Add repl account" +#: backend/iam_app/handlers/drf_perm/ticket.py:172 +msgid "{}不在处理人:{}中, 无权进行审批操作" +msgstr "{} is not among the handlers: {} and does not have the right to perform approval operations" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:312 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:228 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:149 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:465 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:415 -msgid "建立主从关系" -msgstr "Establish a master-slave relationship" +#: backend/iam_app/handlers/permission.py:82 +#, python-brace-format +msgid "获取系统信息错误:{message}" +msgstr "Error getting system information: {message}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:324 -msgid "建立主从同步[{}]" -msgstr "Create master-slave synchronization[{}]" +#: backend/iam_app/handlers/permission.py:663 +msgid "填充权限字段失败:{}" +msgstr "Failed to populate permission fields: {}" -#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:17 -msgid "Flow模块TenDB 异常" -msgstr "Flow module TenDB exception" +#: backend/iam_app/serializers.py:24 backend/iam_app/serializers.py:33 +msgid "资源ID" +msgstr "Resource ID" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:77 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:110 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:97 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:73 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:180 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:178 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:191 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:334 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:96 -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:88 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:79 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:117 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:88 -msgid "下发db-actuator介质" -msgstr "Deliver db-actuator media" +#: backend/iam_app/serializers.py:26 +msgid "动作ID列表" +msgstr "action id list" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:90 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:92 -msgid "下发SQL文件" -msgstr "Send the SQL file" +#: backend/iam_app/serializers.py:32 +msgid "动作ID" +msgstr "Action ID" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:108 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:110 -msgid "执行SQL导入" -msgstr "Execute SQL import" +#: backend/iam_app/serializers.py:34 +msgid "是否抛出异常" +msgstr "Whether to throw an exception" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:119 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:121 -msgid "[{}]执行SQL变更" -msgstr "[{}] Execute SQL Alteration" +#: backend/iam_app/serializers.py:41 +msgid "仅支持业务下一个动作关联一种类型的资源" +msgstr "Only supports one type of resource associated with the next business action" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:143 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:139 -msgid "给模板集群下发db-actuator" -msgstr "Deliver db-actuator to the template cluster" +#: backend/iam_app/views/cluster_provider.py:95 +#: backend/iam_app/views/cluster_provider.py:148 +msgid "单节点" +msgstr "single node" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:155 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:151 -msgid "备份测试库表结构" -msgstr "Backup test database table structure" +#: backend/iam_app/views/cluster_provider.py:95 +#: backend/iam_app/views/cluster_provider.py:148 +msgid "高可用" +msgstr "High availability" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:168 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:164 -msgid "对SQL文件进行语义测试" -msgstr "Semantic testing of SQL files" +#: backend/iam_app/views/cluster_provider.py:139 +msgid "副本集" +msgstr "replica set" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:186 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:182 -msgid "创建SQL执行单据" -msgstr "Create SQL execution tickets" +#: backend/iam_app/views/cluster_provider.py:139 +msgid "分片集" +msgstr "shard set" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:198 -msgid "查询不到可执行的实例!!!" -msgstr "Executable instance could not be found! ! !" +#: backend/iam_app/views/views.py:35 +msgid "获取系统权限中心信息" +msgstr "Obtaining system authority center information" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:251 -msgid "获取字符集为空..." -msgstr "Get charset is empty..." +#: backend/iam_app/views/views.py:42 +msgid "检查当前用户对该动作是否有权限" +msgstr "Check if the current user has permission for the action" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:252 -msgid "获取字符集为空" -msgstr "get character set is empty" +#: backend/iam_app/views/views.py:62 +msgid "" +"检查当前用户对该动作是否有权限(仅适用于鉴权业务下一个动作对应一种资源类型,如" +"果是多种动作对应多种资源类型,请切换为check_allowed接口)" +msgstr "Check whether the current user has permission for the action (only applicable to the authentication business. The next action corresponds to one resource type. If multiple actions correspond to multiple resource types, please switch to the check_allowed interface)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_authorize_rules.py:42 -msgid "添加mysql规则授权" -msgstr "Add mysql rule authorization" +#: backend/iam_app/views/views.py:74 +msgid "获取权限申请数据" +msgstr "Obtain permission application data" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:119 -msgid "检查元数据信息是否存在主备关系" +#: backend/iam_app/views/views.py:89 +msgid "" +"单个获取权限申请数据(仅适用于鉴权业务下一个动作对应一种资源类型,如果是多种动" +"作对应多种资源类型,请切换为get_apply_data接口)" +msgstr "Single acquisition of permission application data (only applicable to the authentication business where the next action corresponds to one resource type. If multiple actions correspond to multiple resource types, please switch to the get_apply_data interface)" + +#: backend/ticket/builders/__init__.py:145 +#, python-brace-format +msgid "{creator}提交了{title}的单据,请查看详情后进行审批" msgstr "" -"Check whether the metadata information has a master-backup relationship" +"{creator} has submitted the ticket for {title}, please review the details " +"before approval" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:133 -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:140 -#: backend/ticket/constants.py:321 -msgid "定时" -msgstr "timing" +#: backend/ticket/builders/__init__.py:150 +msgid "单据链接" +msgstr "ticket link" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:142 -msgid "创建临时用户" -msgstr "create temporary user" +#: backend/ticket/builders/__init__.py:155 +msgid "需求信息" +msgstr "demand information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:149 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:102 -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:119 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:173 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:171 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:139 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:172 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:262 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:317 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:155 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:226 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:273 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:258 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:90 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:270 -msgid "下发actuator介质" -msgstr "Deliver the actuator medium" +#: backend/ticket/builders/__init__.py:355 +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:88 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:192 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:126 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +#: backend/ticket/constants.py:461 backend/ticket/constants.py:498 +msgid "单据审批" +msgstr "Ticket approval" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:161 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:174 -msgid "actuator执行checksum" -msgstr "Actuator executes checksum" +#: backend/ticket/builders/cloud/dbha_add.py:28 +msgid "新DBHA-GM机器的部署信息" +msgstr "Deployment information for new DBHA-GM machines" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:183 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:196 -msgid "删除临时用户" -msgstr "delete temporary user" +#: backend/ticket/builders/cloud/dbha_add.py:29 +msgid "新DBHA-AGENT机器的部署信息" +msgstr "Deployment information for new DBHA-AGENT machines" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:202 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:215 -msgid "生成校验报告" -msgstr "Generate verification report" +#: backend/ticket/builders/cloud/dbha_add.py:45 +msgid "DBHA 服务新增" +msgstr "DBHA service added" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:208 -msgid "master[{}{}{}],slave[{}{}{}]的校验结果" -msgstr "Check result of master[{}{}{}],slave[{}{}{}]" +#: backend/ticket/builders/cloud/dbha_reduce.py:31 +msgid "裁撤的DBHA-GM列表" +msgstr "List of abolished DBHA-GMs" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:221 -msgid "master[{}{}{}]的校验任务" -msgstr "Verification task of master[{}{}{}]" +#: backend/ticket/builders/cloud/dbha_reduce.py:34 +msgid "裁撤的DBHA-AGENT列表" +msgstr "List of abolished DBHA-AGENTs" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:227 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:247 -msgid "构建checksum流程成功" -msgstr "Build the checksum process successfully" +#: backend/ticket/builders/cloud/dbha_reduce.py:43 +msgid "请至少保证一个agent/gm存活" +msgstr "Please keep at least one agent/gm alive" -#: backend/flow/engine/bamboo/scene/mysql/mysql_clone_rules.py:42 -msgid "添加mysql权限克隆" -msgstr "Add mysql permission to clone" +#: backend/ticket/builders/cloud/dbha_reduce.py:60 +msgid "DBHA 服务裁撤" +msgstr "DBHA service abolition" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:58 -msgid "下发db-actor到集群主从节点{}" -msgstr "Send db-actor to the master and slave nodes of the cluster {}" +#: backend/ticket/builders/cloud/dbha_reload.py:28 +msgid "重装的GM ID列表" +msgstr "List of Reloaded GM IDs" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:72 -msgid "修改mysql实例配置{}" -msgstr "Modify the mysql instance configuration {}" +#: backend/ticket/builders/cloud/dbha_reload.py:29 +msgid "重装的AGENT ID列表" +msgstr "Reloaded AGENT ID list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:87 -msgid "开始修改mysql配置" -msgstr "Start to modify the mysql configuration" +#: backend/ticket/builders/cloud/dbha_reload.py:45 +msgid "DBHA 服务重装" +msgstr "DBHA service reload" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:42 -msgid "串行1" -msgstr "serial 1" +#: backend/ticket/builders/cloud/dbha_replace.py:29 +msgid "被替换旧DBHA-GM服务ID" +msgstr "Replaced by the old DBHA-GM service ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:43 -msgid "串行2" -msgstr "serial 2" +#: backend/ticket/builders/cloud/dbha_replace.py:30 +msgid "替换后的新的DBHA-GM服务信息" +msgstr "New DBHA-GM service information after replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:44 -msgid "串行3" -msgstr "Serial 3" +#: backend/ticket/builders/cloud/dbha_replace.py:32 +msgid "被替换旧DBHA-AGENT服务ID" +msgstr "Replaced by the old DBHA-AGENT service ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:48 -msgid "并行1" -msgstr "Parallel 1" +#: backend/ticket/builders/cloud/dbha_replace.py:33 +msgid "替换后的新的DBHA-AGENT服务信息" +msgstr "New DBHA-AGENT service information after replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:53 -msgid "并行2" -msgstr "Parallel 2" +#: backend/ticket/builders/cloud/dbha_replace.py:37 +msgid "不允许同时对agent和gm进行替换" +msgstr "It is not allowed to replace agent and gm at the same time" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:58 -msgid "错误并行3" -msgstr "error parallel 3" +#: backend/ticket/builders/cloud/dbha_replace.py:61 +msgid "DBHA 服务替换" +msgstr "DBHA service replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:65 -msgid "串行结束" -msgstr "end of serial" +#: backend/ticket/builders/cloud/dns_add.py:28 +msgid "新DNS机器的部署信息" +msgstr "Deployment information for the new DNS machine" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:58 -msgid "下发db-actor到集群主节点{}" -msgstr "Send db-actor to the cluster master node {}" +#: backend/ticket/builders/cloud/dns_add.py:42 +#: backend/ticket/builders/cloud/drs_add.py:42 +msgid "DNS 服务新增" +msgstr "DNS service added" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:70 -msgid "flashback启动恢复数据中{}" -msgstr "flashback starts restoring data {}" +#: backend/ticket/builders/cloud/dns_reduce.py:29 +msgid "裁撤的DNS列表" +msgstr "Retired DNS list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:81 -msgid "flash开始恢复数据" -msgstr "flash starts to restore data" +#: backend/ticket/builders/cloud/dns_reduce.py:35 +msgid "请至少保证一个dns服务存活" +msgstr "Please ensure that at least one dns service is alive" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:118 -msgid "空闲检查" -msgstr "idle check" +#: backend/ticket/builders/cloud/dns_reduce.py:51 +msgid "DNS 服务裁撤" +msgstr "DNS service down" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:129 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:189 -msgid "下发MySQL介质包" -msgstr "Deliver the MySQL media package" +#: backend/ticket/builders/cloud/dns_reload.py:28 +msgid "重装的DNSID列表" +msgstr "Reloaded DNSID list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:142 -msgid "下发Proxy介质包" -msgstr "Deliver the proxy media package" +#: backend/ticket/builders/cloud/dns_reload.py:42 +msgid "DNS 服务重装" +msgstr "DNS service reinstallation" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:170 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:141 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:145 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:152 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:597 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:350 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:127 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:98 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:236 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:110 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:234 -msgid "部署mysql-crond" -msgstr "Deploy mysql-crond" +#: backend/ticket/builders/cloud/dns_replace.py:28 +msgid "被替换旧DNS服务ID" +msgstr "Replaced by the old DNS service ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:184 -msgid "安装proxy实例" -msgstr "Install proxy instance" +#: backend/ticket/builders/cloud/dns_replace.py:29 +msgid "替换后的新的DNS服务信息" +msgstr "New DNS service information after replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:194 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:357 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:134 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:248 -msgid "安装MySQL实例" -msgstr "Install MySQL instance" +#: backend/ticket/builders/cloud/dns_replace.py:43 +msgid "DNS 服务替换" +msgstr "DNS service replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:239 -msgid "proxy配置后端实例" -msgstr "proxy configuration backend instance" +#: backend/ticket/builders/cloud/drs_add.py:28 +msgid "新drs机器的部署信息" +msgstr "Deployment information for new drs machines" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:249 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:98 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:93 -msgid "添加主集群域名" -msgstr "Add the main cluster domain name" +#: backend/ticket/builders/cloud/drs_reduce.py:29 +msgid "裁撤的drs列表" +msgstr "abolished drs list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:261 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:117 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:112 -msgid "添加从集群域名" -msgstr "Add slave cluster domain name" +#: backend/ticket/builders/cloud/drs_reduce.py:35 +msgid "请至少保证一个drs服务存活" +msgstr "Please ensure that at least one drs service is alive" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:276 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:383 -msgid "{}集群部署" -msgstr "{} cluster deployment" +#: backend/ticket/builders/cloud/drs_reduce.py:51 +msgid "DRS 服务裁撤" +msgstr "DRS service abolition" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:315 -msgid "部署MySQL高可用集群" -msgstr "Deploy MySQL HA Cluster" +#: backend/ticket/builders/cloud/drs_reload.py:28 +msgid "重装的drsID列表" +msgstr "Reloaded drsID list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:97 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:83 -msgid "{} standby slave 不存在" -msgstr "{} standby slave does not exist" +#: backend/ticket/builders/cloud/drs_reload.py:42 +msgid "DRS 服务重装" +msgstr "DRS Service Reload" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:117 -msgid "构造mydumper正则" -msgstr "Construct mydumper regular" +#: backend/ticket/builders/cloud/drs_replace.py:28 +msgid "被替换旧DRS服务ID" +msgstr "Replaced by the old DRS Service ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:123 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:166 -msgid "检查正则匹配" -msgstr "Check for regular matches" +#: backend/ticket/builders/cloud/drs_replace.py:29 +msgid "替换后的新的DRS服务信息" +msgstr "New DRS service information after replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:141 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:114 -msgid "执行库表备份" -msgstr "Execute database table backup" +#: backend/ticket/builders/cloud/drs_replace.py:43 +msgid "DRS 服务替换" +msgstr "DRS Service Replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:155 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:128 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:123 -msgid "关联备份id" -msgstr "Associated backup id" +#: backend/ticket/builders/cloud/nginx_reload.py:27 +msgid "重装的nginx id" +msgstr "Reloaded nginx id" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:160 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:130 -msgid "{} 库表备份" -msgstr "{} database table backup" +#: backend/ticket/builders/cloud/nginx_reload.py:48 +msgid "Nginx 服务重装" +msgstr "Nginx service reinstallation" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:163 -msgid "构建库表备份流程成功" -msgstr "Build database table backup process successfully" +#: backend/ticket/builders/cloud/nginx_replace.py:29 +#: backend/ticket/builders/cloud/service_apply.py:31 +msgid "部署nginx服务主机信息" +msgstr "Deploy nginx service host information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:98 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:85 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:105 -msgid "删除注册CC系统的服务实例" -msgstr "Delete the service instance registered with the CC system" +#: backend/ticket/builders/cloud/nginx_replace.py:32 +msgid "替换的nginx id" +msgstr "Replaced nginx id" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:142 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:356 -msgid "卸载proxy实例" -msgstr "Uninstall proxy instance" +#: backend/ticket/builders/cloud/nginx_replace.py:33 +#: backend/ticket/builders/cloud/service_apply.py:45 +msgid "nginx服务部署信息" +msgstr "nginx service deployment information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:155 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:122 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:164 -msgid "卸载mysql实例" -msgstr "Uninstall mysql instance" +#: backend/ticket/builders/cloud/nginx_replace.py:52 +msgid "Nginx 服务替换" +msgstr "Nginx service replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:136 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:173 -msgid "清理db_meta元信息" -msgstr "Clean up db_meta meta information" +#: backend/ticket/builders/cloud/redis_dts_add.py:28 +msgid "新Redis Dts机器的部署信息" +msgstr "Deployment information for the new Redis Dts machine" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:178 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:187 -msgid "清理机器级别配置" -msgstr "Clean up machine-level configuration" +#: backend/ticket/builders/cloud/redis_dts_add.py:43 +msgid "RedisDts 服务新增" +msgstr "RedisDts service added" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:184 -msgid "下架MySQL高可用集群[{}]" -msgstr "Remove MySQL HA Cluster[{}]" +#: backend/ticket/builders/cloud/redis_dts_reduce.py:28 +msgid "裁撤的redis_dts列表" +msgstr "Canceled redis_dts list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:85 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:77 -msgid "删除集群域名" -msgstr "Delete the cluster domain name" +#: backend/ticket/builders/cloud/redis_dts_reduce.py:42 +msgid "RedisDts 服务裁撤" +msgstr "RedisDts service discontinuation" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:112 -msgid "重启proxy实例" -msgstr "Restart the proxy instance" +#: backend/ticket/builders/cloud/service_apply.py:28 +msgid "部署drs服务主机信息" +msgstr "Deploy drs service host information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:67 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:119 -msgid "集群变更OFFLINE状态" -msgstr "Cluster changes to OFFLINE state" +#: backend/ticket/builders/cloud/service_apply.py:34 +#: backend/ticket/builders/cloud/service_apply.py:41 +msgid "部署dns服务主机信息" +msgstr "Deploy dns service host information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:140 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:130 -msgid "禁用MySQL高可用集群[{}]" -msgstr "Disable MySQL HA Cluster[{}]" +#: backend/ticket/builders/cloud/service_apply.py:37 +msgid "部署dbha-agent服务主机信息" +msgstr "Deploy dbha-agent service host information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:133 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:93 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:127 -msgid "集群变更ONLINE状态" -msgstr "Change the status of the cluster to ONLINE" +#: backend/ticket/builders/cloud/service_apply.py:38 +msgid "部署dbha-gm服务主机信息" +msgstr "Deploy dbha-gm service host information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:144 -msgid "启动MySQL高可用集群[{}]" -msgstr "Start MySQL high availability cluster[{}]" +#: backend/ticket/builders/cloud/service_apply.py:44 +msgid "drs服务部署信息" +msgstr "drs service deployment information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:133 -msgid "{} 全库备份" -msgstr "{} full database backup" +#: backend/ticket/builders/cloud/service_apply.py:46 +msgid "dns服务部署信息" +msgstr "DNS service deployment information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:136 -msgid "构建全库备份流程成功" -msgstr "The process of building a full database backup is successful" +#: backend/ticket/builders/cloud/service_apply.py:47 +msgid "dbha服务部署信息" +msgstr "dbha service deployment information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:119 -msgid "执行集群主故障转移" -msgstr "Perform cluster master failover" +#: backend/ticket/builders/cloud/service_apply.py:48 +msgid "redis_dts服务部署信息" +msgstr "redis_dts service deployment information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:134 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:274 -msgid "salve节点同步新master数据" -msgstr "The salve node synchronizes the new master data" +#: backend/ticket/builders/cloud/service_apply.py:112 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "Nginx 服务部署" +msgstr "Nginx service deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:153 -msgid "{}集群执行主故障切换" -msgstr "{} cluster performs master failover" +#: backend/ticket/builders/cloud/service_apply.py:118 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DNS 服务部署" +msgstr "DNS service deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:160 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:300 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:278 -msgid "变更db_meta元信息" -msgstr "Change db_meta meta information" +#: backend/ticket/builders/cloud/service_apply.py:124 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DRS 服务部署" +msgstr "DRS Service Deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:183 -msgid "主故障切换流程[整机切换]" -msgstr "Main failover process [whole machine switchover]" +#: backend/ticket/builders/cloud/service_apply.py:130 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DBHA 服务部署" +msgstr "DBHA service deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:87 -msgid "the is_stand_by of new-master-instance [{}] is False " -msgstr "the is_stand_by of new-master-instance [{}] is False" +#: backend/ticket/builders/cloud/service_apply.py:140 +msgid "RedisDts 服务部署" +msgstr "RedisDts service deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:129 -msgid "回收新master的域名映射" -msgstr "Recycle the domain name mapping of the new master" +#: backend/ticket/builders/common/base.py:111 +msgid "展示字段" +msgstr "Display fields" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:144 -msgid "对旧master添加域名映射" -msgstr "Add domain name mapping to the old master" +#: backend/ticket/builders/common/base.py:141 +msgid "此单据只用于临时集群的销毁,请不要用于其他正常集群" +msgstr "This document is only used for the destruction of temporary clusters. Please do not use it for other normal clusters." -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:224 -msgid "旧master添加切换临时账号" -msgstr "Old master add switch temporary account" +#: backend/ticket/builders/common/base.py:145 +msgid "存在临时集群已禁用,请在集群页面进行销毁" +msgstr "There is a temporary cluster that has been disabled. Please destroy it on the cluster page." -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:239 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:453 -msgid "新master克隆旧master权限" -msgstr "The new master clones the old master permission" +#: backend/ticket/builders/common/base.py:158 +msgid "主机{}不在空闲机池,请保证所选的主机均来自空闲机" +msgstr "" +"The host {} is not in the idle machine pool, please ensure that the selected " +"hosts are all from idle machines" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:260 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:461 -msgid "执行集群切换" -msgstr "Perform a cluster switchover" +#: backend/ticket/builders/common/base.py:167 +msgid "所选主机存在已经被使用,请重新选择主机。主机信息: {}" +msgstr "The selected host is already in use, please select a new host. Host information: {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:293 -msgid "{}集群执行主从切换" -msgstr "{} Cluster performs master-slave switchover" +#: backend/ticket/builders/common/base.py:176 +msgid "请输入主机的云区域信息" +msgstr "Please enter the cloud region information of the host" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:323 -msgid "主从切换流程[整机切换]" -msgstr "Master-slave switching process [whole machine switching]" +#: backend/ticket/builders/common/base.py:194 +msgid "请保证所选集群{}都是{}集群" +msgstr "Please ensure that the selected clusters {} are all {} clusters" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:112 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:575 -msgid "下发MySQL介质{}" -msgstr "Send MySQL media {}" +#: backend/ticket/builders/common/base.py:240 +msgid "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" +msgstr "" +"A cluster of the same type: {}, with the same name: {} already exists under " +"business {}, please rename it" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:590 -msgid "初始化机器{}" -msgstr "init machine{}" +#: backend/ticket/builders/common/base.py:246 +msgid "[{}]集群无法通过正则性校验{}" +msgstr "[{}]The cluster cannot pass the regularity check{}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:155 -msgid "安装MySQL实例:{}" -msgstr "Install the MySQL instance: {}" +#: backend/ticket/builders/common/base.py:249 +msgid "[{}]集群域名长度过长,请不要让域名长度超过{}" +msgstr "[{}]The cluster domain name is too long. Please do not make the domain name longer than {}." -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:611 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:364 -msgid "写入初始化实例的db_meta元信息" -msgstr "Write the db_meta meta information of the initialized instance" +#: backend/ticket/builders/common/base.py:285 +msgid "数据库{}不在所属集群{}中,请重新查验" +msgstr "The database {} does not belong to the cluster {}, please check again" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:213 -msgid "下发db-actor到新节点{}" -msgstr "Send db-actor to the new node {}" +#: backend/ticket/builders/common/base.py:378 +msgid "源DB名和新DB名不允许包含通配符" +msgstr "The source DB name and new DB name are not allowed to contain wildcard characters." -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:228 -msgid "获取MASTER节点备份介质{}" -msgstr "Get the MASTER node backup media{}" +#: backend/ticket/builders/common/base.py:385 +msgid "数据库[{}]不存在于集群{}中" +msgstr "Database [{}] does not exist in cluster {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:237 -msgid "获取SLAVE节点备份介质{}" -msgstr "Get SLAVE node backup media {}" +#: backend/ticket/builders/common/base.py:390 +msgid "重命名数据库[{}]已存在于集群{}中" +msgstr "Rename database [{}] already exists in cluster {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:245 -msgid "判断备份文件来源,并传输备份文件新机器" -msgstr "Determine the source of the backup file, and transfer the backup file to a new machine" +#: backend/ticket/builders/common/base.py:393 +msgid "请保证集群{}中源数据库名{}的名字唯一" +msgstr "" +"Please ensure that the name of the source database name {} in the cluster {} " +"is unique" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:264 -msgid "恢复新主节点数据{}:{}" -msgstr "Restore new primary node data{}:{}" +#: backend/ticket/builders/common/base.py:396 +msgid "请保证集群{}中新数据库名{}的名字唯一" +msgstr "" +"Please ensure that the name of the new database name {} in the cluster {} is " +"unique" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:275 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:189 -msgid "恢复新从节点数据{}:{}" -msgstr "Restore new slave node data {}:{}" +#: backend/ticket/builders/common/base.py:400 +msgid "请保证源数据库名{}不要出现在新数据库名列表中" +msgstr "" +"Please ensure that the source database name {} does not appear in the list " +"of new database names" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:286 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:304 -msgid "新增repl帐户{}" -msgstr "add repl account{}" +#: backend/ticket/builders/common/base.py:414 +msgid "slave: {}的is_stand_by不为true,或者处于异常状态" +msgstr "slave: {} is_stand_by is not true, or is in an abnormal state" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:295 -msgid "建立主从关系{}" -msgstr "Create a master-slave relationship {}" +#: backend/ticket/builders/common/bigdata.py:36 +msgid "节点列表信息" +msgstr "Node List Information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:313 -msgid "建立主从关系 {}" -msgstr "Create a master-slave relationship {}" +#: backend/ticket/builders/common/bigdata.py:70 +msgid "操作额外信息(用于前端渲染)" +msgstr "Operation extra information (for front-end rendering)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:320 -msgid "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" -msgstr "" -"After the data is restored, write the metadata of the relationship chain " -"between the new master node and the old master node" +#: backend/ticket/builders/common/bigdata.py:82 +#: backend/ticket/builders/mysql/base.py:175 +msgid "集群{}状态转移不合法:{}--->{} is invalid" +msgstr "Cluster {} state transfer is invalid: {}--->{} is invalid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:330 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:205 -msgid "恢复实例数据" -msgstr "restore instance data" +#: backend/ticket/builders/common/bigdata.py:90 +#: backend/ticket/builders/mongodb/mongo_restore.py:50 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:31 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:35 +msgid "资源池规格" +msgstr "Resource pool specification" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:341 -msgid "写入切换集群 {} 的元信息" -msgstr "Write meta information for switch cluster {}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:351 -msgid "切换实例" -msgstr "switch instance" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:360 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:582 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:302 -msgid "卸载实例" -msgstr "uninstall instance" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:364 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:378 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:261 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:305 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:318 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:306 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:195 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:301 -#: backend/ticket/builders/__init__.py:316 -#: backend/ticket/builders/common/constants.py:80 -#: backend/ticket/builders/mysql/mysql_checksum.py:168 -msgid "人工确认" -msgstr "manual confirmation" +#: backend/ticket/builders/common/bigdata.py:111 +#: backend/ticket/builders/influxdb/influxdb_apply.py:32 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:34 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:29 +#: backend/ticket/builders/mysql/mysql_single_apply.py:48 +#: backend/ticket/builders/redis/redis_cluster_apply.py:31 +#: backend/ticket/builders/redis/redis_instance_apply.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:47 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:34 +msgid "城市代码" +msgstr "city ​​code" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:380 -msgid "成对迁移集群的主从节点" -msgstr "Migrating the master and slave nodes of the cluster in pairs" +#: backend/ticket/builders/common/bigdata.py:119 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:32 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:27 +#: backend/ticket/builders/redis/redis_cluster_apply.py:29 +#: backend/ticket/builders/redis/redis_instance_apply.py:35 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:31 +#: backend/ticket/serializers.py:95 +msgid "业务英文缩写" +msgstr "business abbreviation" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:424 -msgid "给master添加切换临时账号" -msgstr "Add and switch temporary account to master" +#: backend/ticket/builders/common/bigdata.py:120 +msgid "集群名称(英文数字及下划线)" +msgstr "Cluster name (alphanumeric and underscore)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:432 -msgid "给新slave添加切换临时账号" -msgstr "Add and switch temporary account to new slave" +#: backend/ticket/builders/common/bigdata.py:121 +#: backend/ticket/builders/redis/redis_cluster_apply.py:43 +msgid "集群别名(一般为中文别名)" +msgstr "Cluster alias (usually Chinese alias)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:476 -msgid "其余slave节点同步新master数据" -msgstr "The rest of the slave nodes synchronize the new master data" +#: backend/ticket/builders/common/bigdata.py:125 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:43 +msgid "资源申请规格" +msgstr "Resource Application Specifications" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:486 -msgid "回收旧slave的域名映射" -msgstr "Recycle the domain name mapping of the old slave" +#: backend/ticket/builders/common/bigdata.py:169 +msgid "主机{}出现角色互斥,{}与{}冲突" +msgstr "Host {} has a role mutual exclusion, and {} conflicts with {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:501 -msgid "对新slave添加域名映射" -msgstr "Add domain name mapping to new slave" +#: backend/ticket/builders/common/bigdata.py:183 +msgid "旧节点信息集合" +msgstr "Collection of old node information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:516 -msgid "{}集群执行成对切换" -msgstr "{} cluster performs pairwise switchover" +#: backend/ticket/builders/common/bigdata.py:183 +#: backend/ticket/builders/common/bigdata.py:185 +msgid "节点信息" +msgstr "node information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:528 -msgid "清理实例周边配置" -msgstr "Clean up the configuration around the instance" +#: backend/ticket/builders/common/bigdata.py:185 +msgid "新节点信息集合" +msgstr "New node information collection" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:546 -msgid "卸载MySQL实例:{}:{}" -msgstr "Uninstall the MySQL instance: {}:{}" +#: backend/ticket/builders/common/bigdata.py:187 +msgid "规格类型" +msgstr "Specification type" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:561 -msgid "卸载主从实例完毕,修改元数据" -msgstr "After uninstalling the master-slave instance, modify the metadata" +#: backend/ticket/builders/common/bigdata.py:194 +msgid "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" +msgstr "" +"The types of characters before and after the replacement are inconsistent, " +"please ensure that the types and numbers of characters before and after the " +"replacement are the same!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:573 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:300 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:147 -msgid "清理机器配置" -msgstr "Clean up machine configuration" +#: backend/ticket/builders/common/bigdata.py:202 +msgid "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" +msgstr "" +"The number of roles {} before and after replacement is inconsistent, please " +"ensure that the type and number of characters before and after replacement " +"are consistent!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:93 -msgid "上传sql文件" -msgstr "upload sql file" +#: backend/ticket/builders/common/bigdata.py:224 +msgid "实例名" +msgstr "instance name" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:104 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:124 -msgid "下发sql文件" -msgstr "Send sql file" +#: backend/ticket/builders/common/bigdata.py:235 +#: backend/ticket/builders/common/bigdata.py:313 +msgid "实例{}不存在, 请重新确认实例的合法性" +msgstr "" +"Instance {} does not exist, please reconfirm the legitimacy of the instance" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:133 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:145 -msgid "actuator执行partition" -msgstr "Actuator executes partition" +#: backend/ticket/builders/common/bigdata.py:240 +msgid "无法进行重启操作,原因:{}" +msgstr "Unable to perform restart operation, reason: {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:146 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:163 -msgid "cluster[{}]的分区任务" -msgstr "Partition task of cluster[{}]" +#: backend/ticket/builders/common/constants.py:87 +msgid "本地" +msgstr "local" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:149 -msgid "构建mysql partition流程成功" -msgstr "Build mysql partition process successfully" +#: backend/ticket/builders/common/constants.py:88 +msgid "远程" +msgstr "Remotely" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:126 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:132 -msgid "下发proxy安装介质" -msgstr "Deliver proxy installation media" +#: backend/ticket/builders/common/constants.py:105 +msgid "整个集群" +msgstr "entire cluster" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:152 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:159 -msgid "部署proxy实例" -msgstr "Deploy proxy instance" +#: backend/ticket/builders/common/constants.py:106 +msgid "部分实例" +msgstr "Some examples" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:192 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:205 -msgid "新的proxy配置后端实例" -msgstr "New proxy configuration backend instance" +#: backend/ticket/builders/common/constants.py:114 +msgid "手动提单修复" +msgstr "Manual Bill of Lading Repair" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:200 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:215 -msgid "克隆proxy用户白名单" -msgstr "Clone proxy user whitelist" +#: backend/ticket/builders/common/constants.py:115 +msgid "例行校验修复" +msgstr "Routine check repair" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:213 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:228 -msgid "集群对新的proxy添加权限" -msgstr "The cluster adds permissions to the new proxy" +#: backend/ticket/builders/common/constants.py:123 +msgid "远程备份 + 时间" +msgstr "remote backup + time" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:225 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:240 -msgid "增加新proxy域名映射" -msgstr "Add new proxy domain name mapping" +#: backend/ticket/builders/common/constants.py:124 +msgid "远程备份 + backupid" +msgstr "remote backup + backupid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:240 -msgid "{}集群添加proxy实例" -msgstr "{}Cluster add proxy instance" +#: backend/ticket/builders/common/constants.py:125 +msgid "本地备份 + 时间" +msgstr "local backup + time" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:247 -msgid "添加db_meta元信息" -msgstr "Add db_meta meta information" +#: backend/ticket/builders/common/constants.py:126 +msgid "本地备份 + backupid" +msgstr "local backup + backupid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:265 -msgid "添加proxy子流程" -msgstr "Add proxy subprocess" +#: backend/ticket/builders/common/constants.py:134 +msgid "回档到新集群" +msgstr "Roll back to new cluster" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:255 -msgid "{}集群替换proxy实例" -msgstr "{} cluster replaces the proxy instance" +#: backend/ticket/builders/common/constants.py:135 +msgid "回档到已有集群" +msgstr "Roll back to an existing cluster" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:305 -msgid "替换proxy子流程" -msgstr "Replace proxy subprocess" +#: backend/ticket/builders/common/constants.py:136 +msgid "回档到原集群" +msgstr "Back to the original cluster" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:349 -msgid "清理proxy实例级别周边配置" -msgstr "Clean up proxy instance level peripheral configuration" +#: backend/ticket/builders/doris/doris_apply.py:33 +msgid "http端口" +msgstr "http port" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:362 -msgid "回收对应proxy集群映射" -msgstr "Recycle the corresponding proxy cluster mapping" +#: backend/ticket/builders/doris/doris_apply.py:34 +msgid "输入端口" +msgstr "input port" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:373 -msgid "[{}:{}]下线" -msgstr "[{}:{}] offline" +#: backend/ticket/builders/doris/doris_apply.py:55 +msgid "端口号必须在5000到65535之间" +msgstr "The port number must be between 5000 and 65535" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:133 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:139 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:240 -msgid "准备重命名参数" -msgstr "Prepare to rename parameters" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:139 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:126 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:137 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:228 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:246 -msgid "构造过滤正则" -msgstr "Construct filter regular" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:151 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:252 -msgid "获得源目标的库表" -msgstr "Get the db table of the source target" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:155 -msgid "检查源数据库是否在用" -msgstr "Check if the source database is in use" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:161 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:258 -msgid "建立目标数据库" -msgstr "Build target database" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:167 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:264 -msgid "表迁移" -msgstr "table migration" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:185 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:282 -msgid "迁移源库中其他对象" -msgstr "Migrate other objects in the source instance" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:198 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:295 -msgid "确认源数据库已空" -msgstr "Confirm the source database is empty" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:203 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:300 -msgid "删除源数据库" -msgstr "delete source database" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:210 -msgid "{} {} 重命名数据库" -msgstr "{} {} rename database" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:216 -msgid "{} 重命名数据库" -msgstr "{} rename database" +#: backend/ticket/builders/doris/doris_apply.py:57 +msgid "端口号{}不可用" +msgstr "Port number {} is not available" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:220 -msgid "构建重命名数据库流程成功" -msgstr "build rename database process succeeded" +#: backend/ticket/builders/doris/doris_apply.py:62 +msgid "follower节点数不为3台! 请保证follower的部署节点数等于为3" +msgstr "The number of follower nodes is not 3! Please ensure that the number of follower deployment nodes is equal to 3" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:106 -#, python-format -msgid "%s slave 节点不存在" -msgstr "%s slave node does not exist" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:128 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:373 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:477 -msgid "下发db-actor到集群主从节点" -msgstr "Send db-actor to the master and slave nodes of the cluster" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:146 -msgid "slave重建之新增repl帐户{}" -msgstr "New repl account {} for slave reconstruction" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:157 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:387 -msgid "slave重建之获取MASTER节点备份介质{}" -msgstr "Slave reconstruction to obtain MASTER node backup media {}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:166 -msgid "slave重建之获取SLAVE节点备份介质{}" -msgstr "Obtain SLAVE node backup media {} for slave reconstruction" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:173 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:402 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:522 -msgid "判断备份文件来源,并传输备份文件到新slave节点{}" -msgstr "" -"Determine the source of the backup file, and transfer the backup file to the " -"new slave node{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:195 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:544 -msgid "slave恢复完毕,修改元数据" -msgstr "After the slave recovery is complete, modify the metadata" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:222 -msgid "克隆主节点账号权限到新从节点" -msgstr "Clone the master node account permissions to the new slave node" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:228 -msgid "先添加新从库域名{}" -msgstr "First add a new slave domain name {}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:241 -msgid "再删除旧从库域名{}" -msgstr "Then delete the old slave domain name {}" +#: backend/ticket/builders/doris/doris_apply.py:67 +msgid "observer节点数小于2台! 请保证observer的部署节点数至少为2" +msgstr "The number of observer nodes is less than 2! Please ensure that the number of observer deployment nodes is at least 2" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:254 -msgid "slave切换完毕,修改集群 {} 数据" -msgstr "After the slave switch is complete, modify the cluster {} data" +#: backend/ticket/builders/doris/doris_apply.py:75 +#: backend/ticket/builders/doris/doris_shrink.py:93 +msgid "请保证冷/热节点必选1种以上" +msgstr "Please ensure that at least one type of cold/hot node must be selected." -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:264 -msgid "实例切换" -msgstr "instance switching" +#: backend/ticket/builders/doris/doris_apply.py:77 +msgid "请保证部署节点的角色为2以上" +msgstr "Please ensure that the role of the deployment node is 2 or above" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:278 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:108 -msgid "清理实例级别周边配置" -msgstr "Clean up instance-level perimeter configuration" +#: backend/ticket/builders/doris/doris_apply.py:120 +msgid "DORIS集群部署" +msgstr "DORIS cluster deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:286 -msgid "卸载mysql实例{}:{}" -msgstr "Uninstall mysql instance {}:{}" +#: backend/ticket/builders/doris/doris_destroy.py:36 +msgid "DORIS集群删除" +msgstr "DORIS cluster deletion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:292 -msgid "old slave卸载完毕,修改元数据" -msgstr "After the old slave is uninstalled, modify the metadata" +#: backend/ticket/builders/doris/doris_disable.py:39 +msgid "Doris集群停用" +msgstr "Doris cluster deactivation" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:325 -msgid "Restore Slave 重建从库" -msgstr "Restore Slave rebuilds the slave " +#: backend/ticket/builders/doris/doris_enable.py:39 +msgid "Doris集群启用" +msgstr "Doris cluster enabled" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:396 -msgid "slave重建之清理从库{}" -msgstr "Slave reconstruction to clean up the slave {}" +#: backend/ticket/builders/doris/doris_reboot.py:38 +msgid "DORIS实例重启" +msgstr "DORIS instance restart" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:418 -msgid "slave 原地恢复数据{}" -msgstr "slave restore data in place{}" +#: backend/ticket/builders/doris/doris_replace.py:53 +msgid "DORIS集群替换" +msgstr "DORIS cluster replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:423 -msgid "Restore local Slave 本地重建" -msgstr "Restore local Slave local reconstruction" +#: backend/ticket/builders/doris/doris_scale_up.py:45 +#: backend/ticket/builders/es/es_scale_up.py:45 +msgid "实例数必须为正数,请确保实例的合法性" +msgstr "" +"The number of instances must be a positive number, please ensure the " +"legitimacy of the instance" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:495 -msgid "添加slave之新增repl帐户{}" -msgstr "Add a new repl account {} for slave" +#: backend/ticket/builders/doris/doris_scale_up.py:104 +msgid "Doris集群扩容" +msgstr "Doris cluster expansion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:506 -msgid "添加slave之获取MASTER节点备份介质{}" -msgstr "Add slave to obtain MASTER node backup media{}" +#: backend/ticket/builders/doris/doris_shrink.py:31 +#: backend/ticket/builders/es/es_shrink.py:30 +msgid "hot信息列表" +msgstr "hot information list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:515 -msgid "添加slave之获取SLAVE节点备份介质{}" -msgstr "Add slave to obtain SLAVE node backup media{}" +#: backend/ticket/builders/doris/doris_shrink.py:32 +#: backend/ticket/builders/es/es_shrink.py:31 +msgid "cold信息列表" +msgstr "cold information list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:538 -msgid "添加slave之恢复数据{}" -msgstr "Add recovery data of slave {}" +#: backend/ticket/builders/doris/doris_shrink.py:33 +msgid "observer信息列表" +msgstr "observer information list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:555 -msgid "添加Slave之恢复slave" -msgstr "Add Slave recovery slave" +#: backend/ticket/builders/doris/doris_shrink.py:35 +#: backend/ticket/builders/es/es_shrink.py:34 +msgid "nodes节点列表" +msgstr "nodes node list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:558 -msgid "添加从库flow" -msgstr "Add slave flow" +#: backend/ticket/builders/doris/doris_shrink.py:70 +msgid "请保证部署的observer节点的角色最小值为0或2以上" +msgstr "Please ensure that the minimum role value of the deployed observer node is 0 or 2 or above." -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:604 -msgid "安装MySQL实例{}" -msgstr "install mysql instance{}" +#: backend/ticket/builders/doris/doris_shrink.py:95 +msgid "请保证部署的冷/热节点的角色为2以上" +msgstr "Please ensure that the role of the deployed cold/hot node is 2 or above." -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:634 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:381 -msgid "安装实例flow" -msgstr "Installation example flow" +#: backend/ticket/builders/doris/doris_shrink.py:103 +msgid "缩容仅支持hot、cold和observer" +msgstr "Scaling only supports hot, cold and observer" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:641 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:417 -msgid "清理机器配置{}" -msgstr "clean up machine config{}" +#: backend/ticket/builders/doris/doris_shrink.py:119 +msgid "Doris集群缩容" +msgstr "Doris cluster scaling down" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:651 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:422 -msgid "清理机器flow" -msgstr "Clean up machine flow" +#: backend/ticket/builders/es/es_apply.py:50 +msgid "请保证master的部署节点至少为3,且为奇数" +msgstr "Please ensure that the master's deployment nodes are at least 3 and an odd number." -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:129 -msgid "下发db_actuator介质" -msgstr "Deliver db_actuator media" +#: backend/ticket/builders/es/es_apply.py:56 +msgid "请保证部署至少一台hot/cold节点" +msgstr "Please ensure to deploy at least one hot/cold node" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:143 -msgid "定点恢复之获取MASTER节点备份介质{}" -msgstr "Obtain the MASTER node backup media {} for fixed-point recovery" +#: backend/ticket/builders/es/es_apply.py:142 +msgid "ES集群部署" +msgstr "ES cluster deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:152 -msgid "定点恢复之获取SLAVE节点备份介质{}" -msgstr "Obtaining backup media of SLAVE nodes for fixed-point recovery {}" +#: backend/ticket/builders/es/es_destroy.py:36 +msgid "ES集群删除" +msgstr "ES cluster deletion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:159 -msgid "判断备份文件来源,并传输备份文件到新定点恢复节点{}" -msgstr "" -"Determine the source of the backup file, and transfer the backup file to the " -"new designated recovery node{}" +#: backend/ticket/builders/es/es_disable.py:37 +msgid "ES集群停用" +msgstr "ES cluster deactivated" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:178 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:233 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:299 -msgid "定点恢复之恢复数据{}" -msgstr "Fixed-point recovery restore data{}" +#: backend/ticket/builders/es/es_enable.py:37 +msgid "ES集群启用" +msgstr "ES cluster enabled" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:225 -msgid "下载定点恢复的全库备份介质到{}" -msgstr "Download the full database backup media of fixed-point recovery to {}" +#: backend/ticket/builders/es/es_reboot.py:38 +msgid "ES实例重启" +msgstr "ES instance restart" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:282 -msgid "传输文件{}" -msgstr "transfer file{}" +#: backend/ticket/builders/es/es_replace.py:53 +msgid "ES集群替换" +msgstr "ES cluster replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:310 -msgid "定点恢复" -msgstr "fixed point recovery" +#: backend/ticket/builders/es/es_scale_up.py:104 +msgid "ES集群扩容" +msgstr "ES cluster expansion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:328 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:105 -msgid "下发MySQL介质" -msgstr "Deliver MySQL media" +#: backend/ticket/builders/es/es_shrink.py:32 +msgid "client信息列表" +msgstr "client information list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:377 -msgid "安装备份程序" -msgstr "Install a backup program" +#: backend/ticket/builders/es/es_shrink.py:54 +msgid "热节点和冷节点至少保留1台!" +msgstr "Keep at least 1 hot node and cold node!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:398 -msgid "卸载rollback实例{}" -msgstr "unload rollback instance{}" +#: backend/ticket/builders/es/es_shrink.py:62 +msgid "缩容仅支持hot、cold和client" +msgstr "Scaling only supports hot, cold and client" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:404 -msgid "卸载rollback实例完毕,修改元数据" -msgstr "After uninstalling the rollback instance, modify the metadata" +#: backend/ticket/builders/es/es_shrink.py:78 +msgid "ES集群缩容" +msgstr "ES cluster shrinkage" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:162 -msgid "录入db_meta元信息" -msgstr "Enter db_meta meta information" +#: backend/ticket/builders/hdfs/hdfs_apply.py:44 +msgid "Datanode节点数量<2台,请增加Datanode节点数量" +msgstr "" +"The number of Datanode nodes is less than 2, please increase the number of " +"Datanode nodes" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:185 -msgid "部署单节点集群" -msgstr "Deploy a single-node cluster" +#: backend/ticket/builders/hdfs/hdfs_apply.py:49 +msgid "Namenode节点数量不等于2台,请确保Namenode数量为2台" +msgstr "" +"The number of Namenode nodes is not equal to 2, please ensure that the " +"number of Namenodes is 2" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:160 -msgid "下架MySQL单节点集群[{}]" -msgstr "Remove MySQL single-node cluster[{}]" +#: backend/ticket/builders/hdfs/hdfs_apply.py:55 +msgid "资源池部署ZooKeeper/JournalNode的角色数量为1-3台" +msgstr "The number of ZooKeeper/JournalNode roles deployed in the resource pool is 1-3." -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:56 -msgid "回收集群域名" -msgstr "Recycle the cluster domain name" +#: backend/ticket/builders/hdfs/hdfs_apply.py:58 +msgid "" +"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" +msgstr "" +"The number of ZooKeeper/JournalNode nodes is not equal to 3, please ensure " +"that the number of ZooKeeper/JournalNode is 3" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:77 -msgid "禁用MySQL单节点集群[{}]" -msgstr "Disable MySQL single-node cluster[{}]" +#: backend/ticket/builders/hdfs/hdfs_apply.py:147 +#: backend/ticket/constants.py:341 +msgid "HDFS 集群部署" +msgstr "HDFS cluster deployment" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:104 -msgid "启动MySQL单节点集群[{}]" -msgstr "Start MySQL single-node cluster[{}]" +#: backend/ticket/builders/hdfs/hdfs_destroy.py:36 +#: backend/ticket/constants.py:348 +msgid "HDFS 集群删除" +msgstr "HDFS cluster deletion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:132 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:142 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:234 -msgid "获得清档目标" -msgstr "get clearance target" +#: backend/ticket/builders/hdfs/hdfs_disable.py:39 +#: backend/ticket/constants.py:347 +msgid "HDFS 集群禁用" +msgstr "HDFS cluster disabled" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:139 -msgid "检查清档目标是否在用" -msgstr "Check if the cleanup target is in use" +#: backend/ticket/builders/hdfs/hdfs_enable.py:40 +#: backend/ticket/constants.py:346 +msgid "HDFS 集群启用" +msgstr "HDFS cluster enabled" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:155 -msgid "生成备份库名" -msgstr "Generate backup database name" +#: backend/ticket/builders/hdfs/hdfs_reboot.py:39 +msgid "HDFS实例重启" +msgstr "HDFS instance restart" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:151 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:159 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:165 -msgid "建立备份库" -msgstr "Create a backup database" +#: backend/ticket/builders/hdfs/hdfs_replace.py:36 +msgid "hdfs替换只支持datanode角色" +msgstr "hdfs replacement only supports datanode role" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:157 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:252 -msgid "备份清档表" -msgstr "backup cleanup table" +#: backend/ticket/builders/hdfs/hdfs_replace.py:56 +#: backend/ticket/constants.py:345 +msgid "HDFS 集群替换" +msgstr "HDFS cluster replacement" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:164 -msgid "重建空表" -msgstr "rebuild empty table" +#: backend/ticket/builders/hdfs/hdfs_scale_up.py:64 +#: backend/ticket/constants.py:342 +msgid "HDFS 集群扩容" +msgstr "HDFS cluster expansion" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:183 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:269 -msgid "备份库中其他对象" -msgstr "Other objects in the backup db" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:30 +#: backend/ticket/builders/kafka/kafka_shrink.py:31 +#: backend/ticket/builders/pulsar/pulsar_shrink.py:34 +msgid "broker信息列表" +msgstr "broker information list" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:198 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:303 -msgid "删除备份库" -msgstr "delete backup repository" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:32 +#: backend/ticket/builders/kafka/kafka_shrink.py:33 +msgid "nodes节点信息" +msgstr "nodesNode information" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:205 -msgid "{} {} 清档" -msgstr "{} {} clear file" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:56 +msgid "{}: 至少保留2台!" +msgstr "{}: Keep at least 2 units!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:210 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:308 -msgid "{} 清档" -msgstr "{} clear file" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:59 +msgid "缩容仅支持DataNode角色" +msgstr "Scaling only supports the DataNode role" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:213 -msgid "构建清档流程成功" -msgstr "Build clearance process succeeded" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:75 +#: backend/ticket/constants.py:343 +msgid "HDFS 集群缩容" +msgstr "HDFS cluster shrink" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:100 -msgid "执行数据修复" -msgstr "perform data repair" +#: backend/ticket/builders/influxdb/influxdb_apply.py:41 +msgid "分组名字" +msgstr "group name" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:113 -msgid "{}:{}做数据修复" -msgstr "{}:{} do data repair" +#: backend/ticket/builders/influxdb/influxdb_apply.py:82 +#: backend/ticket/constants.py:369 +msgid "InfluxDB 实例部署" +msgstr "InfluxDB instance deployment" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:118 -msgid "{}数据修复" -msgstr "{} data repair" +#: backend/ticket/builders/influxdb/influxdb_destroy.py:37 +#: backend/ticket/constants.py:373 +msgid "InfluxDB 实例删除" +msgstr "InfluxDB instance deletion" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:50 -msgid "创建clb" -msgstr "create clb" +#: backend/ticket/builders/influxdb/influxdb_disable.py:40 +#: backend/ticket/constants.py:372 +msgid "InfluxDB 实例禁用" +msgstr "InfluxDB instance disabled" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:68 -msgid "删除clb" -msgstr "delete clb" +#: backend/ticket/builders/influxdb/influxdb_enable.py:40 +#: backend/ticket/constants.py:371 +msgid "InfluxDB 实例启用" +msgstr "InfluxDB instance enabled" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:87 -msgid "创建polaris" -msgstr "create polaris" +#: backend/ticket/builders/influxdb/influxdb_reboot.py:39 +#: backend/ticket/constants.py:370 +msgid "InfluxDB 实例重启" +msgstr "InfluxDB instance restart" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:107 -msgid "删除polaris" -msgstr "remove polaris" +#: backend/ticket/builders/influxdb/influxdb_replace.py:47 +#: backend/ticket/constants.py:374 +msgid "InfluxDB 实例替换" +msgstr "InfluxDB instance replacement" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:18 -msgid "Flow模块Pulsar集群异常" -msgstr "Flow module Pulsar cluster exception" +#: backend/ticket/builders/kafka/kafka_apply.py:75 +msgid "无认证开关, 1表示无认证。0表示认证,默认0" +msgstr "No authentication switch, 1 means no authentication. 0 means authentication, default 0" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:29 -msgid "Pulsar-Broker异常" -msgstr "Pulsar-Broker exception" +#: backend/ticket/builders/kafka/kafka_apply.py:77 +msgid "消息保留大小" +msgstr "Message reserved size" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:30 -msgid "Pulsar集群Broker数量不能为0" -msgstr "The number of Brokers in the Pulsar cluster cannot be 0" +#: backend/ticket/builders/kafka/kafka_apply.py:78 +#: backend/ticket/builders/pulsar/pulsar_apply.py:29 +msgid "副本数量" +msgstr "number of copies" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:96 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:86 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:142 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:73 -msgid "下发pulsar介质" -msgstr "Issue Pulsar media" +#: backend/ticket/builders/kafka/kafka_apply.py:79 +#: backend/ticket/builders/pulsar/pulsar_apply.py:30 +msgid "分区数量" +msgstr "number of partitions" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:112 -msgid "添加ZK域名" -msgstr "Add ZK domain name" +#: backend/ticket/builders/kafka/kafka_apply.py:80 +#: backend/ticket/builders/pulsar/pulsar_apply.py:31 +msgid "保留时长(小时)" +msgstr "Hold time (hours)" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:124 -msgid "仅非DNS环境使用-添加broker hosts" -msgstr "Only used in non-DNS environments - add broker hosts" +#: backend/ticket/builders/kafka/kafka_apply.py:104 +msgid "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" +msgstr "" +"The number of Zookeeper nodes is not equal to 3, please ensure that the " +"number of Zookeeper nodes is 3" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:161 -msgid "初始化集群配置-{}" -msgstr "Init cluster config-{}" +#: backend/ticket/builders/kafka/kafka_apply.py:110 +msgid "" +"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" +msgstr "" +"The number of Broker nodes and copy nodes is wrong, please ensure that the " +"number of Broker nodes is at least 1 and the number of copies is <= the " +"number of Brokers" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:176 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:163 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:98 -msgid "分发密钥及token" -msgstr "Distribute secretkey and token" +#: backend/ticket/builders/kafka/kafka_apply.py:136 +#: backend/ticket/constants.py:332 +msgid "Kafka 集群部署" +msgstr "Kafka cluster deployment" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:192 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:286 -msgid "安装pulsar manager" -msgstr "Install pulsar-manager" +#: backend/ticket/builders/kafka/kafka_destroy.py:37 +msgid "Kafka 集群销毁" +msgstr "Kafka cluster destruction" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:205 -msgid "插入pulsar manager实例信息" -msgstr "Insert pulsar manager instance information" +#: backend/ticket/builders/kafka/kafka_disable.py:40 +msgid "Kafka 集群停用" +msgstr "Kafka cluster down" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:221 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:294 -msgid "初始化pulsar manager" -msgstr "Initialize pulsar-manager" +#: backend/ticket/builders/kafka/kafka_enable.py:40 +#: backend/ticket/constants.py:337 +msgid "Kafka 集群启用" +msgstr "Kafka cluster enabled" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:187 -msgid "仅非DNS环境使用-添加zookeeper hosts" -msgstr "Only used in non-DNS environment - add zookeeper hosts" +#: backend/ticket/builders/kafka/kafka_reboot.py:39 +#: backend/ticket/constants.py:335 +msgid "Kafka 实例重启" +msgstr "Kafka instance restart" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:192 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:231 -msgid "安装Pulsar-{}-common子流程" -msgstr "Install Pulsar-{}-common subprocess" +#: backend/ticket/builders/kafka/kafka_replace.py:47 +#: backend/ticket/constants.py:336 +msgid "Kafka 集群替换" +msgstr "Kafka cluster replacement" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:241 -msgid "安装bookkeeper-{}" -msgstr "Install bookkeeper-{}" +#: backend/ticket/builders/kafka/kafka_scale_up.py:64 +#: backend/ticket/constants.py:333 +msgid "Kafka 集群扩容" +msgstr "Kafka cluster expansion" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:271 -msgid "缩容Pulsar-Broker-{}" -msgstr "Shrink Pulsar-Broker-{}" +#: backend/ticket/builders/kafka/kafka_shrink.py:58 +msgid "{}: 至少保留1台!" +msgstr "{}: Keep at least 1 unit!" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:301 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:193 -msgid "检查Broker配置-{}" -msgstr "Check Broker Configuration - {}" +#: backend/ticket/builders/kafka/kafka_shrink.py:61 +msgid "缩容仅支持Broker" +msgstr "Scaling only supports Broker" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:312 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:205 -msgid "检查NameSpace配置-{}" -msgstr "Check NameSpace Configuration - {}" +#: backend/ticket/builders/kafka/kafka_shrink.py:77 +#: backend/ticket/constants.py:334 +msgid "Kafka 集群缩容" +msgstr "Kafka cluster shrink" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:319 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:216 -msgid "检查未复制ledger-{}" -msgstr "check not replicated ledger-{}" +#: backend/ticket/builders/mongodb/base.py:69 +msgid "缩容规格: {} 的台数: {} 后不满足容灾要求!" +msgstr "Reduction specifications: {} Number of units: {} does not meet the disaster recovery requirements!" + +#: backend/ticket/builders/mongodb/base.py:79 +msgid "缩容机器: {} 后不满足容灾要求!" +msgstr "Shrink machine: {} does not meet disaster recovery requirements!" + +#: backend/ticket/builders/mongodb/base.py:90 +msgid "请保证机器{}不能再同一个分片{}中" +msgstr "Please ensure that machine {} cannot be in the same shard {}" + +#: backend/ticket/builders/mongodb/base.py:99 +msgid "请保证这一批集群的属性: {}是一致的" +msgstr "Please ensure that the attributes of this batch of clusters: {} are consistent" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:32 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:30 +msgid "接入层角色" +msgstr "Access layer role" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:35 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:43 +#: backend/ticket/builders/mongodb/mongo_clear.py:34 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:33 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:34 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:22 +msgid "是否做安全检测" +msgstr "Whether to do safety inspection" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:39 +msgid "扩容接入层申请信息" +msgstr "Expansion access layer application information" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:74 +msgid "MongoDB 扩容接入层执行" +msgstr "MongoDB expansion access layer execution" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:34 +msgid "当前shard节点数" +msgstr "Current number of shard nodes" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:35 +msgid "扩容shard节点数" +msgstr "Expand the number of shard nodes" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:36 +msgid "单机部署实例数" +msgstr "Number of single-machine deployment instances" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:37 +msgid "扩容shard分片数" +msgstr "Expanding the number of shard shards" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:44 +msgid "扩容shard节点数申请信息" +msgstr "Application information for expanding the number of shard nodes" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:97 +msgid "MongoDB 扩容shard节点数执行" +msgstr "MongoDB expands the number of shard nodes and executes it" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:26 +msgid "授权数据列表" +msgstr "Authorized data list" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:38 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:66 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:39 +msgid "用户输入的excel下载文件地址" +msgstr "The excel download file address entered by the user" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:326 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:274 -msgid "停止BookKeeper服务-{}" -msgstr "Stop BookKeeper service - {}" +#: backend/ticket/builders/mongodb/mongo_authorize.py:40 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:68 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:41 +msgid "授权数据信息列表" +msgstr "List of authorized data information" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:332 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:280 -msgid "退役BookKeeper-{}" -msgstr "Decommissioned BookKeeper-{}" +#: backend/ticket/builders/mongodb/mongo_authorize.py:52 +msgid "MongoDB 授权执行" +msgstr "MongoDB authorization execution" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:337 -msgid "缩容Pulsar-BookKeeper-{}-子流程" -msgstr "Shrinking Pulsar-BookKeeper-{}-subprocesses" +#: backend/ticket/builders/mongodb/mongo_authorize.py:58 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:106 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:72 +msgid "授权数据不存在/已过期,请重新提交授权表单或excel文件" +msgstr "The authorization data does not exist/has expired. Please resubmit the authorization form or excel file." -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:77 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:67 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:67 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:65 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:66 -msgid "下发pulsar actuator" -msgstr "Issue the pulsar actuator" +#: backend/ticket/builders/mongodb/mongo_authorize.py:66 +msgid "MongoDB Excel授权执行" +msgstr "MongoDB Excel authorization execution" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:86 -msgid "Pulsar集群节点清理-{}" -msgstr "Pulsar cluster node cleanup -{}" +#: backend/ticket/builders/mongodb/mongo_backup.py:32 +#: backend/ticket/builders/mongodb/mongo_clear.py:31 +#: backend/ticket/builders/mongodb/mongo_restore.py:45 +msgid "库表选择器" +msgstr "Library table selector" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:110 -msgid "删除ZK域名" -msgstr "Delete ZK domain name" +#: backend/ticket/builders/mongodb/mongo_backup.py:33 +msgid "备份节点" +msgstr "Backup node" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:121 -msgid "删除PULSAR_MANAGER实例信息" -msgstr "Delete PULSAR_MANAGER instance information" +#: backend/ticket/builders/mongodb/mongo_backup.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:59 +msgid "备份方式" +msgstr "Backup method" + +#: backend/ticket/builders/mongodb/mongo_backup.py:40 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:53 +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:30 +msgid "备份保存时间" +msgstr "Backup save time" + +#: backend/ticket/builders/mongodb/mongo_backup.py:62 +msgid "如果备份方式选择mongos,请输入备份节点" +msgstr "If mongos is selected as the backup method, please enter the backup node" + +#: backend/ticket/builders/mongodb/mongo_backup.py:65 +msgid "请保证备份节点{}是分片集群的机器" +msgstr "Please ensure that the backup node {} is a machine in the sharded cluster" + +#: backend/ticket/builders/mongodb/mongo_backup.py:85 +msgid "MongoDB 库表备份执行" +msgstr "MongoDB database table backup execution" + +#: backend/ticket/builders/mongodb/mongo_clear.py:29 +msgid "删除类型" +msgstr "delete type" + +#: backend/ticket/builders/mongodb/mongo_clear.py:30 +msgid "是否删除索引" +msgstr "Whether to delete the index" + +#: backend/ticket/builders/mongodb/mongo_clear.py:33 +msgid "清档信息" +msgstr "Clearance information" + +#: backend/ticket/builders/mongodb/mongo_clear.py:52 +msgid "MongoDB 清档执行" +msgstr "MongoDB clearing execution" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:35 +msgid "替换主机IP" +msgstr "Replace host IP" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:36 +msgid "主机所在云区域" +msgstr "The cloud region where the host is located" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:37 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:47 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:34 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:37 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:38 +msgid "规格ID" +msgstr "Specification ID" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:40 +msgid "替换mongos的信息" +msgstr "Replace mongos information" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:41 +msgid "替换mongodb的信息" +msgstr "Replace mongodb information" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:42 +msgid "替换mongo_config的信息" +msgstr "Replace mongo_config information" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:47 +msgid "整机替换信息" +msgstr "Whole machine replacement information" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:160 +msgid "MongoDB 整机替换执行" +msgstr "MongoDB whole machine replacement execution" + +#: backend/ticket/builders/mongodb/mongo_destroy.py:41 +msgid "MongoDB 集群下架" +msgstr "MongoDB cluster removed" + +#: backend/ticket/builders/mongodb/mongo_disable.py:44 +#: backend/ticket/constants.py:409 +msgid "MongoDB 集群禁用" +msgstr "MongoDB cluster disabled" + +#: backend/ticket/builders/mongodb/mongo_enable.py:44 +#: backend/ticket/constants.py:407 +msgid "MongoDB 集群启用" +msgstr "MongoDB cluster enabled" + +#: backend/ticket/builders/mongodb/mongo_full_backup.py:26 +msgid "是否需要oplog备份" +msgstr "Do you need oplog backup?" + +#: backend/ticket/builders/mongodb/mongo_full_backup.py:53 +msgid "MongoDB 全库备份执行" +msgstr "MongoDB full database backup execution" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:28 +msgid "实例主机ID" +msgstr "Instance host ID" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:32 +msgid "重启信息" +msgstr "Restart information" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:67 +#: backend/ticket/constants.py:408 +msgid "MongoDB 实例重启" +msgstr "MongoDB instance restart" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:31 +#: backend/ticket/builders/riak/riak_shrink.py:30 +msgid "缩容节点" +msgstr "Scale down node" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:34 +msgid "缩容接入层申请信息" +msgstr "Reduction access layer application information" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:53 +msgid "缩容后的整体mongos机器数量不能小于2" +msgstr "The number of overall mongos machines after scaling cannot be less than 2" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:80 +msgid "MongoDB 缩容接入层执行" +msgstr "MongoDB scaling access layer execution" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:29 +msgid "缩容数量" +msgstr "Number of shrinks" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:32 +msgid "缩容shard节点数信息" +msgstr "Shrink shard node number information" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:67 +msgid "MongoDB 缩容Shard节点数执行" +msgstr "MongoDB reduces the number of Shard nodes and executes it" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:27 +msgid "复制集群ID(英文数字及下划线)" +msgstr "Copy the cluster ID (English numbers and underscores)" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:42 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:39 +msgid "起始端口" +msgstr "starting port" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:43 +msgid "副本集数量" +msgstr "Number of replica sets" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:44 +msgid "副本集节点数量" +msgstr "Number of replica set nodes" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:45 +msgid "单机副本集数量" +msgstr "Number of stand-alone replica sets" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:46 +msgid "副本集列表" +msgstr "Replica set list" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:48 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:40 +msgid "oplog容量占比" +msgstr "oplog capacity ratio" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:55 +msgid "集群规格" +msgstr "Cluster specifications" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:101 +msgid "MongoDB 副本集集群部署执行" +msgstr "MongoDB replica set cluster deployment execution" + +#: backend/ticket/builders/mongodb/mongo_restore.py:43 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:34 +msgid "集群列表" +msgstr "cluster list" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:78 -msgid "停止Pulsar集群进程-{}-{}" -msgstr "Stop Pulsar cluster process -{}-{}" +#: backend/ticket/builders/mongodb/mongo_restore.py:47 +msgid "指定备份记录[集群ID: 记录]" +msgstr "Specify backup record [cluster ID: record]" + +#: backend/ticket/builders/mongodb/mongo_restore.py:48 +msgid "部署城市" +msgstr "deploy city" + +#: backend/ticket/builders/mongodb/mongo_restore.py:49 +msgid "每台主机部署的节点数" +msgstr "Number of nodes deployed per host" + +#: backend/ticket/builders/mongodb/mongo_restore.py:59 +msgid "分片集群暂时不支持批量回档" +msgstr "Sharded clusters do not support batch rollback for the time being." + +#: backend/ticket/builders/mongodb/mongo_restore.py:248 +msgid "[{}]回档临时集群部署" +msgstr "[{}]Rolling back temporary cluster deployment" + +#: backend/ticket/builders/mongodb/mongo_restore.py:255 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +msgid "MongoDB 回档执行" +msgstr "MongoDB rollback execution" + +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:204 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:224 +msgid "回档临时集群部署" +msgstr "Rolling back a temporary cluster deployment" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:33 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:46 +#: backend/ticket/builders/redis/redis_cluster_apply.py:49 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:44 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:45 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:33 +msgid "集群分片数" +msgstr "Number of cluster fragments" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:105 -msgid "替换pulsar manager子流程" -msgstr "Replace pulsar manager subprocess" +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:34 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:45 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:54 +msgid "机器组数" +msgstr "Number of machine groups" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:35 +msgid "集群每分片节点数" +msgstr "Number of nodes per cluster in the cluster" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:42 +msgid "集群容量变更申请信息" +msgstr "Cluster capacity change application information" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:50 +msgid "请保证申请机器数{} = 机器组数{} * 集群分片节点数{}" +msgstr "Please ensure that the number of machines you apply for {} = the number of machine groups {} * the number of cluster shard nodes {}" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:115 +msgid "MongoDB 集群容量变更执行" +msgstr "MongoDB cluster capacity change execution" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:32 +msgid "脚本内容列表" +msgstr "Script content list" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:33 +msgid "脚本导入类型" +msgstr "Script import type" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:57 +msgid "MongoDB 变更脚本执行执行" +msgstr "MongoDB change script execution" + +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:101 +msgid "MongoDB 分片集群部署执行" +msgstr "MongoDB sharded cluster deployment execution" + +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:54 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:68 +msgid "MongoDB 临时集群下架" +msgstr "MongoDB temporary cluster removed" + +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:60 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:68 +#: backend/ticket/constants.py:415 +msgid "MongoDB 临时集群销毁" +msgstr "MongoDB temporary cluster destruction" + +#: backend/ticket/builders/mysql/base.py:101 +msgid "单节点实例状态异常,暂时无法执行该单据类型:{}" +msgstr "The status of the single-node instance is abnormal and the document type cannot be executed temporarily: {}" + +#: backend/ticket/builders/mysql/base.py:107 +#: backend/ticket/builders/sqlserver/base.py:91 +msgid "集群实例状态异常:{},暂时无法执行该单据类型:{}" +msgstr "The cluster instance status is abnormal: {}, the document type cannot be executed temporarily: {}" + +#: backend/ticket/builders/mysql/base.py:118 +msgid "请保证所选集群{}与新增机器{}在同一云区域下" +msgstr "" +"Please ensure that the selected cluster {} and the newly added machine {} " +"are in the same cloud region" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:123 -msgid "更新DBMeta" -msgstr "Update DBMeta" +#: backend/ticket/builders/mysql/base.py:127 +msgid "请保证实例f{}的角色类型为{}" +msgstr "Please ensure that the role type of the instance f{} is {}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:132 -msgid "替换ZooKeeper子流程" -msgstr "Replace ZooKeeper subprocess" +#: backend/ticket/builders/mysql/base.py:143 +msgid "请保证所选实例{}的关联集群为{}" +msgstr "" +"Please ensure that the associated cluster of the selected instance {} is {}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:195 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:73 -msgid "缩容BookKeeper子流程" -msgstr "Shrink the BookKeeper sub-process" +#: backend/ticket/builders/mysql/base.py:166 +msgid "是否强制下架" +msgstr "Is it mandatory to take off the shelves" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:262 -msgid "更新pulsar_manager实例信息" -msgstr "Update pulsar_manager instance information" +#: backend/ticket/builders/mysql/base.py:217 +msgid "" +"【库表字段校验】库表只能由`[0-9],[a-z],[A-Z],-,_` 组成,(某些单据)支持*/%/?通" +"配符。库表长度最大为35" +msgstr "[Library table field verification] The library table can only be composed of `[0-9],[az],[AZ],-,_`, (some documents) support */%/? wildcard. The maximum length of the library table is 35" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:275 -msgid "仅非DNS环境使用-添加broker域名" -msgstr "Only used in non-DNS environment - add broker domain name" +#: backend/ticket/builders/mysql/base.py:223 +msgid "【库表字段校验】{}" +msgstr "[Library table field verification]{}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:86 -msgid "停止ZooKeeper服务-{}" -msgstr "stop ZooKeeper service - {}" +#: backend/ticket/builders/mysql/base.py:228 +msgid "【库表字段校验】不允许系统库(除test)做任何变更类操作" +msgstr "[Library table field verification] System libraries (except test) are not allowed to perform any change operations" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:100 -msgid "更新ZK域名" -msgstr "Update ZK domain name" +#: backend/ticket/builders/mysql/base.py:230 +msgid "【库表字段校验】DB名{}不能以stage_truncate开头" +msgstr "[Library table field verification] DB name {} cannot start with stage_truncate" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:117 -msgid "仅非DNS环境使用-更新ZK映射" -msgstr "Only used in non-DNS environments - update ZK mapping" +#: backend/ticket/builders/mysql/base.py:232 +msgid "【库表字段校验】DB名{}不能以dba_rollback结尾" +msgstr "[Library table field verification] DB name {} cannot end with dba_rollback" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:133 -msgid "替换Pulsar-ZooKeeper-{}-子流程" -msgstr "Replace Pulsar-ZooKeeper-{}-subprocess" +#: backend/ticket/builders/mysql/mysql_add_slave.py:27 +msgid "新从库机器信息" +msgstr "New slave machine information" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:230 -msgid "检查Ledger Metadata-{}" -msgstr "Check Ledger Metadata - {}" +#: backend/ticket/builders/mysql/mysql_add_slave.py:31 +msgid "添加从库信息" +msgstr "Add slave information" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:243 -msgid "修改Bookie参数为ReadOnly-{}" -msgstr "Modify the Bookie parameter to ReadOnly-{}" +#: backend/ticket/builders/mysql/mysql_add_slave.py:36 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:33 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:43 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:32 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:40 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:34 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:34 +msgid "机器来源" +msgstr "machine source" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:257 -msgid "滚动重启BookKeeper-{}" -msgstr "Rolling Restart BookKeeper -{}" +#: backend/ticket/builders/mysql/mysql_add_slave.py:88 +msgid "添加从库执行" +msgstr "Add slave execution" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:264 -msgid "等待数据过期" -msgstr "wait for data to expire" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:31 +msgid "目标集群域名" +msgstr "Target cluster domain name" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:68 -msgid "Proxy-001-{}-下发介质包" -msgstr "Proxy-001-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:43 +msgid "第三方接口/插件授权信息" +msgstr "Third-party interface/plug-in authorization information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:75 -msgid "Proxy-002-{}-初始化机器" -msgstr "Proxy-002-{}-initialize machine" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:45 +msgid "是否需要审批" +msgstr "Whether approval is required" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:100 -msgid "Proxy-003-{}-安装实例" -msgstr "Proxy-003-{}-Installation example" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:49 +msgid "请保证授权数据存在" +msgstr "Please ensure that the authorization data exists" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:109 -msgid "Proxy-004-{}-写入元数据" -msgstr "Proxy-004-{}-write metadata" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:89 +msgid "授权执行" +msgstr "authorized execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:130 -msgid "Proxy-005-{}-安装监控" -msgstr "Proxy-005-{}-installation monitoring" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:114 +msgid "Excel 授权执行" +msgstr "Excel authorization execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:135 -msgid "Proxy-{}-安装原子任务" -msgstr "Proxy-{}-install atomic tasks" +#: backend/ticket/builders/mysql/mysql_checksum.py:39 +msgid "slave信息列表" +msgstr "slave information list" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:57 -msgid "Redis-201-{}-下发介质包" -msgstr "Redis-201-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_checksum.py:46 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:61 +#: backend/ticket/constants.py:489 +msgid "超时时间" +msgstr "overtime time" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:77 -msgid "Redis-202-{}-安装监控" -msgstr "Redis-202-{}-install monitoring" +#: backend/ticket/builders/mysql/mysql_checksum.py:47 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:62 +msgid "定时触发时间" +msgstr "Timing trigger time" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:83 -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:129 -msgid "Redis-{}-安装原子任务" -msgstr "Redis-{}-install atomic tasks" +#: backend/ticket/builders/mysql/mysql_checksum.py:48 +msgid "数据校验信息列表" +msgstr "Data verification information list" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:63 -msgid "Redis-001-{}-下发介质包" -msgstr "Redis-001-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_checksum.py:49 +#: backend/ticket/builders/mysql/mysql_data_repair.py:30 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:60 +msgid "数据修复信息" +msgstr "Data Repair Information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:71 -msgid "Redis-002-{}-初始化机器" -msgstr "redis-002-{}-initialize-machine" +#: backend/ticket/builders/mysql/mysql_checksum.py:50 +#: backend/ticket/builders/mysql/mysql_data_repair.py:32 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:64 +msgid "非innodb表是否修复" +msgstr "Are non-innodb tables repaired?" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:90 -msgid "Redis-003-{}-安装实例" -msgstr "Redis-003-{}-installation example" +#: backend/ticket/builders/mysql/mysql_checksum.py:61 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:72 +msgid "定时时间必须晚于当前时间" +msgstr "The scheduled time must be later than the current time" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:104 -msgid "Redis-004-{}-写入元数据" -msgstr "Redis-004-{}-write metadata" +#: backend/ticket/builders/mysql/mysql_checksum.py:185 +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +msgid "数据校验执行" +msgstr "Data validation execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:124 -msgid "Redis-005-{}-安装监控" -msgstr "Redis-005-{}-install monitoring" +#: backend/ticket/builders/mysql/mysql_checksum.py:202 +msgid "手动" +msgstr "manual" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:56 -msgid "Redis-101-{}-下发介质包" -msgstr "Redis-101-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_checksum.py:204 +msgid "自动" +msgstr "automatic" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:76 -msgid "Redis-102-{}-卸载dbmon" -msgstr "Redis-102-{}-uninstall dbmon" +#: backend/ticket/builders/mysql/mysql_checksum.py:212 +msgid "数据修复{}执行" +msgstr "datafix{} execute" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:112 -msgid "Redis-{}-拉起dbmon" -msgstr "Redis-{}-pulls dbmon" +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +#: backend/ticket/builders/mysql/mysql_data_repair.py:59 +msgid "数据修复执行" +msgstr "Data Repair Execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:117 -msgid "Redis-{}-创建同步关系原子任务" -msgstr "Redis-{}-Create a synchronization relational atomic task" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:30 +msgid "源IP" +msgstr "Source IP" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:142 -msgid "Redis-103-{}-建立主从关系" -msgstr "Redis-103-{}-establish master-slave relationship" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:31 +msgid "目标IP列表" +msgstr "Target IP list" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:162 -msgid "Redis-104-{}-建立主从关系" -msgstr "Redis-104-{}-establish master-slave relationship" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:39 +msgid "插件的权限克隆信息" +msgstr "Plug-in permission clone information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:237 -msgid "Redis-103-{}-发起备份" -msgstr "Redis-103-{}-initiate backup" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:45 +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:29 +msgid "克隆集群类型" +msgstr "Clone cluster type" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:55 -msgid "Redis-301-{}-下发介质包" -msgstr "Redis-301-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:69 +msgid "客户端权限克隆执行" +msgstr "Client permission clone execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:70 -msgid "Redis-302-{}-检查同步状态" -msgstr "Redis-302-{}-check sync status" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:78 +msgid "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" +msgstr "" +"The permission clone data has expired, please resubmit the permission clone " +"form or excel file" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:51 -msgid "Redis-801-{}-下发介质包" -msgstr "Redis-801-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:85 +msgid "权限克隆数据不合法!请检查" +msgstr "Cloning data with permission is illegal! Check, please" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:66 -msgid "Redis-802-{}-请求检查" -msgstr "redis-802-{}-request-check" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:90 +msgid "DB实例权限克隆执行" +msgstr "DB instance permission clone execution" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:78 -msgid "Redis-803-{}-干掉非活跃链接" -msgstr "Redis-803-{}-kill inactive links" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:27 +#: backend/ticket/builders/mysql/mysql_openarea.py:43 +msgid "目标集群列表" +msgstr "Target cluster list" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:89 -msgid "Redis-804-{}-下架实例" -msgstr "Redis-804-{}-delist instance" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:28 +msgid "迁移库列表" +msgstr "Migration library list" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:104 -msgid "Redis-805-{}-卸载监控" -msgstr "redis-805-{}-offload monitoring" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:29 +msgid "克隆类型" +msgstr "Clone type" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:118 -msgid "Redis-806-{}-清理元数据" -msgstr "redis-806 - {} - cleanup metadata" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:31 +msgid "数据迁移信息" +msgstr "Data migration information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:123 -msgid "Redis-{}-下架原子任务" -msgstr "Redis-{}-offset atomic task" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:46 +msgid "迁移存在不属于源集群的数据库" +msgstr "Migrate databases that do not belong to the source cluster" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:73 -msgid "Redis-501-元数据加入集群" -msgstr "Redis-501-metadata join cluster" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:52 +msgid "迁移的数据库不能与目标集群有交集" +msgstr "The migrated database cannot overlap with the target cluster" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:77 -msgid "Redis-502-人工确认" -msgstr "Redis-502-manual confirmation" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:55 +msgid "即将迁移的数据库和目标集群不允许重复" +msgstr "The database and target cluster to be migrated do not allow duplicates" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:84 -msgid "Redis-003-{}-下发介质包" -msgstr "Redis-003-{}-deliver media package" +#: backend/ticket/builders/mysql/mysql_data_repair.py:27 +msgid "master信息" +msgstr "master information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:114 -msgid "Redis-504-{}-实例切换" -msgstr "Redis-504-{}-instance switching" +#: backend/ticket/builders/mysql/mysql_data_repair.py:28 +msgid "slaves信息" +msgstr "slaves information" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:137 -msgid "Redis-505-元数据切换" -msgstr "Redis-505 - Metadata toggle" +#: backend/ticket/builders/mysql/mysql_data_repair.py:31 +msgid "校验单据结果表名" +msgstr "Verification ticket result table name" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:140 -msgid "Redis-{}-实例切换" -msgstr "Redis-{}-instance switching" +#: backend/ticket/builders/mysql/mysql_data_repair.py:33 +msgid "校验结果是否一致" +msgstr "Whether the verification result is consistent" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:98 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:98 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:114 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:104 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:137 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:135 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:118 -#: backend/flow/engine/bamboo/scene/redis/redis_dbmon.py:78 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:102 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:100 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:88 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:128 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:88 -msgid "初始化配置" -msgstr "Initial configuration" +#: backend/ticket/builders/mysql/mysql_data_repair.py:36 +msgid "数据修复触发类型" +msgstr "Data Repair Trigger Type" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:160 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:157 -msgid "redis建立主从 元数据" -msgstr "Redis establishes master-slave metadata" +#: backend/ticket/builders/mysql/mysql_dump_data.py:31 +msgid "where条件" +msgstr "where condition" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:186 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:184 -msgid "建立集群 元数据" -msgstr "Create cluster metadata" +#: backend/ticket/builders/mysql/mysql_dump_data.py:32 +msgid "导出库列表" +msgstr "Export library list" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:210 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:197 -msgid "回写集群配置[Redis]" -msgstr "Write back cluster configuration [Redis]" +#: backend/ticket/builders/mysql/mysql_dump_data.py:35 +msgid "是否导出表结构" +msgstr "Whether to export the table structure" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:226 -msgid "回写集群配置[Twemproxy]" -msgstr "Write back cluster configuration [Twemproxy]" +#: backend/ticket/builders/mysql/mysql_dump_data.py:36 +msgid "是否导出表数据" +msgstr "Whether to export table data" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:241 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:228 -msgid "注册域名" -msgstr "Domain name registration" +#: backend/ticket/builders/mysql/mysql_dump_data.py:75 +msgid "数据导出执行" +msgstr "Data export execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:103 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:119 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:109 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:123 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:107 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:105 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:94 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:98 -msgid "下发介质包" -msgstr "Deliver the media package" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:34 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:43 +msgid "回档集群ID" +msgstr "Rollback cluster ID" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:112 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:146 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:133 -msgid "redis备份: {}" -msgstr "redis backup: {}" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:35 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:44 +msgid "备份新机器" +msgstr "backup new machine" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:119 -msgid "集群[{}]备份" -msgstr "cluster[{}] backup" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:41 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:50 +msgid "备份文件信息" +msgstr "Backup file information" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:79 -msgid "获取源集群、目的集群信息" -msgstr "Obtain information about the source and destination clusters" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:49 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:60 +msgid "回档集群类型" +msgstr "Rollback cluster type" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:95 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:139 -msgid "获取磁盘使用情况: {}" -msgstr "Get disk usage: {}" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:51 +msgid "定点构造信息" +msgstr "fixed-point construction information" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:104 -msgid "redis dts前置检查" -msgstr "redis dts pre-check" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:57 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:62 +msgid "请提供部署新集群的机器信息" +msgstr "Please provide machine information for deploying the new cluster" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:109 -msgid "redis dts发起任务并等待至增量同步阶段" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:66 +msgid "请保证rollback_time或backupinfo参数至少存在一个" msgstr "" -"redis dts initiates a task and waits until the incremental synchronization " -"phase" +"Please ensure that there is at least one rollback_time or backupinfo " +"parameter" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:128 -msgid "redis dts数据校验: {}" -msgstr "Redis dts data verification: {}" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:74 +msgid "定点时间{}不能晚于当前时间{}" +msgstr "Fixed time {} cannot be later than current time {}" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:136 -msgid "源集群:{} 数据迁移到 目的集群:{}" -msgstr "Source cluster: {} Data migration to destination cluster: {}" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:118 +msgid "定点构造执行" +msgstr "Fixed-point construction execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:118 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:132 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:118 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:111 -msgid "redis请求检查: {}" -msgstr "redis request check: {}" +#: backend/ticket/builders/mysql/mysql_flashback.py:41 +msgid "flashback工具地址" +msgstr "flashback tool address" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:138 -msgid "更新实例状态" -msgstr "update instance status" +#: backend/ticket/builders/mysql/mysql_flashback.py:43 +msgid "记录文件" +msgstr "log file" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:162 -msgid "[{}]卸载bkdbmon" -msgstr "[{}] uninstall bkdbmon" +#: backend/ticket/builders/mysql/mysql_flashback.py:56 +msgid "" +"flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时" +"间" +msgstr "" +"The start and end time of flash {}--{} is invalid, please ensure that the " +"start time is less than the end time, and the two are not greater than the " +"current time" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:164 -msgid "[{}]安装bkdbmon" -msgstr "[{}] install bkdbmon" +#: backend/ticket/builders/mysql/mysql_flashback.py:78 +msgid "闪回执行" +msgstr "flashback execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:179 -msgid "集群[{}]启停" -msgstr "Cluster[{}] starts and stops" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:93 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:198 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:132 +msgid "人工确认执行" +msgstr "Manual confirmation execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:188 -msgid "更新集群状态" -msgstr "update cluster status" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:105 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:209 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:143 +msgid "库表备份" +msgstr "Database table backup" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:148 -msgid "REDIS_MASTER-裁撤替换" -msgstr "REDIS_MASTER - undo replace" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:115 +msgid "强制变更SQL执行" +msgstr "Force changes to SQL execution" + +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:124 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +msgid "库表备份(可选)" +msgstr "Database table backup (optional)" + +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:124 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:219 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:153 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +#: backend/ticket/constants.py:260 +msgid "变更SQL执行" +msgstr "Change SQL execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:249 -msgid "REDIS_MASTER-故障自愈" -msgstr "REDIS_MASTER - fault self-healing" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:41 +msgid "Proxy起始端口" +msgstr "Proxy start port" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:146 -msgid "REDIS_SLAVE-裁撤替换" -msgstr "REDIS_SLAVE - undo replace" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:61 +msgid "" +"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" +"台backend机器" +msgstr "" +"The number of machines entered is wrong. Expected to input {} proxy and " +"backend machines, but actually entered {} proxy machines and {} backend " +"machines" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:204 -msgid "Redis-新节点加入集群" -msgstr "Redis-new node joins the cluster" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:130 +msgid "MySQL高可用部署执行" +msgstr "MySQL high availability deployment execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:224 -msgid "REDIS_SLAVE-故障自愈" -msgstr "REDIS_SLAVE - failure self-healing" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:149 +#: backend/ticket/builders/mysql/mysql_single_apply.py:223 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:131 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:220 +msgid "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" +msgstr "" +"Failed to get the database character set or version, please check the " +"parameters, db_config: {}" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:169 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:234 -msgid "{}下架proxy实例" -msgstr "{}Remove the proxy instance" +#: backend/ticket/builders/mysql/mysql_ha_backup.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:37 +msgid "备份信息列表" +msgstr "Backup Information List" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:180 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:125 -msgid "{}下架redis实例" -msgstr "{}Remove the redis instance" +#: backend/ticket/builders/mysql/mysql_ha_backup.py:57 +msgid "库表备份执行" +msgstr "Database table backup execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:205 -msgid "[redis]卸载bkdbmon" -msgstr "[redis] uninstall bkdbmon" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:33 +msgid "清档类型" +msgstr "Clearance type" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:225 -msgid "清理Redis配置" -msgstr "Clean up Redis configuration" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:37 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:36 +msgid "清档信息列表" +msgstr "List of clearance information" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:242 -msgid "清理Proxy配置" -msgstr "Clean up the Proxy configuration" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:62 +msgid "清档执行" +msgstr "Clear file execution" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:255 -msgid "删除集群元数据" -msgstr "delete cluster metadata" +#: backend/ticket/builders/mysql/mysql_ha_destroy.py:51 +msgid "MySQL高可用销毁执行" +msgstr "MySQL high availability destruction execution" -#: backend/flow/engine/bamboo/scene/redis/redis_dbmon.py:89 -msgid "REDIS-重装DBMON" -msgstr "REDIS-Reinstall DBMON" +#: backend/ticket/builders/mysql/mysql_ha_destroy.py:85 +msgid "dumper 下架" +msgstr "dumper removed from shelves" -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:146 -msgid "redis清档: {}" -msgstr "redis file clear: {}" +#: backend/ticket/builders/mysql/mysql_ha_disable.py:38 +msgid "MySQL高可用禁用执行" +msgstr "MySQL high availability disable execution" -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:154 -msgid "集群[{}]清档" -msgstr "Cluster[{}] clear file" +#: backend/ticket/builders/mysql/mysql_ha_enable.py:38 +msgid "MySQL高可用启用执行" +msgstr "MySQL HA Enabled Execution" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:115 -msgid "按正则删除key: {}" -msgstr "Delete key according to regex: {}" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:30 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:26 +msgid "备份位置" +msgstr "Backup location" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:123 -msgid "集群[{}]按正则删除keys" -msgstr "Cluster[{}] deletes keys according to the rules" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:35 +msgid "备份类型" +msgstr "backup type" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:148 -msgid "获取磁盘空闲最大机器" -msgstr "Get disk free max machine" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:36 +msgid "备份文件tag" +msgstr "backup file tag" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:158 -msgid "按文件删除key" -msgstr "Delete key by file" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:37 +#: backend/ticket/builders/redis/redis_instance_apply.py:45 +msgid "集群信息" +msgstr "Cluster information" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:163 -msgid "集群[{}]按文件删除keys" -msgstr "cluster[{}] delete keys by file" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:67 +msgid "全库备份执行" +msgstr "Full database backup execution" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:103 -msgid "提取key: {}" -msgstr "Extract key: {}" +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:31 +#: backend/ticket/builders/spider/metadata_import.py:31 +#: backend/ticket/builders/tendbsingle/metadata_import.py:30 +msgid "元数据json内容" +msgstr "Metadata json content" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:61 +#: backend/ticket/builders/spider/metadata_import.py:56 +#: backend/ticket/builders/tendbsingle/metadata_import.py:52 +msgid "bk_biz_id: {} 不存在" +msgstr "bk_biz_id: {} does not exist" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:67 +#: backend/ticket/builders/spider/metadata_import.py:62 +#: backend/ticket/builders/tendbsingle/metadata_import.py:58 +msgid "db_module_id: {} 不存在" +msgstr "db_module_id: {} does not exist" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:89 +msgid "proxy_spec_id: {} 不存在" +msgstr "proxy_spec_id: {} does not exist" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:96 +#: backend/ticket/builders/tendbsingle/metadata_import.py:78 +msgid "storage_spec_id: {} 不存在" +msgstr "storage_spec_id: {} does not exist" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:121 +#: backend/ticket/builders/tendbsingle/metadata_import.py:190 +msgid "{} 超出 scr mysql segment 范围" +msgstr "{} exceeds scr mysql segment range" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:127 +#: backend/ticket/builders/spider/metadata_import.py:112 +msgid "隔离级别 {} 不支持" +msgstr "Isolation level {} not supported" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:145 +#: backend/ticket/builders/spider/metadata_import.py:129 +#: backend/ticket/builders/tendbsingle/metadata_import.py:107 +msgid "{} version: {} or charset: {} not match to db module: {}: {}, {}" +msgstr "{} version: {} or charset: {} not match to db module: {}: {}, {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:161 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:172 +#: backend/ticket/builders/spider/metadata_import.py:153 +#: backend/ticket/builders/spider/metadata_import.py:168 +#: backend/ticket/builders/tendbsingle/metadata_import.py:121 +msgid "{} not found in machine part" +msgstr "{} not found in machine part" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:188 +#: backend/ticket/builders/spider/metadata_import.py:184 +#: backend/ticket/builders/tendbsingle/metadata_import.py:137 +msgid "{} cpu={} not match to {}" +msgstr "{} cpu={} not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:198 +#: backend/ticket/builders/spider/metadata_import.py:194 +#: backend/ticket/builders/tendbsingle/metadata_import.py:147 +msgid "{} mem={}GB not match to {}GB" +msgstr "{} mem={}GB not match to {}GB" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:213 +#: backend/ticket/builders/spider/metadata_import.py:209 +#: backend/ticket/builders/tendbsingle/metadata_import.py:162 +msgid "{} {} size={}GB not match to {}" +msgstr "{} {} size={}GB not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:222 +#: backend/ticket/builders/spider/metadata_import.py:218 +#: backend/ticket/builders/tendbsingle/metadata_import.py:171 +msgid "{} {} type={} not match to {}" +msgstr "{} {} type={} not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:229 +#: backend/ticket/builders/spider/metadata_import.py:225 +#: backend/ticket/builders/tendbsingle/metadata_import.py:178 +msgid "{} mount point {} not found" +msgstr "{} mount point {} not found" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:243 +msgid "MySQL高可用元数据导入" +msgstr "MySQL high availability metadata import" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:110 -msgid "集群[{}提取keys" -msgstr "cluster[{} extract keys" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:29 +msgid "源数据库名" +msgstr "source database name" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:136 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:211 -msgid "proxy下发介质包" -msgstr "The proxy delivers the media package" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:30 +msgid "目标数据库名" +msgstr "target database name" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:151 -msgid "{}安装proxy实例" -msgstr "{} install proxy instance" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:32 +msgid "重命名数据库列表" +msgstr "Rename database list" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:158 -msgid "{}部署bkdbmon" -msgstr "{} deploy bkdbmon" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:67 +msgid "DB重命名执行" +msgstr "DB rename execution" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:171 -msgid "{}proxy扩容 元数据" -msgstr "{} proxy expansion metadata" +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:29 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:29 +#: backend/ticket/builders/tendbsingle/standardize.py:27 +msgid "标准化信息" +msgstr "standardized information" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:41 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:41 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:46 +#: backend/ticket/builders/tendbsingle/standardize.py:40 +msgid "{} 不是 {} 集群" +msgstr "{} is not a {} cluster" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:51 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:49 +msgid "{} proxy 数量异常" +msgstr "{} The number of proxies is abnormal" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:56 +msgid "{} 存储 master 数量异常" +msgstr "{} The number of storage masters is abnormal" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:61 +msgid "{} 存储 slave 数量异常" +msgstr "{} The number of storage slaves is abnormal." + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:74 +msgid "MySQL高可用标准化" +msgstr "MySQL high availability standardization" + +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:41 +msgid "语义执行的流程ID" +msgstr "Process ID for semantic execution" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:184 -msgid "{}添加域名" -msgstr "{} add domain name" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:49 +msgid "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" +msgstr "" +"Failed to get the context data of semantic execution id: {}, please check " +"whether the semantic execution task is successfully completed" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:200 -msgid "主机转移" -msgstr "host transfer" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:64 +msgid "模拟执行链接" +msgstr "Simulation Execution Link" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:203 -msgid "新增proxy实例" -msgstr "Add proxy instance" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:70 +msgid "模拟执行结果" +msgstr "Simulation execution results" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:226 -msgid "{}删除域名" -msgstr "{} delete domain name" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:78 +msgid "无" +msgstr "none" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:244 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:136 -msgid "主机转移到空闲机" -msgstr "Host transfer to idle machine" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:81 +msgid "SQL高危语句" +msgstr "SQL high-risk statements" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:249 -msgid "下架proxy实例" -msgstr "Remove the proxy instance" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:140 +msgid "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" +msgstr "" +"The pipeline data for simulated execution is not ready yet, please check the " +"celery status and try again later." -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:259 -msgid "proxy下架元数据" -msgstr "Proxy removal metadata" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:175 +msgid "SQL语法检查查询" +msgstr "SQL syntax check query" -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:140 -msgid "建立集群meet关系" -msgstr "Establish a cluster meet relationship" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:182 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +msgid "SQL模拟执行状态查询" +msgstr "SQL simulation execution status query" -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:213 -msgid "回写集群配置[predixy]" -msgstr "Write back cluster configuration [predixy]" +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:25 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:37 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:25 +msgid "目标版本包ID" +msgstr "Target version package ID" + +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:27 +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:39 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:28 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:31 +msgid "单据信息" +msgstr "Ticket information" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:82 -msgid "下发actuator以及riak介质" -msgstr "Deliver actuator and riak media" +#: backend/ticket/builders/mysql/mysql_master_fail_over.py:38 +msgid "主库故障切换执行" +msgstr "Primary database failover execution" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:93 -msgid "actuator_riak系统配置初始化" -msgstr "actuator_riak system configuration initialization" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:24 +msgid "主库 IP" +msgstr "Master IP" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:107 -msgid "actuator_riak部署节点" -msgstr "actuator_riak deployment node" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:25 +msgid "从库 IP" +msgstr "Slave IP" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:121 -msgid "actuator_riak节点加入集群" -msgstr "The actuator_riak node joins the cluster" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:40 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:33 +msgid "是否检测连接" +msgstr "Whether to detect the connection" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:135 -msgid "actuator_集群变更生效" -msgstr "actuator_cluster changes take effect" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:42 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:35 +msgid "是否检测数据同步延时情况(互切单据延时属于强制检测,故必须传True)" +msgstr "Whether to detect data synchronization delay (the delay of mutual switching documents is mandatory detection, so it must be passed True)" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:149 -msgid "actuator_初始化bucket_type" -msgstr "actuator_init bucket_type" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:44 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:37 +msgid "是否检测历史数据检验结果" +msgstr "Whether to detect historical data inspection results" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:162 -msgid "riak修改元数据" -msgstr "riak modify metadata" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:104 +msgid "主从互换执行" +msgstr "Master-slave swap execution" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:172 -msgid "部署Riak集群" -msgstr "Deploy the Riak cluster" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:138 +msgid "dumper 迁移" +msgstr "dumper migration" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:72 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:210 -msgid "下发spider安装介质" -msgstr "Deliver the spider installation media" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:27 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:39 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:26 +msgid "新主库主机" +msgstr "New master database host" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:114 -msgid "安装Spider_slave实例" -msgstr "Install the spider_slave instance" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:28 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:40 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:27 +msgid "新从库主机" +msgstr "new slave master" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:130 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:284 -msgid "克隆权限到spider节点[{}]" -msgstr "Clone permissions to the spider node [{}]" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:35 +msgid "迁移主从信息" +msgstr "Migrate master-slave information" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:149 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:307 -msgid "添加对应路由关系" -msgstr "Add corresponding routing relationship" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:39 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:35 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:40 +msgid "安全模式" +msgstr "safe mode" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:176 -msgid "集群[{}]添加spider slave节点" -msgstr "Cluster [{}] add spider slave node" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:90 +msgid "迁移主从执行" +msgstr "Migrate master-slave execution" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:252 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:129 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:268 -msgid "安装Spider实例" -msgstr "Install the Spider instance" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:38 +msgid "数据库模块ID" +msgstr "Database module ID" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:267 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:284 -msgid "安装Spider集群中控实例" -msgstr "Install the control instance of the Spider cluster" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:46 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:34 +msgid "添加信息" +msgstr "add information" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:344 -msgid "集群[{}]添加spider master节点" -msgstr "Cluster [{}] add spider master node" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:60 +msgid "集群{}无法找到最近一次备份,或最近一次备份不为logical" +msgstr "Cluster{} cannot find the most recent backup, or the most recent backup is not logical" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:382 -msgid "spider[{}]安装DBATools工具箱" -msgstr "spider[{}] installs the DBATools toolbox" +#: backend/ticket/builders/mysql/mysql_openarea.py:26 +msgid "源DB" +msgstr "SourceDB" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:398 -msgid "spider[{}]安装mysql-monitor" -msgstr "spider[{}] install mysql-monitor" +#: backend/ticket/builders/mysql/mysql_openarea.py:27 +msgid "目标DB" +msgstr "Target DB" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:415 -msgid "spider[{}]安装备份程序" -msgstr "spider[{}] install backup program" +#: backend/ticket/builders/mysql/mysql_openarea.py:28 +msgid "表结构列表" +msgstr "table structure list" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:429 -msgid "安装Spider周边程序" -msgstr "Install the Spider peripheral program" +#: backend/ticket/builders/mysql/mysql_openarea.py:29 +msgid "表数据列表" +msgstr "table data list" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:479 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:429 -msgid "部署spider-ctl集群" -msgstr "Deploy the spider-ctl cluster" +#: backend/ticket/builders/mysql/mysql_openarea.py:32 +msgid "分区执行信息" +msgstr "Partition execution information" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:17 -msgid "Flow模块TenDB Cluster异常" -msgstr "Flow Module TenDB Cluster Abnormal" +#: backend/ticket/builders/mysql/mysql_openarea.py:36 +msgid "db名" +msgstr "db name" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:28 -msgid "添加spider-master节点是分配incr初始值失败" -msgstr "Adding a spider-master node fails to assign the initial value of incr" +#: backend/ticket/builders/mysql/mysql_openarea.py:41 +msgid "用户" +msgstr "user" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:34 -msgid "添加spider节点路由失败" -msgstr "Failed to add spider node route" +#: backend/ticket/builders/mysql/mysql_openarea.py:42 +#: backend/ticket/serializers.py:337 +msgid "IP列表" +msgstr "IP list" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:209 -msgid "查询remotedb version 失败" -msgstr "Query remotedb version failed" +#: backend/ticket/builders/mysql/mysql_openarea.py:44 +msgid "授权DB列表" +msgstr "Authorized DB list" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:215 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:231 -#, python-brace-format -msgid "存在多个版本{version}" -msgstr "Multiple versions {version} exist" +#: backend/ticket/builders/mysql/mysql_openarea.py:46 +msgid "准入DB列表" +msgstr "Admission DB list" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:225 -msgid "查询spider version 失败" -msgstr "Query spider version failed" +#: backend/ticket/builders/mysql/mysql_openarea.py:49 +msgid "模板ID" +msgstr "Template ID" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:87 -msgid "[{}]The cluster has not added a slave cluster, skip" -msgstr "[{}]The cluster has not added a slave cluster, skip" +#: backend/ticket/builders/mysql/mysql_openarea.py:51 +#: backend/ticket/builders/mysql/mysql_partition.py:52 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:28 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:29 +msgid "分区信息" +msgstr "partition information" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:96 -msgid "[{}]This type of role addition is not supported" -msgstr "[{}]This type of role addition is not supported" +#: backend/ticket/builders/mysql/mysql_partition.py:23 +msgid "初始化分区语句" +msgstr "initialize partition statement" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:140 -msgid "[{}]添加spider-master节点流程" -msgstr "[{}] Add spider-master node process" +#: backend/ticket/builders/mysql/mysql_partition.py:24 +msgid "所需空间Byte" +msgstr "Required space Byte" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:177 -msgid "[{}]添加spider-slave节点流程" -msgstr "[{}] Add spider-slave node process" +#: backend/ticket/builders/mysql/mysql_partition.py:25 +msgid "表是否包含唯一键或者主键" +msgstr "Whether the table contains a unique key or a primary key" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:79 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:202 -msgid "下发Spider/tdbCtl介质包" -msgstr "Deliver the Spider/tdbCtl media package" +#: backend/ticket/builders/mysql/mysql_partition.py:29 +msgid "配置ID" +msgstr "Configuration ID" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:140 -msgid "spider上对中控主节点进行授权" -msgstr "Authorize the central control master node on the spider" +#: backend/ticket/builders/mysql/mysql_partition.py:30 +msgid "库名匹配规则" +msgstr "database Name Matching Rules" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:150 -msgid "中控主节点注册临时spider节点路由信息" -msgstr "" -"The central control master node registers the routing information of the " -"temporary spider node" +#: backend/ticket/builders/mysql/mysql_partition.py:31 +msgid "表明匹配规则" +msgstr "show matching rules" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:155 -msgid "{}添加临时spider节点" -msgstr "{}Add a temporary spider node" +#: backend/ticket/builders/mysql/mysql_partition.py:32 +msgid "初始化分区表" +msgstr "Initialize the partition table" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:167 -msgid "分片{}:创建临时用户" -msgstr "Shard{}: create temporary user" +#: backend/ticket/builders/mysql/mysql_partition.py:33 +msgid "添加分区" +msgstr "add partition" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:221 -msgid "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" -msgstr "Verification results of fragment {}:master[{}{}{}],slave[{}{}{}]" +#: backend/ticket/builders/mysql/mysql_partition.py:34 +msgid "删除分区" +msgstr "delete partition" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:236 -msgid "分片{}:master[{}{}{}]的校验任务" -msgstr "Fragment {}:master[{}{}{}] verification task" +#: backend/ticket/builders/mysql/mysql_partition.py:40 +msgid "分片名" +msgstr "slice name" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:244 -msgid "集群[{}]的校验任务" -msgstr "Validation task for cluster [{}]" +#: backend/ticket/builders/mysql/mysql_partition.py:41 +msgid "执行对象列表" +msgstr "Execution object list" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:121 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:120 -msgid "不支持的备份位置 {}" -msgstr "Unsupported backup location {}" +#: backend/ticket/builders/mysql/mysql_partition.py:46 +msgid "配置ID列表" +msgstr "Configuration ID list" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:134 -msgid "构造库表备份流程成功" -msgstr "The database table backup process is successful" +#: backend/ticket/builders/mysql/mysql_partition.py:67 +#: backend/ticket/builders/tendbcluster/tendb_partition.py:36 +msgid "分区管理执行" +msgstr "Partition Management Execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:160 -msgid "构造 spider/ctl mydumper正则" -msgstr "Construct spider/ctl mydumper regular" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:24 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:25 +msgid "服务器IP" +msgstr "Server IP" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:184 -msgid "spider 执行库表备份" -msgstr "spider performs database table backup" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:26 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:27 +msgid "分区文件名" +msgstr "Partition file name" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:197 -msgid "ctl 执行库表备份" -msgstr "ctl perform database table backup" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:30 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:31 +msgid "定时任务执行日期" +msgstr "Scheduled task execution date" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:208 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:191 -msgid "spider/ctl备份库表结构" -msgstr "spider/ctl backup database table structure" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:45 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:46 +msgid "分区管理定时任务执行" +msgstr "Partition management scheduled task execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:256 -msgid "构造remote mydumper正则" -msgstr "Construct remote mydumper regular" +#: backend/ticket/builders/mysql/mysql_proxy_add.py:27 +msgid "Proxy IP + 云区域" +msgstr "Proxy IP + cloud region" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:274 -msgid "remote 执行库表备份" -msgstr "Remote performs database table backup" +#: backend/ticket/builders/mysql/mysql_proxy_add.py:78 +msgid "添加PROXY执行" +msgstr "Add PROXY execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:286 -msgid "remote 备份库表" -msgstr "remote backup database table" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:35 +msgid "旧Proxy实例信息" +msgstr "Old Proxy instance information" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:311 -msgid "构造运维节点正则" -msgstr "Construct operation and maintenance node rules" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:36 +msgid "新Proxy机器信息" +msgstr "New Proxy machine information" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:329 -msgid "运维节点执行库表备份" -msgstr "The operation and maintenance node performs database table backup" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:42 +msgid "是否强制替换" +msgstr "Whether to force replacement" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:340 -msgid "spider_mnt库表备份" -msgstr "spider_mnt database table backup" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:43 +msgid "替换信息" +msgstr "replacement information" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:84 -msgid "存入的存储节点数量不是偶数,请检查!" -msgstr "" -"The number of stored storage nodes is not an even number, please check!" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:96 +msgid "替换PROXY执行" +msgstr "Replace PROXY execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:316 -msgid "集群内部节点间授权" -msgstr "Inter-node authorization within the cluster" +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:25 +msgid "单据输入" +msgstr "Document entry" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:328 -msgid "初始化集群节点间关系" -msgstr "Initialize the relationship between cluster nodes" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:25 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:30 +msgid "从库实例信息" +msgstr "Information of the slave instance" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:136 -msgid "卸载spider实例" -msgstr "Uninstall the spider instance" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:39 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:33 +msgid "重建从库列表" +msgstr "Rebuild slave list" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:150 -msgid "卸载中控实例" -msgstr "Uninstall the central control instance" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:72 +msgid "Slave原地重建执行" +msgstr "Slave in-place reconstruction execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:193 -msgid "下架TenDB-Cluster集群[{}]" -msgstr "Remove the TenDB-Cluster cluster[{}]" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:26 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:28 +msgid "旧从库 IP" +msgstr "Old slave IP" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:103 -msgid "重启spider实例" -msgstr "Restart the spider instance" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:27 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:29 +msgid "新从库 IP" +msgstr "New slave IP" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:137 -msgid "启用spider集群[{}]" -msgstr "Enable spider cluster[{}]" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:37 +msgid "集群重建信息" +msgstr "Cluster rebuild information" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:128 -msgid "{} 全备" -msgstr "{} full recovery" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:76 +msgid "Slave重建执行" +msgstr "Slave reconstruction execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:131 -msgid "构造全库备份流程成功" -msgstr "The process of constructing the full database backup is successful" +#: backend/ticket/builders/mysql/mysql_single_apply.py:42 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:43 +msgid "域名关键字" +msgstr "domain name keywords" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:167 -msgid "spider 执行全库备份" -msgstr "The spider performs a full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:50 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:49 +msgid "机器规格" +msgstr "Machine Specifications" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:180 -msgid "ctl 执行全库备份" -msgstr "ctl perform full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:52 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:51 +msgid "申请数量" +msgstr "Number of applications" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:238 -msgid "remote 执行全库备份" -msgstr "remote perform full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:54 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:53 +msgid "每台机器部署的实例数量" +msgstr "Number of instances deployed per machine" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:250 -msgid "remote 全库备份" -msgstr "remote full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:60 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:59 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:43 +msgid "部署规格" +msgstr "deployment specification" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:285 -msgid "运维节点执行全库备份" -msgstr "The operation and maintenance node performs full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:68 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:67 +msgid "机器规格展示名" +msgstr "Machine specification display name" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:296 -msgid "spider_mnt全库备份" -msgstr "spider_mnt full database backup" +#: backend/ticket/builders/mysql/mysql_single_apply.py:71 +msgid "MySQL起始端口" +msgstr "MySQL starting port" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:182 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:186 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:190 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:194 -msgid "预清理备份库" -msgstr "Preclean the backup repository" +#: backend/ticket/builders/mysql/mysql_single_apply.py:95 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:89 +#, python-brace-format +msgid "不允许存在重复的域名关键字[{duplicates}]" +msgstr "Duplicate domain name keywords are not allowed [{duplicates}]" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:240 -msgid "适配备份库映射" -msgstr "Adapt backup database mapping" +#: backend/ticket/builders/mysql/mysql_single_apply.py:204 +msgid "MySQL单节点部署执行" +msgstr "MySQL standalone deployment execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:246 -msgid "重建备份库" -msgstr "Rebuild the backup database" +#: backend/ticket/builders/mysql/mysql_single_clear.py:46 +msgid "MySQL 单节点清档执行" +msgstr "MySQL single node clearing execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:283 -msgid "{} on remote {} 清档" -msgstr "{} on remote {} clear file" +#: backend/ticket/builders/mysql/mysql_single_destroy.py:36 +msgid "MySQL单节点销毁执行" +msgstr "MySQL standalone destruction execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:294 -msgid "处理集群表" -msgstr "Working with clustered tables" +#: backend/ticket/builders/mysql/mysql_single_disable.py:36 +msgid "MySQL单节点禁用执行" +msgstr "MySQL standalone disable execution" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:311 -msgid "构造清档流程成功" -msgstr "Construction cleanup process succeeded" +#: backend/ticket/builders/mysql/mysql_single_enable.py:36 +msgid "MySQL单节点启用执行" +msgstr "MySQL standalone enable execution" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:110 -msgid "partition_sql_file_{}_{}_{}_{}.txt" -msgstr "partition_sql_file_{}_{}_{}_{}.txt" +#: backend/ticket/builders/mysql/mysql_single_rename.py:40 +msgid "MySQL 单节点DB重命名执行" +msgstr "MySQL single node DB rename execution" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:113 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:145 -msgid "{}: {}" -msgstr "{}: {}" +#: backend/ticket/builders/pulsar/pulsar_apply.py:32 +msgid "至少写入成功副本数" +msgstr "At least the number of successfully written replicas" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:167 -msgid "构建spider partition流程成功" -msgstr "Build the spider partition process successfully" +#: backend/ticket/builders/pulsar/pulsar_apply.py:57 +msgid "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" +msgstr "" +"The number of bookkeeper nodes is less than 2! Please ensure that the number " +"of bookkeeper deployment nodes is at least 2" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:307 -msgid "{} on remote {} 重命名数据库" -msgstr "{} on remote {} rename database" +#: backend/ticket/builders/pulsar/pulsar_apply.py:62 +msgid "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" +msgstr "" +"The number of zookeeper nodes is not 3! Please ensure that the number of " +"zookeeper deployment nodes is equal to 3" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:315 -msgid "删除集群源库" -msgstr "Delete the cluster source database" +#: backend/ticket/builders/pulsar/pulsar_apply.py:67 +msgid "broker节点数小于1台! 请保证broker的部署节点数至少为1" +msgstr "" +"The number of broker nodes is less than 1! Please ensure that the number of " +"broker deployment nodes is at least 1" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:323 -msgid "构造数据库重命名流程成功" -msgstr "Construction database renaming process succeeded" +#: backend/ticket/builders/pulsar/pulsar_apply.py:71 +msgid "请保证副本数量至少为2,且不超过bookkeeper数量" +msgstr "" +"Please ensure that the number of copies is at least 2 and does not exceed " +"the number of bookkeepers" -#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:106 -msgid "[{}]添加slave集群" -msgstr "[{}]Add slave cluster" +#: backend/ticket/builders/pulsar/pulsar_apply.py:74 +msgid "最小成功写入副本数量不得大于副本数量" +msgstr "" +"The minimum number of successfully written replicas must not be greater than " +"the number of replicas" -#: backend/flow/engine/exceptions.py:28 -msgid "组件服务未部署" -msgstr "Component Services is not deployed" +#: backend/ticket/builders/pulsar/pulsar_apply.py:101 +#: backend/ticket/constants.py:359 +msgid "Pulsar 集群部署" +msgstr "Pulsar cluster deployment" -#: backend/flow/engine/exceptions.py:32 -msgid "MySQL备份位置异常" -msgstr "The MySQL backup location is abnormal" +#: backend/ticket/builders/pulsar/pulsar_destroy.py:37 +#: backend/ticket/constants.py:366 +msgid "Pulsar 集群删除" +msgstr "Pulsar cluster deletion" -#: backend/flow/engine/exceptions.py:37 -msgid "MySQL备份方式和位置不兼容" -msgstr "MySQL backup method and location are incompatible" +#: backend/ticket/builders/pulsar/pulsar_disable.py:40 +#: backend/ticket/constants.py:365 +msgid "Pulsar 集群禁用" +msgstr "Pulsar cluster disabled" -#: backend/flow/engine/exceptions.py:38 -#, python-brace-format -msgid "MySQL备份方式{backup_type}和位置{backup_local}不兼容" -msgstr "MySQL backup method {backup_type} and location {backup_local} are incompatible" +#: backend/ticket/builders/pulsar/pulsar_enable.py:40 +#: backend/ticket/constants.py:364 +msgid "Pulsar 集群启用" +msgstr "Pulsar cluster enabled" -#: backend/flow/models.py:22 backend/flow/models.py:38 -msgid "流程ID" -msgstr "Process ID" +#: backend/ticket/builders/pulsar/pulsar_reboot.py:39 +msgid "Pulsar 集群重启" +msgstr "Pulsar cluster restart" -#: backend/flow/models.py:23 -msgid "流程树" -msgstr "process tree" +#: backend/ticket/builders/pulsar/pulsar_replace.py:46 +#: backend/ticket/constants.py:363 +msgid "Pulsar 集群替换" +msgstr "Pulsar cluster replacement" -#: backend/flow/models.py:25 backend/ticket/serializers.py:108 -msgid "流程状态" -msgstr "process status" +#: backend/ticket/builders/pulsar/pulsar_scale_up.py:46 +#: backend/ticket/constants.py:360 +msgid "Pulsar 集群扩容" +msgstr "Pulsar cluster expansion" -#: backend/flow/models.py:27 -msgid "流程创建人" -msgstr "Process Creator" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:35 +msgid "bookkeeper信息列表" +msgstr "bookkeeper information list" -#: backend/flow/models.py:28 -msgid "启动时间" -msgstr "Start Time" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:61 +msgid "{}: 至少保留{}台!" +msgstr "{}: Keep at least {} units!" -#: backend/flow/models.py:29 -msgid "流程结束时间" -msgstr "process end time" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:64 +msgid "请选择Broker和BookKeeper实例进行缩容" +msgstr "Please select Broker and BookKeeper instances for shrinking" -#: backend/flow/models.py:40 -msgid "当前版本ID" -msgstr "current version id" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:69 +msgid "缩容不支持ZooKeeper" +msgstr "Scaling does not support ZooKeeper" -#: backend/flow/models.py:42 -msgid "节点状态" -msgstr "node status" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:85 +#: backend/ticket/constants.py:361 +msgid "Pulsar 集群缩容" +msgstr "Pulsar cluster shrink" -#: backend/flow/models.py:44 -msgid "节点运行时IP" -msgstr "Node runtime IP" +#: backend/ticket/builders/redis/base.py:48 +msgid "集群【{}({})】锁定中,请等待" +msgstr "Cluster [{}({})] is locked, please wait" -#: backend/flow/models.py:46 -msgid "开始执行时间" -msgstr "start execution time" +#: backend/ticket/builders/redis/base.py:50 +msgid "集群【{}】不存在" +msgstr "Cluster {{}] does not exist" -#: backend/flow/plugins/components/collections/cloud/exec_service_script.py:58 -msgid "该节点{}获取到执行ip信息为空,请联系系统管理员" -msgstr "The execution ip information obtained by the node {} is empty, please contact the system administrator" +#: backend/ticket/builders/redis/base.py:57 +msgid "提取/删除/备份规则列表" +msgstr "Extract/delete/backup rule list" -#: backend/flow/plugins/components/collections/cloud/push_config_file.py:56 -#: backend/flow/plugins/components/collections/cloud/trans_files.py:59 -#: backend/flow/plugins/components/collections/es/trans_files.py:63 -#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:70 -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:99 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:85 -#: backend/flow/plugins/components/collections/redis/trans_flies.py:79 -#: backend/flow/plugins/components/collections/riak/trans_files.py:63 -msgid "[{}] 下发介质包参数:{}" -msgstr "[{}] Delivery media package parameters: {}" +#: backend/ticket/builders/redis/base.py:145 +msgid "集群{}已被禁用,请先启用!" +msgstr "Cluster {} has been disabled, please enable it first!" -#: backend/flow/plugins/components/collections/cloud/trans_files.py:44 -msgid "该节点{}获取到执行ip信息为空,请联系系统管理员{}" -msgstr "The execution ip information obtained by the node {} is empty, please contact the system administrator {}" +#: backend/ticket/builders/redis/base.py:147 +msgid "集群{}不存在." +msgstr "Cluster{} does not exist." -#: backend/flow/plugins/components/collections/common/base_service.py:83 -msgid "[{}] 运行成功" -msgstr "[{}] ran successfully" +#: backend/ticket/builders/redis/plugin_create_clb.py:42 +msgid "创建CLB" +msgstr "Create CLB" -#: backend/flow/plugins/components/collections/common/base_service.py:87 -msgid "[{}] 失败: {}" -msgstr "[{}] fail: {}" +#: backend/ticket/builders/redis/plugin_create_polaris.py:42 +msgid "创建Polaris" +msgstr "CreatePolaris" -#: backend/flow/plugins/components/collections/common/base_service.py:216 -msgid "[写入上下文结果失败] failed: {}" -msgstr "[Failed to write context result] failed: {}" +#: backend/ticket/builders/redis/plugin_delete_clb.py:42 +msgid "删除CLB" +msgstr "Delete CLB" -#: backend/flow/plugins/components/collections/common/base_service.py:253 -msgid "[{}] 任务正在执行🤔" -msgstr "[{}] Task is executing 🤔" +#: backend/ticket/builders/redis/plugin_delete_polaris.py:42 +msgid "删除Polaris" +msgstr "Remove Polaris" -#: backend/flow/plugins/components/collections/common/base_service.py:262 -msgid "[{}] 任务调度失败😱" -msgstr "[{}] Task scheduling failed 😱" +#: backend/ticket/builders/redis/plugin_dns_bind_clb.py:42 +msgid "域名绑定CLB" +msgstr "Domain name binding CLB" -#: backend/flow/plugins/components/collections/common/base_service.py:273 -msgid "[{}]任务调度成功🥳︎" -msgstr "[{}] Task scheduling succeeded 🥳︎" +#: backend/ticket/builders/redis/plugin_dns_unbind_clb.py:42 +msgid "域名接绑CLB" +msgstr "Domain name binding to CLB" -#: backend/flow/plugins/components/collections/common/base_service.py:279 -msgid "[{}]该节点需要获取执行后日志,赋值到trans_data" -msgstr "" -"[{}] This node needs to obtain the post-execution log and assign it to " -"trans_data" +#: backend/ticket/builders/redis/redis_backup.py:67 +msgid "集群备份" +msgstr "cluster backup" -#: backend/flow/plugins/components/collections/common/base_service.py:290 -msgid "[{}] 获取执行后日志失败,获取ip[{}]" -msgstr "[{}] Failed to get log after execution, get ip[{}]" +#: backend/ticket/builders/redis/redis_close.py:51 +#: backend/ticket/builders/redis/redis_close.py:69 +msgid "禁用集群" +msgstr "disable cluster" -#: backend/flow/plugins/components/collections/common/bigdata_manager_service.py:123 -msgid "无法找到Manager处理类型,请联系系统管理员:{}" -msgstr "Unable to find Manager processing type, please contact the system administrator: {}" +#: backend/ticket/builders/redis/redis_close.py:56 +#: backend/ticket/builders/redis/redis_open.py:53 +msgid "是否强制" +msgstr "Is it mandatory?" -#: backend/flow/plugins/components/collections/common/create_ticket.py:36 -msgid "未知单据类型, {}不存在于已知单据类型中" -msgstr "Unknown ticket type, {} does not exist in known ticket types" +#: backend/ticket/builders/redis/redis_cluster_apply.py:28 +#: backend/ticket/builders/redis/redis_instance_apply.py:41 +msgid "集群端口" +msgstr "cluster port" -#: backend/flow/plugins/components/collections/common/create_ticket.py:41 -msgid "不允许自动创建单据,单据创建流程结束" -msgstr "" -"Automatic ticket creation is not allowed, and the ticket creation process " -"ends" +#: backend/ticket/builders/redis/redis_cluster_apply.py:39 +msgid "申请容量" +msgstr "Application capacity" -#: backend/flow/plugins/components/collections/common/external_service.py:36 -msgid "第三方接口: {} 请求成功! 返回参数为: {}" -msgstr "" -"Third-party interface: {} The request is successful! The return parameter " -"is: {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:40 +msgid "申请容量详情" +msgstr "Application Capacity Details" -#: backend/flow/plugins/components/collections/common/external_service.py:38 -msgid "第三方接口:{} 调用失败!错误信息为: {}" -msgstr "Third-party interface: {} call failed! The error message is: {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:42 +#: backend/ticket/builders/redis/redis_instance_apply.py:30 +msgid "集群ID(英文数字及下划线)" +msgstr "Cluster ID (English numbers and underscores)" -#: backend/flow/plugins/components/collections/common/external_service.py:40 -msgid "请求遇到未知错误!错误信息为: {}" -msgstr "The request encountered an unknown error! The error message is: {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:44 +msgid "proxy访问密码" +msgstr "proxy access password" -#: backend/flow/plugins/components/collections/common/pause.py:44 -msgid "【{}】自动化流程待确认,是否继续?" -msgstr "" -"【{}】The automated process is pending confirmation. Do you want to continue?" +#: backend/ticket/builders/redis/redis_cluster_apply.py:48 +#: backend/ticket/builders/redis/redis_instance_apply.py:47 +msgid "proxy部署方案" +msgstr "Proxy deployment scheme" -#: backend/flow/plugins/components/collections/common/pause.py:78 -msgid "回调数据" -msgstr "callback data" +#: backend/ticket/builders/redis/redis_cluster_apply.py:72 +msgid "redis集群部署的集群分片数至少大于3" +msgstr "The number of cluster shards deployed in the redis cluster is at least greater than 3" -#: backend/flow/plugins/components/collections/common/pause.py:87 -#: backend/ticket/constants.py:315 -msgid "暂停" -msgstr "pause" +#: backend/ticket/builders/redis/redis_cluster_apply.py:105 +msgid "master、slave、proxy中存在重复节点" +msgstr "There are duplicate nodes in master, slave and proxy" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:38 -msgid "{}-空闲检查" -msgstr "{} - idle check" +#: backend/ticket/builders/redis/redis_cluster_apply.py:109 +msgid "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" +msgstr "" +"Provide at least 1 master node and 1 slave node, and the number of master " +"and slave nodes should be consistent" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:70 -#: backend/flow/plugins/components/collections/common/sa_init.py:66 -msgid "空闲检查失败" -msgstr "idle check failed" +#: backend/ticket/builders/redis/redis_cluster_apply.py:111 +msgid "proxy至少提供2台机器" +msgstr "The proxy provides at least 2 machines" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:72 -#: backend/flow/plugins/components/collections/common/sa_init.py:68 -msgid "任务状态异常{}" -msgstr "The task status is abnormal {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:282 +#: backend/ticket/constants.py:289 +msgid "Redis 集群部署" +msgstr "Redis cluster deployment" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:85 -msgid "错误详情{}" -msgstr "error details{}" +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:31 +msgid "集群新域名" +msgstr "Cluster new domain name" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:32 +msgid "集群额外信息" +msgstr "Cluster extra information" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:38 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:47 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:45 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:42 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:54 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:76 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:38 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:62 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:36 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:37 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:58 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:42 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:83 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:86 +msgid "批量操作参数列表" +msgstr "Batch operation parameter list" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:52 +msgid "集群域名重命名" +msgstr "Cluster domain name renaming" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:24 +msgid "节点类型" +msgstr "Node type" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:25 +msgid "当前版本列表" +msgstr "Current version list" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:26 +msgid "目标版本" +msgstr "target version" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:28 +msgid "版本升级信息" +msgstr "Version upgrade information" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:45 +msgid "redis 集群版本升级" +msgstr "redis cluster version upgrade" + +#: backend/ticket/builders/redis/redis_destroy.py:49 +#: backend/ticket/builders/redis/redis_destroy.py:65 +msgid "下架集群" +msgstr "Take off the cluster" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:90 -msgid "sa空闲检查" -msgstr "sa idle check" +#: backend/ticket/builders/redis/redis_instance_apply.py:31 +msgid "db数量" +msgstr "db quantity" -#: backend/flow/plugins/components/collections/common/sa_init.py:35 -msgid "SA初始化" -msgstr "SA initialization" +#: backend/ticket/builders/redis/redis_instance_apply.py:32 +msgid "追加部署的主机信息" +msgstr "Add deployed host information" -#: backend/flow/plugins/components/collections/common/sa_init.py:82 -msgid "sa初始化" -msgstr "sa initialization" +#: backend/ticket/builders/redis/redis_instance_apply.py:42 +msgid "访问密码" +msgstr "access password" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:50 -msgid "定时时间" -msgstr "Timing" +#: backend/ticket/builders/redis/redis_instance_apply.py:49 +msgid "是否是追加部署" +msgstr "Is it an additional deployment?" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:53 -#, python-format -msgid "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" -msgstr "Timing time, the format is seconds (s) or (%%Y-%%m-%%d %%H:%%M:%%S)" +#: backend/ticket/builders/redis/redis_instance_apply.py:68 +msgid "请保证机器组数{}能整除集群数{}" +msgstr "Please ensure that the number of machine groups {} can be evenly divided by the number of clusters {}" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:56 -msgid "是否强制晚于当前时间" -msgstr "Whether to force later than the current time" +#: backend/ticket/builders/redis/redis_instance_apply.py:167 +msgid "Redis 主从部署" +msgstr "Redis master-slave deployment" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:59 -msgid "" -"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" -msgstr "" -"Whether to force the time to be later than the current time when the user " -"enters the date format, only valid for timing input in the date format" +#: backend/ticket/builders/redis/redis_key_delete.py:30 +msgid "删除方式" +msgstr "delete method" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:83 -#, python-format -msgid "输入参数%s不符合【时区(+08:00、-08:00)】格式" -msgstr "" -"The input parameter %s does not conform to the [time zone (+08:00, -08:00)] " -"format" +#: backend/ticket/builders/redis/redis_key_delete.py:90 +msgid "删除Key" +msgstr "delete key" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:98 -msgid "定时时间需晚于当前时间" -msgstr "The timing time needs to be later than the current time" +#: backend/ticket/builders/redis/redis_key_extract.py:67 +msgid "提取Key" +msgstr "extract key" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:106 -#, python-format -msgid "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" -msgstr "" -"The input parameter %s does not conform to the [second (s) or time (%%Y-%%m-" -"%%d %%H:%%M:%%S)] format" +#: backend/ticket/builders/redis/redis_maxmemory_set.py:80 +msgid "集群maxmemory设置" +msgstr "Cluster maxmemory settings" -#: backend/flow/plugins/components/collections/es/es_dns_manage.py:61 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:37 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:48 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:75 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:57 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:69 -#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:29 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:43 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:78 -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:44 -msgid "该节点获取到执行ip信息为空,请联系系统管理员" -msgstr "" -"The node obtained execution ip information is empty, please contact the " -"system administrator" +#: backend/ticket/builders/redis/redis_open.py:48 +#: backend/ticket/builders/redis/redis_open.py:66 +msgid "启用集群" +msgstr "enable cluster" -#: backend/flow/plugins/components/collections/es/es_dns_manage.py:146 -#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:71 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:93 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:84 -#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:61 -#: backend/flow/plugins/components/collections/pulsar/pulsar_zk_dns_manage.py:51 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:84 -msgid "无法适配到传入的域名处理类型,请联系系统管理员:{}" -msgstr "" -"Unable to adapt to the incoming domain name processing type, please contact " -"the system administrator: {}" +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:31 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:33 +msgid "主从切换对" +msgstr "master-slave switching pair" + +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:43 +msgid "集群{}不存在异常的从库主机" +msgstr "There is no abnormal slave host in cluster {}" + +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:74 +msgid "Redis 新建从库" +msgstr "Redis new slave library" + +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:40 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:38 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:35 +msgid "slave列表" +msgstr "slave list" + +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:93 +msgid "故障自愈" +msgstr "Fault self-healing" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:37 +msgid "master列表" +msgstr "master list" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:39 +msgid "资源申请信息(前端不用传递,后台渲染)" +msgstr "Resource application information (no need to pass it to the front end, rendering in the background)" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:95 +msgid "整机替换" +msgstr "Whole machine replacement" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:29 +msgid "源集群访问入口" +msgstr "Source cluster access entrance" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:30 +msgid "目标集群访问入口" +msgstr "Target cluster access entrance" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:32 +msgid "源实例列表" +msgstr "Source instance list" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:32 +msgid "IP:PORT" +msgstr "IP:PORT" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:34 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:38 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:29 +msgid "包含key" +msgstr "Contains key" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:35 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:39 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:30 +msgid "排除key" +msgstr "exclude key" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:37 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:48 +msgid "执行模式" +msgstr "execution mode" -#: backend/flow/plugins/components/collections/es/exec_es_actuator_script.py:65 -#: backend/flow/plugins/components/collections/es/trans_files.py:47 -#: backend/flow/plugins/components/collections/hdfs/exec_actuator_script.py:69 -#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:53 -#: backend/flow/plugins/components/collections/influxdb/exec_actuator_script.py:62 -#: backend/flow/plugins/components/collections/kafka/exec_actuator_script.py:62 -#: backend/flow/plugins/components/collections/mysql/exec_actuator_script.py:103 -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:60 -#: backend/flow/plugins/components/collections/pulsar/exec_actuator_script.py:66 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:46 -#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:82 -#: backend/flow/plugins/components/collections/redis/trans_flies.py:61 -#: backend/flow/plugins/components/collections/riak/exec_actuator_script.py:80 -#: backend/flow/plugins/components/collections/riak/trans_files.py:47 -msgid "该节点获取到执行ip信息为空,请联系系统管理员{}" -msgstr "" -"The execution ip information obtained by this node is empty, please contact " -"the system administrator {}" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:38 +msgid "执行模式为定时执行时,需要设置执行时间" +msgstr "When the execution mode is scheduled execution, the execution time needs to be set" -#: backend/flow/plugins/components/collections/es/get_es_resource.py:57 -#: backend/flow/plugins/components/collections/kafka/get_kafka_resource.py:50 -msgid "获取机器资源成功成功。 {}" -msgstr "Acquiring the machine resource was successful. {}" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:40 +msgid "是否保持校验" +msgstr "Whether to keep verification" -#: backend/flow/plugins/components/collections/hdfs/get_hdfs_resource.py:61 -#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:48 -msgid "获取机器资源成功。 {}" -msgstr "Acquiring machine resource successfully. {}" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:41 +msgid "校验终止时间,当不保持校验时,需要设置该时间" +msgstr "Verification termination time. When verification is not maintained, this time needs to be set." -#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:48 -msgid "获取DNS操作IP为空" -msgstr "Get DNS operation IP is empty" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:43 +msgid "是否修复数据" +msgstr "Whether to repair data" -#: backend/flow/plugins/components/collections/hdfs/update_hdfs_resource.py:67 -msgid "更新机器资源成功成功。 {}" -msgstr "Updating the machine resource succeeded successfully. {}" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:44 +msgid "数据修复模式" +msgstr "Data Repair Mode" -#: backend/flow/plugins/components/collections/influxdb/trans_flies.py:52 -#: backend/flow/plugins/components/collections/kafka/trans_flies.py:52 -msgid " 下发介质包参数:{}" -msgstr "Send media package parameters: {}" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:46 +msgid "批量校验与修复列表" +msgstr "Batch verification and repair list" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:53 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:105 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:69 +msgid "请补齐缺少正则配置的行" +msgstr "Please complete the missing regular configuration lines" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:74 +#: backend/ticket/constants.py:316 +msgid "Redis 数据校验与修复" +msgstr "Redis data verification and repair" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:51 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:57 +msgid "集群IP端口" +msgstr "Cluster IP port" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:52 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:58 +msgid "集群访问密码" +msgstr "Cluster access password" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:80 +msgid "批量数据复制列表" +msgstr "Batch data copy list" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:99 +msgid "仅支持两个不同集群间的复制: {}" +msgstr "Only supports replication between two different clusters: {}" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:102 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:66 +msgid "源集群不能重复: {}" +msgstr "The source cluster cannot be repeated: {}" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:109 +msgid "源集群{}不存在,请确认." +msgstr "The source cluster {} does not exist, please confirm." + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:111 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:39 +msgid "目标集群{}不存在,请确认." +msgstr "The target cluster {} does not exist, please confirm." + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:134 +msgid "Redis 数据复制" +msgstr "Redis data replication" + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:29 +msgid "关联单据ID" +msgstr "Associated document ID" + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:48 +msgid "集群{}: 没有找到未销毁的实例." +msgstr "Cluster{}: No undestroyed instance found." + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:65 +msgid "Redis 销毁构造实例" +msgstr "Redis destroys the constructed instance" + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:38 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:31 +msgid "待构造时间点" +msgstr "Time point to be constructed" + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:52 +msgid "集群{}: 主机数量({})不能大于实例数量({})." +msgstr "Cluster {}: The number of hosts ({}) cannot be greater than the number of instances ({})." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:66 +msgid "集群{}: 不支持部分实例构造." +msgstr "Cluster{}: Partial instance construction is not supported." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:71 +msgid "集群{}: 构造时间最多向前追溯15天." +msgstr "Cluster{}: The construction time can be traced back up to 15 days." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:106 +msgid "Redis 定点构造" +msgstr "Redis fixed-point construction" + +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:52 +msgid "实例下架" +msgstr "Instance removed from shelves" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:29 +msgid "master主机" +msgstr "master host" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:30 +msgid "slave主机" +msgstr "slave host" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:35 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:33 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:50 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:55 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:58 +msgid "切换类型" +msgstr "Switch type" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:52 +msgid "集群{}的主从关系不匹配:{} -> {}." +msgstr "The master-slave relationship of cluster {} does not match: {} -> {}." + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:73 +#: backend/ticket/constants.py:305 +msgid "Redis 主从切换" +msgstr "Redis master-slave switching" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:28 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:33 +msgid "目标proxy数量" +msgstr "Target number of proxies" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:30 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:28 +msgid "缩容指定主机" +msgstr "Reduce the capacity of a specified host" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:48 +msgid "请保证集群{}缩容后proxy数量不小于2" +msgstr "Please ensure that the number of proxies is not less than 2 after the cluster {} is scaled down." + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:64 +msgid "Proxy缩容" +msgstr "Proxy reduction" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:65 +msgid "Proxy扩容" +msgstr "Proxy expansion" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:45 +msgid "部署机器组数" +msgstr "Number of deployed machine groups" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:53 +msgid "容量变更类型" +msgstr "Capacity change type" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:80 +#: backend/ticket/constants.py:301 +msgid "Redis 集群容量变更" +msgstr "Redis cluster capacity change" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:27 +msgid "构造产物访问入口(ip:port)" +msgstr "Construct product access entrance (ip:port)" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:60 +msgid "构造记录不存在,请确认: {}" +msgstr "Construction record does not exist, please confirm: {}" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:63 +msgid "目标集群不能重复: {}" +msgstr "The target cluster cannot be repeated: {}" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:88 +#: backend/ticket/constants.py:315 +msgid "Redis 构造实例数据回写" +msgstr "Redis constructs instance data writeback" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:43 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:44 +msgid "申请proxy资源" +msgstr "Apply for proxy resources" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:44 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:45 +msgid "申请redis主从资源" +msgstr "Apply for redis master-slave resources" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:47 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:48 +msgid "当前规格ID" +msgstr "Current specification ID" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:48 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:49 +msgid "当前分片数" +msgstr "Current number of shards" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:49 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:50 +msgid "目标分片数" +msgstr "Target number of shards" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:63 +msgid "集群({}):目标分片数({})和原始分片数({})相同." +msgstr "Cluster ({}): The target number of shards ({}) and the original number of shards ({}) are the same." + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:72 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:75 +msgid "集群({}):{} 类集群不支持版本 {}." +msgstr "Cluster({}): {} class cluster does not support version {}." + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:105 +msgid "Redis 集群分片变更" +msgstr "Redis cluster sharding changes" + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:51 +msgid "当前集群类型" +msgstr "Current cluster type" + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:66 +msgid "集群({}):目标类型({})和原始类型({})相同." +msgstr "Cluster ({}): The target type ({}) and the original type ({}) are the same." + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:108 +#: backend/ticket/constants.py:313 +msgid "Redis 集群类型变更" +msgstr "Redis cluster type change" + +#: backend/ticket/builders/riak/riak_apply.py:77 +msgid "Riak 集群部署执行" +msgstr "Riak cluster deployment execution" + +#: backend/ticket/builders/riak/riak_destroy.py:43 +#: backend/ticket/constants.py:389 +msgid "Riak 集群销毁" +msgstr "Riak cluster destroyed" + +#: backend/ticket/builders/riak/riak_disable.py:46 +#: backend/ticket/constants.py:391 +msgid "Riak 集群禁用" +msgstr "Riak cluster disabled" + +#: backend/ticket/builders/riak/riak_enable.py:46 +#: backend/ticket/constants.py:390 +msgid "Riak 集群启用" +msgstr "Riak cluster enabled" + +#: backend/ticket/builders/riak/riak_migrate.py:69 +msgid "Riak 集群迁移执行" +msgstr "Riak cluster migration execution" + +#: backend/ticket/builders/riak/riak_reboot.py:28 +msgid "重启主机ID" +msgstr "Reboot host ID" + +#: backend/ticket/builders/riak/riak_reboot.py:35 +msgid "等待重启的riak节点{}不存在,请重新选择" +msgstr "The riak node {} waiting for restart does not exist, please select again." + +#: backend/ticket/builders/riak/riak_reboot.py:52 +msgid "Riak 集群重启" +msgstr "Riak cluster restart" + +#: backend/ticket/builders/riak/riak_scale_up.py:62 +#: backend/ticket/constants.py:387 +msgid "Riak 集群扩容" +msgstr "Riak cluster expansion" + +#: backend/ticket/builders/riak/riak_shrink.py:45 +#: backend/ticket/constants.py:388 +msgid "Riak 集群缩容" +msgstr "Riak cluster scaling" + +#: backend/ticket/builders/spider/metadata_import.py:34 +msgid "spider规格ID" +msgstr "spider specification ID" + +#: backend/ticket/builders/spider/metadata_import.py:35 +msgid "remote规格ID" +msgstr "remote specification ID" + +#: backend/ticket/builders/spider/metadata_import.py:82 +msgid "spider_spec_id: {} 不存在" +msgstr "spider_spec_id: {} does not exist" + +#: backend/ticket/builders/spider/metadata_import.py:89 +msgid "remote_spec_id: {} 不存在" +msgstr "remote_spec_id: {} does not exist" + +#: backend/ticket/builders/spider/mysql_spider_standardize.py:73 +msgid "TendbCluster 高可用标准化" +msgstr "TendbCluster high availability standardization" + +#: backend/ticket/builders/sqlserver/base.py:85 +msgid "副本集实例状态异常,暂时无法执行该单据类型:{}" +msgstr "The replica set instance status is abnormal and the document type cannot be executed temporarily: {}" + +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:37 +msgid "新slave机器信息" +msgstr "New slave machine information" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:64 -msgid "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" -msgstr "{}. Account rule: {}-{}, source ip: {}, target cluster: {}" +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:66 +msgid "SQLServer 添加Slave执行" +msgstr "SQLServer adds Slave execution" + +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:62 +msgid "SQLServer 授权执行" +msgstr "SQLServer authorized execution" + +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:79 +msgid "SQLServer Excel授权执行" +msgstr "SQLServer Excel authorized execution" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:41 +msgid "备份db列表" +msgstr "Backup db list" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:51 +msgid "备份位置(先固定为master)" +msgstr "Backup location (fixed to master first)" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:67 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:153 +msgid "SQLServer 库表备份执行" +msgstr "SQLServer database table backup execution" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:42 +msgid "同步的数据库" +msgstr "Synchronized database" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:44 +msgid "同步信息列表" +msgstr "Synchronized information list" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:61 +msgid "SQLServer 同步数据" +msgstr "SQLServer synchronizes data" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:26 +msgid "清档db列表" +msgstr "Clear db list" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:27 +msgid "清档db正则列表" +msgstr "Clear db regular list" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:29 +msgid "忽略db正则列表" +msgstr "Ignore db regular list" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:31 +msgid "清档表" +msgstr "clearance list" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:32 +msgid "忽略表" +msgstr "ignore table" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:56 +msgid "SQLServer 清档执行" +msgstr "SQLServer cleanup execution" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:33 +msgid "源集群库名" +msgstr "Source cluster library name" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:31 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:34 +msgid "目标集群库名" +msgstr "Target cluster library name" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:36 +msgid "集群重命名库名" +msgstr "Cluster rename library name" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:48 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:52 +msgid "迁移DB信息" +msgstr "Migrate DB information" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:49 +msgid "迁移记录ID" +msgstr "Migration record ID" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:51 +msgid "迁移后,系统是否对源DB进行重命名" +msgstr "After migration, whether the system renames the source DB" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:52 +msgid "手动终止迁移" +msgstr "Terminate migration manually" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:53 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:56 +msgid "迁移信息列表" +msgstr "Migration information list" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:149 +msgid "SQLServer 全备迁移执行" +msgstr "SQLServer full migration execution" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:213 +msgid "SQLServer 增量迁移执行(断开同步)" +msgstr "SQLServer incremental migration execution (disconnect synchronization)" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:225 +msgid "SQLServer 目标数据库重命名" +msgstr "SQLServer target database rename" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:231 +msgid "SQLServer 源数据库重命名" +msgstr "SQLServer source database rename" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:252 +msgid "SQLServer 增量迁移执行" +msgstr "SQLServer incremental migration execution" + +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:68 +msgid "SQLServer DB重命名执行" +msgstr "SQLServer DB rename execution" + +#: backend/ticket/builders/sqlserver/sqlserver_destroy.py:35 +msgid "SQLServer 销毁执行" +msgstr "SQLServer destroy execution" + +#: backend/ticket/builders/sqlserver/sqlserver_disable.py:38 +msgid "SQLServer 禁用执行" +msgstr "SQLServer disable execution" + +#: backend/ticket/builders/sqlserver/sqlserver_enable.py:39 +msgid "SQLServer 启用执行" +msgstr "SQLServer enable execution" + +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:49 +msgid "机器输入数量{}有误,预期数量{}" +msgstr "The machine input quantity {} is incorrect, the expected quantity {}" + +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:114 +msgid "SQLServer 高可用部署执行" +msgstr "SQLServer High Availability Deployment Execution" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:31 +msgid "执行DB" +msgstr "Execute DB" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:42 +msgid "忽略备份db列表" +msgstr "Ignore backup db list" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:88 +msgid "所选备份DB信息为空,请检查库表正则" +msgstr "The selected backup DB information is empty, please check the database table regularity" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +msgid "定时执行(人工确认)" +msgstr "Scheduled execution (manual confirmation)" + +#: backend/ticket/builders/sqlserver/sqlserver_master_fail_over.py:24 +msgid "是否强制切换(强切固定为true)" +msgstr "Whether to force switching (forced switching is fixed to true)" + +#: backend/ticket/builders/sqlserver/sqlserver_master_fail_over.py:44 +msgid "SQLServer 主故障切换执行" +msgstr "SQLServer Primary Failover Execution" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:70 -msgid "" -"授权规则明细:\n" -"{}\n" -msgstr "" -"Authorization rule details:\n" -"{}\n" +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:29 +msgid "是否强制切换(互切固定为false)" +msgstr "Whether to force switching (mutual switching is fixed to false)" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:83 -msgid "「授权接口返回结果异常」{}" -msgstr "Authorization interface returns abnormal result {}" +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:55 +msgid "SQLServer 主从互换执行" +msgstr "SQLServer master-slave interchange execution" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:85 -msgid "「授权接口调用异常」{}" -msgstr "Authorization interface call exception {}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:27 +msgid "重置集群名" +msgstr "Reset cluster name" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:88 -msgid "授权异常,相关信息: {}\n" -msgstr "Authorization exception, related information: {}\n" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:28 +msgid "重置集群主域名" +msgstr "Reset the cluster primary domain name" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:95 -msgid "授权整体结果{}" -msgstr "Authorization overall result{}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:29 +msgid "重置集群从域名" +msgstr "Reset the cluster from domain name" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:99 -msgid "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" -msgstr "" -"The number of Excel import authorization lines: {}, the number of successful " -"authorization: {}, the number of failed authorization: {}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:31 +msgid "集群重置信息" +msgstr "Cluster reset information" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:108 -msgid "" -"授权结果详情请下载excel: excel 下载" -msgstr "" -"For details of authorization results, please download excel: excel download" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:38 +msgid "集群:{}不处于禁用态,无法重置" +msgstr "Cluster: {} is not disabled and cannot be reset" -#: backend/flow/plugins/components/collections/mysql/build_database_table_filter_regex.py:47 -msgid "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" -msgstr "[{}] Success: db_table_filter_regex: {}, db_filter_regex: {}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:53 +msgid "SQLServer 集群重置执行" +msgstr "SQLServer cluster reset execution" -#: backend/flow/plugins/components/collections/mysql/clear_machine.py:45 -msgid "机器还在系统中注册,暂不用清理[{}]" -msgstr "" -"The machine is still registered in the system, there is no need to clean " -"up[{}]" +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:57 +msgid "SQLServer Slave原地重建执行" +msgstr "SQLServer Slave rebuilds execution in place" -#: backend/flow/plugins/components/collections/mysql/clear_machine.py:50 -msgid "本次操作没有机器可以清理,提前结束活动节点" -msgstr "" -"There is no machine to clean up in this operation, and the active node is " -"terminated early" +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:36 +msgid "旧slave机器信息" +msgstr "Old slave machine information" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:92 -#: backend/flow/plugins/components/collections/mysql/clone_user.py:61 -msgid "「权限克隆返回结果异常」{}" -msgstr "The return result of permission cloning is abnormal {}" +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:116 +msgid "SQLServer Slave重建执行" +msgstr "SQLServer Slave rebuild execution" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:94 -#: backend/flow/plugins/components/collections/mysql/clone_user.py:63 -msgid "「权限克隆调用异常」{}" -msgstr "Privilege clone call exception {}" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:45 +msgid "备份ID" +msgstr "Backup ID" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:98 -msgid "权限克隆失败,错误信息: {}\n" -msgstr "Permission clone failed, error message: {}\n" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:46 +msgid "备份日志" +msgstr "Backup log" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:105 -msgid "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" -msgstr "" -"The overall execution result of permission cloning—total: {}, success: {}, " -"failure: {}\n" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:57 +msgid "是否原地构造" +msgstr "Whether to construct in situ" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:111 -msgid "" -"详情请下载excel: excel 下载" -msgstr "" -"For details, please download excel: excel " -"download" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:140 +msgid "SQLServer 定点构造执行" +msgstr "SQLServer fixed-point construction execution" -#: backend/flow/plugins/components/collections/mysql/clone_user.py:64 -msgid "执行克隆失败!" -msgstr "Failed to execute clone!" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:146 +msgid "SQLServer 数据库重命名" +msgstr "SQLServer database rename" -#: backend/flow/plugins/components/collections/mysql/create_user.py:52 -msgid "在「{}」创建临时用户「{}@{}」成功" -msgstr "Successfully created temporary user {}@{} at {}" +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:70 +msgid "SQLServer起始端口" +msgstr "SQLServer starting port" -#: backend/flow/plugins/components/collections/mysql/create_user.py:54 -msgid "创建用户接口异常,相关信息: {}" -msgstr "Create user interface exception, related information: {}" +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:206 +msgid "SQLServer 单节点部署执行" +msgstr "SQLServer single node deployment execution" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:38 -msgid "在「{}」执行sql失败,相关信息: {}" -msgstr "Failed to execute sql in \"{}\", related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:32 +msgid "订阅库名" +msgstr "Subscription library name" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:42 -msgid "在「{}」执行sql{}失败,相关信息: {}" -msgstr "Failed to execute sql{} in \"{}\", related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:33 +msgid "订阅表名列表" +msgstr "Subscription table name list" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:49 -msgid "删除用户接口异常,相关信息: {}" -msgstr "Delete user interface exception, related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:36 +msgid "数据库原源群" +msgstr "Database source group" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:52 -msgid "在「{}」删除临时用户「{}@{}」成功" -msgstr "Successfully deleted temporary user {}@{} at {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:37 +msgid "集群module id" +msgstr "cluster module id" -#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:58 -msgid "这是一个fake的模拟执行" -msgstr "This is a simulated execution of a fake" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:38 +msgid "部署的dumper id" +msgstr "Deployed dumper id" -#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:65 -msgid "语义检查执行成功" -msgstr "Semantic check performed successfully" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:40 +msgid "接收端集群域名/IP" +msgstr "Receiver cluster domain name/IP" -#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:91 -msgid "[{}] 过滤所得库表: {}" -msgstr "[{}] Filtered database table: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:41 +msgid "接收端端口" +msgstr "Receiver port" -#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:94 -msgid "[{}] 未匹配到任何库" -msgstr "[{}] did not match any libraries" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:43 +msgid "l5_modid配置" +msgstr "l5_modid arrangement" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:56 -msgid "在{}执行sql失败,相关信息: {}" -msgstr "Failed to execute sql in {}, related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:44 +msgid "l5_cmdid配置" +msgstr "l5_cmdid configuration" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:61 -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:68 -msgid "在{}执行sql{}失败,相关信息: {}" -msgstr "Failed to execute sql{} in {}, related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:45 +msgid "kafka用户名" +msgstr "kafka username" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:87 -msgid "查询数据库接口异常,相关信息: {}" -msgstr "Query database interface exception, related information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:46 +msgid "kafka密码" +msgstr "kafka password" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:90 -msgid "uid:{}" -msgstr "uid:{}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:48 +msgid "订阅名称" +msgstr "Subscription name" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:119 -msgid "ERROR 数据不一致的表的数量: {}" -msgstr "ERROR Number of tables with inconsistent data: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:50 +msgid "订阅库表" +msgstr "Subscription library table" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:120 -msgid "WARNING 被跳过校验的表的数量: {}" -msgstr "WARNING Number of tables skipped for validation: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:51 +msgid "dumper配置信息" +msgstr "dumper configuration information" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:121 -msgid "SUCCESS 数据一致的表的数量: {}" -msgstr "Number of tables with consistent SUCCESS data: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:79 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:106 +msgid "全局订阅中, 数据源 + 接收端(类型+接收地址)需要唯一" +msgstr "In global subscription, the data source + receiving end (type + receiving address) need to be unique" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:83 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:127 +msgid "同一个订阅中,dumper ID + 接收端(类型+接收地址) 需要唯一" +msgstr "In the same subscription, dumper ID + receiving end (type + receiving address) need to be unique" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:135 +msgid "接收端协议选择KAFKA时,请填写kafka用户名和密码" +msgstr "When KAFKA is selected as the receiving protocol, please fill in the kafka username and password." + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:137 +msgid "接收端协议选择L5_AGENT时,请填写l5_modid和l5_cmdid" +msgstr "When the receiving protocol selects L5_AGENT, please fill in l5_modid and l5_cmdid" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:180 +msgid "Tbinlogdumper 上架" +msgstr "Tbinlogdumper is on the shelves" + +#: backend/ticket/builders/tbinlogdumper/dumper_disable.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_enable.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_reduce_nodes.py:30 +msgid "dumper实例ID" +msgstr "dumper instance ID" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:126 -msgid "ERROR 校验失败,数据不一致的表:" -msgstr "ERROR Validation failed, table with inconsistent data:" +#: backend/ticket/builders/tbinlogdumper/dumper_disable.py:38 +msgid "Tbinlogdumper 禁用" +msgstr "Tbinlogdumper disabled" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:132 -msgid "WARNING 校验程序没有校验的表:" -msgstr "WARNING Table not validated by validator:" +#: backend/ticket/builders/tbinlogdumper/dumper_enable.py:38 +msgid "Tbinlogdumper 启用" +msgstr "Tbinlogdumper enabled" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:138 -msgid "SUCCESS 校验成功,数据一致的表:" -msgstr "SUCCESS verification is successful, the table with consistent data:" +#: backend/ticket/builders/tbinlogdumper/dumper_reduce_nodes.py:72 +msgid "Tbinlogdumper 下架" +msgstr "Tbinlogdumper removed from shelves" -#: backend/flow/plugins/components/collections/mysql/mysql_db_meta.py:41 -#: backend/flow/plugins/components/collections/redis/get_redis_payload.py:45 -#: backend/flow/plugins/components/collections/redis/redis_db_meta.py:45 -#: backend/flow/plugins/components/collections/spider/spider_db_meta.py:40 -msgid "集群元信息:{}" -msgstr "Cluster meta information: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:25 +msgid "dumper进程ID" +msgstr "dumper process ID" -#: backend/flow/plugins/components/collections/mysql/mysql_link_backup_id_bill_id.py:28 -msgid "[{}] 备份 id: {}" -msgstr "[{}] backup id: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:46 +msgid "Tbinlogdumper 切换" +msgstr "Tbinlogdumper toggle" -#: backend/flow/plugins/components/collections/mysql/mysql_master_slave_relationship_check.py:72 -msgid "主备关系校验成功" -msgstr "Master-standby relationship verification succeeded" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:41 +msgid "{} 不是 [{}]{} 的集群" +msgstr "{} is not a cluster of [{}]{}" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:40 -msgid "分区管理服务api异常,相关信息: {}" -msgstr "Partition management service api exception, related information: {}" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:60 +msgid "{} spider master 数量不足 2 个" +msgstr "{} The number of spider masters is less than 2" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:45 -#: backend/flow/plugins/components/collections/mysql/upload_file.py:43 -msgid "单据id{}" -msgstr "ticket id {}" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:65 +msgid "{} remote 数量异常" +msgstr "{} The number of remotes is abnormal" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:46 -msgid "获取分区语句成功" -msgstr "Get partition statement succeeded" +#: backend/ticket/builders/tendbcluster/base.py:112 +msgid "【{}】请保证集群部署的接入层主节点和运维节点的总和小于37" +msgstr "[{}] Please ensure that the total number of access layer master nodes and operation and maintenance nodes deployed in the cluster is less than 37" -#: backend/flow/plugins/components/collections/mysql/rename_database_confirm_empty_from.py:69 -msgid "确认源数据库已空完成" -msgstr "Confirm that the source database is empty" +#: backend/ticket/builders/tendbcluster/base.py:129 +msgid "【{}】请保证缩容后的接入层数量小于当前节点数量" +msgstr "[{}] Please ensure that the number of access layers after scaling is smaller than the current number of nodes." -#: backend/flow/plugins/components/collections/mysql/rename_database_drop_from.py:51 -msgid "删除源数据库完成" -msgstr "Delete source database complete" +#: backend/ticket/builders/tendbcluster/base.py:133 +msgid "【{}】请保证缩容后的接入层spider master数量>=2" +msgstr "[{}] Please ensure that the number of spider masters in the access layer after scaling is >= 2" -#: backend/flow/plugins/components/collections/mysql/rename_database_prepare_param.py:28 -msgid "[{}] 构造 old_new_map 完成: {}" -msgstr "[{}] Construct old_new_map completed: {}" +#: backend/ticket/builders/tendbcluster/base.py:136 +msgid "【{}】请保证缩容后的接入层spider slave数量>=1" +msgstr "[{}] Please ensure that the number of spider slaves in the access layer after scaling is >= 1" -#: backend/flow/plugins/components/collections/mysql/rollback_trans_flies.py:53 -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:63 -msgid "没有符合的备份文件提供定点恢复" -msgstr "There is no matching backup file to provide fixed-point recovery" +#: backend/ticket/builders/tendbcluster/base.py:155 +msgid "集群总分片数{}与单机分片数{}、机器部署组数{}不匹配" +msgstr "The total number of cluster shards{} does not match the number of single-machine shards{} and the number of machine deployment groups{}" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:56 -msgid "创建模拟执行任务resp{}" -msgstr "Create a simulated execution task resp{}" +#: backend/ticket/builders/tendbcluster/base.py:165 +msgid "是否只禁用只读接入层" +msgstr "Whether to disable only the read-only access layer" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:60 -msgid "创建模拟任务失败:{}" -msgstr "Failed to create mock task: {}" +#: backend/ticket/builders/tendbcluster/base.py:166 +msgid "是否只启用只读接入层" +msgstr "Whether to enable only the read-only access layer" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:62 -msgid "创建模拟任务成功" -msgstr "Create mock task successfully" +#: backend/ticket/builders/tendbcluster/tendb_apply.py:44 +msgid "集群访问端口" +msgstr "cluster access port" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:66 -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:68 -msgid "「执行语义分析任务异常」{}" -msgstr "Execution of semantic analysis task exception {}" +#: backend/ticket/builders/tendbcluster/tendb_apply.py:46 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:34 +msgid "单机分片数" +msgstr "Number of shards on a single machine" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:69 -msgid "创建模拟任务失败!" -msgstr "Failed to create simulation task!" +#: backend/ticket/builders/tendbcluster/tendb_apply.py:125 +msgid "TenDB Cluster 集群部署执行" +msgstr "TenDB Cluster deployment execution" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:119 -msgid "语义检查出发的自动创建单据" -msgstr "Automatic creation of tickets starting from semantic check" +#: backend/ticket/builders/tendbcluster/tendb_authorize_rules.py:29 +#: backend/ticket/builders/tendbcluster/tendb_authorize_rules.py:44 +msgid "TenDB Cluster 授权执行" +msgstr "TenDB Cluster authorized execution" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:42 -msgid "仅在主库查找备份源" -msgstr "Find the backup source only in the master" +#: backend/ticket/builders/tendbcluster/tendb_backup.py:32 +msgid "库表备份信息" +msgstr "Database table backup information" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:46 -msgid "在主、从库查找备份源" -msgstr "Find the backup source in the master and slave libraries" +#: backend/ticket/builders/tendbcluster/tendb_backup.py:51 +#: backend/ticket/constants.py:213 +msgid "TenDB Cluster 库表备份" +msgstr "TenDB Cluster database table backup" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:50 -msgid "从备份源中筛选符合的备份" -msgstr "Filter matching backups from backup sources" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:44 +msgid "是否修复" +msgstr "Whether to repair" -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:66 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:52 -msgid "" -"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" -"{}" -msgstr "" -"Select the file transfer mode between servers. The machine ip list that " -"should be the source file cannot be empty. Please contact the system " -"administrator{}" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:45 +msgid "数据校验后修复执行类型" +msgstr "Repair execution type after data verification" -#: backend/flow/plugins/components/collections/mysql/truncate_data_create_stage_database.py:55 -msgid "建立备份库完成" -msgstr "Create a backup db complete" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:49 +msgid "主库实例" +msgstr "Main library instance" -#: backend/flow/plugins/components/collections/mysql/truncate_data_drop_stage_database.py:49 -msgid "删除备份库完成" -msgstr "Deleting the backup repository is complete" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:50 +msgid "从库实例" +msgstr "Example from library" -#: backend/flow/plugins/components/collections/mysql/truncate_data_generate_stage_database_name.py:31 -msgid "生成备份库名完成" -msgstr "Generate backup db name complete" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:57 +msgid "校验范围" +msgstr "Calibration range" -#: backend/flow/plugins/components/collections/mysql/truncate_data_recreate_table.py:60 -msgid "重建表成功" -msgstr "rebuild table successfully" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:63 +msgid "全备信息列表" +msgstr "Full information list" -#: backend/flow/plugins/components/collections/mysql/truncate_data_rename_table.py:88 -msgid "[{}] 备份清档表完成" -msgstr "[{}] Backup cleanup table completed" +#: backend/ticket/builders/tendbcluster/tendb_clear.py:46 +msgid "TenDB Cluster 清档执行" +msgstr "TenDB Cluster cleanup execution" -#: backend/flow/plugins/components/collections/mysql/upload_file.py:38 -msgid "分区sql为空无需上传" -msgstr "Partition sql is empty and no need to upload" +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:41 +msgid "TenDB Cluster 客户端权限克隆执行" +msgstr "TenDB Cluster client permission clone execution" -#: backend/flow/plugins/components/collections/mysql/upload_file.py:44 -msgid "分区sql文件上传成功" -msgstr "Partition sql file uploaded successfully" +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:49 +msgid "TenDB Cluster 实例权限克隆执行" +msgstr "TenDB Cluster instance permission clone execution" -#: backend/flow/plugins/components/collections/pulsar/blank_schedule_service.py:66 -msgid "successfully enter blank schedule, interval times: {}" -msgstr "successfully enter blank schedule, interval times: {}" +#: backend/ticket/builders/tendbcluster/tendb_data_repair.py:46 +msgid "Tendb Cluster 数据修复执行" +msgstr "Tendb Cluster data repair execution" -#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:100 -msgid "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" -msgstr "" -"[{}] kwargs['payload'] is incomplete, you need to add {} content to " -"payload" +#: backend/ticket/builders/tendbcluster/tendb_destroy.py:37 +msgid "TenDB Cluster 下架执行" +msgstr "TenDB Cluster delisting execution" -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:113 -msgid "无符合要求机器" -msgstr "No matching machine" +#: backend/ticket/builders/tendbcluster/tendb_disable.py:40 +msgid "TenDB Cluster 禁用执行" +msgstr "TenDB Cluster disable execution" -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:117 -msgid "获取最大磁盘空闲机器失败:{}" -msgstr "Failed to get max disk free machines: {}" +#: backend/ticket/builders/tendbcluster/tendb_dump_data.py:41 +msgid "Tendb Cluster 数据导出执行" +msgstr "Tendb Cluster data export execution" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:393 -msgid "源redis集群{}存在{}个非running状态的slave" -msgstr "There are {} non-running slaves in the source redis cluster {}" +#: backend/ticket/builders/tendbcluster/tendb_enable.py:40 +msgid "TenDB Cluster 启用执行" +msgstr "TenDB Cluster enable execution" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:450 -msgid "所有源redis slave机器:{} 磁盘空间检查通过" -msgstr "All source redis slave machines: {} disk space check passed" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:39 +msgid "spider新机器" +msgstr "spider new machine" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:461 -msgid "src_cluster:{} type:{} 无需检查cluster nodes是否ok" -msgstr "" -"src_cluster:{} type:{} No need to check whether the cluster nodes are ok" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:40 +msgid "remote新机器" +msgstr "remote new machine" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:523 -msgid "src_cluster:{} 类型是:{} 无需检查cluster state" -msgstr "src_cluster: {} type is: {} no need to check cluster state" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:45 +msgid "回档类型" +msgstr "rollback type" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:696 -msgid "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" -msgstr "bill_id:{} src_cluster:{} dst_cluster:{} Some tasks migration failed" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:62 +msgid "回档信息" +msgstr "rollback information" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:705 -msgid "" -"bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了迁移进程" -msgstr "" -"bill_id:{} src_cluster:{} dst_cluster:{} All tasks are successful and the " -"migration process is terminated" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:214 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:224 +msgid "TenDBCluster 回档执行" +msgstr "TenDBCluster rollback execution" + +#: backend/ticket/builders/tendbcluster/tendb_flashback.py:49 +msgid "TenDB Cluster 闪回执行" +msgstr "TenDB Cluster flashback execution" + +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:27 +msgid "备份位置信息" +msgstr "Back up location information" + +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:29 +msgid "备份选项" +msgstr "Backup options" + +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:31 +msgid "集群备份信息" +msgstr "Cluster backup information" + +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:56 +msgid "备份位置选择spider_mnt时,请提供运维节点的地址" +msgstr "When selecting spider_mnt as the backup location, please provide the address of the operation and maintenance node." + +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:69 +#: backend/ticket/constants.py:236 +msgid "TenDB Cluster 全库备份" +msgstr "TenDB Cluster full database backup" + +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:23 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:32 +msgid "是否强制执行(互切不强制,故障切强制)" +msgstr "Whether to enforce it (mutual switching is not mandatory, fault switching is mandatory)" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:715 -msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" -msgstr "" -"bill_id:{} src_cluster:{} dst_cluster:{} All tasks are incremental " -"synchronization" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:24 +msgid "是否检测数据同步延时情况" +msgstr "Whether to detect data synchronization delay" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:797 -msgid "task:{} {}:{} 迁移失败" -msgstr "task:{} {}:{} migration failed" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:28 +msgid "主故障切换场景需要强制执行" +msgstr "Primary failover scenario needs to be enforced" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:862 -msgid "{}中有{}个proxy不是running状态" -msgstr "{} proxy in {} is not running" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:41 +msgid "TendbCluster 主故障切换" +msgstr "TendbCluster Master Failover" -#: backend/flow/plugins/components/collections/redis/trans_flies.py:87 -msgid "下发介质包失败: [{}/{}] resp:{}" -msgstr "Failed to deliver media package: [{}/{}] resp:{}" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:25 +msgid "主库信息" +msgstr "Main database information" -#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:43 -msgid "获取机器资源失败,新建集群至少3台机器,添加节点至少1台机器" -msgstr "Failed to obtain machine resources, create a new cluster with at least 3 machines, add a node with at least 1 machine" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:26 +msgid "从库信息" +msgstr "Information from the database" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:60 -msgid "select mysql.servers failed: {}" -msgstr "select mysql.servers failed: {}" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:28 +msgid "切换的主从组" +msgstr "Switched master-slave group" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:94 -msgid "TdbCtl-create-node failed: {}" -msgstr "TdbCtl-create-node failed: {}" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:41 +msgid "主从互切场景:非强制执行,强制检查延时" +msgstr "Master-slave mutual switching scenario: non-mandatory execution, mandatory check delay" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:142 -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:148 -#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:23 -msgid "在[{}]创建添加内置账号成功" -msgstr "Created and added built-in account in [{}] successfully" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:54 +msgid "TendbCluster 主从互换执行" +msgstr "TendbCluster master-slave swap execution" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:151 -#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:25 -msgid "[{}]添加用户接口异常,相关信息: {}" -msgstr "[{}] Add user interface exception, related information: {}" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:28 +msgid "旧主库主机" +msgstr "Old main library host" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:186 -msgid "This spider-role is not supported,check" -msgstr "This spider-role is not supported,check" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:29 +msgid "旧从库主机" +msgstr "Old slave host" -#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:45 -msgid "{} {} 检查库表是否在用" -msgstr "{} {} Check if the database table is in use" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:36 +msgid "克隆主从信息" +msgstr "Clone master-slave information" -#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:50 -msgid "{} 检查库表是否在用" -msgstr "{} Check if the database table is in use" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:78 +msgid "TenDB Cluster 主从迁移执行" +msgstr "TenDB Cluster master-slave migration execution" -#: backend/flow/plugins/components/collections/spider/clear_database_on_remote_service.py:56 -msgid "remote drop 新库完成" -msgstr "remote drop new database completed" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:26 +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:24 +msgid "运维节点信息" +msgstr "Operation and maintenance node information" -#: backend/flow/plugins/components/collections/spider/create_database_like_via_ctl.py:110 -msgid "建立集群备份库表完成" -msgstr "The establishment of the cluster backup database table is completed" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:28 +msgid "添加spider运维节点信息" +msgstr "Add spider operation and maintenance node information" -#: backend/flow/plugins/components/collections/spider/drop_spider_table_via_ctl.py:49 -msgid "删除老数据库完成" -msgstr "Delete the old database complete" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:52 +msgid "TendbCluster 添加运维节点" +msgstr "TendbCluster adds operation and maintenance nodes" -#: backend/flow/plugins/components/collections/spider/truncate_database_drop_stage_db_via_ctl.py:47 -msgid "清理备份库完成" -msgstr "Clean up the backup database is complete" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:26 +msgid "下架spider运维节点信息" +msgstr "Remove spider operation and maintenance node information" -#: backend/flow/plugins/components/collections/spider/truncate_database_on_spider_via_ctl.py:145 -msgid "处理集群表完成" -msgstr "Processing cluster table complete" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:27 +msgid "是否安全模式执行" +msgstr "Whether to execute in safe mode" -#: backend/flow/signal/handlers.py:35 -msgid "【状态信号捕获】{} root_id={}, node_id={}, status:{}" -msgstr "【Status signal capture】{} root_id={}, node_id={}, status:{}" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:42 +msgid "TendbCluster 下架运维节点" +msgstr "TendbCluster removes operation and maintenance nodes" -#: backend/flow/signal/handlers.py:68 -msgid "【状态信号捕获】未查找到FlowTree root_id={}" -msgstr "[Status signal capture] FlowTree root_id={} not found" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:35 +msgid "规格要求" +msgstr "Specification requirements" -#: backend/flow/utils/cc_manage.py:55 -msgid "查询主机bk_host_id失败[数量不匹配]" -msgstr "Failed to query host bk_host_id [number does not match]" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:37 +msgid "变更前的规格名" +msgstr "Specification name before change" -#: backend/flow/utils/cc_manage.py:67 -msgid "查询空闲机模块ID bk_module_id 失败" -msgstr "Failed to query the idle machine module ID bk_module_id" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:38 +msgid "变更前机器组数" +msgstr "Number of machine groups before change" -#: backend/flow/utils/cloud/cloud_act_payload.py:42 -msgid "单据中不包含DRS的部署信息" -msgstr "The ticket does not contain the deployment information of DRS" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:40 +msgid "集群扩缩容信息" +msgstr "Cluster expansion and contraction information" -#: backend/flow/utils/cloud/cloud_act_payload.py:50 -msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" -msgstr "" -"The DNS service has not been deployed, please deploy the service after the " -"DNS service is deployed" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:47 +msgid "执行前是否需要数据校验" +msgstr "Whether data verification is required before execution" -#: backend/flow/utils/cloud/cloud_act_payload.py:58 -msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" -msgstr "" -"The Nginx service is not deployed, please deploy the service after the Nginx " -"service is deployed" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:48 +msgid "数据校验触发类型" +msgstr "Data verification trigger type" -#: backend/flow/utils/cloud/cloud_db_proxy.py:52 -msgid "找不到单据类型需要变更的proxy函数,服务信息入库失败" -msgstr "The proxy function that needs to be changed in the ticket type cannot be found, and the service information storage fails" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:49 +msgid "数据校验 触发时间" +msgstr "Data verification trigger time" -#: backend/flow/utils/cloud/cloud_module_operate.py:135 -msgid "主机{}转移{}失败,转移参数:{}, 错误信息:{}" -msgstr "Host {} transfer {} failed, transfer parameters: {}, error message: {}" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:93 +msgid "TendbCluster 集群容量变更" +msgstr "TendbCluster cluster capacity change" -#: backend/flow/utils/cloud/cloud_module_operate.py:196 -msgid "主机{}转移待回收失败,错误信息:{}" -msgstr "The transfer of host {} to be recycled failed, error message: {}" +#: backend/ticket/builders/tendbcluster/tendb_openarea.py:31 +msgid "Tendb Cluster 开区执行" +msgstr "Tendb Cluster zone execution" -#: backend/flow/utils/es/es_db_meta.py:94 -msgid "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" -msgstr "" -"The cmdb function {} that needs to be changed cannot be found, please " -"contact the system administrator" +#: backend/ticket/builders/tendbcluster/tendb_rename.py:42 +msgid "TenDBCluster Cluster 重命名执行" +msgstr "TenDBCluster Cluster rename execution" -#: backend/flow/utils/hdfs/hdfs_db_meta.py:52 -#: backend/flow/utils/influxdb/influxdb_db_meta.py:114 -#: backend/flow/utils/kafka/kafka_db_meta.py:160 -#: backend/flow/utils/redis/redis_db_meta.py:48 -msgid "找不到单据类型需要变更的cmdb函数,请联系系统管理员" -msgstr "" -"The cmdb function that needs to be changed cannot be found, please contact " -"the system administrator" +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:83 +msgid "TenDB Cluster Slave原地重建执行" +msgstr "TenDB Cluster Slave in-situ reconstruction execution" -#: backend/flow/utils/mysql/db_resource.py:106 -msgid " 获取资源失败: {}" -msgstr "Failed to fetch resource: {}" +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:30 +msgid "新从库资源池参数" +msgstr "New slave library resource pool parameters" -#: backend/flow/utils/mysql/db_table_filter/exception.py:18 -msgid "库表过滤异常" -msgstr "Database table filtering exception" +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:80 +#: backend/ticket/constants.py:227 +msgid "TenDB Cluster Slave重建" +msgstr "TenDB Cluster Slave rebuild" -#: backend/flow/utils/mysql/db_table_filter/exception.py:23 -msgid "输入校验异常" -msgstr "input validation exception" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:30 +msgid "接入层类型" +msgstr "Access layer type" -#: backend/flow/utils/mysql/db_table_filter/filter.py:42 -msgid "include patterns 不能为空" -msgstr "include patterns cannot be empty" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:31 +msgid "规格参数" +msgstr "Specifications" -#: backend/flow/utils/mysql/db_table_filter/filter.py:48 -msgid "exclude patterns 要么同时为空, 要么都不为空" -msgstr "" -"exclude patterns are either empty at the same time, or none of them are empty" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:34 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:38 +msgid "机器导入类型" +msgstr "Machine import type" -#: backend/flow/utils/mysql/db_table_filter/tools.py:30 -msgid "使用通配符时, 只能有一个模式: {}" -msgstr "When using wildcards, there can only be one pattern: {}" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:36 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:36 +msgid "扩容信息" +msgstr "Expansion information" -#: backend/flow/utils/mysql/db_table_filter/tools.py:33 -msgid "% ? 不能独立使用" -msgstr "% ? cannot be used independently" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:71 +msgid "TenDBCluster Cluster 接入层扩容" +msgstr "TenDBCluster Cluster access layer expansion" -#: backend/flow/utils/mysql/db_table_filter/tools.py:36 -msgid "* 只能独立使用" -msgstr "* can only be used independently" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:26 +msgid "剩余spider数量" +msgstr "Number of remaining spiders" -#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:27 -msgid "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" -msgstr "" -"The exec_ip variable and the get_trans_data_ip_var variable cannot be " -"assigned at the same time" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:31 +msgid "缩容的角色" +msgstr "Shrunken role" -#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:29 -msgid "exec_ip变量和get_trans_data_ip_var变量不能同时为None" -msgstr "" -"The exec_ip variable and the get_trans_data_ip_var variable cannot be None " -"at the same time" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:35 +msgid "缩容信息" +msgstr "Shrink information" -#: backend/flow/utils/mysql/mysql_act_playload.py:305 -msgid "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" -msgstr "" -"The incoming mysql port list is empty or an illegal value, please contact " -"the system administrator" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:54 +msgid "TenDB Cluster 接入层缩容" +msgstr "TenDB Cluster access layer reduction" -#: backend/flow/utils/mysql/mysql_act_playload.py:349 -msgid "传入的安装spider端口列表为空或者非法值,请联系系统管理员" -msgstr "The incoming installation spider port list is empty or an illegal value, please contact the system administrator" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:32 +msgid "slave信息" +msgstr "slave information" -#: backend/flow/utils/mysql/mysql_act_playload.py:676 -msgid "不支持的机器类型: {}" -msgstr "Unsupported machine type: {}" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:34 +msgid "资源规格参数" +msgstr "Resource specification parameters" -#: backend/flow/utils/pulsar/consts.py:20 -msgid "broker默认分区数" -msgstr "broker default number of partitions" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:50 +msgid "集群{}已经存在只读接入层,无法再次部署" +msgstr "Cluster {} already has a read-only access layer and cannot be deployed again." -#: backend/flow/utils/pulsar/consts.py:21 -msgid "broker认证配置" -msgstr "Broker authentication configuration" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:86 +#: backend/ticket/constants.py:225 +msgid "TenDB Cluster 部署只读接入层" +msgstr "TenDB Cluster deploys a read-only access layer" -#: backend/flow/utils/pulsar/consts.py:22 -msgid "默认bookie池大小" -msgstr "Default bookie pool size" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:34 +#: backend/ticket/constants.py:226 +msgid "TenDB Cluster 只读接入层下架" +msgstr "TenDB Cluster read-only access layer removed" -#: backend/flow/utils/pulsar/consts.py:23 -msgid "写入副本数" -msgstr "Write replicas" +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:49 +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:63 +msgid "TenDBCluster 临时集群下架" +msgstr "TenDBCluster temporary cluster removed" -#: backend/flow/utils/pulsar/consts.py:24 -msgid "确认写入副本数" -msgstr "Acknowledge the number of replicas written" +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:55 +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:63 +msgid "TenDBCluster 临时集群销毁" +msgstr "TenDBCluster temporary cluster destruction" -#: backend/flow/utils/pulsar/consts.py:25 -msgid "数据保留时间,单位为分钟" -msgstr "Data retention time, in minutes" +#: backend/ticket/builders/tendbsingle/standardize.py:52 +msgid "TenDB Single 标准化" +msgstr "TenDB Single Standardization" -#: backend/flow/utils/pulsar/consts.py:26 -msgid "broker服务端口" -msgstr "broker service port" +#: backend/ticket/constants.py:32 +msgid "主流程-人工确认" +msgstr "Main Process - Manual Confirmation" -#: backend/flow/utils/pulsar/consts.py:27 -msgid "访问Pulsar Manager账户名" -msgstr "Access Pulsar Manager account name" +#: backend/ticket/constants.py:33 +msgid "自动化流程-人工确认" +msgstr "Automated Process - Manual Confirmation" -#: backend/flow/utils/pulsar/consts.py:28 -msgid "访问Pulsar Manager密码" -msgstr "Access Pulsar Manager Password" +#: backend/ticket/constants.py:34 +msgid "资源补货" +msgstr "Resource replenishment" -#: backend/flow/utils/redis/redis_db_meta.py:56 -msgid "找不到单据类型需要查询的cmdb函数,请联系系统管理员" -msgstr "" -"The cmdb function that needs to be queried for the ticket type cannot be " -"found, please contact the system administrator" +#: backend/ticket/constants.py:42 +msgid "我的待办" +msgstr "my to do" -#: backend/flow/utils/spider/get_spider_incr.py:45 -msgid "select spider_auto_increment failed: {}" -msgstr "select spider_auto_increment failed: {}" +#: backend/ticket/constants.py:43 +msgid "我的申请" +msgstr "My application" -#: backend/flow/utils/spider/get_spider_incr.py:49 -msgid "select spider_auto_increment is null, check " -msgstr "select spider_auto_increment is null, check" +#: backend/ticket/constants.py:55 +msgid "已处理" +msgstr "processed" -#: backend/flow/utils/spider/get_spider_incr.py:65 -msgid "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" -msgstr "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" +#: backend/ticket/constants.py:64 +msgid "资源不足" +msgstr "Insufficient resources" -#: backend/flow/views/cloud_dbha_apply.py:39 -#: backend/flow/views/cloud_dns_bind_apply.py:39 -msgid "开始部署dns-bind服务场景" -msgstr "Start deploying the dns-bind service scenario" +#: backend/ticket/constants.py:65 +msgid "获取资源所失败" +msgstr "Failed to obtain resource" -#: backend/flow/views/cloud_drs_apply.py:44 -msgid "开始部署drs服务场景" -msgstr "Start deploying the drs service scenario" +#: backend/ticket/constants.py:66 +msgid "参数合法性校验失败" +msgstr "Parameter validity verification failed" -#: backend/flow/views/cloud_nginx_apply.py:44 -msgid "开始部署nginx服务场景" -msgstr "Start deploying nginx service scenarios" +#: backend/ticket/constants.py:67 +msgid "锁定返回机器失败" +msgstr "Lock return machine failed" -#: backend/flow/views/cloud_nginx_apply.py:54 -msgid "开始替换nginx服务场景" -msgstr "Start to replace the nginx service scenario" +#: backend/ticket/constants.py:77 backend/ticket/constants.py:88 +msgid "等待中" +msgstr "Waiting" -#: backend/flow/views/es_apply.py:63 -msgid "开始部署ES场景" -msgstr "Start deploying ES scenarios" +#: backend/ticket/constants.py:81 backend/ticket/constants.py:93 +msgid "撤销" +msgstr "revoke" -#: backend/flow/views/es_destroy.py:39 -msgid "开始下架ES场景" -msgstr "Start to remove the ES scene" +#: backend/ticket/constants.py:82 backend/ticket/constants.py:91 +msgid "终止" +msgstr "termination" -#: backend/flow/views/es_disable.py:39 -msgid "开始禁用ES场景" -msgstr "Start disabling ES scenes" +#: backend/ticket/constants.py:94 +msgid "跳过" +msgstr "jump over" -#: backend/flow/views/es_enable.py:39 -msgid "开始启用ES场景" -msgstr "Start to enable ES scene" +#: backend/ticket/constants.py:157 +msgid "无法找到{}关联的组件类型" +msgstr "Unable to find component type associated with {}" -#: backend/flow/views/es_reboot.py:47 -msgid "开始重启ES节点场景" -msgstr "Start restarting the ES node scenario" +#: backend/ticket/constants.py:161 +msgid "MySQL 单节点部署" +msgstr "MySQL standalone deployment" -#: backend/flow/views/es_replace.py:63 backend/flow/views/es_scale_up.py:52 -msgid "开始扩容ES场景" -msgstr "Start to expand the ES scene" +#: backend/ticket/constants.py:162 +msgid "MySQL 添加从库" +msgstr "MySQL Add Slave Instance" -#: backend/flow/views/es_shrink.py:52 -msgid "开始缩容ES场景" -msgstr "Start shrinking the ES scene" +#: backend/ticket/constants.py:162 backend/ticket/constants.py:163 +#: backend/ticket/constants.py:164 backend/ticket/constants.py:165 +#: backend/ticket/constants.py:166 backend/ticket/constants.py:167 +#: backend/ticket/constants.py:172 backend/ticket/constants.py:173 +#: backend/ticket/constants.py:184 backend/ticket/constants.py:195 +#: backend/ticket/constants.py:216 backend/ticket/constants.py:217 +#: backend/ticket/constants.py:221 backend/ticket/constants.py:222 +#: backend/ticket/constants.py:227 backend/ticket/constants.py:228 +#: backend/ticket/constants.py:229 backend/ticket/constants.py:235 +#: backend/ticket/constants.py:266 backend/ticket/constants.py:267 +#: backend/ticket/constants.py:268 backend/ticket/constants.py:269 +#: backend/ticket/constants.py:270 backend/ticket/constants.py:271 +#: backend/ticket/constants.py:272 backend/ticket/constants.py:301 +#: backend/ticket/constants.py:302 backend/ticket/constants.py:303 +#: backend/ticket/constants.py:304 backend/ticket/constants.py:305 +#: backend/ticket/constants.py:306 backend/ticket/constants.py:307 +#: backend/ticket/constants.py:312 backend/ticket/constants.py:313 +#: backend/ticket/constants.py:317 backend/ticket/constants.py:402 +#: backend/ticket/constants.py:403 backend/ticket/constants.py:404 +#: backend/ticket/constants.py:405 backend/ticket/constants.py:406 +#: backend/ticket/constants.py:411 backend/ticket/constants.py:414 +#: backend/ticket/constants.py:415 backend/ticket/constants.py:416 +msgid "集群维护" +msgstr "Cluster maintenance" -#: backend/flow/views/hdfs_apply.py:61 -msgid "开始部署HDFS场景" -msgstr "Start deploying HDFS scenarios" +#: backend/ticket/constants.py:163 +msgid "MySQL Slave重建" +msgstr "MySQL Slave Rebuild" -#: backend/flow/views/hdfs_destroy.py:39 -msgid "开始HDFS集群销毁场景" -msgstr "Start the HDFS cluster destruction scenario" +#: backend/ticket/constants.py:164 +msgid "MySQL Slave原地重建" +msgstr "MySQL Slave reconstruction in place" -#: backend/flow/views/hdfs_disable.py:39 -msgid "开始HDFS集群禁用场景" -msgstr "Start HDFS cluster disable scenario" +#: backend/ticket/constants.py:165 +msgid "MySQL 迁移主从" +msgstr "MySQL migration master-slave" -#: backend/flow/views/hdfs_enable.py:39 -msgid "开始HDFS集群启用场景" -msgstr "Start the HDFS cluster enablement scenario" +#: backend/ticket/constants.py:166 +msgid "MySQL 主从互换" +msgstr "MySQL master-slave swap" -#: backend/flow/views/hdfs_reboot.py:55 -msgid "开始重启HDFS场景" -msgstr "Start to restart the HDFS scene" +#: backend/ticket/constants.py:167 +msgid "MySQL 主库故障切换" +msgstr "MySQL master database failover" -#: backend/flow/views/hdfs_replace.py:65 -msgid "开始替换HDFS场景" -msgstr "Start to replace the HDFS scene" +#: backend/ticket/constants.py:168 +msgid "MySQL 高可用部署" +msgstr "MySQL high availability deployment" -#: backend/flow/views/hdfs_scale_up.py:42 -msgid "开始扩容HDFS场景" -msgstr "Start expanding the HDFS scene" +#: backend/ticket/constants.py:169 +msgid "MySQL 变更SQL执行" +msgstr "MySQL changes SQL execution" -#: backend/flow/views/hdfs_shrink.py:42 -msgid "开始HDFS集群缩容场景" -msgstr "Start the HDFS cluster shrinking scenario" +#: backend/ticket/constants.py:170 +msgid "MySQL 强制变更SQL执行" +msgstr "MySQL forces changes to SQL execution" -#: backend/flow/views/influxdb_apply.py:57 -msgid "开始部署influxdb场景" -msgstr "Start deploying the influxdb scene" +#: backend/ticket/constants.py:171 +msgid "MySQL 模拟执行" +msgstr "MySQL simulation execution" + +#: backend/ticket/constants.py:172 +msgid "MySQL 添加Proxy" +msgstr "MySQL add Proxy" -#: backend/flow/views/influxdb_destroy.py:39 -msgid "开始下架Influxdb场景" -msgstr "Start to remove the Influxdb scene" +#: backend/ticket/constants.py:173 +msgid "MySQL 替换Proxy" +msgstr "MySQL replaces Proxy" -#: backend/flow/views/influxdb_disable.py:39 -msgid "开始禁用Influxdb场景" -msgstr "Start disabling the Influxdb scene" +#: backend/ticket/constants.py:174 +msgid "MySQL 单节点删除" +msgstr "MySQL standalone deletion" -#: backend/flow/views/influxdb_enable.py:39 -msgid "开始启用Influxdb场景" -msgstr "Start enabling the Influxdb scene" +#: backend/ticket/constants.py:175 +msgid "MySQL 单节点启用" +msgstr "MySQL standalone enabled" -#: backend/flow/views/influxdb_reboot.py:47 -msgid "开始重启Influxdb节点场景" -msgstr "Start restarting the Influxdb node scenario" +#: backend/ticket/constants.py:176 +msgid "MySQL 单节点禁用" +msgstr "MySQL standalone disabled" -#: backend/flow/views/influxdb_replace.py:49 -msgid "开始替换influxdb场景" -msgstr "Start to replace the influxdb scene" +#: backend/ticket/constants.py:177 +msgid "MySQL 高可用删除" +msgstr "MySQL high availability deletion" -#: backend/flow/views/kafka_apply.py:70 -msgid "开始部署kafka场景" -msgstr "Start deploying kafka scenarios" +#: backend/ticket/constants.py:178 +msgid "MySQL 高可用禁用" +msgstr "MySQL high availability disabled" -#: backend/flow/views/kafka_destroy.py:39 -msgid "开始下架Kafka场景" -msgstr "Start to remove the Kafka scene" +#: backend/ticket/constants.py:179 +msgid "MySQL 高可用启用" +msgstr "MySQL high availability enabled" -#: backend/flow/views/kafka_disable.py:39 -msgid "开始禁用Kafka场景" -msgstr "Start disabling the Kafka scene" +#: backend/ticket/constants.py:180 +msgid "MySQL 集群授权" +msgstr "MySQL Cluster Authorization" -#: backend/flow/views/kafka_enable.py:39 -msgid "开始启用Kafka场景" -msgstr "Start to enable the Kafka scene" +#: backend/ticket/constants.py:181 +msgid "MySQL EXCEL授权" +msgstr "MySQL EXCEL authorization" -#: backend/flow/views/kafka_reboot.py:47 -msgid "开始重启Kafka节点场景" -msgstr "Start restarting the Kafka node scenario" +#: backend/ticket/constants.py:183 +msgid "MySQL DB实例权限克隆" +msgstr "Clone MySQL DB Instance Privileges" -#: backend/flow/views/kafka_replace.py:51 -msgid "开始替换kafka场景" -msgstr "Start to replace the kafka scene" +#: backend/ticket/constants.py:184 +msgid "MySQL 高可用DB重命名" +msgstr "MySQL high availability DB renaming" -#: backend/flow/views/kafka_scale_up.py:49 -msgid "开始扩容kafka场景" -msgstr "Start to expand the kafka scene" +#: backend/ticket/constants.py:185 +msgid "MySQL 高可用清档" +msgstr "MySQL HA Clear File" -#: backend/flow/views/kafka_shrink.py:44 -msgid "开始缩容kafka场景" -msgstr "Start shrinking the kafka scene" +#: backend/ticket/constants.py:186 +msgid "MySQL 高可用库表备份" +msgstr "MySQL high availability database table backup" -#: backend/flow/views/mysql_add_slave.py:44 -msgid "开始添加slave" -msgstr "Start adding slaves" +#: backend/ticket/constants.py:186 backend/ticket/constants.py:193 +#: backend/ticket/constants.py:213 backend/ticket/constants.py:236 +#: backend/ticket/constants.py:261 backend/ticket/constants.py:400 +#: backend/ticket/constants.py:401 +msgid "备份" +msgstr "backup" -#: backend/flow/views/mysql_edit_config.py:60 -msgid "开始下发修改的参数" -msgstr "Start sending the modified parameters" +#: backend/ticket/constants.py:187 +msgid "MySQL 数据校验修复" +msgstr "MySQL Data Inconsistency Repair" -#: backend/flow/views/mysql_flashback.py:49 -msgid "开始flashback" -msgstr "start flashback" +#: backend/ticket/constants.py:188 +msgid "MySQL 分区" +msgstr "MySQL partition" -#: backend/flow/views/mysql_ha_db_table_backup.py:32 -msgid "开始库表备份场景" -msgstr "Start database table backup scenario" +#: backend/ticket/constants.py:189 +msgid "MySQL 分区定时任务" +msgstr "MySQL partition scheduled tasks" -#: backend/flow/views/mysql_ha_destroy.py:31 -msgid "开始回收mysql主从版场景" -msgstr "Start to recycle the mysql master-slave version scenario" +#: backend/ticket/constants.py:190 +msgid "MySQL 数据修复" +msgstr "MySQL data repair" -#: backend/flow/views/mysql_ha_destroy.py:49 -msgid "开始禁用mysql主从版场景" -msgstr "Start to disable the mysql master-slave version scenario" +#: backend/ticket/constants.py:191 +msgid "MySQL 闪回" +msgstr "MySQL flashback" -#: backend/flow/views/mysql_ha_destroy.py:65 -msgid "开始启动mysql主从版场景" -msgstr "Start the mysql master-slave version scenario" +#: backend/ticket/constants.py:191 backend/ticket/constants.py:192 +#: backend/ticket/constants.py:237 backend/ticket/constants.py:238 +msgid "回档" +msgstr "rollback" -#: backend/flow/views/mysql_ha_full_backup.py:32 -msgid "开始全库备份场景" -msgstr "Start the full database backup scenario" +#: backend/ticket/constants.py:192 +msgid "MySQL 定点构造" +msgstr "MySQL fixed-point construct" -#: backend/flow/views/mysql_ha_master_fail_over.py:30 -msgid "开始执行主故障切换[整机切换]的任务" -msgstr "Start the task of performing the main failover [whole machine switchover]" +#: backend/ticket/constants.py:193 +msgid "MySQL 高可用全库备份" +msgstr "MySQL high availability full database backup" -#: backend/flow/views/mysql_ha_rename_database.py:30 -#: backend/flow/views/mysql_ha_truncate_data.py:30 -msgid "开始TenDBHA清档场景" -msgstr "Start the TenDBHA clearing scene" +#: backend/ticket/constants.py:194 +msgid "MySQL 单节点清档" +msgstr "MySQL standalone clear file" -#: backend/flow/views/mysql_ha_switch.py:30 -msgid "开始执行主从切换[整机切换]的任务" -msgstr "Start the task of master-slave switching [whole machine switching]" +#: backend/ticket/constants.py:195 +msgid "MySQL 单节点DB重命名" +msgstr "MySQL standalone DB rename" -#: backend/flow/views/mysql_migrate_cluster.py:46 -#: backend/flow/views/mysql_restore_slave.py:49 -msgid "开始重建slave" -msgstr "Start rebuilding the slave" +#: backend/ticket/constants.py:196 +msgid "TendbHA 标准化" +msgstr "TendbHA standardization" -#: backend/flow/views/mysql_proxy_add.py:30 -msgid "开始添加mysql_proxy实例场景" -msgstr "Start adding mysql_proxy instance scenarios" +#: backend/ticket/constants.py:197 +msgid "TendbHA 元数据导入" +msgstr "TendbHA metadata import" -#: backend/flow/views/mysql_proxy_reduce.py:30 -msgid "开始回收mysql_proxy实例场景" -msgstr "Start to recycle the mysql_proxy instance scenario" +#: backend/ticket/constants.py:198 +msgid "MySQL 开区" +msgstr "MySQL zone" -#: backend/flow/views/mysql_proxy_switch.py:30 -msgid "开始替换mysql_proxy实例场景" -msgstr "Start to replace the mysql_proxy instance scenario" +#: backend/ticket/constants.py:199 +msgid "MySQL DB克隆" +msgstr "MySQL DB clone" -#: backend/flow/views/mysql_pt_table_sync.py:30 -msgid "开始执行数据修复" -msgstr "Start data recovery" +#: backend/ticket/constants.py:200 +msgid "MySQL 数据导出" +msgstr "MySQL data export" -#: backend/flow/views/mysql_restore_local_slave.py:44 -msgid "开始原地重建slave" -msgstr "Start rebuilding the slave in situ" +#: backend/ticket/constants.py:201 +msgid "MySQL 原地升级" +msgstr "MySQL in-place upgrade" -#: backend/flow/views/mysql_rollback_data.py:48 -msgid "开始重建定点回档数据" -msgstr "Start to rebuild the fixed-point archive data" +#: backend/ticket/constants.py:201 backend/ticket/constants.py:202 +#: backend/ticket/constants.py:203 +msgid "版本升级" +msgstr "Version upgrade" -#: backend/flow/views/mysql_single_apply.py:57 -msgid "开始部署mysql单实例场景" -msgstr "Start deploying mysql single instance scenario" +#: backend/ticket/constants.py:202 +msgid "MySQL 迁移升级" +msgstr "MySQL migration and upgrade" -#: backend/flow/views/mysql_single_destroy.py:30 -msgid "开始回收mysql单节点版场景" -msgstr "Start to recycle mysql single-node version scenario" +#: backend/ticket/constants.py:203 +msgid "MySQL Proxy升级" +msgstr "MySQL Proxy upgrade" -#: backend/flow/views/mysql_single_destroy.py:46 -msgid "开始禁用mysql单节点版场景" -msgstr "Start disabling the mysql single-node version scenario" +#: backend/ticket/constants.py:204 +msgid "TendbHA集群迁移至其他业务" +msgstr "Migrate TendbHA cluster to other businesses" -#: backend/flow/views/mysql_single_destroy.py:62 -msgid "开始启动mysql单节点版场景" -msgstr "Start the mysql single-node version scenario" +#: backend/ticket/constants.py:205 +msgid "推送周边配置" +msgstr "Push peripheral configuration" -#: backend/flow/views/mysql_single_rename_database.py:30 -#: backend/flow/views/mysql_single_truncate_data.py:30 -msgid "开始TenDBSingle清档场景" -msgstr "Start the TenDBSingle clearing scene" +#: backend/ticket/constants.py:208 +msgid "TenDB Cluster 开区" +msgstr "TenDB Cluster zone" -#: backend/flow/views/pulsar_destroy.py:39 -msgid "开始pulsar集群销毁场景" -msgstr "Start the pulsar cluster destruction scenario" +#: backend/ticket/constants.py:209 +msgid "TenDB Cluster 数据校验修复" +msgstr "TenDB Cluster data verification repair" -#: backend/flow/views/pulsar_disable.py:39 -msgid "开始PULSAR集群禁用场景" -msgstr "Start PULSAR cluster disable scenario" +#: backend/ticket/constants.py:210 +msgid "TenDB Cluster 数据修复" +msgstr "TenDB Cluster data repair" -#: backend/flow/views/pulsar_enable.py:39 -msgid "开始PULSAR集群启用场景" -msgstr "Start the PULSAR cluster enablement scenario" +#: backend/ticket/constants.py:211 +msgid "TenDB Cluster 分区管理" +msgstr "TenDB Cluster partition management" -#: backend/flow/views/pulsar_reboot.py:55 -msgid "开始重启PULSAR场景" -msgstr "Start restarting the PULSAR scene" +#: backend/ticket/constants.py:212 +msgid "TenDB Cluster 分区定时任务" +msgstr "TenDB Cluster partition scheduled tasks" -#: backend/flow/views/pulsar_replace.py:28 -msgid "开始PULSAR集群替换场景" -msgstr "Start the PULSAR cluster replacement scenario" +#: backend/ticket/constants.py:214 +msgid "TenDB Cluster 数据库重命名" +msgstr "TenDB Cluster database rename" -#: backend/flow/views/pulsar_shrink.py:28 -msgid "开始PULSAR集群缩容场景" -msgstr "Start the PULSAR cluster shrinking scenario" +#: backend/ticket/constants.py:215 +msgid "TenDB Cluster 清档" +msgstr "TenDB Cluster cleanup" -#: backend/flow/views/rollback_pipeline.py:151 -msgid "导入资源池失败" -msgstr "Failed to import resource pool" +#: backend/ticket/constants.py:216 +msgid "TenDB Cluster 主库故障切换" +msgstr "TenDB Cluster main database failover" -#: backend/flow/views/rollback_pipeline.py:171 -msgid "高可用架构" -msgstr "High availability architecture" +#: backend/ticket/constants.py:217 +msgid "TenDB Cluster 主从互切" +msgstr "TenDB Cluster master-slave switch" -#: backend/flow/views/rollback_pipeline.py:172 -msgid "单实例架构" -msgstr "single instance architecture" +#: backend/ticket/constants.py:218 +msgid "TenDB Cluster 变更SQL执行" +msgstr "TenDB Cluster changes SQL execution" -#: backend/flow/views/spider_cluster_database_table_backup.py:30 -msgid "开始TenDBCluster库表备份场景" -msgstr "Start TenDBCluster database table backup scenario" +#: backend/ticket/constants.py:219 +msgid "TenDB Cluster 强制变更SQL执行" +msgstr "TenDB Cluster forces changes to SQL execution" -#: backend/flow/views/spider_cluster_destroy.py:34 -msgid "开始禁用spider集群场景" -msgstr "Start to disable the spider cluster scenario" +#: backend/ticket/constants.py:220 +msgid "TenDB Cluster 模拟执行" +msgstr "TenDB Cluster simulation execution" -#: backend/flow/views/spider_cluster_destroy.py:53 -msgid "开始启用spider集群场景" -msgstr "Start to enable the spider cluster scenario" +#: backend/ticket/constants.py:221 +msgid "TenDB Cluster 扩容接入层" +msgstr "TenDB Cluster expansion access layer" -#: backend/flow/views/spider_cluster_full_backup.py:30 -msgid "开始TenDBCluster全库备份场景" -msgstr "Start TenDBCluster full database backup scenario" +#: backend/ticket/constants.py:222 +msgid "TenDB Cluster 缩容接入层" +msgstr "TenDB Cluster scale-down access layer" -#: backend/flow/views/spider_cluster_rename_database.py:30 -msgid "开始TenDBCluster数据库重命名场景" -msgstr "Start the TenDBCluster database renaming scenario" +#: backend/ticket/constants.py:223 +msgid "TenDB Cluster 添加运维节点" +msgstr "TenDB Cluster adds operation and maintenance nodes" -#: backend/flow/views/spider_cluster_truncate_database.py:30 -msgid "开始TenDBCluster清档场景" -msgstr "Start the TenDBCluster clearing scene" +#: backend/ticket/constants.py:223 backend/ticket/constants.py:224 +msgid "运维 Spider 管理" +msgstr "Operation and maintenance Spider management" -#: backend/iam_app/dataclass/actions.py:47 -msgid "业务访问" -msgstr "business visit" +#: backend/ticket/constants.py:224 +msgid "TenDB Cluster 下架运维节点" +msgstr "TenDB Cluster removes operation and maintenance nodes" -#: backend/iam_app/dataclass/actions.py:56 -msgid "数据库管理" -msgstr "database management" +#: backend/ticket/constants.py:228 +msgid "TenDB Cluster Slave原地重建" +msgstr "TenDB Cluster Slave is rebuilt in place" -#: backend/iam_app/dataclass/actions.py:65 -msgid "平台管理" -msgstr "platform management" +#: backend/ticket/constants.py:229 +msgid "TenDB Cluster 主从迁移" +msgstr "TenDB Cluster master-slave migration" -#: backend/iam_app/dataclass/actions.py:78 -msgid "动作ID不存在: {}" -msgstr "Action ID does not exist: {}" +#: backend/ticket/constants.py:230 +msgid "TenDB Cluster 集群部署" +msgstr "TenDB Cluster deployment" -#: backend/iam_app/dataclass/resources.py:94 -msgid "资源类型ID不存在: {}" -msgstr "Resource type ID does not exist: {}" +#: backend/ticket/constants.py:231 +msgid "TenDB Cluster 集群启用" +msgstr "TenDB Cluster enabled" -#: backend/iam_app/exceptions.py:51 -#, python-brace-format -msgid "当前用户无 [{action_name}] 权限" -msgstr "The current user does not have permission for [{action_name}]" +#: backend/ticket/constants.py:232 +msgid "TenDB Cluster 集群禁用" +msgstr "TenDB Cluster disabled" -#: backend/iam_app/handlers/drf_perm.py:162 -msgid "JWT鉴权错误,错误信息: {}" -msgstr "JWT authentication error, error message: {}" +#: backend/ticket/constants.py:233 +msgid "TenDB Cluster 集群销毁" +msgstr "TenDB Cluster destruction" -#: backend/iam_app/handlers/permission.py:74 -#, python-brace-format -msgid "获取系统信息错误:{message}" -msgstr "Error getting system information: {message}" +#: backend/ticket/constants.py:234 +msgid "TenDB Cluster 临时集群销毁" +msgstr "TenDB Cluster temporary cluster destruction" -#: backend/iam_app/serializers.py:18 -msgid "资源类型" -msgstr "Resource Type" +#: backend/ticket/constants.py:235 +msgid "TenDB Cluster 集群容量变更" +msgstr "TenDB Cluster cluster capacity change" -#: backend/iam_app/serializers.py:19 -msgid "资源ID" -msgstr "Resource ID" +#: backend/ticket/constants.py:237 +msgid "TenDB Cluster 定点构造" +msgstr "TenDB Cluster fixed-point construction" -#: backend/iam_app/serializers.py:21 -msgid "动作ID列表" -msgstr "action id list" +#: backend/ticket/constants.py:238 +msgid "TenDB Cluster 闪回" +msgstr "TenDB Cluster flashback" -#: backend/iam_app/serializers.py:22 -msgid "资源列表" -msgstr "resource list" +#: backend/ticket/constants.py:242 +msgid "TenDB Cluster EXCEL授权" +msgstr "TenDB Cluster EXCEL authorization" -#: backend/iam_app/views/views.py:27 -msgid "获取系统权限中心信息" -msgstr "Obtaining system authority center information" +#: backend/ticket/constants.py:248 +msgid "TenDB Cluster DB克隆" +msgstr "TenDB Cluster DB clone" -#: backend/iam_app/views/views.py:34 -msgid "检查当前用户对该动作是否有权限" -msgstr "Check if the current user has permission for the action" +#: backend/ticket/constants.py:249 +msgid "TenDB Cluster 数据导出" +msgstr "TenDB Cluster data export" -#: backend/iam_app/views/views.py:51 -msgid "获取权限申请数据" -msgstr "Obtain permission application data" +#: backend/ticket/constants.py:251 +msgid "TBINLOGDUMPER 上架" +msgstr "TBINLOGDUMPER is now available" -#: backend/ticket/builders/__init__.py:149 -#, python-brace-format -msgid "{creator}提交了{title}的单据,请查看详情后进行审批" -msgstr "" -"{creator} has submitted the ticket for {title}, please review the details " -"before approval" +#: backend/ticket/constants.py:252 +msgid "TBINLOGDUMPER 下架" +msgstr "TBINLOGDUMPER removed from shelves" -#: backend/ticket/builders/__init__.py:154 -msgid "单据链接" -msgstr "ticket link" +#: backend/ticket/constants.py:253 +msgid "TBINLOGDUMPER 切换" +msgstr "TBINLOGDUMPER toggle" -#: backend/ticket/builders/__init__.py:159 -msgid "需求信息" -msgstr "demand information" +#: backend/ticket/constants.py:254 +msgid "TBINLOGDUMPER 禁用" +msgstr "TBINLOGDUMPER disabled" -#: backend/ticket/builders/__init__.py:305 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:176 -#: backend/ticket/constants.py:307 -msgid "单据审批" -msgstr "Ticket approval" +#: backend/ticket/constants.py:255 +msgid "TBINLOGDUMPER 启用" +msgstr "TBINLOGDUMPER enabled" -#: backend/ticket/builders/cloud/dbha_add.py:30 -msgid "新DBHA-GM机器的部署信息" -msgstr "Deployment information for new DBHA-GM machines" +#: backend/ticket/constants.py:258 +msgid "SQLServer 单节点部署" +msgstr "SQLServer single node deployment" -#: backend/ticket/builders/cloud/dbha_add.py:31 -msgid "新DBHA-AGENT机器的部署信息" -msgstr "Deployment information for new DBHA-AGENT machines" +#: backend/ticket/constants.py:259 +msgid "SQLServer 高可用部署" +msgstr "SQLServer High Availability Deployment" -#: backend/ticket/builders/cloud/dbha_add.py:47 -msgid "DBHA 服务新增" -msgstr "DBHA service added" +#: backend/ticket/constants.py:260 +msgid "SQLServer SQL导入执行" +msgstr "SQLServer SQL import execution" -#: backend/ticket/builders/cloud/dbha_reduce.py:32 -msgid "裁撤的DBHA-GM列表" -msgstr "List of abolished DBHA-GMs" +#: backend/ticket/constants.py:261 +msgid "SQLServer 库表备份" +msgstr "SQLServer database table backup" -#: backend/ticket/builders/cloud/dbha_reduce.py:35 -msgid "裁撤的DBHA-AGENT列表" -msgstr "List of abolished DBHA-AGENTs" +#: backend/ticket/constants.py:262 +msgid "SQLServer 清档" +msgstr "SQLServer Clearance" -#: backend/ticket/builders/cloud/dbha_reduce.py:44 -msgid "请至少保证一个agent/gm存活" -msgstr "Please keep at least one agent/gm alive" +#: backend/ticket/constants.py:263 +msgid "SQLServer 集群卸载" +msgstr "SQLServer cluster uninstallation" -#: backend/ticket/builders/cloud/dbha_reduce.py:61 -msgid "DBHA 服务裁撤" -msgstr "DBHA service abolition" +#: backend/ticket/constants.py:264 +msgid "SQLServer 集群禁用" +msgstr "SQLServer cluster disabled" -#: backend/ticket/builders/cloud/dbha_reload.py:29 -msgid "重装的GM ID列表" -msgstr "List of Reloaded GM IDs" +#: backend/ticket/constants.py:265 +msgid "SQLServer 集群启用" +msgstr "SQLServer cluster enabled" -#: backend/ticket/builders/cloud/dbha_reload.py:30 -msgid "重装的AGENT ID列表" -msgstr "Reloaded AGENT ID list" +#: backend/ticket/constants.py:266 +msgid "SQLServer DB重命名" +msgstr "SQLServer DB rename" -#: backend/ticket/builders/cloud/dbha_reload.py:46 -msgid "DBHA 服务重装" -msgstr "DBHA service reload" +#: backend/ticket/constants.py:267 +msgid "SQLServer 主从互切" +msgstr "SQLServer master-slave switching" -#: backend/ticket/builders/cloud/dbha_replace.py:30 -msgid "被替换旧DBHA-GM服务ID" -msgstr "Replaced by the old DBHA-GM service ID" +#: backend/ticket/constants.py:268 +msgid "SQLServer 主库故障切换" +msgstr "SQLServer main database failover" -#: backend/ticket/builders/cloud/dbha_replace.py:31 -msgid "替换后的新的DBHA-GM服务信息" -msgstr "New DBHA-GM service information after replacement" +#: backend/ticket/constants.py:269 +msgid "SQLServer 原地重建" +msgstr "SQLServer rebuild in place" -#: backend/ticket/builders/cloud/dbha_replace.py:33 -msgid "被替换旧DBHA-AGENT服务ID" -msgstr "Replaced by the old DBHA-AGENT service ID" +#: backend/ticket/constants.py:270 +msgid "SQLServer 新机重建" +msgstr "SQLServer new machine reconstruction" -#: backend/ticket/builders/cloud/dbha_replace.py:34 -msgid "替换后的新的DBHA-AGENT服务信息" -msgstr "New DBHA-AGENT service information after replacement" +#: backend/ticket/constants.py:271 +msgid "SQLServer 添加从库" +msgstr "SQLServer add slave database" -#: backend/ticket/builders/cloud/dbha_replace.py:38 -msgid "不允许同时对agent和gm进行替换" -msgstr "It is not allowed to replace agent and gm at the same time" +#: backend/ticket/constants.py:272 +msgid "SQLServer 集群重置" +msgstr "SQLServer cluster reset" -#: backend/ticket/builders/cloud/dbha_replace.py:62 -msgid "DBHA 服务替换" -msgstr "DBHA service replacement" +#: backend/ticket/constants.py:273 +msgid "SQLServer 全备迁移" +msgstr "SQLServer full migration" -#: backend/ticket/builders/cloud/dns_add.py:29 -msgid "新DNS机器的部署信息" -msgstr "Deployment information for the new DNS machine" +#: backend/ticket/constants.py:274 +msgid "SQLServer 增量迁移" +msgstr "SQLServer incremental migration" -#: backend/ticket/builders/cloud/dns_add.py:43 -#: backend/ticket/builders/cloud/drs_add.py:43 -msgid "DNS 服务新增" -msgstr "DNS service added" +#: backend/ticket/constants.py:275 +msgid "SQLServer 定点构造" +msgstr "SQLServer fixed-point construction" -#: backend/ticket/builders/cloud/dns_reduce.py:30 -msgid "裁撤的DNS列表" -msgstr "Retired DNS list" +#: backend/ticket/constants.py:277 +msgid "SQLServer EXCEL授权" +msgstr "SQLServer EXCEL authorization" -#: backend/ticket/builders/cloud/dns_reduce.py:36 -msgid "请至少保证一个dns服务存活" -msgstr "Please ensure that at least one dns service is alive" +#: backend/ticket/constants.py:278 +msgid "SQLServer DB建立同步" +msgstr "SQLServer DB establishes synchronization" -#: backend/ticket/builders/cloud/dns_reduce.py:52 -msgid "DNS 服务裁撤" -msgstr "DNS service down" +#: backend/ticket/constants.py:281 +msgid "Redis 创建CLB" +msgstr "Redis creates CLB" -#: backend/ticket/builders/cloud/dns_reload.py:29 -msgid "重装的DNSID列表" -msgstr "Reloaded DNSID list" +#: backend/ticket/constants.py:282 +msgid "Redis 删除CLB" +msgstr "Redis delete CLB" -#: backend/ticket/builders/cloud/dns_reload.py:43 -msgid "DNS 服务重装" -msgstr "DNS service reinstallation" +#: backend/ticket/constants.py:283 +msgid "Redis 域名绑定CLB" +msgstr "Redis domain name binding CLB" -#: backend/ticket/builders/cloud/dns_replace.py:29 -msgid "被替换旧DNS服务ID" -msgstr "Replaced by the old DNS service ID" +#: backend/ticket/constants.py:284 +msgid "Redis 域名解绑CLB" +msgstr "Redis domain name unbinding CLB" -#: backend/ticket/builders/cloud/dns_replace.py:30 -msgid "替换后的新的DNS服务信息" -msgstr "New DNS service information after replacement" +#: backend/ticket/constants.py:285 +msgid "Redis 创建Polaris" +msgstr "Redis creates Polaris" -#: backend/ticket/builders/cloud/dns_replace.py:44 -msgid "DNS 服务替换" -msgstr "DNS service replacement" +#: backend/ticket/constants.py:286 +msgid "Redis 删除Polaris" +msgstr "Redis Delete Polaris" -#: backend/ticket/builders/cloud/drs_add.py:29 -msgid "新drs机器的部署信息" -msgstr "Deployment information for new drs machines" +#: backend/ticket/constants.py:287 +msgid "Redis 单节点部署" +msgstr "Redis standalone deployment" -#: backend/ticket/builders/cloud/drs_reduce.py:30 -msgid "裁撤的drs列表" -msgstr "abolished drs list" +#: backend/ticket/constants.py:288 +msgid "Redis 主从节点部署" +msgstr "Redis master-slave node deployment" -#: backend/ticket/builders/cloud/drs_reduce.py:36 -msgid "请至少保证一个drs服务存活" -msgstr "Please ensure that at least one drs service is alive" +#: backend/ticket/constants.py:290 +msgid "Redis 提取 Key" +msgstr "Redis Extract Key" -#: backend/ticket/builders/cloud/drs_reduce.py:52 -msgid "DRS 服务裁撤" -msgstr "DRS service abolition" +#: backend/ticket/constants.py:291 +msgid "Redis 删除 key" +msgstr "Redis delete key" -#: backend/ticket/builders/cloud/drs_reload.py:29 -msgid "重装的drsID列表" -msgstr "Reloaded drsID list" +#: backend/ticket/constants.py:292 +msgid "Redis 集群备份" +msgstr "Redis cluster backup" -#: backend/ticket/builders/cloud/drs_reload.py:43 -msgid "DRS 服务重装" -msgstr "DRS Service Reload" +#: backend/ticket/constants.py:293 +msgid "Redis 集群启用" +msgstr "Redis cluster enabled" -#: backend/ticket/builders/cloud/drs_replace.py:29 -msgid "被替换旧DRS服务ID" -msgstr "Replaced by the old DRS Service ID" +#: backend/ticket/constants.py:294 +msgid "Redis 集群禁用" +msgstr "Redis cluster disabled" -#: backend/ticket/builders/cloud/drs_replace.py:30 -msgid "替换后的新的DRS服务信息" -msgstr "New DRS service information after replacement" +#: backend/ticket/constants.py:295 +msgid "Redis 主从启用" +msgstr "Redis master-slave enabled" -#: backend/ticket/builders/cloud/drs_replace.py:44 -msgid "DRS 服务替换" -msgstr "DRS Service Replacement" +#: backend/ticket/constants.py:296 +msgid "Redis 主从禁用" +msgstr "Redis master-slave disabled" -#: backend/ticket/builders/cloud/nginx_reload.py:28 -msgid "重装的nginx id" -msgstr "Reloaded nginx id" +#: backend/ticket/constants.py:297 +msgid "Redis 集群删除" +msgstr "Redis cluster deletion" -#: backend/ticket/builders/cloud/nginx_reload.py:49 -msgid "Nginx 服务重装" -msgstr "Nginx service reinstallation" +#: backend/ticket/constants.py:298 +msgid "Redis 主从集群删除" +msgstr "Redis master-slave cluster deletion" -#: backend/ticket/builders/cloud/nginx_replace.py:30 -#: backend/ticket/builders/cloud/service_apply.py:31 -msgid "部署nginx服务主机信息" -msgstr "Deploy nginx service host information" +#: backend/ticket/constants.py:299 +msgid "Redis 集群清档" +msgstr "Redis cluster clear file" -#: backend/ticket/builders/cloud/nginx_replace.py:33 -msgid "替换的nginx id" -msgstr "Replaced nginx id" +#: backend/ticket/constants.py:302 +msgid "Redis 整机替换" +msgstr "Redis whole machine replacement" -#: backend/ticket/builders/cloud/nginx_replace.py:34 -#: backend/ticket/builders/cloud/service_apply.py:42 -#: backend/ticket/builders/cloud/service_apply.py:51 -msgid "nginx服务部署信息" -msgstr "nginx service deployment information" +#: backend/ticket/constants.py:303 +msgid "Redis 故障自愈" +msgstr "Redis fault self-healing" -#: backend/ticket/builders/cloud/nginx_replace.py:53 -msgid "Nginx 服务替换" -msgstr "Nginx service replacement" +#: backend/ticket/constants.py:304 +msgid "Redis 故障自愈-实例下架" +msgstr "Redis fault self-healing-instance removed" -#: backend/ticket/builders/cloud/service_apply.py:28 -msgid "部署drs服务主机信息" -msgstr "Deploy drs service host information" +#: backend/ticket/constants.py:306 +msgid "Redis Proxy扩容" +msgstr "Redis Proxy expansion" -#: backend/ticket/builders/cloud/service_apply.py:34 -msgid "部署dns服务主机信息" -msgstr "Deploy dns service host information" +#: backend/ticket/constants.py:307 +msgid "Redis Proxy缩容" +msgstr "Redis Proxy scaling down" -#: backend/ticket/builders/cloud/service_apply.py:37 -msgid "部署dbha-agent服务主机信息" -msgstr "Deploy dbha-agent service host information" +#: backend/ticket/constants.py:308 +msgid "Redis 新增DTS SERVER" +msgstr "Redis adds DTS SERVER" -#: backend/ticket/builders/cloud/service_apply.py:38 -msgid "部署dbha-gm服务主机信息" -msgstr "Deploy dbha-gm service host information" +#: backend/ticket/constants.py:309 +msgid "Redis 删除DTS SERVER" +msgstr "Redis delete DTS SERVER" -#: backend/ticket/builders/cloud/service_apply.py:41 -#: backend/ticket/builders/cloud/service_apply.py:50 -msgid "drs服务部署信息" -msgstr "drs service deployment information" +#: backend/ticket/constants.py:310 +msgid "Redis 集群数据构造" +msgstr "Redis cluster data structure" -#: backend/ticket/builders/cloud/service_apply.py:43 -#: backend/ticket/builders/cloud/service_apply.py:52 -msgid "dns服务部署信息" -msgstr "DNS service deployment information" +#: backend/ticket/constants.py:310 backend/ticket/constants.py:311 +#: backend/ticket/constants.py:315 +msgid "数据构造" +msgstr "data structure" -#: backend/ticket/builders/cloud/service_apply.py:44 -#: backend/ticket/builders/cloud/service_apply.py:53 -msgid "dbha服务部署信息" -msgstr "dbha service deployment information" +#: backend/ticket/constants.py:311 +msgid "Redis 数据构造记录删除" +msgstr "Redis data structure record deletion" -#: backend/ticket/builders/cloud/service_apply.py:115 -msgid "Nginx 服务部署" -msgstr "Nginx service deployment" +#: backend/ticket/constants.py:312 +msgid "Redis 集群分片数变更" +msgstr "Redis cluster shard number change" -#: backend/ticket/builders/cloud/service_apply.py:121 -msgid "DNS 服务部署" -msgstr "DNS service deployment" +#: backend/ticket/constants.py:314 +msgid "Redis 集群数据复制" +msgstr "Redis cluster data replication" -#: backend/ticket/builders/cloud/service_apply.py:127 -msgid "DRS 服务部署" -msgstr "DRS Service Deployment" +#: backend/ticket/constants.py:314 +msgid "数据传输" +msgstr "Data transfer" -#: backend/ticket/builders/cloud/service_apply.py:133 -msgid "DBHA 服务部署" -msgstr "DBHA service deployment" +#: backend/ticket/constants.py:317 +msgid "Redis 重建从库" +msgstr "Redis rebuilds the slave library" -#: backend/ticket/builders/common/base.py:76 -msgid "请输入主机的云区域信息" -msgstr "Please enter the cloud region information of the host" +#: backend/ticket/constants.py:318 +msgid "Redis DTS在线切换" +msgstr "Redis DTS online switching" -#: backend/ticket/builders/common/base.py:137 -msgid "" -"新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连接" -"符-和下划线_,并且长度在1到39字符之间" -msgstr "" -"The format of the new DB name {} is invalid. Please ensure that the database " -"name starts with a lowercase letter and can only contain letters, numbers, " -"hyphens - and underscores _, and the length is between 1 and 39 characters" +#: backend/ticket/constants.py:319 +msgid "Redis 数据迁移" +msgstr "Redis data migration" -#: backend/ticket/builders/common/base.py:141 -msgid "DB名{}不能以stage_truncate开头" -msgstr "DB name {} cannot start with stage_truncate" +#: backend/ticket/constants.py:320 +msgid "Redis slots 迁移" +msgstr "Redis slots migration" -#: backend/ticket/builders/common/base.py:144 -msgid "DB名{}不能以dba_rollback结尾" -msgstr "DB name {} cannot end with dba_rollback" +#: backend/ticket/constants.py:321 +msgid "Redis 集群版本升级" +msgstr "Redis cluster version upgrade" -#: backend/ticket/builders/common/base.py:153 -msgid "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" -msgstr "A cluster of the same type: {}, with the same name: {} already exists under business {}, please rename it" +#: backend/ticket/constants.py:322 +msgid "Redis 集群重装DBMON" +msgstr "Redis cluster reinstall DBMON" -#: backend/ticket/builders/common/base.py:173 -msgid "不允许%单独使用,不允许*组合使用" -msgstr "" -"% is not allowed to be used alone, and * is not allowed to be used in " -"combination" +#: backend/ticket/constants.py:323 +msgid "predixy配置重写" +msgstr "predixy configuration rewrite" -#: backend/ticket/builders/common/base.py:176 -msgid "包含通配符时,每一个输入框只能允许单一对象" -msgstr "" -"When wildcards are included, each input box can only allow a single object" +#: backend/ticket/constants.py:324 +msgid "Redis 集群proxys版本升级" +msgstr "Redis cluster proxys version upgrade" -#: backend/ticket/builders/common/base.py:179 -msgid "字符不允许只包含空格" -msgstr "Characters are not allowed to contain only spaces" +#: backend/ticket/constants.py:325 +msgid "Redis脏机清理" +msgstr "Redis dirty machine cleaning" -#: backend/ticket/builders/common/base.py:182 -msgid "DB选择框不允许为空" -msgstr "The DB selection box is not allowed to be empty" +#: backend/ticket/constants.py:326 +msgid "Redis 集群存储层cli连接kill" +msgstr "Redis cluster storage layer cli connection kill" -#: backend/ticket/builders/common/base.py:185 -msgid "table选择框不允许为空" -msgstr "The table selection box is not allowed to be empty" +#: backend/ticket/constants.py:327 +msgid "Redis集群域名重命名" +msgstr "Redis cluster domain name renaming" -#: backend/ticket/builders/common/base.py:188 -msgid "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" -msgstr "" -"Ignore the DB selection box and ignore the table selection box are either " -"empty or not empty at the same time" +#: backend/ticket/constants.py:328 +msgid "Redis 集群设置maxmemory" +msgstr "Redis cluster settings maxmemory" -#: backend/ticket/builders/common/base.py:200 -msgid "数据库{}不在所属集群{}中,请重新查验" -msgstr "The database {} does not belong to the cluster {}, please check again" +#: backend/ticket/constants.py:329 +msgid "Redis 集群加载modules" +msgstr "Redis cluster loads modules" -#: backend/ticket/builders/common/bigdata.py:38 -msgid "节点列表信息" -msgstr "Node List Information" +#: backend/ticket/constants.py:338 +msgid "Kafka 集群禁用" +msgstr "Kafka cluster disabled" -#: backend/ticket/builders/common/bigdata.py:52 -#: backend/ticket/builders/redis/redis_cluster_apply.py:96 -msgid "主机{}不在空闲机池,请保证所选的主机均来自空闲机" -msgstr "" -"The host {} is not in the idle machine pool, please ensure that the selected " -"hosts are all from idle machines" +#: backend/ticket/constants.py:339 +msgid "Kafka 集群删除" +msgstr "Kafka cluster deletion" -#: backend/ticket/builders/common/bigdata.py:61 -msgid "主机{}已经被使用,请重新选择主机" -msgstr "The host {} is already in use, please reselect the host" +#: backend/ticket/constants.py:344 +msgid "HDFS 实例重启" +msgstr "HDFS instance restart" -#: backend/ticket/builders/common/bigdata.py:82 -#: backend/ticket/builders/mysql/base.py:175 -msgid "集群{}状态转移不合法:{}--->{} is invalid" -msgstr "Cluster {} state transfer is invalid: {}--->{} is invalid" +#: backend/ticket/constants.py:351 +msgid "ES 集群扩容" +msgstr "ES cluster expansion" -#: backend/ticket/builders/common/bigdata.py:90 -msgid "资源池规格" -msgstr "Resource pool specification" +#: backend/ticket/constants.py:352 +msgid "ES 集群缩容" +msgstr "ES cluster shrinkage" -#: backend/ticket/builders/common/bigdata.py:110 -#: backend/ticket/builders/influxdb/influxdb_apply.py:29 -#: backend/ticket/builders/mysql/mysql_single_apply.py:48 -#: backend/ticket/builders/redis/redis_cluster_apply.py:33 -#: backend/ticket/builders/spider/tendb_apply.py:32 -msgid "城市代码" -msgstr "city ​​code" +#: backend/ticket/constants.py:353 +msgid "ES 实例重启" +msgstr "ES instance restart" -#: backend/ticket/builders/common/bigdata.py:112 -#: backend/ticket/builders/redis/redis_cluster_apply.py:31 -#: backend/ticket/serializers.py:77 -msgid "业务英文缩写" -msgstr "business abbreviation" +#: backend/ticket/constants.py:354 +msgid "ES 集群替换" +msgstr "ES cluster replacement" -#: backend/ticket/builders/common/bigdata.py:113 -msgid "集群名称(英文数字及下划线)" -msgstr "Cluster name (alphanumeric and underscore)" +#: backend/ticket/constants.py:355 +msgid "ES 集群启用" +msgstr "ES cluster enabled" -#: backend/ticket/builders/common/bigdata.py:114 -#: backend/ticket/builders/redis/redis_cluster_apply.py:42 -msgid "集群别名(一般为中文别名)" -msgstr "Cluster alias (usually Chinese alias)" +#: backend/ticket/constants.py:356 +msgid "ES 集群禁用" +msgstr "ES cluster disabled" -#: backend/ticket/builders/common/bigdata.py:118 -msgid "资源申请规格" -msgstr "Resource Application Specifications" +#: backend/ticket/constants.py:357 +msgid "ES 集群删除" +msgstr "ES cluster deletion" -#: backend/ticket/builders/common/bigdata.py:156 -msgid "主机{}出现角色互斥,{}与{}冲突" -msgstr "Host {} has a role mutual exclusion, and {} conflicts with {}" +#: backend/ticket/constants.py:362 +msgid "Pulsar 实例重启" +msgstr "Pulsar instance restart" -#: backend/ticket/builders/common/bigdata.py:170 -#: backend/ticket/builders/common/bigdata.py:291 -msgid "旧节点信息集合" -msgstr "Collection of old node information" +#: backend/ticket/constants.py:369 backend/ticket/constants.py:370 +#: backend/ticket/constants.py:373 backend/ticket/constants.py:374 +msgid "实例管理" +msgstr "Instance management" -#: backend/ticket/builders/common/bigdata.py:170 -#: backend/ticket/builders/common/bigdata.py:172 -#: backend/ticket/builders/common/bigdata.py:291 -#: backend/ticket/builders/common/bigdata.py:293 -msgid "节点信息" -msgstr "node information" +#: backend/ticket/constants.py:376 +msgid "Doris 集群部署" +msgstr "Doris cluster deployment" -#: backend/ticket/builders/common/bigdata.py:172 -#: backend/ticket/builders/common/bigdata.py:293 -msgid "新节点信息集合" -msgstr "New node information collection" +#: backend/ticket/constants.py:377 +msgid "Doris 集群扩容" +msgstr "Doris cluster expansion" -#: backend/ticket/builders/common/bigdata.py:174 -msgid "规格类型" -msgstr "Specification type" +#: backend/ticket/constants.py:378 +msgid "Doris 集群缩容" +msgstr "Doris cluster scaling down" -#: backend/ticket/builders/common/bigdata.py:181 -#: backend/ticket/builders/common/bigdata.py:302 -msgid "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" -msgstr "" -"The types of characters before and after the replacement are inconsistent, " -"please ensure that the types and numbers of characters before and after the " -"replacement are the same!" +#: backend/ticket/constants.py:379 +msgid "Doris 实例重启" +msgstr "Doris instance restart" -#: backend/ticket/builders/common/bigdata.py:189 -#: backend/ticket/builders/common/bigdata.py:310 -msgid "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" -msgstr "" -"The number of roles {} before and after replacement is inconsistent, please " -"ensure that the type and number of characters before and after replacement " -"are consistent!" +#: backend/ticket/constants.py:380 +msgid "Doris 集群替换" +msgstr "Doris cluster replacement" + +#: backend/ticket/constants.py:381 +msgid "Doris 集群启用" +msgstr "Doris cluster enabled" -#: backend/ticket/builders/common/bigdata.py:208 -msgid "实例名" -msgstr "instance name" +#: backend/ticket/constants.py:382 +msgid "Doris 集群禁用" +msgstr "Doris cluster disabled" -#: backend/ticket/builders/common/bigdata.py:219 -#: backend/ticket/builders/common/bigdata.py:285 -msgid "实例{}不存在, 请重新确认实例的合法性" -msgstr "" -"Instance {} does not exist, please reconfirm the legitimacy of the instance" +#: backend/ticket/constants.py:383 +msgid "Doris 集群删除" +msgstr "Doris cluster deletion" -#: backend/ticket/builders/common/bigdata.py:224 -msgid "无法进行重启操作,原因:{}" -msgstr "Unable to perform restart operation, reason: {}" +#: backend/ticket/constants.py:386 +msgid "Riak 集群部署" +msgstr "Riak cluster deployment" -#: backend/ticket/builders/common/bigdata.py:295 -msgid "规格" -msgstr "Specification" +#: backend/ticket/constants.py:392 +msgid "Riak 集群节点重启" +msgstr "Riak cluster node restart" -#: backend/ticket/builders/common/constants.py:70 -msgid "本地" -msgstr "local" +#: backend/ticket/constants.py:393 +msgid "Riak 集群迁移" +msgstr "Riak cluster migration" -#: backend/ticket/builders/common/constants.py:71 -msgid "远程" -msgstr "Remotely" +#: backend/ticket/constants.py:396 +msgid "MongoDB 副本集集群部署" +msgstr "MongoDB replica set cluster deployment" -#: backend/ticket/builders/common/constants.py:88 -msgid "手动提单修复" -msgstr "Manual Bill of Lading Repair" +#: backend/ticket/constants.py:397 +msgid "MongoDB 分片集群部署" +msgstr "MongoDB sharded cluster deployment" -#: backend/ticket/builders/common/constants.py:89 -msgid "例行校验修复" -msgstr "Routine check repair" +#: backend/ticket/constants.py:398 +msgid "MongoDB 变更脚本执行" +msgstr "MongoDB change script execution" -#: backend/ticket/builders/common/constants.py:97 -msgid "远程备份 + 时间" -msgstr "remote backup + time" +#: backend/ticket/constants.py:398 +msgid "脚本任务" +msgstr "script task" -#: backend/ticket/builders/common/constants.py:98 -msgid "远程备份 + backupid" -msgstr "remote backup + backupid" +#: backend/ticket/constants.py:399 +msgid "MongoDB 清档" +msgstr "MongoDB clearance" -#: backend/ticket/builders/common/constants.py:99 -msgid "本地备份 + 时间" -msgstr "local backup + time" +#: backend/ticket/constants.py:400 +msgid "MongoDB 全库备份" +msgstr "MongoDB full database backup" -#: backend/ticket/builders/common/constants.py:100 -msgid "本地备份 + backupid" -msgstr "local backup + backupid" +#: backend/ticket/constants.py:401 +msgid "MongoDB 库表备份" +msgstr "MongoDB database table backup" -#: backend/ticket/builders/es/es_apply.py:45 -msgid "master节点数不为3台! 请保证master的部署节点为3" -msgstr "" -"The number of master nodes is not 3! Please ensure that the deployment nodes " -"of the master are 3" +#: backend/ticket/constants.py:402 +msgid "MongoDB 扩容接入层" +msgstr "MongoDB expansion access layer" -#: backend/ticket/builders/es/es_apply.py:52 -msgid "请保证在部署client节点的情况下,部署至少一台hot/cold节点" -msgstr "" -"Please ensure that at least one hot/cold node is deployed when the client " -"node is deployed" +#: backend/ticket/constants.py:403 +msgid "MongoDB 缩容接入层" +msgstr "MongoDB scaling access layer" -#: backend/ticket/builders/es/es_apply.py:125 -msgid "ES集群部署" -msgstr "ES cluster deployment" +#: backend/ticket/constants.py:404 +msgid "MongoDB 扩容shard节点数" +msgstr "MongoDB expands the number of shard nodes" -#: backend/ticket/builders/es/es_destroy.py:36 -msgid "ES集群删除" -msgstr "ES cluster deletion" +#: backend/ticket/constants.py:405 +msgid "MongoDB 缩容shard节点数" +msgstr "MongoDB shrinks the number of shard nodes" -#: backend/ticket/builders/es/es_disable.py:36 -msgid "ES集群停用" -msgstr "ES cluster deactivated" +#: backend/ticket/constants.py:406 +msgid "MongoDB 集群容量变更" +msgstr "MongoDB cluster capacity changes" -#: backend/ticket/builders/es/es_enable.py:36 -msgid "ES集群启用" -msgstr "ES cluster enabled" +#: backend/ticket/constants.py:410 +msgid "MongoDB 集群删除" +msgstr "MongoDB cluster deletion" -#: backend/ticket/builders/es/es_reboot.py:38 -msgid "ES实例重启" -msgstr "ES instance restart" +#: backend/ticket/constants.py:411 +msgid "MongoDB 整机替换" +msgstr "MongoDB whole machine replacement" -#: backend/ticket/builders/es/es_replace.py:47 -msgid "ES集群替换" -msgstr "ES cluster replacement" +#: backend/ticket/constants.py:412 +msgid "MongoDB 授权" +msgstr "MongoDB authorization" -#: backend/ticket/builders/es/es_scale_up.py:44 -msgid "实例数必须为正数,请确保实例的合法性" -msgstr "" -"The number of instances must be a positive number, please ensure the " -"legitimacy of the instance" +#: backend/ticket/constants.py:413 +msgid "MongoDB Excel授权" +msgstr "MongoDB Excel authorization" -#: backend/ticket/builders/es/es_scale_up.py:98 -msgid "ES集群扩容" -msgstr "ES cluster expansion" +#: backend/ticket/constants.py:414 +msgid "MongoDB 定点回档" +msgstr "MongoDB fixed point recovery" -#: backend/ticket/builders/es/es_shrink.py:30 -msgid "hot信息列表" -msgstr "hot information list" +#: backend/ticket/constants.py:416 +msgid "MongoDB 安装DBMon" +msgstr "MongoDB install DBMon" -#: backend/ticket/builders/es/es_shrink.py:31 -msgid "cold信息列表" -msgstr "cold information list" +#: backend/ticket/constants.py:419 +msgid "云区域服务部署" +msgstr "Cloud Region Service Deployment" -#: backend/ticket/builders/es/es_shrink.py:32 -msgid "client信息列表" -msgstr "client information list" +#: backend/ticket/constants.py:420 +msgid "云区域Nginx 服务部署" +msgstr "Nginx Service Deployment in Cloud Regions" -#: backend/ticket/builders/es/es_shrink.py:34 -msgid "nodes节点列表" -msgstr "nodes node list" +#: backend/ticket/constants.py:421 +msgid "云区域nginx 服务重装" +msgstr "Cloud area nginx service reinstallation" -#: backend/ticket/builders/es/es_shrink.py:59 -#: backend/ticket/builders/kafka/kafka_shrink.py:58 -msgid "{}: 至少保留1台!" -msgstr "{}: Keep at least 1 unit!" +#: backend/ticket/constants.py:422 +msgid "云区域nginx 服务替换" +msgstr "Cloud zone nginx service replacement" -#: backend/ticket/builders/es/es_shrink.py:62 -msgid "缩容仅支持hot、cold和client" -msgstr "Scaling only supports hot, cold and client" +#: backend/ticket/constants.py:423 +msgid "云区域dns 服务部署" +msgstr "Cloud zone dns service deployment" -#: backend/ticket/builders/es/es_shrink.py:78 -msgid "ES集群缩容" -msgstr "ES cluster shrinkage" +#: backend/ticket/constants.py:424 +msgid "云区域dns 服务添加" +msgstr "cloud zone dns service added" -#: backend/ticket/builders/hdfs/hdfs_apply.py:40 -msgid "Datanode节点数量<2台,请增加Datanode节点数量" -msgstr "" -"The number of Datanode nodes is less than 2, please increase the number of " -"Datanode nodes" +#: backend/ticket/constants.py:425 +msgid "云区域dns 服务裁撤" +msgstr "Cloud zone dns service abolition" -#: backend/ticket/builders/hdfs/hdfs_apply.py:45 -msgid "Namenode节点数量不等于2台,请确保Namenode数量为2台" -msgstr "" -"The number of Namenode nodes is not equal to 2, please ensure that the " -"number of Namenodes is 2" +#: backend/ticket/constants.py:426 +msgid "云区域dns 服务替换" +msgstr "Cloud zone dns service replacement" -#: backend/ticket/builders/hdfs/hdfs_apply.py:50 -msgid "" -"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" -msgstr "" -"The number of ZooKeeper/JournalNode nodes is not equal to 3, please ensure " -"that the number of ZooKeeper/JournalNode is 3" +#: backend/ticket/constants.py:427 +msgid "云区域dns 服务重装" +msgstr "Cloud zone dns service reinstallation" -#: backend/ticket/builders/hdfs/hdfs_apply.py:139 -#: backend/ticket/constants.py:184 -msgid "HDFS 集群部署" -msgstr "HDFS cluster deployment" +#: backend/ticket/constants.py:428 +msgid "云区域dbha 服务部署" +msgstr "Cloud region dbha service deployment" -#: backend/ticket/builders/hdfs/hdfs_destroy.py:36 -#: backend/ticket/constants.py:191 -msgid "HDFS 集群删除" -msgstr "HDFS cluster deletion" +#: backend/ticket/constants.py:429 +msgid "云区域dbha 服务重装" +msgstr "Cloud region dbha service reinstallation" -#: backend/ticket/builders/hdfs/hdfs_disable.py:36 -#: backend/ticket/constants.py:190 -msgid "HDFS 集群禁用" -msgstr "HDFS cluster disabled" +#: backend/ticket/constants.py:430 +msgid "云区域dbha 服务替换" +msgstr "Cloud zone dbha service replacement" -#: backend/ticket/builders/hdfs/hdfs_enable.py:36 -#: backend/ticket/constants.py:189 -msgid "HDFS 集群启用" -msgstr "HDFS cluster enabled" +#: backend/ticket/constants.py:431 +msgid "云区域dbha 服务新增" +msgstr "Cloud region dbha service added" -#: backend/ticket/builders/hdfs/hdfs_reboot.py:39 -msgid "HDFS实例重启" -msgstr "HDFS instance restart" +#: backend/ticket/constants.py:432 +msgid "云区域dbha 服务删除" +msgstr "cloud zone dbha service delete" -#: backend/ticket/builders/hdfs/hdfs_replace.py:37 -msgid "hdfs替换只支持datanode角色" -msgstr "hdfs replacement only supports datanode role" +#: backend/ticket/constants.py:433 +msgid "云区域drs 服务部署" +msgstr "Cloud zone drs service deployment" -#: backend/ticket/builders/hdfs/hdfs_replace.py:57 -#: backend/ticket/constants.py:188 -msgid "HDFS 集群替换" -msgstr "HDFS cluster replacement" +#: backend/ticket/constants.py:434 +msgid "云区域drs 服务重启" +msgstr "Cloud zone drs service restart" -#: backend/ticket/builders/hdfs/hdfs_scale_up.py:64 -#: backend/ticket/constants.py:185 -msgid "HDFS 集群扩容" -msgstr "HDFS cluster expansion" +#: backend/ticket/constants.py:435 +msgid "云区域drs 服务新增" +msgstr "Cloud zone drs service added" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:30 -#: backend/ticket/builders/kafka/kafka_shrink.py:31 -#: backend/ticket/builders/pulsar/pulsar_shrink.py:34 -msgid "broker信息列表" -msgstr "broker information list" +#: backend/ticket/constants.py:436 +msgid "云区域drs 服务删除" +msgstr "cloud zone drs service deletion" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:32 -#: backend/ticket/builders/kafka/kafka_shrink.py:33 -msgid "nodes节点信息" -msgstr "nodesNode information" +#: backend/ticket/constants.py:437 +msgid "云区域drs 服务替换" +msgstr "cloud zone drs service replacement" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:56 -msgid "{}: 至少保留2台!" -msgstr "{}: Keep at least 2 units!" +#: backend/ticket/constants.py:438 +msgid "云区域redis_dts 服务部署" +msgstr "Cloud region redis_dts service deployment" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:59 -msgid "缩容仅支持DataNode角色" -msgstr "Scaling only supports the DataNode role" +#: backend/ticket/constants.py:439 +msgid "云区域redis_dts 服务新增" +msgstr "New redis_dts service in cloud area" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:75 -#: backend/ticket/constants.py:186 -msgid "HDFS 集群缩容" -msgstr "HDFS cluster shrink" +#: backend/ticket/constants.py:440 +msgid "云区域redis_dts 服务删除" +msgstr "Cloud region redis_dts service deletion" -#: backend/ticket/builders/influxdb/influxdb_apply.py:35 -msgid "分组名字" -msgstr "group name" +#: backend/ticket/constants.py:447 +msgid "VM 集群部署" +msgstr "VM cluster deployment" -#: backend/ticket/builders/influxdb/influxdb_apply.py:36 -#: backend/ticket/builders/mysql/mysql_add_slave.py:37 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:33 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:34 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:35 -msgid "资源规格" -msgstr "resource specification" +#: backend/ticket/constants.py:448 +msgid "VM 集群扩容" +msgstr "VM cluster expansion" -#: backend/ticket/builders/influxdb/influxdb_apply.py:75 -#: backend/ticket/constants.py:211 -msgid "InfluxDB 实例部署" -msgstr "InfluxDB instance deployment" +#: backend/ticket/constants.py:449 +msgid "VM 集群缩容" +msgstr "VM cluster scaling down" -#: backend/ticket/builders/influxdb/influxdb_destroy.py:37 -#: backend/ticket/constants.py:215 -msgid "InfluxDB 实例删除" -msgstr "InfluxDB instance deletion" +#: backend/ticket/constants.py:450 +msgid "VM 实例重启" +msgstr "VM instance restart" -#: backend/ticket/builders/influxdb/influxdb_disable.py:37 -#: backend/ticket/constants.py:214 -msgid "InfluxDB 实例禁用" -msgstr "InfluxDB instance disabled" +#: backend/ticket/constants.py:451 +msgid "VM 集群替换" +msgstr "VM cluster replacement" -#: backend/ticket/builders/influxdb/influxdb_enable.py:37 -#: backend/ticket/constants.py:213 -msgid "InfluxDB 实例启用" -msgstr "InfluxDB instance enabled" +#: backend/ticket/constants.py:452 +msgid "VM 集群启用" +msgstr "VM cluster enabled" -#: backend/ticket/builders/influxdb/influxdb_reboot.py:39 -#: backend/ticket/constants.py:212 -msgid "InfluxDB 实例重启" -msgstr "InfluxDB instance restart" +#: backend/ticket/constants.py:453 +msgid "VM 集群禁用" +msgstr "VM cluster disabled" -#: backend/ticket/builders/influxdb/influxdb_replace.py:46 -#: backend/ticket/constants.py:216 -msgid "InfluxDB 实例替换" -msgstr "InfluxDB instance replacement" +#: backend/ticket/constants.py:454 +msgid "VM 集群删除" +msgstr "VM cluster deletion" -#: backend/ticket/builders/kafka/kafka_apply.py:73 -#: backend/ticket/builders/pulsar/pulsar_apply.py:29 -msgid "副本数量" -msgstr "number of copies" +#: backend/ticket/constants.py:463 +msgid "生产部署" +msgstr "production deployment" -#: backend/ticket/builders/kafka/kafka_apply.py:76 -#: backend/ticket/builders/pulsar/pulsar_apply.py:30 -msgid "分区数量" -msgstr "number of partitions" +#: backend/ticket/constants.py:465 +msgid "快速执行" +msgstr "fast execution" -#: backend/ticket/builders/kafka/kafka_apply.py:79 -#: backend/ticket/builders/pulsar/pulsar_apply.py:31 -msgid "保留时长(小时)" -msgstr "Hold time (hours)" +#: backend/ticket/constants.py:467 +msgid "结果忽略执行" +msgstr "result ignore execution" -#: backend/ticket/builders/kafka/kafka_apply.py:101 -msgid "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" -msgstr "" -"The number of Zookeeper nodes is not equal to 3, please ensure that the " -"number of Zookeeper nodes is 3" +#: backend/ticket/constants.py:471 +msgid "交付" +msgstr "Deliver" -#: backend/ticket/builders/kafka/kafka_apply.py:107 -msgid "" -"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" -msgstr "" -"The number of Broker nodes and copy nodes is wrong, please ensure that the " -"number of Broker nodes is at least 1 and the number of copies is <= the " -"number of Brokers" +#: backend/ticket/constants.py:473 +msgid "描述任务信息" +msgstr "Describe task information" -#: backend/ticket/builders/kafka/kafka_apply.py:133 -#: backend/ticket/constants.py:175 -msgid "Kafka 集群部署" -msgstr "Kafka cluster deployment" +#: backend/ticket/constants.py:479 +msgid "资源交付" +msgstr "resource delivery" -#: backend/ticket/builders/kafka/kafka_destroy.py:37 -msgid "Kafka 集群销毁" -msgstr "Kafka cluster destruction" +#: backend/ticket/constants.py:481 +msgid "资源批量申请" +msgstr "Resource Batch Application" -#: backend/ticket/builders/kafka/kafka_disable.py:37 -msgid "Kafka 集群停用" -msgstr "Kafka cluster down" +#: backend/ticket/constants.py:483 +msgid "资源批量交付" +msgstr "Batch delivery of resources" -#: backend/ticket/builders/kafka/kafka_enable.py:37 -#: backend/ticket/constants.py:180 -msgid "Kafka 集群启用" -msgstr "Kafka cluster enabled" +#: backend/ticket/constants.py:500 +msgid "单据过期配置" +msgstr "Document expiration configuration" -#: backend/ticket/builders/kafka/kafka_reboot.py:39 -#: backend/ticket/constants.py:178 -msgid "Kafka 实例重启" -msgstr "Kafka instance restart" +#: backend/ticket/constants.py:506 +msgid "前置动作" +msgstr "pre-action" -#: backend/ticket/builders/kafka/kafka_replace.py:48 -#: backend/ticket/constants.py:179 -msgid "Kafka 集群替换" -msgstr "Kafka cluster replacement" +#: backend/ticket/constants.py:507 +msgid "后继动作" +msgstr "subsequent action" -#: backend/ticket/builders/kafka/kafka_scale_up.py:65 -#: backend/ticket/constants.py:176 -msgid "Kafka 集群扩容" -msgstr "Kafka cluster expansion" +#: backend/ticket/constants.py:513 +msgid "自动重试" +msgstr "automatic retry" -#: backend/ticket/builders/kafka/kafka_shrink.py:61 -msgid "缩容仅支持Broker" -msgstr "Scaling only supports Broker" +#: backend/ticket/constants.py:514 +msgid "手动重试" +msgstr "Manual retry" -#: backend/ticket/builders/kafka/kafka_shrink.py:77 -#: backend/ticket/constants.py:177 -msgid "Kafka 集群缩容" -msgstr "Kafka cluster shrink" +#: backend/ticket/constants.py:520 +msgid "通用错误代码" +msgstr "generic error code" -#: backend/ticket/builders/mysql/base.py:98 -msgid "matser实例状态异常,暂时无法执行该单据类型:{}" -msgstr "" -"The state of the matser instance is abnormal, and this ticket type cannot " -"be executed temporarily: {}" +#: backend/ticket/constants.py:521 +msgid "自动互斥重试错误代码" +msgstr "Automatic mutex retry error code" -#: backend/ticket/builders/mysql/base.py:104 -msgid "slave实例状态异常,暂时无法执行该单据类型:{}" -msgstr "" -"The status of the slave instance is abnormal, and the ticket type cannot " -"be executed temporarily: {}" +#: backend/ticket/constants.py:522 +msgid "手动互斥重试错误代码" +msgstr "Manual mutex retry error code" -#: backend/ticket/builders/mysql/base.py:110 -msgid "proxy实例状态异常,暂时无法执行该单据类型:{}" -msgstr "" -"The status of the proxy instance is abnormal, and the ticket type cannot " -"be executed temporarily: {}" +#: backend/ticket/constants.py:523 +msgid "系统终止错误代码" +msgstr "System termination error code" -#: backend/ticket/builders/mysql/base.py:120 -msgid "请保证所选集群{}与新增机器{}在同一云区域下" -msgstr "" -"Please ensure that the selected cluster {} and the newly added machine {} " -"are in the same cloud region" +#: backend/ticket/constants.py:541 +msgid "需要人工确认" +msgstr "Requires manual confirmation" -#: backend/ticket/builders/mysql/base.py:129 -msgid "请保证实例f{}的角色类型为{}" -msgstr "Please ensure that the role type of the instance f{} is {}" +#: backend/ticket/constants.py:542 +msgid "无需确认" +msgstr "No confirmation required" -#: backend/ticket/builders/mysql/base.py:136 -msgid "请保证所选集群{}都是{}集群" -msgstr "Please ensure that the selected clusters {} are all {} clusters" +#: backend/ticket/constants.py:550 +msgid "数据复制完成后自动断开同步关系" +msgstr "Automatically disconnect the synchronization relationship after data copy is completed" -#: backend/ticket/builders/mysql/base.py:148 -msgid "请保证所选实例{}的关联集群为{}" -msgstr "" -"Please ensure that the associated cluster of the selected instance {} is {}" +#: backend/ticket/constants.py:551 +msgid "数据复制完成后保持同步关系,定时发送断开同步提醒" +msgstr "After data replication is completed, the synchronization relationship is maintained and synchronization disconnection reminders are sent regularly." -#: backend/ticket/builders/mysql/base.py:166 -msgid "是否强制下架" -msgstr "Is it mandatory to take off the shelves" +#: backend/ticket/constants.py:569 +msgid "一天一次" +msgstr "once a day" -#: backend/ticket/builders/mysql/mysql_add_slave.py:32 -msgid "新从库机器信息" -msgstr "New slave machine information" +#: backend/ticket/constants.py:570 backend/ticket/constants.py:580 +msgid "一周一次" +msgstr "once a week" -#: backend/ticket/builders/mysql/mysql_add_slave.py:39 -msgid "添加从库信息" -msgstr "Add slave information" +#: backend/ticket/constants.py:578 +msgid "一次" +msgstr "once" -#: backend/ticket/builders/mysql/mysql_add_slave.py:41 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:37 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:38 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:38 -msgid "机器来源" -msgstr "machine source" +#: backend/ticket/constants.py:579 +msgid "三天一次" +msgstr "Once every three days" -#: backend/ticket/builders/mysql/mysql_add_slave.py:87 -msgid "添加从库执行" -msgstr "Add slave execution" +#: backend/ticket/constants.py:588 +msgid "删除同名key再写入" +msgstr "Delete the key with the same name and write it again" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:41 -msgid "用户输入的excel下载文件地址" -msgstr "The excel download file address entered by the user" +#: backend/ticket/constants.py:589 +msgid "保留同名key追加写入" +msgstr "Keep the key with the same name and append it to write" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:43 -msgid "授权数据信息列表" -msgstr "List of authorized data information" +#: backend/ticket/constants.py:590 +msgid "清空集群后写入" +msgstr "Write after clearing the cluster" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:55 -msgid "授权数据已过期,请重新提交授权表单或excel文件" -msgstr "" -"The authorization data has expired, please resubmit the authorization form " -"or excel file" +#: backend/ticket/constants.py:598 +msgid "立刻触发" +msgstr "Trigger immediately" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:73 -msgid "授权执行" -msgstr "authorized execution" +#: backend/ticket/constants.py:599 +msgid "定时触发" +msgstr "Timing trigger" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:83 -msgid "Excel 授权执行" -msgstr "Excel authorization execution" +#: backend/ticket/constants.py:605 backend/ticket/constants.py:614 +msgid "审批" +msgstr "Approval" -#: backend/ticket/builders/mysql/mysql_checksum.py:32 -msgid "slave信息列表" -msgstr "slave information list" +#: backend/ticket/constants.py:606 backend/ticket/constants.py:615 +msgid "认领" +msgstr "claim" -#: backend/ticket/builders/mysql/mysql_checksum.py:39 -msgid "超时时间" -msgstr "overtime time" +#: backend/ticket/constants.py:607 +msgid "分派" +msgstr "dispatch" -#: backend/ticket/builders/mysql/mysql_checksum.py:40 -msgid "定时触发时间" -msgstr "Timing trigger time" +#: backend/ticket/constants.py:608 +msgid "自动处理" +msgstr "Automatic processing" -#: backend/ticket/builders/mysql/mysql_checksum.py:41 -msgid "全备信息列表" -msgstr "Full information list" +#: backend/ticket/constants.py:616 +msgid "派单" +msgstr "dispatch order" -#: backend/ticket/builders/mysql/mysql_checksum.py:42 -#: backend/ticket/builders/mysql/mysql_data_repair.py:32 -msgid "数据修复信息" -msgstr "Data Repair Information" +#: backend/ticket/constants.py:617 +msgid "转单" +msgstr "transfer order" -#: backend/ticket/builders/mysql/mysql_checksum.py:43 -#: backend/ticket/builders/mysql/mysql_data_repair.py:34 -msgid "非innodb表是否修复" -msgstr "Are non-innodb tables repaired?" +#: backend/ticket/constants.py:618 +msgid "终止节点和单据" +msgstr "Termination nodes and documents" -#: backend/ticket/builders/mysql/mysql_checksum.py:156 -msgid "数据校验执行" -msgstr "Data validation execution" +#: backend/ticket/constants.py:634 +msgid "待办" +msgstr "Upcoming" -#: backend/ticket/builders/mysql/mysql_checksum.py:173 -msgid "手动" -msgstr "manual" +#: backend/ticket/constants.py:639 +msgid "待确认" +msgstr "To be confirmed" -#: backend/ticket/builders/mysql/mysql_checksum.py:175 -msgid "自动" -msgstr "automatic" +#: backend/ticket/constants.py:640 +msgid "待审批" +msgstr "Pending approval" -#: backend/ticket/builders/mysql/mysql_checksum.py:183 -msgid "数据修复{}执行" -msgstr "datafix{} execute" +#: backend/ticket/constants.py:646 +msgid "审批过期" +msgstr "Approval expired" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:51 -msgid "客户端权限克隆执行" -msgstr "Client permission clone execution" +#: backend/ticket/constants.py:647 +msgid "执行过期" +msgstr "Execution expired" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:64 -msgid "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" -msgstr "" -"The permission clone data has expired, please resubmit the permission clone " -"form or excel file" +#: backend/ticket/constants.py:648 +msgid "单据流程todo过期" +msgstr "Document process todo expires" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:71 -msgid "DB实例权限克隆执行" -msgstr "DB instance permission clone execution" +#: backend/ticket/exceptions.py:18 +msgid "单据模块异常" +msgstr "Ticket module exception" -#: backend/ticket/builders/mysql/mysql_data_repair.py:29 -msgid "master信息" -msgstr "master information" +#: backend/ticket/exceptions.py:23 +msgid "ITSM单据不存在" +msgstr "ITSM ticket does not exist" -#: backend/ticket/builders/mysql/mysql_data_repair.py:30 -msgid "slaves信息" -msgstr "slaves information" +#: backend/ticket/exceptions.py:24 +#, python-brace-format +msgid "ITSM单据[{sn}]不存在" +msgstr "ITSM ticket [{sn}] does not exist" -#: backend/ticket/builders/mysql/mysql_data_repair.py:33 -msgid "校验单据结果表名" -msgstr "Verification ticket result table name" +#: backend/ticket/exceptions.py:29 +msgid "单据类型不支持" +msgstr "Ticket type does not support" -#: backend/ticket/builders/mysql/mysql_data_repair.py:35 -msgid "校验结果是否一致" -msgstr "Whether the verification result is consistent" +#: backend/ticket/exceptions.py:30 +#, python-brace-format +msgid "单据类型不支持{ticket_type}" +msgstr "Ticket type does not support {ticket_type}" -#: backend/ticket/builders/mysql/mysql_data_repair.py:38 -msgid "数据修复触发类型" -msgstr "Data Repair Trigger Type" +#: backend/ticket/exceptions.py:35 +msgid "单据参数校验异常" +msgstr "Ticket parameter verification exception" -#: backend/ticket/builders/mysql/mysql_data_repair.py:51 -msgid "数据修复执行" -msgstr "Data Repair Execution" +#: backend/ticket/exceptions.py:36 +#, python-brace-format +msgid "单据{ticket_type}参数校验异常" +msgstr "Ticket {ticket_type} parameter verification exception" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:29 -msgid "备份新机器" -msgstr "backup new machine" +#: backend/ticket/exceptions.py:41 +msgid "单据执行互斥" +msgstr "Mutual Execution of Tickets" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:35 -msgid "备份文件信息" -msgstr "Backup file information" +#: backend/ticket/exceptions.py:42 +#, python-brace-format +msgid "单据{ticket_type}执行互斥" +msgstr "Ticket {ticket_type} executes mutual exclusion" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:37 -#: backend/ticket/builders/mysql/mysql_flashback.py:30 -msgid "目标库列表" -msgstr "target db list" +#: backend/ticket/exceptions.py:47 +msgid "单据提交重复" +msgstr "Duplicate ticket submission" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:38 -#: backend/ticket/builders/mysql/mysql_flashback.py:31 -msgid "忽略库列表" -msgstr "ignore db list" +#: backend/ticket/exceptions.py:48 +#, python-brace-format +msgid "单据{ticket_type}提交重复" +msgstr "Duplicate submission of ticket {ticket_type}" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:39 -#: backend/ticket/builders/mysql/mysql_flashback.py:32 -msgid "目标table列表" -msgstr "target table list" +#: backend/ticket/exceptions.py:53 +msgid "单据任务定时触发异常" +msgstr "Document task triggers exception regularly" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:40 -#: backend/ticket/builders/mysql/mysql_flashback.py:33 -msgid "忽略table列表" -msgstr "ignore table list" +#: backend/ticket/exceptions.py:54 +msgid "单据任务{ticket_type}定时触发异常" +msgstr "Document task {ticket_type} triggers exception regularly" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:42 -msgid "定点回档信息" -msgstr "Fixed-point rollback information" +#: backend/ticket/exceptions.py:59 +msgid "错误的todo处理人" +msgstr "Wrong todo handler" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:52 -msgid "请保证rollback_time或backupinfo参数至少存在一个" -msgstr "" -"Please ensure that there is at least one rollback_time or backupinfo " -"parameter" +#: backend/ticket/exceptions.py:60 +#, python-brace-format +msgid "错误的todo处理人{username}" +msgstr "Wrong todo handler {username}" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:60 -msgid "定点时间{}不能晚于当前时间{}" -msgstr "Fixed time {} cannot be later than current time {}" +#: backend/ticket/exceptions.py:65 +msgid "审批处理异常" +msgstr "Approval processing exception" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:81 -msgid "定点回档执行" -msgstr "Fixed-point rollback execution" +#: backend/ticket/exceptions.py:66 +#, python-brace-format +msgid "审批处理异常{username}" +msgstr "Approval processing exception {username}" -#: backend/ticket/builders/mysql/mysql_flashback.py:35 -msgid "flashback工具地址" -msgstr "flashback tool address" +#: backend/ticket/exceptions.py:71 +msgid "单据流程设置失败" +msgstr "Document process setup failed" -#: backend/ticket/builders/mysql/mysql_flashback.py:37 -msgid "记录文件" -msgstr "log file" +#: backend/ticket/exceptions.py:72 +msgid "单据流程{ticket_type}设置失败" +msgstr "Document process {ticket_type} setting failed" -#: backend/ticket/builders/mysql/mysql_flashback.py:39 -msgid "flashback信息" -msgstr "flashback information" +#: backend/ticket/flow_manager/base.py:110 +msgid "{}流程已跳过" +msgstr "{} process skipped" -#: backend/ticket/builders/mysql/mysql_flashback.py:51 -msgid "flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时间" -msgstr "The start and end time of flash {}--{} is invalid, please ensure that the start time is less than the end time, and the two are not greater than the current time" +#: backend/ticket/flow_manager/delivery.py:42 +msgid "交付成功" +msgstr "successful delivery" -#: backend/ticket/builders/mysql/mysql_flashback.py:68 -msgid "闪回执行" -msgstr "flashback execution" +#: backend/ticket/flow_manager/delivery.py:89 +msgid "失败后继续提交" +msgstr "Continue submitting after failure" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:37 -msgid "容灾级别" -msgstr "Disaster recovery level" +#: backend/ticket/flow_manager/delivery.py:93 +msgid "执行{}" +msgstr "implement{}" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:39 -msgid "Proxy起始端口" -msgstr "Proxy start port" +#: backend/ticket/flow_manager/inner.py:85 +#, python-brace-format +msgid "任务{status_display}" +msgstr "task {status_display}" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:59 -msgid "" -"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" -"台backend机器" +#: backend/ticket/flow_manager/inner.py:200 +msgid "该任务流程跳过,相关信息可在历史任务中查看" msgstr "" -"The number of machines entered is wrong. Expected to input {} proxy and " -"backend machines, but actually entered {} proxy machines and {} backend " -"machines" +"The task process is skipped, and relevant information can be viewed in the " +"historical task" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:126 -msgid "MySQL高可用部署执行" -msgstr "MySQL high availability deployment execution" +#: backend/ticket/flow_manager/inner.py:220 +#, python-brace-format +msgid "(执行结果可忽略)任务状态: {status_display}" +msgstr "(The execution result can be ignored) Task status: {status_display}" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:145 -#: backend/ticket/builders/mysql/mysql_single_apply.py:203 -msgid "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" -msgstr "" -"Failed to get the database character set or version, please check the " -"parameters, db_config: {}" +#: backend/ticket/flow_manager/itsm.py:63 +msgid "未知单据" +msgstr "unknown document" -#: backend/ticket/builders/mysql/mysql_ha_backup.py:36 -msgid "备份信息列表" -msgstr "Backup Information List" +#: backend/ticket/flow_manager/itsm.py:70 +msgid "审批中" +msgstr "Approval" -#: backend/ticket/builders/mysql/mysql_ha_backup.py:58 -msgid "库表备份执行" -msgstr "Database table backup execution" +#: backend/ticket/flow_manager/itsm.py:71 +msgid "已通过" +msgstr "passed" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:34 -msgid "清档类型" -msgstr "Clearance type" +#: backend/ticket/flow_manager/itsm.py:72 +msgid "已撤销" +msgstr "Revoked" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:37 -msgid "清档信息列表" -msgstr "List of clearance information" +#: backend/ticket/flow_manager/itsm.py:73 +msgid "被拒绝" +msgstr "be rejected" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:63 -msgid "清档执行" -msgstr "Clear file execution" +#: backend/ticket/flow_manager/pause.py:43 +#, python-brace-format +msgid "暂停状态{status_display}" +msgstr "pause status {status_display}" -#: backend/ticket/builders/mysql/mysql_ha_destroy.py:36 -msgid "MySQL高可用销毁执行" -msgstr "MySQL high availability destruction execution" +#: backend/ticket/flow_manager/pause.py:66 +msgid "【{}】流程待确认,是否继续?" +msgstr "【{}】The process is pending confirmation. Do you want to continue?" -#: backend/ticket/builders/mysql/mysql_ha_disable.py:36 -msgid "MySQL高可用禁用执行" -msgstr "MySQL high availability disable execution" +#: backend/ticket/flow_manager/resource.py:60 +#, python-brace-format +msgid "资源申请状态{status_display}" +msgstr "Resource application status {status_display}" -#: backend/ticket/builders/mysql/mysql_ha_enable.py:36 -msgid "MySQL高可用启用执行" -msgstr "MySQL HA Enabled Execution" +#: backend/ticket/flow_manager/resource.py:165 +msgid "资源不足申请失败,请前往补货后重试{}" +msgstr "The application failed due to insufficient resources, please try again after replenishing {}" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:30 -msgid "备份类型" -msgstr "backup type" +#: backend/ticket/flow_manager/resource.py:168 +msgid "资源池服务出现系统错误,请联系管理员或稍后重试。错误信息: [{}]{}" +msgstr "A system error occurred in the resource pool service. Please contact the administrator or try again later. error message: [{}]{}" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:31 -msgid "备份文件tag" -msgstr "backup file tag" +#: backend/ticket/flow_manager/resource.py:174 +msgid "资源池相关服务出现未知异常,请联系管理员处理。错误信息: [{}]{}" +msgstr "An unknown exception occurred in resource pool-related services. Please contact the administrator to handle it. error message: [{}]{}" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:32 -msgid "集群列表" -msgstr "cluster list" +#: backend/ticket/flow_manager/resource.py:203 +msgid "【{}】流程所需资源不足" +msgstr "【{}】Insufficient resources required for the process" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:47 -msgid "全库备份执行" -msgstr "Full database backup execution" +#: backend/ticket/flow_manager/resource.py:246 +msgid "申请的资源总数为0,资源申请不合法" +msgstr "The total number of resources requested is 0, and the resource application is illegal." -#: backend/ticket/builders/mysql/mysql_ha_rename.py:31 -msgid "源数据库名" -msgstr "source database name" +#: backend/ticket/flow_manager/resource.py:284 +msgid "资源申请下一个节点不为部署节点,请重新编排" +msgstr "" +"The next node for resource application is not a deployment node, please re-" +"arrange" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:32 -msgid "目标数据库名" -msgstr "target database name" +#: backend/ticket/flow_manager/resource.py:431 +msgid "模拟资源申请失败,主机数量不够" +msgstr "Simulation resource application failed, the number of hosts is not enough" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:35 -msgid "重命名数据库列表" -msgstr "Rename database list" +#: backend/ticket/flow_manager/resource.py:437 +msgid "模拟资源申请失败,主机数量不够:{} < {}" +msgstr "Simulation resource application failed, the number of hosts is not enough: {} < {}" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:58 -msgid "系统内置数据库[{}],不允许重命名" -msgstr "System built-in database [{}], renaming is not allowed" +#: backend/ticket/flow_manager/resource.py:439 +#, python-format +msgid "模拟资源申请成功(%s):%s" +msgstr "Simulation resource application successful (%s): %s" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:61 -msgid "请保证集群{}中源数据库名{}的名字唯一" +#: backend/ticket/flow_manager/timer.py:56 +msgid "定时时间{},已超时{},需手动触发。暂停状态:{}" msgstr "" -"Please ensure that the name of the source database name {} in the cluster {} " -"is unique" +"Timing time {}, has timed out {} and needs to be triggered manually. " +"Suspended state: {}" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:64 -msgid "请保证集群{}中新数据库名{}的名字唯一" -msgstr "" -"Please ensure that the name of the new database name {} in the cluster {} is " -"unique" +#: backend/ticket/flow_manager/timer.py:64 +msgid "定时节点已触发" +msgstr "Timing node has been triggered" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:68 -msgid "请保证源数据库名{}不要出现在新数据库名列表中" +#: backend/ticket/flow_manager/timer.py:66 +msgid "定时时间{},倒计时:{}" +msgstr "Timing time {}, countdown: {}" + +#: backend/ticket/flow_manager/timer.py:99 +msgid "【{}】定时流程待确认,是否继续?" msgstr "" -"Please ensure that the source database name {} does not appear in the list " -"of new database names" +"【{}】The scheduled process is to be confirmed. Do you want to continue?" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:84 -msgid "DB重命名执行" -msgstr "DB rename execution" +#: backend/ticket/handler.py:164 +msgid "云区域组件快速部署单据" +msgstr "Quick Deployment ticket for Cloud Region Components" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:37 -msgid "语义执行的流程ID" -msgstr "Process ID for semantic execution" +#: backend/ticket/handler.py:236 +msgid "{} 终止了此单据" +msgstr "{} terminated this document" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:45 -msgid "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" -msgstr "" -"Failed to get the context data of semantic execution id: {}, please check " -"whether the semantic execution task is successfully completed" +#: backend/ticket/handler.py:268 +msgid "单据[{}]没有需要终止的流程,跳过..." +msgstr "Document [{}] has no process that needs to be terminated, skip..." -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:59 -msgid "sql文件路径" -msgstr "sql file path" +#: backend/ticket/handler.py:282 +msgid "操作人[{}]终止了单据[{}]" +msgstr "Operator [{}] terminated document [{}]" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:61 -msgid "执行模式" -msgstr "execution mode" +#: backend/ticket/handler.py:298 +msgid "不允许新增平台级别的流程设置" +msgstr "New platform-level process settings are not allowed" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:63 -msgid "模拟执行node_id" -msgstr "Simulate the execution of node_id" +#: backend/ticket/handler.py:304 +msgid "业务级别不允许编辑[人工确认]设置" +msgstr "Business level does not allow editing of [Manual Confirmation] settings" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:64 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:93 -msgid "模拟执行root_id" -msgstr "Simulate the execution of root_id" +#: backend/ticket/handler.py:311 +msgid "业务[{}]已存在{}的流程配置" +msgstr "Business [{}] already has the process configuration of {}" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:71 -msgid "sql文件名" -msgstr "sql file name" +#: backend/ticket/handler.py:313 +msgid "业务[{}]已存在{}的集群流程配置" +msgstr "Business [{}] already has the cluster process configuration of {}" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:72 -msgid "目标变更db" -msgstr "target change db" +#: backend/ticket/handler.py:318 +msgid "业务[{}]已存在{}的相同范围配置" +msgstr "Business [{}] already exists in the same scope configuration of {}" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:73 -msgid "忽略db" -msgstr "ignore db" +#: backend/ticket/mock_data.py:60 +msgid "测试创建es集群" +msgstr "Test to create an es cluster" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:77 -msgid "sql执行体信息" -msgstr "sql execution body information" +#: backend/ticket/mock_data.py:65 backend/ticket/mock_data.py:92 +#: backend/ticket/mock_data.py:121 backend/ticket/mock_data.py:158 +msgid "深圳" +msgstr "Shenzhen" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:82 -msgid "备份匹配DB列表" -msgstr "Backup matching DB list" +#: backend/ticket/mock_data.py:87 +msgid "测试创建kafka集群" +msgstr "Test to create a kafka cluster" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:83 -msgid "备份匹配Table列表" -msgstr "Backup matching Table list" +#: backend/ticket/mock_data.py:116 +msgid "测试创建hdfs集群" +msgstr "Test to create hdfs cluster" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:87 -msgid "sql备份信息" -msgstr "sql backup information" +#: backend/ticket/mock_data.py:156 +msgid "测试集群" +msgstr "test cluster" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:95 -msgid "模拟执行链接" -msgstr "Simulation Execution Link" +#: backend/ticket/models/ticket.py:47 +msgid "流程类型" +msgstr "Process type" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:140 -msgid "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" -msgstr "" -"The pipeline data for simulated execution is not ready yet, please check the " -"celery status and try again later." +#: backend/ticket/models/ticket.py:48 +msgid "流程别名" +msgstr "process alias" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:170 -msgid "SQL模拟执行状态查询" -msgstr "SQL simulation execution status query" +#: backend/ticket/models/ticket.py:50 +msgid "单据流程对象ID" +msgstr "Ticket process object ID" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:182 -msgid "人工确认执行" -msgstr "Manual confirmation execution" +#: backend/ticket/models/ticket.py:51 +msgid "单据流程详情" +msgstr "Ticket process details" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:193 -msgid "库表备份" -msgstr "Database table backup" +#: backend/ticket/models/ticket.py:53 +msgid "单据流程状态" +msgstr "Ticket process status" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:203 -msgid "变更SQL执行" -msgstr "Change SQL execution" +#: backend/ticket/models/ticket.py:59 +msgid "错误代码" +msgstr "error code" -#: backend/ticket/builders/mysql/mysql_master_fail_over.py:40 -msgid "主库故障切换执行" -msgstr "Primary database failover execution" +#: backend/ticket/models/ticket.py:61 +msgid "重试类型(专用于inner_flow)" +msgstr "retry type (specific to inner_flow)" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:27 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:23 -msgid "主库 IP" -msgstr "Master IP" +#: backend/ticket/models/ticket.py:63 +msgid "流程上下文(用于扩展字段)" +msgstr "Process context (for extension fields)" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:28 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:24 -msgid "从库 IP" -msgstr "Slave IP" +#: backend/ticket/models/ticket.py:66 +msgid "单据流程(Flow)" +msgstr "Document process (Flow)" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:31 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:27 -msgid "单据信息" -msgstr "Ticket information" +#: backend/ticket/models/ticket.py:93 backend/ticket/models/ticket.py:237 +#: backend/ticket/serializers.py:88 backend/ticket/serializers.py:291 +#: backend/ticket/serializers.py:323 +msgid "单据分组类型" +msgstr "Ticket grouping type" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:63 -msgid "主从互换执行" -msgstr "Master-slave swap execution" +#: backend/ticket/models/ticket.py:101 +msgid "单据差异化详情" +msgstr "Ticket Differentiation Details" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:31 -msgid "新主库主机" -msgstr "New master database host" +#: backend/ticket/models/ticket.py:102 +msgid "单据通知设置" +msgstr "Document notification settings" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:32 -msgid "新从库主机" -msgstr "new slave master" +#: backend/ticket/models/ticket.py:103 +msgid "单据是否审阅过" +msgstr "Have the tickets been reviewed" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:39 -msgid "克隆主从信息" -msgstr "Clone master-slave information" +#: backend/ticket/models/ticket.py:106 +msgid "单据(Ticket)" +msgstr "Ticket" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:40 -msgid "安全模式" -msgstr "safe mode" +#: backend/ticket/models/ticket.py:195 +msgid "正在自动创建单据,单据详情: {}" +msgstr "Ticket is being created automatically, ticket details: {}" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:85 -msgid "克隆主从执行" -msgstr "Clone master-slave execution" +#: backend/ticket/models/ticket.py:204 +msgid "单据{}正在初始化流程" +msgstr "Ticket {} is initializing the process" -#: backend/ticket/builders/mysql/mysql_partition.py:24 -msgid "初始化分区语句" -msgstr "initialize partition statement" +#: backend/ticket/models/ticket.py:219 +msgid "不支持该类型的单据" +msgstr "This type of document is not supported" -#: backend/ticket/builders/mysql/mysql_partition.py:25 -msgid "所需空间Byte" -msgstr "Required space Byte" +#: backend/ticket/models/ticket.py:225 +msgid "发起故障自愈,告警事件 ID:" +msgstr "Initiate fault self-healing, alarm event ID:" -#: backend/ticket/builders/mysql/mysql_partition.py:29 -msgid "配置ID" -msgstr "Configuration ID" +#: backend/ticket/models/ticket.py:239 +msgid "是否支持用户配置" +msgstr "Whether to support user configuration" -#: backend/ticket/builders/mysql/mysql_partition.py:30 -msgid "库名匹配规则" -msgstr "database Name Matching Rules" +#: backend/ticket/models/ticket.py:240 +msgid "单据配置 eg: {'need_itsm': false, 'need_manual_confirm': false}" +msgstr "Document configuration eg: {'need_itsm': false, 'need_manual_confirm': false}" -#: backend/ticket/builders/mysql/mysql_partition.py:31 -msgid "表明匹配规则" -msgstr "show matching rules" +#: backend/ticket/models/ticket.py:243 +msgid "单据流程配置(TicketFlowsConfig)" +msgstr "Ticket flow configuration (TicketFlowsConfig)" -#: backend/ticket/builders/mysql/mysql_partition.py:32 -msgid "初始化分区表" -msgstr "Initialize the partition table" +#: backend/ticket/models/ticket.py:327 backend/ticket/models/ticket.py:397 +#: backend/ticket/models/todo.py:51 +msgid "关联流程任务" +msgstr "Associate Process Task" -#: backend/ticket/builders/mysql/mysql_partition.py:33 -msgid "添加分区" -msgstr "add partition" +#: backend/ticket/models/ticket_result_relation.py:25 +msgid "第三方系统id" +msgstr "Third-party system id" -#: backend/ticket/builders/mysql/mysql_partition.py:34 -msgid "删除分区" -msgstr "delete partition" +#: backend/ticket/models/todo.py:50 +msgid "待办标题" +msgstr "to do title" -#: backend/ticket/builders/mysql/mysql_partition.py:38 -msgid "ip" -msgstr "ip" +#: backend/ticket/models/todo.py:53 +msgid "待办人" +msgstr "to-do person" -#: backend/ticket/builders/mysql/mysql_partition.py:39 -msgid "port" -msgstr "port" +#: backend/ticket/models/todo.py:55 +msgid "待办类型" +msgstr "to-do type" -#: backend/ticket/builders/mysql/mysql_partition.py:40 -msgid "分片名" -msgstr "slice name" +#: backend/ticket/models/todo.py:60 +msgid "上下文" +msgstr "the context" -#: backend/ticket/builders/mysql/mysql_partition.py:41 -msgid "执行对象列表" -msgstr "Execution object list" +#: backend/ticket/models/todo.py:62 +msgid "待办状态" +msgstr "pending status" -#: backend/ticket/builders/mysql/mysql_partition.py:46 -msgid "配置ID列表" -msgstr "Configuration ID list" +#: backend/ticket/models/todo.py:67 +msgid "待办完成人" +msgstr "to-do completion person" -#: backend/ticket/builders/mysql/mysql_partition.py:50 -msgid "分区执行对象列表" -msgstr "Partition execution object list" +#: backend/ticket/models/todo.py:68 +msgid "待办完成时间" +msgstr "to-do completion time" -#: backend/ticket/builders/mysql/mysql_partition.py:52 -msgid "分区信息" -msgstr "partition information" +#: backend/ticket/models/todo.py:73 +msgid "待办(Todo)" +msgstr "Todo" -#: backend/ticket/builders/mysql/mysql_partition.py:66 -#: backend/ticket/builders/spider/spider_partition.py:38 -msgid "分区管理执行" -msgstr "Partition Management Execution" +#: backend/ticket/models/todo.py:104 +msgid "关联待办" +msgstr "Associated to-do" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:33 -msgid "Proxy IP + 云区域" -msgstr "Proxy IP + cloud region" +#: backend/ticket/models/todo.py:105 +msgid "操作" +msgstr "operate" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:40 -msgid "添加信息" -msgstr "add information" +#: backend/ticket/models/todo.py:108 backend/ticket/models/todo.py:109 +msgid "待办操作记录" +msgstr "To-do operation record" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:84 -msgid "添加PROXY执行" -msgstr "Add PROXY execution" +#: backend/ticket/serializers.py:36 +msgid "发送类型" +msgstr "Send type" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:33 -msgid "旧Proxy实例信息" -msgstr "Old Proxy instance information" +#: backend/ticket/serializers.py:38 +msgid "包含用户名,用户需在蓝鲸平台注册,多个以逗号分隔" +msgstr "Contains usernames. Users need to register on the Blue Whale platform. Multiple ones are separated by commas." -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:34 -msgid "新Proxy机器信息" -msgstr "New Proxy machine information" +#: backend/ticket/serializers.py:39 +msgid "发件人/企微机器人ID" +msgstr "Sender/Qiwei Robot ID" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:40 -msgid "是否强制替换" -msgstr "Whether to force replacement" +#: backend/ticket/serializers.py:40 +msgid "(机器人专用)接收者,可以传@all,或者会话id" +msgstr "(robot only) receiver, you can pass @all, or session id" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:41 -msgid "替换信息" -msgstr "replacement information" +#: backend/ticket/serializers.py:41 +msgid "提醒群中的指定成员(@某个成员),@all表示提醒所有人" +msgstr "Remind designated members in the group (@a member), @all means remind everyone" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:94 -msgid "替换PROXY执行" -msgstr "Replace PROXY execution" +#: backend/ticket/serializers.py:42 +msgid "提醒手机号对应的群成员(@某个成员),@all表示提醒所有人" +msgstr "Remind the group member corresponding to the mobile phone number (@a certain member), @all means remind everyone" -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:28 -msgid "从库实例信息" -msgstr "Information of the slave instance" +#: backend/ticket/serializers.py:43 +msgid "是否只给指定用户可见,默认给所有人可见" +msgstr "Whether it is only visible to specified users. It is visible to everyone by default." -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:34 -msgid "重建从库列表" -msgstr "Rebuild slave list" +#: backend/ticket/serializers.py:89 backend/ticket/views.py:228 +#: backend/ticket/views.py:229 +msgid "单据详情" +msgstr "Ticket details" -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:67 -msgid "Slave原地重建执行" -msgstr "Slave in-place reconstruction execution" +#: backend/ticket/serializers.py:92 +msgid "状态名称" +msgstr "state name" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:27 -msgid "旧从库 IP" -msgstr "Old slave IP" +#: backend/ticket/serializers.py:98 +msgid "是否忽略重复提交" +msgstr "Whether to ignore duplicate submissions" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:28 -msgid "新从库 IP" -msgstr "New slave IP" +#: backend/ticket/serializers.py:101 +msgid "通知设置" +msgstr "Notification settings" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:32 -msgid "集群重建信息" -msgstr "Cluster rebuild information" +#: backend/ticket/serializers.py:111 +msgid "不允许提交敏感单据类型{}" +msgstr "Sensitive document types are not allowed to be submitted{}" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:70 -msgid "Slave重建执行" -msgstr "Slave reconstruction execution" +#: backend/ticket/serializers.py:134 +msgid "流程待办" +msgstr "process to do" -#: backend/ticket/builders/mysql/mysql_single_apply.py:42 -msgid "域名关键字" -msgstr "domain name keywords" +#: backend/ticket/serializers.py:135 +msgid "跳转链接" +msgstr "jump link" + +#: backend/ticket/serializers.py:139 +msgid "流程类型显示名" +msgstr "Process type display name" + +#: backend/ticket/serializers.py:140 +msgid "概览" +msgstr "overview" + +#: backend/ticket/serializers.py:141 +msgid "流程输出数据" +msgstr "Process output data" + +#: backend/ticket/serializers.py:214 +msgid "待办人列表" +msgstr "to-do list" + +#: backend/ticket/serializers.py:232 backend/ticket/serializers.py:360 +msgid "待办ID" +msgstr "to-do ID" -#: backend/ticket/builders/mysql/mysql_single_apply.py:50 -msgid "机器规格" -msgstr "Machine Specifications" +#: backend/ticket/serializers.py:233 +msgid "动作" +msgstr "action" -#: backend/ticket/builders/mysql/mysql_single_apply.py:52 -msgid "申请数量" -msgstr "Number of applications" +#: backend/ticket/serializers.py:234 backend/ticket/serializers.py:361 +msgid "动作参数" +msgstr "action parameters" -#: backend/ticket/builders/mysql/mysql_single_apply.py:54 -msgid "每台机器部署的实例数量" -msgstr "Number of instances deployed per machine" +#: backend/ticket/serializers.py:241 +msgid "是否是部署类单据" +msgstr "Is it a deployment document?" -#: backend/ticket/builders/mysql/mysql_single_apply.py:60 -#: backend/ticket/builders/spider/tendb_apply.py:38 -msgid "部署规格" -msgstr "deployment specification" +#: backend/ticket/serializers.py:256 backend/ticket/serializers.py:260 +msgid "单据流程的ID" +msgstr "ID of the ticket process" -#: backend/ticket/builders/mysql/mysql_single_apply.py:68 -msgid "机器规格展示名" -msgstr "Machine specification display name" +#: backend/ticket/serializers.py:275 backend/ticket/serializers.py:283 +msgid "查询起始时间" +msgstr "Query start time" -#: backend/ticket/builders/mysql/mysql_single_apply.py:71 -msgid "MySQL起始端口" -msgstr "MySQL starting port" +#: backend/ticket/serializers.py:276 backend/ticket/serializers.py:284 +msgid "查询终止时间" +msgstr "query end time" -#: backend/ticket/builders/mysql/mysql_single_apply.py:90 -#, python-brace-format -msgid "不允许存在重复的域名关键字[{duplicates}]" -msgstr "Duplicate domain name keywords are not allowed [{duplicates}]" +#: backend/ticket/serializers.py:278 backend/ticket/serializers.py:286 +msgid "操作状态" +msgstr "operating state" -#: backend/ticket/builders/mysql/mysql_single_apply.py:184 -msgid "MySQL单节点部署执行" -msgstr "MySQL standalone deployment execution" +#: backend/ticket/serializers.py:308 +msgid "单据可配置项" +msgstr "Document configurable items" -#: backend/ticket/builders/mysql/mysql_single_destroy.py:32 -msgid "MySQL单节点销毁执行" -msgstr "MySQL standalone destruction execution" +#: backend/ticket/serializers.py:313 backend/ticket/serializers.py:318 +msgid "流程规则ID列表)" +msgstr "Process rule ID list)" -#: backend/ticket/builders/mysql/mysql_single_disable.py:32 -msgid "MySQL单节点禁用执行" -msgstr "MySQL standalone disable execution" +#: backend/ticket/serializers.py:322 backend/ticket/serializers.py:330 +msgid "单据流程描述" +msgstr "Document process description" -#: backend/ticket/builders/mysql/mysql_single_enable.py:32 -msgid "MySQL单节点启用执行" -msgstr "MySQL standalone enable execution" +#: backend/ticket/serializers.py:325 +msgid "是否需要单据审批" +msgstr "Whether document approval is required" -#: backend/ticket/builders/pulsar/pulsar_apply.py:32 -msgid "至少写入成功副本数" -msgstr "At least the number of successfully written replicas" +#: backend/ticket/serializers.py:326 +msgid "是否需要人工确认" +msgstr "Whether manual confirmation is required" -#: backend/ticket/builders/pulsar/pulsar_apply.py:54 -msgid "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" -msgstr "The number of bookkeeper nodes is less than 2! Please ensure that the number of bookkeeper deployment nodes is at least 2" +#: backend/ticket/serializers.py:335 +msgid "主机所在业务" +msgstr "host business" -#: backend/ticket/builders/pulsar/pulsar_apply.py:59 -msgid "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" -msgstr "The number of zookeeper nodes is not 3! Please ensure that the number of zookeeper deployment nodes is equal to 3" +#: backend/ticket/serializers.py:341 +msgid "请至少提供两台机器来部署云区域组件" +msgstr "Please provide at least two machines to deploy cloud zone components" -#: backend/ticket/builders/pulsar/pulsar_apply.py:64 -msgid "broker节点数小于1台! 请保证broker的部署节点数至少为1" -msgstr "The number of broker nodes is less than 1! Please ensure that the number of broker deployment nodes is at least 1" +#: backend/ticket/serializers.py:347 +msgid "单据ID(逗号分割)" +msgstr "Document ID (comma separated)" -#: backend/ticket/builders/pulsar/pulsar_apply.py:68 -msgid "请保证副本数量至少为2,且不超过bookkeeper数量" -msgstr "" -"Please ensure that the number of copies is at least 2 and does not exceed " -"the number of bookkeepers" +#: backend/ticket/serializers.py:351 +msgid "是否通过" +msgstr "pass or not" -#: backend/ticket/builders/pulsar/pulsar_apply.py:71 -msgid "最小成功写入副本数量不得大于副本数量" -msgstr "" -"The minimum number of successfully written replicas must not be greater than " -"the number of replicas" +#: backend/ticket/serializers.py:352 +msgid "单据id集合" +msgstr "Document ID collection" -#: backend/ticket/builders/pulsar/pulsar_apply.py:98 -#: backend/ticket/constants.py:202 -msgid "Pulsar 集群部署" -msgstr "Pulsar cluster deployment" +#: backend/ticket/serializers.py:370 +msgid "统一动作" +msgstr "Unified action" -#: backend/ticket/builders/pulsar/pulsar_destroy.py:37 -#: backend/ticket/constants.py:209 -msgid "Pulsar 集群删除" -msgstr "Pulsar cluster deletion" +#: backend/ticket/serializers.py:372 +msgid "待办操作列表" +msgstr "To-do list" -#: backend/ticket/builders/pulsar/pulsar_disable.py:37 -#: backend/ticket/constants.py:208 -msgid "Pulsar 集群禁用" -msgstr "Pulsar cluster disabled" +#: backend/ticket/serializers.py:384 +msgid "待办id{}不存在" +msgstr "To-do id{} does not exist" -#: backend/ticket/builders/pulsar/pulsar_enable.py:37 -#: backend/ticket/constants.py:207 -msgid "Pulsar 集群启用" -msgstr "Pulsar cluster enabled" +#: backend/ticket/tasks/ticket_tasks.py:197 +msgid "集群{}数据校验正确,不需要进行数据修复" +msgstr "Cluster {} data verification is correct, no data repair is required" -#: backend/ticket/builders/pulsar/pulsar_reboot.py:39 -msgid "Pulsar 集群重启" -msgstr "Pulsar cluster restart" +#: backend/ticket/tasks/ticket_tasks.py:225 +msgid "集群{}存在数据不一致,自动创建的数据修复单据" +msgstr "" +"There is data inconsistency in the cluster {}, the automatically created " +"data repair ticket" -#: backend/ticket/builders/pulsar/pulsar_replace.py:47 -#: backend/ticket/constants.py:206 -msgid "Pulsar 集群替换" -msgstr "Pulsar cluster replacement" +#: backend/ticket/tasks/ticket_tasks.py:295 +msgid "任务{}立即执行" +msgstr "Task {} executes immediately" -#: backend/ticket/builders/pulsar/pulsar_scale_up.py:47 -#: backend/ticket/constants.py:203 -msgid "Pulsar 集群扩容" -msgstr "Pulsar cluster expansion" +#: backend/ticket/tasks/ticket_tasks.py:298 +msgid "任务{}定时执行,定时触发时间:{}" +msgstr "The task {} is executed regularly, and the timing trigger time: {}" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:35 -msgid "bookkeeper信息列表" -msgstr "bookkeeper information list" +#: backend/ticket/tasks/ticket_tasks.py:306 +msgid "不支持的定时类型: {}" +msgstr "Unsupported timing type: {}" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:61 -msgid "{}: 至少保留{}台!" -msgstr "{}: Keep at least {} units!" +#: backend/ticket/tasks/ticket_tasks.py:337 +#, python-brace-format +msgid "" +" 单据类型:{ticket_type}\n" +" 所属业务:{biz_name}\n" +" 提单人:{creator}\n" +" 提单时间:{submit_time}\n" +" 处理人:{processor}\n" +" 执行情况:{flow_status}\n" +" 查看详情:{detail_address} " +msgstr "Document type: {ticket_type}\n Business: {biz_name}\n Bill of lading: {creator}\n Bill of lading time: {submit_time}\n Processor: {processor}\n Execution status: {flow_status}\n View details :{detail_address}" + +#: backend/ticket/tasks/ticket_tasks.py:364 +#, python-brace-format +msgid "" +"\n" +"审批链接:{approval_address}" +msgstr "\nApproval link: {approval_address}" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:64 -msgid "请选择Broker和BookKeeper实例进行缩容" -msgstr "Please select Broker and BookKeeper instances for shrinking" +#: backend/ticket/tasks/ticket_tasks.py:375 +#, python-brace-format +msgid "【数据库管理】 {flow_msg_type}通知" +msgstr "【Database Management】 {flow_msg_type} notification" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:69 -msgid "缩容不支持ZooKeeper" -msgstr "Scaling does not support ZooKeeper" +#: backend/ticket/todos/__init__.py:99 +msgid "确认执行" +msgstr "Confirm execution" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:85 -#: backend/ticket/constants.py:204 -msgid "Pulsar 集群缩容" -msgstr "Pulsar cluster shrink" +#: backend/ticket/todos/__init__.py:100 +msgid "终止单据" +msgstr "Termination ticket" -#: backend/ticket/builders/redis/base.py:50 -msgid "集群【{}({})】锁定中,请等待" -msgstr "Cluster [{}({})] is locked, please wait" +#: backend/ticket/todos/__init__.py:101 +msgid "资源重新申请" +msgstr "Resource re-application" -#: backend/ticket/builders/redis/base.py:52 -msgid "集群【{}】不存在" -msgstr "Cluster {{}] does not exist" +#: backend/ticket/todos/pause_todo.py:42 backend/ticket/todos/pause_todo.py:62 +#: backend/ticket/todos/pipeline_todo.py:40 +msgid "{}不在处理人: {}中,无法处理" +msgstr "{} is not among the handlers: {} and cannot be processed" -#: backend/ticket/builders/redis/base.py:59 -msgid "提取/删除/备份规则列表" -msgstr "Extract/delete/backup rule list" +#: backend/ticket/views.py:194 +msgid "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +msgstr "" +"The same type of ticket [{}] already exists in the instance {} and is " +"running, please confirm whether to submit it repeatedly" -#: backend/ticket/builders/redis/redis_backup.py:79 -msgid "集群备份" -msgstr "cluster backup" +#: backend/ticket/views.py:205 +msgid "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +msgstr "" +"The same type of ticket [{}] already exists in the cluster {} and is " +"running, please confirm whether to submit it repeatedly" -#: backend/ticket/builders/redis/redis_close.py:45 -msgid "禁用集群" -msgstr "disable cluster" +#: backend/ticket/views.py:245 +msgid "单据列表" +msgstr "Ticket list" -#: backend/ticket/builders/redis/redis_cluster_apply.py:30 -msgid "集群端口" -msgstr "cluster port" +#: backend/ticket/views.py:286 backend/ticket/views.py:288 +msgid "创建单据(允许创建敏感单据)" +msgstr "Create documents (allows creation of sensitive documents)" -#: backend/ticket/builders/redis/redis_cluster_apply.py:38 -msgid "申请容量" -msgstr "Application capacity" +#: backend/ticket/views.py:296 +msgid "获取单据流程" +msgstr "Obtain ticket process" -#: backend/ticket/builders/redis/redis_cluster_apply.py:39 -msgid "申请容量详情" -msgstr "Application Capacity Details" +#: backend/ticket/views.py:297 +msgid "流程信息" +msgstr "process information" -#: backend/ticket/builders/redis/redis_cluster_apply.py:41 -msgid "集群ID(英文数字及下划线)" -msgstr "Cluster ID (English numbers and underscores)" +#: backend/ticket/views.py:308 +msgid "单据回调" +msgstr "Ticket callback" -#: backend/ticket/builders/redis/redis_cluster_apply.py:47 -msgid "proxy部署方案" -msgstr "Proxy deployment scheme" +#: backend/ticket/views.py:320 +msgid "单据流程重试" +msgstr "Ticket process retry" -#: backend/ticket/builders/redis/redis_cluster_apply.py:48 -msgid "后台部署方案" -msgstr "Background deployment scheme" +#: backend/ticket/views.py:331 +msgid "单据流程终止" +msgstr "Document process terminated" -#: backend/ticket/builders/redis/redis_cluster_apply.py:87 -msgid "主机【{}】已经被注册到了集群元数据,请检查" -msgstr "" -"The host [{}] has been registered in the cluster metadata, please check" +#: backend/ticket/views.py:343 +msgid "获取单据类型列表" +msgstr "Get a list of ticket types" -#: backend/ticket/builders/redis/redis_cluster_apply.py:100 -msgid "master和slave中存在重复节点" -msgstr "There are duplicate nodes in master and slave" +#: backend/ticket/views.py:358 +msgid "节点列表" +msgstr "node list" -#: backend/ticket/builders/redis/redis_cluster_apply.py:103 -msgid "master和proxy中存在重复节点" -msgstr "There are duplicate nodes in master and proxy" +#: backend/ticket/views.py:386 +msgid "待办单据列表" +msgstr "To-Do List" -#: backend/ticket/builders/redis/redis_cluster_apply.py:106 -msgid "slave和proxy中存在重复节点" -msgstr "There are duplicate nodes in slave and proxy" +#: backend/ticket/views.py:424 +msgid "待办处理" +msgstr "pending" -#: backend/ticket/builders/redis/redis_cluster_apply.py:110 -msgid "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" -msgstr "" -"Provide at least 1 master node and 1 slave node, and the number of master " -"and slave nodes should be consistent" +#: backend/ticket/views.py:450 +msgid "待办单据数" +msgstr "Number of pending tickets" -#: backend/ticket/builders/redis/redis_cluster_apply.py:113 -msgid "proxy至少提供2台机器" -msgstr "The proxy provides at least 2 machines" +#: backend/ticket/views.py:473 +msgid "查询集群变更单据事件" +msgstr "Query cluster change ticket events" -#: backend/ticket/builders/redis/redis_cluster_apply.py:270 -msgid "集群部署" -msgstr "cluster deployment" +#: backend/ticket/views.py:508 +msgid "查询集群实例变更单据事件" +msgstr "Query cluster instance change ticket events" -#: backend/ticket/builders/redis/redis_destroy.py:46 -msgid "下架集群" -msgstr "Take off the cluster" +#: backend/ticket/views.py:543 +msgid "查询可编辑单据流程描述" +msgstr "Query editable document process description" -#: backend/ticket/builders/redis/redis_key_delete.py:31 -msgid "删除方式" -msgstr "delete method" +#: backend/ticket/views.py:570 +msgid "修改可编辑的单据流程规则" +msgstr "Modify editable document process rules" -#: backend/ticket/builders/redis/redis_key_delete.py:103 -msgid "删除Key" -msgstr "delete key" +#: backend/ticket/views.py:581 +msgid "创建单据流程规则" +msgstr "Create document process rules" -#: backend/ticket/builders/redis/redis_key_extract.py:87 -msgid "提取Key" -msgstr "extract key" +#: backend/ticket/views.py:592 +msgid "删除单据流程规则" +msgstr "Delete document process rules" -#: backend/ticket/builders/redis/redis_open.py:42 -msgid "启用集群" -msgstr "enable cluster" +#: backend/ticket/views.py:603 +msgid "快速部署云区域组件" +msgstr "Quickly deploy cloud zone components" -#: backend/ticket/builders/redis/redis_purge.py:56 -msgid "集群清档" -msgstr "Cluster cleanup" +#: backend/ticket/views.py:618 +msgid "批量审批" +msgstr "Batch approval" -#: backend/ticket/builders/spider/spider_destory.py:34 -msgid "TenDB Cluster 下架执行" -msgstr "TenDB Cluster delisting execution" +#: backend/ticket/views.py:639 +msgid "批量待办处理" +msgstr "Batch to-do processing" -#: backend/ticket/builders/spider/spider_disable.py:34 -msgid "TenDB Cluster 禁用执行" -msgstr "TenDB Cluster disable execution" +#: backend/utils/time.py:157 +msgid "搜索的时间序列为空" +msgstr "The time series being searched is empty" -#: backend/ticket/builders/spider/tendb_apply.py:39 -msgid "部署方案" -msgstr "deployment plan" +#: backend/utils/time.py:169 +msgid "无法找到合适的附近时间点" +msgstr "Unable to find a suitable nearby time point" -#: backend/ticket/builders/spider/tendb_apply.py:40 -msgid "集群访问端口" -msgstr "cluster access port" +#: backend/version_log/config.py:30 +msgid "版本日志" +msgstr "version log" -#: backend/ticket/builders/spider/tendb_apply.py:41 -msgid "集群访问域名" -msgstr "Cluster access domain name" +#: backend/version_log/models.py:43 +msgid "访问版本" +msgstr "access version" -#: backend/ticket/builders/spider/tendb_apply.py:44 -msgid "云区域" -msgstr "cloud area" +#: backend/version_log/models.py:48 +msgid "版本日志访问记录" +msgstr "Version log access records" -#: backend/ticket/builders/spider/tendb_apply.py:49 -msgid "集群分片数" -msgstr "Number of cluster fragments" +#: backend/version_log/views.py:44 +msgid "访问出错,请联系管理员。" +msgstr "System error, please contact administrator" -#: backend/ticket/builders/spider/tendb_apply.py:50 -msgid "机器数" -msgstr "Number of machines" +#: backend/version_log/views.py:48 +msgid "日志列表获取成功" +msgstr "Log list obtained successfully" -#: backend/ticket/builders/spider/tendb_apply.py:113 -msgid "TenDB Cluster 集群部署执行" -msgstr "TenDB Cluster deployment execution" +#: backend/version_log/views.py:64 +msgid "日志版本文件没找到,请联系管理员" +msgstr "The log version file was not found, please contact the administrator" -#: backend/ticket/builders/spider/tendb_enable.py:34 -msgid "TenDB Cluster 启用执行" -msgstr "TenDB Cluster enable execution" +#: backend/version_log/views.py:68 +msgid "日志详情获取成功" +msgstr "Log details obtained successfully" -#: backend/ticket/builders/spider/tendb_master_fail_over.py:33 -msgid "TendbCluster 主故障切换" -msgstr "TendbCluster Master Failover" +#~ msgid "部分列表元素的参数不合法,请检查" +#~ msgstr "The parameters of some list elements are invalid, please check" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:28 -msgid "是否检测连接" -msgstr "Whether to detect the connection" +#~ msgid "查询任务Node详情" +#~ msgstr "Querying Task Node Details" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:29 -msgid "是否检测数据同步延时情况" -msgstr "Whether to detect data synchronization delay" +#~ msgid "SQL语句导入" +#~ msgstr "SQL statement import" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:30 -msgid "是否检测历史数据检验结果" -msgstr "Whether to detect historical data inspection results" +#~ msgid "请补充:指定云区域的proxy信息" +#~ msgstr "Please add: the proxy information of the specified cloud area" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:46 -msgid "TendbCluster 主从互换执行" -msgstr "TendbCluster master-slave swap execution" +#~ msgid "主从高可用-主域名配置" +#~ msgstr "Master-slave high availability - master domain name configuration" -#: backend/ticket/constants.py:31 -msgid "主流程-人工确认" -msgstr "Main Process - Manual Confirmation" +#~ msgid "主从高可用-从域名配置" +#~ msgstr "Master-slave high availability-slave domain name configuration" -#: backend/ticket/constants.py:32 -msgid "自动化流程-人工确认" -msgstr "Automated Process - Manual Confirmation" +#~ msgid "单节点-域名配置" +#~ msgstr "standalone-domain name configuration" -#: backend/ticket/constants.py:40 -msgid "我的待办" -msgstr "my to do" +#~ msgid "端口默认值-Proxy起始端口" +#~ msgstr "Port default value - Proxy start port" -#: backend/ticket/constants.py:41 -msgid "我的申请" -msgstr "My application" +#~ msgid "端口默认值-MySQL起始端口" +#~ msgstr "Port default value - MySQL start port" -#: backend/ticket/constants.py:51 -msgid "待处理" -msgstr "Pending" +#~ msgid "MySQL的RSA秘钥" +#~ msgstr "MySQL RSA key" -#: backend/ticket/constants.py:53 -msgid "已处理" -msgstr "processed" +#~ msgid "密码加密失败: {}" +#~ msgstr "Password encryption failed: {}" -#: backend/ticket/constants.py:54 -msgid "已终止" -msgstr "terminated" +#~ msgid "密码解密失败: {}" +#~ msgstr "Password decryption failed: {}" -#: backend/ticket/constants.py:63 backend/ticket/constants.py:73 -msgid "等待中" -msgstr "Waiting" +#~ msgid "RSA密钥" +#~ msgstr "RSA key" -#: backend/ticket/constants.py:64 backend/ticket/constants.py:74 -msgid "执行中" -msgstr "in execution" +#~ msgid "RSA秘钥" +#~ msgstr "RSA key" -#: backend/ticket/constants.py:67 backend/ticket/constants.py:77 -msgid "撤销" -msgstr "revoke" +#~ msgid "提供服务 节点" +#~ msgstr "Provide service node" -#: backend/ticket/constants.py:78 -msgid "跳过" -msgstr "jump over" +#~ msgid "proxy {} 在集群里边" +#~ msgstr "proxy {} in the cluster" -#: backend/ticket/constants.py:108 -msgid "MySQL 单节点部署" -msgstr "MySQL standalone deployment" +#~ msgid "DB 模块 ID" +#~ msgstr "DB module ID" -#: backend/ticket/constants.py:109 -msgid "MySQL 添加从库" -msgstr "MySQL Add Slave Instance" +#~ msgid "拓扑层级" +#~ msgstr "topology level" -#: backend/ticket/constants.py:110 -msgid "MySQL Slave重建" -msgstr "MySQL Slave Rebuild" +#~ msgid "系统角色" +#~ msgstr "system role" -#: backend/ticket/constants.py:111 -msgid "MySQL Slave原地重建" -msgstr "MySQL Slave reconstruction in place" +#~ msgid "同步后继" +#~ msgstr "sync successor" -#: backend/ticket/constants.py:112 -msgid "MySQL 克隆主从" -msgstr "MySQL clone master-slave" +#~ msgid "同步上联" +#~ msgstr "sync uplink" -#: backend/ticket/constants.py:113 -msgid "MySQL 主从互换" -msgstr "MySQL master-slave swap" +#~ msgid "绑定入口" +#~ msgstr "binding entry" -#: backend/ticket/constants.py:114 -msgid "MySQL 主库故障切换" -msgstr "MySQL master database failover" +#~ msgid "接入层列表" +#~ msgstr "access layer list" -#: backend/ticket/constants.py:115 -msgid "MySQL 高可用部署" -msgstr "MySQL high availability deployment" +#~ msgid "IDC 城市 ID" +#~ msgstr "IDC City ID" -#: backend/ticket/constants.py:116 -msgid "MySQL 变更SQL执行" -msgstr "MySQL changes SQL execution" +#~ msgid "逻辑城市 ID" +#~ msgstr "Logical City ID" -#: backend/ticket/constants.py:117 -msgid "MySQL 模拟执行" -msgstr "MySQL simulation execution" +#~ msgid "逻辑城市名" +#~ msgstr "logical city name" -#: backend/ticket/constants.py:118 -msgid "MySQL 添加Proxy" -msgstr "MySQL add Proxy" +#~ msgid "网络设备 ID" +#~ msgstr "network device ID" -#: backend/ticket/constants.py:119 -msgid "MySQL 替换Proxy" -msgstr "MySQL replaces Proxy" +#~ msgid "online" +#~ msgstr "online" -#: backend/ticket/constants.py:120 -msgid "MySQL 单节点删除" -msgstr "MySQL standalone deletion" +#~ msgid "offline" +#~ msgstr "offline" -#: backend/ticket/constants.py:121 -msgid "MySQL 单节点启用" -msgstr "MySQL standalone enabled" +#~ msgid "destroy" +#~ msgstr "destroy" -#: backend/ticket/constants.py:122 -msgid "MySQL 单节点禁用" -msgstr "MySQL standalone disabled" +#~ msgid "tendbsingle" +#~ msgstr "tendbsingle" -#: backend/ticket/constants.py:123 -msgid "MySQL 高可用删除" -msgstr "MySQL high availability deletion" +#~ msgid "backend_master" +#~ msgstr "backend_master" -#: backend/ticket/constants.py:124 -msgid "MySQL 高可用禁用" -msgstr "MySQL high availability disabled" +#~ msgid "backend_repeater" +#~ msgstr "backend_repeater" -#: backend/ticket/constants.py:125 -msgid "MySQL 高可用启用" -msgstr "MySQL high availability enabled" +#~ msgid "backend_slave" +#~ msgstr "backend_slave" -#: backend/ticket/constants.py:126 -msgid "MySQL 授权" -msgstr "MySQL Authorization" +#~ msgid "redis_master" +#~ msgstr "redis_master" -#: backend/ticket/constants.py:127 -msgid "MySQL EXCEL-授权" -msgstr "MySQL EXCEL-Authorization" +#~ msgid "redis_slave" +#~ msgstr "redis_slave" -#: backend/ticket/constants.py:128 -msgid "MySQL 客户端权限克隆" -msgstr "MySQL Client Privileged Clone" +#~ msgid "es_datanode_hot" +#~ msgstr "es_datanode_hot" -#: backend/ticket/constants.py:129 -msgid "MySQL DB实例权限克隆" -msgstr "Clone MySQL DB Instance Privileges" +#~ msgid "es_datanode_cold" +#~ msgstr "es_datanode_cold" -#: backend/ticket/constants.py:130 -msgid "MySQL 高可用DB重命名" -msgstr "MySQL high availability DB renaming" +#~ msgid "hdfs_namenode" +#~ msgstr "hdfs_namenode" -#: backend/ticket/constants.py:131 -msgid "MySQL 高可用清档" -msgstr "MySQL HA Clear File" +#~ msgid "hdfs_zookeeper" +#~ msgstr "hdfs_zookeeper" -#: backend/ticket/constants.py:132 -msgid "MySQL 高可用库表备份" -msgstr "MySQL high availability database table backup" +#~ msgid "hdfs_journalnode" +#~ msgstr "hdfs_journalnode" -#: backend/ticket/constants.py:133 -msgid "MySQL 数据校验修复" -msgstr "MySQL Data Inconsistency Repair" +#~ msgid "riak_node" +#~ msgstr "riak_node" -#: backend/ticket/constants.py:134 -msgid "MySQL 分区" -msgstr "MySQL partition" +#~ msgid "部署方案不匹配" +#~ msgstr "Deployment scheme does not match" -#: backend/ticket/constants.py:135 -msgid "MySQL 数据修复" -msgstr "MySQL data repair" +#~ msgid "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" +#~ msgstr "" +#~ "Cluster type: {cluster_type} and deployment plan: {deploy_plan_class} do " +#~ "not match" -#: backend/ticket/constants.py:136 -msgid "MySQL 闪回" -msgstr "MySQL flashback" +#~ msgid "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" +#~ msgstr "" +#~ "The business needs to add a new set under the dba business, and the set " +#~ "id needs to be recorded" -#: backend/ticket/constants.py:137 -msgid "MySQL 定点回档" -msgstr "MySQL fixed-point rollback" +#~ msgid "部署方法ID" +#~ msgstr "Deployment Method ID" -#: backend/ticket/constants.py:138 -msgid "MySQL 高可用全库备份" -msgstr "MySQL high availability full database backup" +#~ msgid "{} 未实现 status flag" +#~ msgstr "{} unimplemented status flag" -#: backend/ticket/constants.py:139 -msgid "MySQL 单节点清档" -msgstr "MySQL standalone clear file" +#~ msgid "find primary show slave status failed: {}" +#~ msgstr "find primary show slave status failed: {}" -#: backend/ticket/constants.py:140 -msgid "MySQL 单节点DB重命名" -msgstr "MySQL standalone DB rename" +#~ msgid "分组表" +#~ msgstr "group table" -#: backend/ticket/constants.py:143 -msgid "Spider 数据校验修复" -msgstr "Spider data check fix" +#~ msgid "集群分片总数" +#~ msgstr "Total number of cluster shards" -#: backend/ticket/constants.py:144 -msgid "Spider 分区管理" -msgstr "Spider partition management" +#~ msgid "集群存储预估总容量/G" +#~ msgstr "Estimated total capacity of cluster storage/G" -#: backend/ticket/constants.py:145 -msgid "Spider 库表备份" -msgstr "Spider database table backup" +#~ msgid "方案描述" +#~ msgstr "Program description" -#: backend/ticket/constants.py:146 -msgid "Spider 数据库重命名" -msgstr "Spider database rename" +#~ msgid "drop_cluster - 方便调试,后面去掉" +#~ msgstr "drop_cluster - convenient for debugging, removed later" -#: backend/ticket/constants.py:147 -msgid "Spider 清档" -msgstr "Spider Cleanup" +#~ msgid "drop_my_cluster - 方便调试,后面去掉" +#~ msgstr "drop_my_cluster - convenient for debugging, removed later" -#: backend/ticket/constants.py:149 -msgid "TenDB Cluster 主故障切换" -msgstr "TenDB Cluster primary failover" +#~ msgid "告警通知组类别" +#~ msgstr "Alarm notification group category" -#: backend/ticket/constants.py:150 -msgid "TenDB Cluster 主从互切" -msgstr "TenDB Cluster master-slave switch" +#~ msgid "DBA系统专用" +#~ msgstr "Dedicated to DBA system" -#: backend/ticket/constants.py:151 -msgid "TenDB Cluster 集群部署" -msgstr "TenDB Cluster deployment" +#~ msgid "[gcsdns]查询和上报切换队列" +#~ msgstr "[gcsdns] query and report switch queue" -#: backend/ticket/constants.py:152 -msgid "TenDB Cluster 集群启用" -msgstr "TenDB Cluster enabled" +#~ msgid "" +#~ "dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) " +#~ "两个操作" +#~ msgstr "" +#~ "The dts task operation currently supports two operations: synchronous " +#~ "completion (syncStopTodo) and forced termination (ForceKillTaskTodo)" -#: backend/ticket/constants.py:153 -msgid "TenDB Cluster 集群禁用" -msgstr "TenDB Cluster disabled" +#~ msgid "dts tasks重新开始" +#~ msgstr "dts tasks restart" -#: backend/ticket/constants.py:154 -msgid "TenDB Cluster 集群销毁" -msgstr "TenDB Cluster destruction" +#~ msgid "dts tasks重试当前步骤" +#~ msgstr "dts tasks retry current step" -#: backend/ticket/constants.py:155 -msgid "Spider 全备" -msgstr "Spider fully prepared" +#~ msgid "token:{}不存在,请传入校验token" +#~ msgstr "token: {} does not exist, please pass in the verification token" -#: backend/ticket/constants.py:158 -msgid "Redis 单节点部署" -msgstr "Redis standalone deployment" +#~ msgid "部署方案操作失败" +#~ msgstr "Deployment scenario operation failed" -#: backend/ticket/constants.py:159 -msgid "Redis 集群部署" -msgstr "Redis cluster deployment" +#~ msgid "Redis部署方案名称" +#~ msgstr "Redis deployment scheme name" -#: backend/ticket/constants.py:160 -msgid "Redis 提取 Key" -msgstr "Redis Extract Key" +#~ msgid "Redis集群类型" +#~ msgstr "Redis cluster type" -#: backend/ticket/constants.py:161 -msgid "Redis 删除 key" -msgstr "Redis delete key" +#~ msgid "部署方案id列表" +#~ msgstr "Deployment scheme id list" -#: backend/ticket/constants.py:162 -msgid "Redis 集群备份" -msgstr "Redis cluster backup" +#~ msgid "新建{}部署方案" +#~ msgstr "New {} deployment plan" -#: backend/ticket/constants.py:163 -msgid "Redis 集群启用" -msgstr "Redis cluster enabled" +#~ msgid "更新{}部署方案" +#~ msgstr "update{} deployment scheme" -#: backend/ticket/constants.py:164 -msgid "Redis 集群禁用" -msgstr "Redis cluster disabled" +#~ msgid "部署方案: {} 正在被引用,无法修改相关参数" +#~ msgstr "" +#~ "Deployment plan: {} is being referenced, cannot modify related parameters" -#: backend/ticket/constants.py:165 -msgid "Redis 集群删除" -msgstr "Redis cluster deletion" +#~ msgid "查询{}部署方案列表" +#~ msgstr "Query the list of {} deployment schemes" -#: backend/ticket/constants.py:166 -msgid "Redis 集群清档" -msgstr "Redis cluster clear file" +#~ msgid "删除{}部署方案" +#~ msgstr "delete {} deployment scheme" -#: backend/ticket/constants.py:167 -msgid "Redis 扩缩容" -msgstr "Redis scaling" +#~ msgid "部署方案: {} 正在被引用,无法删除" +#~ msgstr "Deployment scheme: {} is being referenced and cannot be removed" -#: backend/ticket/constants.py:168 -msgid "Proxy 扩缩容" -msgstr "Proxy expansion and contraction" +#~ msgid "批量删除{}部署方案" +#~ msgstr "Batch delete {} deployment schemes" -#: backend/ticket/constants.py:169 -msgid "redis集群 slave 裁撤替换" -msgstr "redis cluster slave abolition and replacement" +#~ msgid "部署方案: {} 存在被引用,无法删除" +#~ msgstr "" +#~ "Deployment scheme: {} exists and is referenced and cannot be deleted" -#: backend/ticket/constants.py:170 -msgid "redis集群 master 裁撤替换" -msgstr "redis cluster master abolition and replacement" +#~ msgid "通过下发脚本到机器获取集群备份记录" +#~ msgstr "Get the cluster backup record by sending the script to the machine" -#: backend/ticket/constants.py:171 -msgid "redis集群 proxy 裁撤替换" -msgstr "redis cluster proxy abolition and replacement" +#~ msgid "根据job id查询任务执行状态和执行结果" +#~ msgstr "Query task execution status and execution results based on job id" -#: backend/ticket/constants.py:172 -msgid "Redis 新建DTS任务" -msgstr "Redis new DTS task" +#~ msgid "excel表头校验不正确! 提示: 请按照模板填写授权数据" +#~ msgstr "" +#~ "The excel header verification is incorrect! Reminder: Please fill in the " +#~ "authorization data according to the template" -#: backend/ticket/constants.py:181 -msgid "Kafka 集群禁用" -msgstr "Kafka cluster disabled" +#~ msgid "授权数据缓存UID" +#~ msgstr "Authorization Data Cache UID" -#: backend/ticket/constants.py:182 -msgid "Kafka 集群删除" -msgstr "Kafka cluster deletion" +#~ msgid "密码是否满足强度" +#~ msgstr "Whether the password meets the strength" -#: backend/ticket/constants.py:187 -msgid "HDFS 实例重启" -msgstr "HDFS instance restart" +#~ msgid "不允许sql_content和sql_file同时为空,请至少填写一项" +#~ msgstr "" +#~ "Both sql_content and sql_file are not allowed to be empty at the same " +#~ "time, please fill in at least one item" -#: backend/ticket/constants.py:193 -msgid "ES 集群部署" -msgstr "ES cluster deployment" +#~ msgid "sql执行的DB信息" +#~ msgstr "DB information executed by sql" -#: backend/ticket/constants.py:194 -msgid "ES 集群扩容" -msgstr "ES cluster expansion" +#~ msgid "高危信息提示" +#~ msgstr "High-risk information reminder" -#: backend/ticket/constants.py:195 -msgid "ES 集群缩容" -msgstr "ES cluster shrinkage" +#~ msgid "时间{}格式解析失败: {},请按照{}格式输入时间" +#~ msgstr "" +#~ "Time {} format parsing failed: {}, please enter time according to {} " +#~ "format" -#: backend/ticket/constants.py:196 -msgid "ES 实例重启" -msgstr "ES instance restart" +#~ msgid "sql数据是否成功录入到pipeline" +#~ msgstr "Whether the sql data is successfully entered into the pipeline" -#: backend/ticket/constants.py:197 -msgid "ES 集群替换" -msgstr "ES cluster replacement" +#~ msgid "改变流程配置" +#~ msgstr "Change process configuration" -#: backend/ticket/constants.py:198 -msgid "ES 集群启用" -msgstr "ES cluster enabled" +#~ msgid "查询流程配置" +#~ msgstr "Query process configuration" -#: backend/ticket/constants.py:199 -msgid "ES 集群禁用" -msgstr "ES cluster disabled" +#~ msgid "创建分区后自动执行的分区单据" +#~ msgstr "Partition ticket executed automatically after partition creation" -#: backend/ticket/constants.py:200 -msgid "ES 集群删除" -msgstr "ES cluster deletion" +#~ msgid "更新者" +#~ msgstr "updater" -#: backend/ticket/constants.py:205 -msgid "Pulsar 实例重启" -msgstr "Pulsar instance restart" +#~ msgid "分区使用的端口" +#~ msgstr "The port used by the partition" -#: backend/ticket/constants.py:219 -msgid "云区域服务部署" -msgstr "Cloud Region Service Deployment" +#~ msgid "同一业务不同集群" +#~ msgstr "Different clusters of the same business" -#: backend/ticket/constants.py:220 -msgid "云区域Nginx 服务部署" -msgstr "Nginx Service Deployment in Cloud Regions" +#~ msgid "不同业务不同集群" +#~ msgstr "Different business clusters" -#: backend/ticket/constants.py:221 -msgid "云区域nginx 服务重装" -msgstr "Cloud area nginx service reinstallation" +#~ msgid "复制到其他系统" +#~ msgstr "copy to other system" -#: backend/ticket/constants.py:222 -msgid "云区域nginx 服务替换" -msgstr "Cloud zone nginx service replacement" +#~ msgid "从回档临时环境复制数据" +#~ msgstr "Copy data from the archive staging environment" -#: backend/ticket/constants.py:223 -msgid "云区域dns 服务部署" -msgstr "Cloud zone dns service deployment" +#~ msgid "用户自建redis迁移到DBM" +#~ msgstr "Migrating user-built redis to DBM" -#: backend/ticket/constants.py:224 -msgid "云区域dns 服务添加" -msgstr "cloud zone dns service added" +#~ msgid "用户确认修复" +#~ msgstr "User confirms the fix" -#: backend/ticket/constants.py:225 -msgid "云区域dns 服务裁撤" -msgstr "Cloud zone dns service abolition" +#~ msgid "是否数据修复" +#~ msgstr "Data repair Execution" -#: backend/ticket/constants.py:226 -msgid "云区域dns 服务替换" -msgstr "Cloud zone dns service replacement" +#~ msgid "bill备注" +#~ msgstr "Bill Remarks" -#: backend/ticket/constants.py:227 -msgid "云区域dns 服务重装" -msgstr "Cloud zone dns service reinstallation" +#~ msgid "非超级用户,暂不允许调用此接口" +#~ msgstr "Non-super users are not allowed to call this interface" -#: backend/ticket/constants.py:228 -msgid "云区域dbha 服务部署" -msgstr "Cloud region dbha service deployment" +#~ msgid "打包下载结果文件列表" +#~ msgstr "Package download result file list" -#: backend/ticket/constants.py:229 -msgid "云区域dbha 服务重装" -msgstr "Cloud region dbha service reinstallation" +#~ msgid "deploy-rotate" +#~ msgstr "deploy-rotate" -#: backend/ticket/constants.py:230 -msgid "云区域dbha 服务替换" -msgstr "Cloud zone dbha service replacement" +#~ msgid "backup-truncate-database" +#~ msgstr "backup-truncate-database" -#: backend/ticket/constants.py:231 -msgid "云区域dbha 服务新增" -msgstr "Cloud region dbha service added" +#~ msgid "长久存储-保留三年" +#~ msgstr "Long-term storage - keep for three years" -#: backend/ticket/constants.py:232 -msgid "云区域dbha 服务删除" -msgstr "cloud zone dbha service delete" +#~ msgid "下发MySQL介质{}" +#~ msgstr "Send MySQL media {}" -#: backend/ticket/constants.py:233 -msgid "云区域drs 服务部署" -msgstr "Cloud zone drs service deployment" +#~ msgid "初始化机器{}" +#~ msgstr "init machine{}" -#: backend/ticket/constants.py:234 -msgid "云区域drs 服务重启" -msgstr "Cloud zone drs service restart" +#~ msgid "获取MASTER节点备份介质{}" +#~ msgstr "Get the MASTER node backup media{}" -#: backend/ticket/constants.py:235 -msgid "云区域drs 服务新增" -msgstr "Cloud zone drs service added" +#~ msgid "获取SLAVE节点备份介质{}" +#~ msgstr "Get SLAVE node backup media {}" -#: backend/ticket/constants.py:236 -msgid "云区域drs 服务删除" -msgstr "cloud zone drs service deletion" +#~ msgid "切换实例" +#~ msgstr "switch instance" -#: backend/ticket/constants.py:237 -msgid "云区域drs 服务替换" -msgstr "cloud zone drs service replacement" +#~ msgid "成对迁移集群的主从节点" +#~ msgstr "Migrating the master and slave nodes of the cluster in pairs" -#: backend/ticket/constants.py:309 -msgid "生产部署" -msgstr "production deployment" +#~ msgid "卸载主从实例完毕,修改元数据" +#~ msgstr "After uninstalling the master-slave instance, modify the metadata" -#: backend/ticket/constants.py:311 -msgid "快速执行" -msgstr "fast execution" +#~ msgid "准备重命名参数" +#~ msgstr "Prepare to rename parameters" -#: backend/ticket/constants.py:313 -msgid "结果忽略执行" -msgstr "result ignore execution" +#~ msgid "构造过滤正则" +#~ msgstr "Construct filter regular" -#: backend/ticket/constants.py:317 -msgid "交付" -msgstr "Deliver" +#~ msgid "获得源目标的库表" +#~ msgstr "Get the db table of the source target" -#: backend/ticket/constants.py:319 -msgid "描述任务信息" -msgstr "Describe task information" +#~ msgid "检查源数据库是否在用" +#~ msgstr "Check if the source database is in use" -#: backend/ticket/constants.py:325 -msgid "资源交付" -msgstr "resource delivery" +#~ msgid "表迁移" +#~ msgstr "table migration" -#: backend/ticket/constants.py:327 -msgid "资源批量申请" -msgstr "Resource Batch Application" +#~ msgid "迁移源库中其他对象" +#~ msgstr "Migrate other objects in the source instance" -#: backend/ticket/constants.py:329 -msgid "资源批量交付" -msgstr "Batch delivery of resources" +#~ msgid "确认源数据库已空" +#~ msgstr "Confirm the source database is empty" -#: backend/ticket/constants.py:335 -msgid "前置动作" -msgstr "pre-action" +#~ msgid "删除源数据库" +#~ msgstr "delete source database" -#: backend/ticket/constants.py:336 -msgid "后继动作" -msgstr "subsequent action" +#~ msgid "{} {} 重命名数据库" +#~ msgstr "{} {} rename database" -#: backend/ticket/constants.py:342 -msgid "自动重试" -msgstr "automatic retry" +#, python-format +#~ msgid "%s slave 节点不存在" +#~ msgstr "%s slave node does not exist" -#: backend/ticket/constants.py:343 -msgid "手动重试" -msgstr "Manual retry" +#~ msgid "下发db-actor到集群主从节点" +#~ msgstr "Send db-actor to the master and slave nodes of the cluster" -#: backend/ticket/constants.py:349 -msgid "通用错误代码" -msgstr "generic error code" +#~ msgid "slave重建之新增repl帐户{}" +#~ msgstr "New repl account {} for slave reconstruction" -#: backend/ticket/constants.py:350 -msgid "自动互斥重试错误代码" -msgstr "Automatic mutex retry error code" +#~ msgid "slave重建之获取MASTER节点备份介质{}" +#~ msgstr "Slave reconstruction to obtain MASTER node backup media {}" -#: backend/ticket/constants.py:351 -msgid "手动互斥重试错误代码" -msgstr "Manual mutex retry error code" +#~ msgid "slave重建之获取SLAVE节点备份介质{}" +#~ msgstr "Obtain SLAVE node backup media {} for slave reconstruction" -#: backend/ticket/exceptions.py:18 -msgid "单据模块异常" -msgstr "Ticket module exception" +#~ msgid "判断备份文件来源,并传输备份文件到新slave节点{}" +#~ msgstr "" +#~ "Determine the source of the backup file, and transfer the backup file to " +#~ "the new slave node{}" -#: backend/ticket/exceptions.py:23 -msgid "ITSM单据不存在" -msgstr "ITSM ticket does not exist" +#~ msgid "克隆主节点账号权限到新从节点" +#~ msgstr "Clone the master node account permissions to the new slave node" -#: backend/ticket/exceptions.py:24 -#, python-brace-format -msgid "ITSM单据[{sn}]不存在" -msgstr "ITSM ticket [{sn}] does not exist" +#~ msgid "old slave卸载完毕,修改元数据" +#~ msgstr "After the old slave is uninstalled, modify the metadata" -#: backend/ticket/exceptions.py:29 -msgid "单据类型不支持" -msgstr "Ticket type does not support" +#~ msgid "slave 原地恢复数据{}" +#~ msgstr "slave restore data in place{}" + +#~ msgid "Restore local Slave 本地重建" +#~ msgstr "Restore local Slave local reconstruction" -#: backend/ticket/exceptions.py:30 -#, python-brace-format -msgid "单据类型不支持{ticket_type}" -msgstr "Ticket type does not support {ticket_type}" +#~ msgid "添加slave之新增repl帐户{}" +#~ msgstr "Add a new repl account {} for slave" -#: backend/ticket/exceptions.py:35 -msgid "单据参数校验异常" -msgstr "Ticket parameter verification exception" +#~ msgid "添加slave之获取MASTER节点备份介质{}" +#~ msgstr "Add slave to obtain MASTER node backup media{}" -#: backend/ticket/exceptions.py:36 -#, python-brace-format -msgid "单据{ticket_type}参数校验异常" -msgstr "Ticket {ticket_type} parameter verification exception" +#~ msgid "添加slave之获取SLAVE节点备份介质{}" +#~ msgstr "Add slave to obtain SLAVE node backup media{}" -#: backend/ticket/exceptions.py:41 -msgid "单据执行互斥" -msgstr "Mutual Execution of Tickets" +#~ msgid "添加slave之恢复数据{}" +#~ msgstr "Add recovery data of slave {}" -#: backend/ticket/exceptions.py:42 -#, python-brace-format -msgid "单据{ticket_type}执行互斥" -msgstr "Ticket {ticket_type} executes mutual exclusion" +#~ msgid "添加Slave之恢复slave" +#~ msgstr "Add Slave recovery slave" -#: backend/ticket/exceptions.py:47 -msgid "单据提交重复" -msgstr "Duplicate ticket submission" +#~ msgid "添加从库flow" +#~ msgstr "Add slave flow" -#: backend/ticket/exceptions.py:48 -msgid "单据{ticket_type}提交重复" -msgstr "Duplicate submission of ticket {ticket_type}" +#~ msgid "清理机器配置{}" +#~ msgstr "clean up machine config{}" -#: backend/ticket/flow_manager/base.py:94 -msgid "{}流程已跳过" -msgstr "{} process skipped" +#~ msgid "清理机器flow" +#~ msgstr "Clean up machine flow" -#: backend/ticket/flow_manager/delivery.py:42 -msgid "交付成功" -msgstr "successful delivery" +#~ msgid "定点恢复之获取MASTER节点备份介质{}" +#~ msgstr "Obtain the MASTER node backup media {} for fixed-point recovery" -#: backend/ticket/flow_manager/delivery.py:79 -msgid "{}执行{}" -msgstr "{}implement{}" +#~ msgid "定点恢复之获取SLAVE节点备份介质{}" +#~ msgstr "Obtaining backup media of SLAVE nodes for fixed-point recovery {}" -#: backend/ticket/flow_manager/inner.py:82 -#, python-brace-format -msgid "任务{status_display}" -msgstr "task {status_display}" +#~ msgid "判断备份文件来源,并传输备份文件到新定点恢复节点{}" +#~ msgstr "" +#~ "Determine the source of the backup file, and transfer the backup file to " +#~ "the new designated recovery node{}" -#: backend/ticket/flow_manager/inner.py:206 -msgid "该任务流程跳过,相关信息可在历史任务中查看" -msgstr "" -"The task process is skipped, and relevant information can be viewed in the " -"historical task" +#~ msgid "传输文件{}" +#~ msgstr "transfer file{}" -#: backend/ticket/flow_manager/inner.py:226 -#, python-brace-format -msgid "(执行结果可忽略)任务状态: {status_display}" -msgstr "(The execution result can be ignored) Task status: {status_display}" +#~ msgid "卸载rollback实例{}" +#~ msgstr "unload rollback instance{}" -#: backend/ticket/flow_manager/itsm.py:65 -msgid "审批中" -msgstr "Approval" +#~ msgid "卸载rollback实例完毕,修改元数据" +#~ msgstr "After uninstalling the rollback instance, modify the metadata" -#: backend/ticket/flow_manager/itsm.py:66 -msgid "已撤销" -msgstr "Revoked" +#~ msgid "获得清档目标" +#~ msgstr "get clearance target" -#: backend/ticket/flow_manager/itsm.py:67 -msgid "已通过" -msgstr "passed" +#~ msgid "检查清档目标是否在用" +#~ msgstr "Check if the cleanup target is in use" -#: backend/ticket/flow_manager/itsm.py:68 -msgid "被拒绝" -msgstr "be rejected" +#~ msgid "生成备份库名" +#~ msgstr "Generate backup database name" -#: backend/ticket/flow_manager/pause.py:43 -#, python-brace-format -msgid "暂停状态{status_display}" -msgstr "pause status {status_display}" +#~ msgid "备份清档表" +#~ msgstr "backup cleanup table" -#: backend/ticket/flow_manager/pause.py:65 -msgid "【{}】流程待确认,是否继续?" -msgstr "【{}】The process is pending confirmation. Do you want to continue?" +#~ msgid "重建空表" +#~ msgstr "rebuild empty table" -#: backend/ticket/flow_manager/resource.py:52 -msgid "资源申请状态{status_display}" -msgstr "Resource application status {status_display}" +#~ msgid "备份库中其他对象" +#~ msgstr "Other objects in the backup db" -#: backend/ticket/flow_manager/resource.py:129 -msgid "资源申请失败,错误信息: {}" -msgstr "Resource application failed, error message: {}" +#~ msgid "{} {} 清档" +#~ msgstr "{} {} clear file" -#: backend/ticket/flow_manager/resource.py:166 -#: backend/ticket/flow_manager/resource.py:206 -msgid "资源申请下一个节点不为部署节点,请重新编排" -msgstr "" -"The next node for resource application is not a deployment node, please re-" -"arrange" +#~ msgid "Redis-{}-安装原子任务" +#~ msgstr "Redis-{}-install atomic tasks" -#: backend/ticket/flow_manager/timer.py:56 -msgid "定时时间{},已超时{},需手动触发。暂停状态:{}" -msgstr "" -"Timing time {}, has timed out {} and needs to be triggered manually. " -"Suspended state: {}" +#~ msgid "Redis-001-{}-下发介质包" +#~ msgstr "Redis-001-{}-deliver media package" -#: backend/ticket/flow_manager/timer.py:63 -msgid "定时节点已触发" -msgstr "Timing node has been triggered" +#~ msgid "Redis-005-{}-安装监控" +#~ msgstr "Redis-005-{}-install monitoring" -#: backend/ticket/flow_manager/timer.py:65 -msgid "定时时间{},倒计时:{}" -msgstr "Timing time {}, countdown: {}" +#~ msgid "Redis-101-{}-下发介质包" +#~ msgstr "Redis-101-{}-deliver media package" -#: backend/ticket/flow_manager/timer.py:96 -msgid "【{}】定时流程待确认,是否继续?" -msgstr "" -"【{}】The scheduled process is to be confirmed. Do you want to continue?" +#~ msgid "Redis-102-{}-卸载dbmon" +#~ msgstr "Redis-102-{}-uninstall dbmon" -#: backend/ticket/mock_data.py:60 -msgid "测试创建es集群" -msgstr "Test to create an es cluster" +#~ msgid "Redis-103-{}-建立主从关系" +#~ msgstr "Redis-103-{}-establish master-slave relationship" -#: backend/ticket/mock_data.py:65 backend/ticket/mock_data.py:92 -#: backend/ticket/mock_data.py:121 backend/ticket/mock_data.py:158 -msgid "深圳" -msgstr "Shenzhen" +#~ msgid "Redis-104-{}-建立主从关系" +#~ msgstr "Redis-104-{}-establish master-slave relationship" -#: backend/ticket/mock_data.py:87 -msgid "测试创建kafka集群" -msgstr "Test to create a kafka cluster" +#~ msgid "Redis-801-{}-下发介质包" +#~ msgstr "Redis-801-{}-deliver media package" -#: backend/ticket/mock_data.py:116 -msgid "测试创建hdfs集群" -msgstr "Test to create hdfs cluster" +#~ msgid "Redis-802-{}-请求检查" +#~ msgstr "redis-802-{}-request-check" -#: backend/ticket/mock_data.py:156 -msgid "测试集群" -msgstr "test cluster" +#~ msgid "Redis-003-{}-下发介质包" +#~ msgstr "Redis-003-{}-deliver media package" -#: backend/ticket/models/ticket.py:46 -msgid "流程类型" -msgstr "Process type" +#~ msgid "Redis-504-{}-实例切换" +#~ msgstr "Redis-504-{}-instance switching" -#: backend/ticket/models/ticket.py:47 -msgid "流程别名" -msgstr "process alias" +#~ msgid "源集群:{} 数据迁移到 目的集群:{}" +#~ msgstr "Source cluster: {} Data migration to destination cluster: {}" -#: backend/ticket/models/ticket.py:49 -msgid "单据流程对象ID" -msgstr "Ticket process object ID" +#~ msgid "REDIS_MASTER-裁撤替换" +#~ msgstr "REDIS_MASTER - undo replace" -#: backend/ticket/models/ticket.py:50 -msgid "单据流程详情" -msgstr "Ticket process details" +#~ msgid "REDIS_MASTER-故障自愈" +#~ msgstr "REDIS_MASTER - fault self-healing" -#: backend/ticket/models/ticket.py:52 -msgid "单据流程状态" -msgstr "Ticket process status" +#~ msgid "[redis]卸载bkdbmon" +#~ msgstr "[redis] uninstall bkdbmon" -#: backend/ticket/models/ticket.py:58 -msgid "错误代码" -msgstr "error code" +#~ msgid "清理Redis配置" +#~ msgstr "Clean up Redis configuration" -#: backend/ticket/models/ticket.py:60 -msgid "重试类型(专用于inner_flow)" -msgstr "retry type (specific to inner_flow)" +#~ msgid "清理Proxy配置" +#~ msgstr "Clean up the Proxy configuration" -#: backend/ticket/models/ticket.py:64 backend/ticket/models/ticket.py:65 -msgid "单据流程" -msgstr "ticket flow" +#~ msgid "REDIS-重装DBMON" +#~ msgstr "REDIS-Reinstall DBMON" -#: backend/ticket/models/ticket.py:93 backend/ticket/serializers.py:70 -msgid "单据分组类型" -msgstr "Ticket grouping type" +#~ msgid "{}部署bkdbmon" +#~ msgstr "{} deploy bkdbmon" -#: backend/ticket/models/ticket.py:101 -msgid "单据差异化详情" -msgstr "Ticket Differentiation Details" +#~ msgid "{}添加域名" +#~ msgstr "{} add domain name" -#: backend/ticket/models/ticket.py:102 -msgid "单据是否审阅过" -msgstr "Have the tickets been reviewed" +#~ msgid "主机转移" +#~ msgstr "host transfer" -#: backend/ticket/models/ticket.py:105 backend/ticket/models/ticket.py:106 -msgid "单据" -msgstr "tickets" +#~ msgid "{}删除域名" +#~ msgstr "{} delete domain name" -#: backend/ticket/models/ticket.py:187 -msgid "正在自动创建单据,单据详情: {}" -msgstr "Ticket is being created automatically, ticket details: {}" +#~ msgid "下架proxy实例" +#~ msgstr "Remove the proxy instance" -#: backend/ticket/models/ticket.py:196 -msgid "单据{}正在初始化流程" -msgstr "Ticket {} is initializing the process" +#~ msgid "proxy下架元数据" +#~ msgstr "Proxy removal metadata" -#: backend/ticket/models/ticket.py:246 backend/ticket/models/ticket.py:302 -#: backend/ticket/models/todo.py:31 -msgid "关联流程任务" -msgstr "Associate Process Task" +#~ msgid "集群[{}]添加spider master节点" +#~ msgstr "Cluster [{}] add spider master node" -#: backend/ticket/models/ticket_result_relation.py:25 -msgid "第三方系统id" -msgstr "Third-party system id" +#~ msgid "部署spider-ctl集群" +#~ msgstr "Deploy the spider-ctl cluster" -#: backend/ticket/models/todo.py:30 -msgid "待办标题" -msgstr "to do title" +#~ msgid "spider上对中控主节点进行授权" +#~ msgstr "Authorize the central control master node on the spider" -#: backend/ticket/models/todo.py:33 -msgid "待办人" -msgstr "to-do person" +#~ msgid "中控主节点注册临时spider节点路由信息" +#~ msgstr "" +#~ "The central control master node registers the routing information of the " +#~ "temporary spider node" -#: backend/ticket/models/todo.py:35 -msgid "待办类型" -msgstr "to-do type" +#~ msgid "ctl 执行库表备份" +#~ msgstr "ctl perform database table backup" -#: backend/ticket/models/todo.py:40 -msgid "上下文" -msgstr "the context" +#~ msgid "存入的存储节点数量不是偶数,请检查!" +#~ msgstr "" +#~ "The number of stored storage nodes is not an even number, please check!" -#: backend/ticket/models/todo.py:42 -msgid "待办状态" -msgstr "pending status" +#~ msgid "ctl 执行全库备份" +#~ msgstr "ctl perform full database backup" -#: backend/ticket/models/todo.py:47 -msgid "待办完成人" -msgstr "to-do completion person" +#~ msgid "适配备份库映射" +#~ msgstr "Adapt backup database mapping" -#: backend/ticket/models/todo.py:48 -msgid "待办完成时间" -msgstr "to-do completion time" +#~ msgid "重建备份库" +#~ msgstr "Rebuild the backup database" -#: backend/ticket/models/todo.py:72 backend/ticket/models/todo.py:73 -msgid "待办" -msgstr "Upcoming" +#~ msgid "{} on remote {} 清档" +#~ msgstr "{} on remote {} clear file" -#: backend/ticket/models/todo.py:81 -msgid "关联待办" -msgstr "Associated to-do" +#~ msgid "处理集群表" +#~ msgstr "Working with clustered tables" -#: backend/ticket/models/todo.py:82 -msgid "操作" -msgstr "operate" +#~ msgid "{} on remote {} 重命名数据库" +#~ msgstr "{} on remote {} rename database" -#: backend/ticket/models/todo.py:85 backend/ticket/models/todo.py:86 -msgid "待办操作记录" -msgstr "To-do operation record" +#~ msgid "删除集群源库" +#~ msgstr "Delete the cluster source database" -#: backend/ticket/serializers.py:71 backend/ticket/views.py:172 -#: backend/ticket/views.py:173 -msgid "单据详情" -msgstr "Ticket details" +#~ msgid "【{}】自动化流程待确认,是否继续?" +#~ msgstr "" +#~ "【{}】The automated process is pending confirmation. Do you want to " +#~ "continue?" -#: backend/ticket/serializers.py:74 -msgid "状态名称" -msgstr "state name" +#~ msgid "{}-空闲检查" +#~ msgstr "{} - idle check" -#: backend/ticket/serializers.py:80 -msgid "是否忽略重复提交" -msgstr "Whether to ignore duplicate submissions" +#~ msgid "空闲检查失败" +#~ msgstr "idle check failed" -#: backend/ticket/serializers.py:109 -msgid "流程待办" -msgstr "process to do" +#~ msgid "错误详情{}" +#~ msgstr "error details{}" -#: backend/ticket/serializers.py:110 -msgid "跳转链接" -msgstr "jump link" +#, python-format +#~ msgid "输入参数%s不符合【时区(+08:00、-08:00)】格式" +#~ msgstr "" +#~ "The input parameter %s does not conform to the [time zone (+08:00, " +#~ "-08:00)] format" -#: backend/ticket/serializers.py:114 -msgid "流程类型显示名" -msgstr "Process type display name" +#, python-format +#~ msgid "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" +#~ msgstr "" +#~ "The input parameter %s does not conform to the [second (s) or time (%%Y-" +#~ "%%m-%%d %%H:%%M:%%S)] format" -#: backend/ticket/serializers.py:115 -msgid "概览" -msgstr "overview" +#~ msgid "「授权接口返回结果异常」{}" +#~ msgstr "Authorization interface returns abnormal result {}" -#: backend/ticket/serializers.py:165 -msgid "待办人列表" -msgstr "to-do list" +#~ msgid "分区管理服务api异常,相关信息: {}" +#~ msgstr "Partition management service api exception, related information: {}" -#: backend/ticket/serializers.py:183 -msgid "待办ID" -msgstr "to-do ID" +#~ msgid "获取分区语句成功" +#~ msgstr "Get partition statement succeeded" -#: backend/ticket/serializers.py:184 -msgid "动作" -msgstr "action" +#~ msgid "语义检查出发的自动创建单据" +#~ msgstr "Automatic creation of tickets starting from semantic check" -#: backend/ticket/serializers.py:185 -msgid "动作参数" -msgstr "action parameters" +#~ msgid "task:{} {}:{} 迁移失败" +#~ msgstr "task:{} {}:{} migration failed" -#: backend/ticket/serializers.py:203 -msgid "单据流程的ID" -msgstr "ID of the ticket process" +#~ msgid "{}中有{}个proxy不是running状态" +#~ msgstr "{} proxy in {} is not running" -#: backend/ticket/serializers.py:218 backend/ticket/serializers.py:226 -msgid "查询起始时间" -msgstr "Query start time" +#~ msgid "查询主机bk_host_id失败[数量不匹配]" +#~ msgstr "Failed to query host bk_host_id [number does not match]" -#: backend/ticket/serializers.py:219 backend/ticket/serializers.py:227 -msgid "查询终止时间" -msgstr "query end time" +#~ msgid "查询空闲机模块ID bk_module_id 失败" +#~ msgstr "Failed to query the idle machine module ID bk_module_id" -#: backend/ticket/serializers.py:221 backend/ticket/serializers.py:229 -msgid "操作状态" -msgstr "operating state" +#~ msgid "导入资源池失败" +#~ msgstr "Failed to import resource pool" -#: backend/ticket/serializers.py:233 -msgid "主机所在业务" -msgstr "host business" +#~ msgid "单实例架构" +#~ msgstr "single instance architecture" -#: backend/ticket/serializers.py:235 -msgid "IP列表" -msgstr "IP list" +#~ msgid "数据库管理" +#~ msgstr "database management" -#: backend/ticket/serializers.py:239 -msgid "请至少提供两台机器来部署云区域组件" -msgstr "Please provide at least two machines to deploy cloud zone components" +#~ msgid "平台管理" +#~ msgstr "platform management" -#: backend/ticket/tasks/ticket_tasks.py:104 -msgid "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" -msgstr "" -"The relevant information of the cluster {} cannot be queried in dbm meta, " -"please check the status of the cluster" +#~ msgid "JWT鉴权错误,错误信息: {}" +#~ msgstr "JWT authentication error, error message: {}" -#: backend/ticket/tasks/ticket_tasks.py:176 -msgid "集群{}数据校验正确,不需要进行数据修复" -msgstr "Cluster {} data verification is correct, no data repair is required" +#~ msgid "" +#~ "新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连" +#~ "接符-和下划线_,并且长度在1到39字符之间" +#~ msgstr "" +#~ "The format of the new DB name {} is invalid. Please ensure that the " +#~ "database name starts with a lowercase letter and can only contain " +#~ "letters, numbers, hyphens - and underscores _, and the length is between " +#~ "1 and 39 characters" -#: backend/ticket/tasks/ticket_tasks.py:200 -msgid "集群{}存在数据不一致,自动创建的数据修复单据" -msgstr "" -"There is data inconsistency in the cluster {}, the automatically created " -"data repair ticket" +#~ msgid "不允许%单独使用,不允许*组合使用" +#~ msgstr "" +#~ "% is not allowed to be used alone, and * is not allowed to be used in " +#~ "combination" -#: backend/ticket/tasks/ticket_tasks.py:216 -msgid "任务{}立即执行" -msgstr "Task {} executes immediately" +#~ msgid "包含通配符时,每一个输入框只能允许单一对象" +#~ msgstr "" +#~ "When wildcards are included, each input box can only allow a single object" -#: backend/ticket/tasks/ticket_tasks.py:219 -msgid "任务{}定时执行,定时触发时间:{}" -msgstr "The task {} is executed regularly, and the timing trigger time: {}" +#~ msgid "字符不允许只包含空格" +#~ msgstr "Characters are not allowed to contain only spaces" -#: backend/ticket/todos/__init__.py:100 -msgid "确认执行" -msgstr "Confirm execution" +#~ msgid "DB选择框不允许为空" +#~ msgstr "The DB selection box is not allowed to be empty" -#: backend/ticket/todos/__init__.py:101 -msgid "终止单据" -msgstr "Termination ticket" +#~ msgid "table选择框不允许为空" +#~ msgstr "The table selection box is not allowed to be empty" -#: backend/ticket/views.py:136 -msgid "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -msgstr "The same type of ticket [{}] already exists in the instance {} and is running, please confirm whether to submit it repeatedly" +#~ msgid "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" +#~ msgstr "" +#~ "Ignore the DB selection box and ignore the table selection box are either " +#~ "empty or not empty at the same time" -#: backend/ticket/views.py:149 -msgid "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -msgstr "" -"The same type of ticket [{}] already exists in the cluster {} and is " -"running, please confirm whether to submit it repeatedly" +#~ msgid "规格" +#~ msgstr "Specification" -#: backend/ticket/views.py:189 -msgid "单据列表" -msgstr "Ticket list" +#~ msgid "master节点数不为3台! 请保证master的部署节点为3" +#~ msgstr "" +#~ "The number of master nodes is not 3! Please ensure that the deployment " +#~ "nodes of the master are 3" -#: backend/ticket/views.py:208 -msgid "获取单据流程" -msgstr "Obtain ticket process" +#~ msgid "matser实例状态异常,暂时无法执行该单据类型:{}" +#~ msgstr "" +#~ "The state of the matser instance is abnormal, and this ticket type cannot " +#~ "be executed temporarily: {}" -#: backend/ticket/views.py:210 -msgid "流程信息" -msgstr "process information" +#~ msgid "proxy实例状态异常,暂时无法执行该单据类型:{}" +#~ msgstr "" +#~ "The status of the proxy instance is abnormal, and the ticket type cannot " +#~ "be executed temporarily: {}" -#: backend/ticket/views.py:221 -msgid "单据回调" -msgstr "Ticket callback" +#~ msgid "系统内置数据库[{}],不允许重命名" +#~ msgstr "System built-in database [{}], renaming is not allowed" -#: backend/ticket/views.py:234 -msgid "单据流程重试" -msgstr "Ticket process retry" +#~ msgid "sql文件路径" +#~ msgstr "sql file path" -#: backend/ticket/views.py:248 -msgid "获取单据类型列表" -msgstr "Get a list of ticket types" +#~ msgid "模拟执行node_id" +#~ msgstr "Simulate the execution of node_id" -#: backend/ticket/views.py:257 -msgid "节点列表" -msgstr "node list" +#~ msgid "模拟执行root_id" +#~ msgstr "Simulate the execution of root_id" -#: backend/ticket/views.py:286 -msgid "待办单据列表" -msgstr "To-Do List" +#~ msgid "sql文件名" +#~ msgstr "sql file name" -#: backend/ticket/views.py:325 -msgid "待办处理" -msgstr "pending" +#~ msgid "目标变更db" +#~ msgstr "target change db" -#: backend/ticket/views.py:346 -msgid "待办单据数" -msgstr "Number of pending tickets" +#~ msgid "备份匹配DB列表" +#~ msgstr "Backup matching DB list" -#: backend/ticket/views.py:370 -msgid "查询集群变更单据事件" -msgstr "Query cluster change ticket events" +#~ msgid "备份匹配Table列表" +#~ msgstr "Backup matching Table list" -#: backend/ticket/views.py:406 -msgid "查询集群实例变更单据事件" -msgstr "Query cluster instance change ticket events" +#~ msgid "sql备份信息" +#~ msgstr "sql backup information" -#: backend/ticket/views.py:442 -msgid "快速部署云区域组件" -msgstr "Quickly deploy cloud zone components" +#~ msgid "后台部署方案" +#~ msgstr "Background deployment scheme" -#: backend/ticket/views.py:514 -msgid "云区域组件快速部署单据" -msgstr "Quick Deployment ticket for Cloud Region Components" +#~ msgid "主机【{}】已经被注册到了集群元数据,请检查" +#~ msgstr "" +#~ "The host [{}] has been registered in the cluster metadata, please check" -#: backend/utils/time.py:127 -msgid "类型{}与类型{}之间不允许进行比较" -msgstr "Comparison not allowed between type {} and type {}" +#~ msgid "master和slave中存在重复节点" +#~ msgstr "There are duplicate nodes in master and slave" -#: backend/utils/time.py:135 -msgid "无法找到合适的附近时间点" -msgstr "Unable to find a suitable nearby time point" +#~ msgid "slave和proxy中存在重复节点" +#~ msgstr "There are duplicate nodes in slave and proxy" -#: backend/version_log/config.py:30 -msgid "版本日志" -msgstr "version log" +#~ msgid "部署方案" +#~ msgstr "deployment plan" -#: backend/version_log/models.py:43 -msgid "访问版本" -msgstr "access version" +#~ msgid "集群访问域名" +#~ msgstr "Cluster access domain name" -#: backend/version_log/models.py:48 -msgid "版本日志访问记录" -msgstr "Version log access records" +#~ msgid "机器数" +#~ msgstr "Number of machines" -#: backend/version_log/views.py:45 -msgid "访问出错,请联系管理员。" -msgstr "System error, please contact administrator" +#~ msgid "Spider 全备" +#~ msgstr "Spider fully prepared" -#: backend/version_log/views.py:49 -msgid "日志列表获取成功" -msgstr "Log list obtained successfully" +#~ msgid "redis集群 slave 裁撤替换" +#~ msgstr "redis cluster slave abolition and replacement" -#: backend/version_log/views.py:65 -msgid "日志版本文件没找到,请联系管理员" -msgstr "The log version file was not found, please contact the administrator" +#~ msgid "redis集群 proxy 裁撤替换" +#~ msgstr "redis cluster proxy abolition and replacement" -#: backend/version_log/views.py:69 -msgid "日志详情获取成功" -msgstr "Log details obtained successfully" +#~ msgid "类型{}与类型{}之间不允许进行比较" +#~ msgstr "Comparison not allowed between type {} and type {}" diff --git a/dbm-ui/locale/zh_hans/LC_MESSAGES/django.mo b/dbm-ui/locale/zh_hans/LC_MESSAGES/django.mo index f709d59a9b83502a04620ceb0d70795ceb6138dc..0e039147b3c4a666c9a6cab76d71095bdef977ea 100644 GIT binary patch literal 473357 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 GTz0_Gq~~F!R4pU>)KucqL}flOyy0Kh4$X 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

=AqVFX&$udx@tS;wJo?3IFZ8?0~t;dIrOFlzv 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

` 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 diff --git a/dbm-ui/locale/zh_hans/LC_MESSAGES/django.po b/dbm-ui/locale/zh_hans/LC_MESSAGES/django.po index 1235826c5f..2c5accdf45 100644 --- a/dbm-ui/locale/zh_hans/LC_MESSAGES/django.po +++ b/dbm-ui/locale/zh_hans/LC_MESSAGES/django.po @@ -2,12 +2,11 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. - msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-20 15:58+0800\n" +"POT-Creation-Date: 2024-09-13 20:51+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,105 +16,147 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: backend/bk_web/handlers.py:37 -msgid "部分列表元素的参数不合法,请检查" -msgstr "部分列表元素的参数不合法,请检查" +#: backend/bk_dataview/grafana/views.py:209 +#: backend/db_monitor/models/dashboard.py:29 +msgid "集群监控视图" +msgstr "集群监控视图" + +#: backend/bk_web/exceptions.py:19 +msgid "外部路由转发异常" +msgstr "外部路由转发异常" + +#: backend/bk_web/exceptions.py:24 +msgid "外部用户不存在" +msgstr "外部用户不存在" + +#: backend/bk_web/exceptions.py:29 +msgid "转发路由非法" +msgstr "转发路由非法" -#: backend/bk_web/handlers.py:65 +#: backend/bk_web/handlers.py:41 msgid "捕获未处理异常, 请求URL->{}, 请求方法->{} 请求参数->{}" msgstr "捕获未处理异常, 请求URL->{}, 请求方法->{} 请求参数->{}" -#: backend/bk_web/handlers.py:84 +#: backend/bk_web/handlers.py:61 msgid "用户未登录或登录态失效,请重新登录" msgstr "用户未登录或登录态失效,请重新登录" -#: backend/bk_web/handlers.py:97 +#: backend/bk_web/handlers.py:74 #, python-brace-format msgid "【APP 自定义异常】{message}, code={code}, args={args}" msgstr "【APP 自定义异常】{message}, code={code}, args={args}" -#: backend/bk_web/handlers.py:113 +#: backend/bk_web/handlers.py:90 msgid "捕获未处理异常, 请求URL->[{}], 请求方法->[{}] 请求参数->[{}]" msgstr "捕获未处理异常, 请求URL->[{}], 请求方法->[{}] 请求参数->[{}]" -#: backend/bk_web/handlers.py:117 +#: backend/bk_web/handlers.py:94 #, python-brace-format msgid "系统错误,请联系管理员({error})" msgstr "系统错误,请联系管理员({error})" -#: backend/bk_web/models.py:20 -#: backend/db_proxy/views/redis_dts/serializers.py:22 -#: backend/db_services/bigdata/influxdb/query.py:34 -#: backend/db_services/bigdata/influxdb/query.py:35 -#: backend/db_services/bigdata/resources/query.py:46 -#: backend/db_services/bigdata/resources/query.py:47 -#: backend/db_services/mysql/resources/spider/query.py:45 -#: backend/db_services/mysql/resources/tendbha/query.py:46 -#: backend/db_services/mysql/resources/tendbsingle/query.py:42 -#: backend/db_services/redis/resources/redis_cluster/query.py:61 -#: backend/db_services/redis_dts/serializers.py:17 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:66 +#: backend/bk_web/middleware.py:137 +msgid "外部请求失败,错误原因:{}" +msgstr "外部请求失败,错误原因:{}" + +#: backend/bk_web/middleware.py:168 +msgid "单据类型[{}]非法,未开通白名单" +msgstr "单据类型[{}]非法,未开通白名单" + +#: backend/bk_web/middleware.py:202 +msgid "路由{}非法,未开通白名单" +msgstr "路由{}非法,未开通白名单" + +#: backend/bk_web/models.py:22 backend/db_monitor/views/policy.py:49 +#: backend/db_services/bigdata/influxdb/query.py:36 +#: backend/db_services/bigdata/influxdb/query.py:37 +#: backend/db_services/bigdata/resources/query.py:44 +#: backend/db_services/bigdata/resources/query.py:45 +#: backend/db_services/mongodb/resources/query.py:37 +#: backend/db_services/mysql/resources/tendbcluster/query.py:49 +#: backend/db_services/mysql/resources/tendbha/query.py:41 +#: backend/db_services/mysql/resources/tendbsingle/query.py:36 +#: backend/db_services/redis/resources/redis_cluster/query.py:65 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:37 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:34 msgid "创建人" msgstr "创建人" -#: backend/bk_web/models.py:21 backend/core/encrypt/models.py:25 -#: backend/core/storages/models.py:28 backend/core/storages/models.py:47 -#: backend/db_services/bigdata/influxdb/query.py:36 -#: backend/db_services/bigdata/resources/query.py:48 -#: backend/db_services/mysql/permission/db_account/serializers.py:88 -#: backend/db_services/mysql/permission/db_account/serializers.py:98 -#: backend/db_services/mysql/resources/spider/query.py:46 -#: backend/db_services/mysql/resources/tendbha/query.py:47 -#: backend/db_services/mysql/resources/tendbsingle/query.py:43 -#: backend/db_services/mysql/sql_import/serializers.py:143 -#: backend/db_services/redis/resources/redis_cluster/query.py:62 -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:19 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:57 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:70 -#: backend/flow/models.py:45 backend/ticket/models/ticket.py:43 +#: backend/bk_web/models.py:23 backend/core/storages/models.py:28 +#: backend/core/storages/models.py:47 backend/db_package/models.py:42 +#: backend/db_services/bigdata/influxdb/query.py:38 +#: backend/db_services/bigdata/resources/query.py:46 +#: backend/db_services/dbpermission/db_account/serializers.py:89 +#: backend/db_services/dbpermission/db_account/serializers.py:98 +#: backend/db_services/mysql/resources/tendbcluster/query.py:50 +#: backend/db_services/mysql/resources/tendbha/query.py:42 +#: backend/db_services/mysql/resources/tendbsingle/query.py:37 +#: backend/db_services/mysql/sql_import/serializers.py:164 +#: backend/db_services/redis/autofix/models.py:92 +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:19 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:91 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:75 +#: backend/db_services/redis/resources/redis_cluster/query.py:66 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:38 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:35 +#: backend/flow/models.py:49 backend/ticket/models/ticket.py:44 msgid "创建时间" msgstr "创建时间" -#: backend/bk_web/models.py:22 +#: backend/bk_web/models.py:24 msgid "修改人" msgstr "修改人" -#: backend/bk_web/models.py:23 backend/core/encrypt/models.py:24 -#: backend/core/storages/models.py:27 backend/core/storages/models.py:46 -#: backend/db_services/bigdata/influxdb/query.py:38 -#: backend/db_services/bigdata/resources/query.py:50 +#: backend/bk_web/models.py:25 backend/core/storages/models.py:27 +#: backend/core/storages/models.py:46 backend/db_package/models.py:43 +#: backend/db_services/bigdata/influxdb/query.py:40 +#: backend/db_services/bigdata/resources/query.py:48 #: backend/db_services/dbconfig/serializers.py:66 -#: backend/db_services/redis/resources/redis_cluster/query.py:64 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:58 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:71 -#: backend/flow/models.py:47 backend/ticket/models/ticket.py:44 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:28 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:23 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:92 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:76 +#: backend/db_services/redis/resources/redis_cluster/query.py:68 +#: backend/flow/models.py:51 backend/ticket/models/ticket.py:45 msgid "更新时间" msgstr "更新时间" -#: backend/components/base.py:158 +#: backend/bk_web/models.py:34 +msgid "外部用户名" +msgstr "外部用户名" + +#: backend/bk_web/models.py:35 +msgid "内部用户名" +msgstr "内部用户名" + +#: backend/bk_web/models.py:43 +msgid "外部用户{}没有注册到DBM平台,请联系管理员注册" +msgstr "外部用户{}没有注册到DBM平台,请联系管理员注册" + +#: backend/components/base.py:175 #, python-brace-format msgid "请求已达到最大重试次数{max_retry_times}" msgstr "请求已达到最大重试次数{max_retry_times}" -#: backend/components/base.py:199 -msgid "{}-接口调用异常" -msgstr "{}-接口调用异常" +#: backend/components/base.py:214 +msgid "{}-接口调用异常: {}" +msgstr "{}-接口调用异常: {}" -#: backend/components/base.py:217 +#: backend/components/base.py:245 #, python-brace-format msgid "[{module}]API请求异常:({error_message})" msgstr "[{module}]API请求异常:({error_message})" -#: backend/components/base.py:279 +#: backend/components/base.py:303 msgid "返回数据格式不正确,结果格式非json." msgstr "返回数据格式不正确,结果格式非json." -#: backend/components/base.py:347 +#: backend/components/base.py:375 #, python-brace-format msgid "[BKAPI] {info}" msgstr "[BKAPI] {info}" -#: backend/components/base.py:446 +#: backend/components/base.py:501 #, python-brace-format msgid "异常请求方式,{method}" msgstr "异常请求方式,{method}" @@ -124,31 +165,35 @@ msgstr "异常请求方式,{method}" msgid "请求[{}]失败:{}" msgstr "请求[{}]失败:{}" -#: backend/components/bklog/client.py:19 +#: backend/components/bklog/client.py:18 msgid "蓝鲸日志平台" msgstr "蓝鲸日志平台" -#: backend/components/bklog/client.py:27 +#: backend/components/bklog/client.py:26 msgid "查询索引" msgstr "查询索引" -#: backend/components/bklog/client.py:34 +#: backend/components/bklog/client.py:31 msgid "简易创建采集配置" msgstr "简易创建采集配置" -#: backend/components/bklog/client.py:43 +#: backend/components/bklog/client.py:38 msgid "简易更新采集配置" msgstr "简易更新采集配置" -#: backend/components/bklog/client.py:50 +#: backend/components/bklog/client.py:43 msgid "创建采集项的前置检查" msgstr "创建采集项的前置检查" -#: backend/components/bklog/client.py:57 +#: backend/components/bklog/client.py:48 msgid "获取采集项列表" msgstr "获取采集项列表" -#: backend/components/bkmonitorv3/client.py:23 +#: backend/components/bklog/client.py:53 +msgid "查询索引集列表" +msgstr "查询索引集列表" + +#: backend/components/bkmonitorv3/client.py:19 msgid "监控" msgstr "监控" @@ -156,211 +201,374 @@ msgstr "监控" msgid "获取 data id" msgstr "获取 data id" -#: backend/components/bkmonitorv3/client.py:38 +#: backend/components/bkmonitorv3/client.py:36 msgid "保存通知组" msgstr "保存通知组" -#: backend/components/bkmonitorv3/client.py:45 +#: backend/components/bkmonitorv3/client.py:41 msgid "获取业务下自定义事件列表" msgstr "获取业务下自定义事件列表" -#: backend/components/bkmonitorv3/client.py:52 +#: backend/components/bkmonitorv3/client.py:46 msgid "获取自定义指标列表" msgstr "获取自定义指标列表" -#: backend/components/bkmonitorv3/client.py:59 +#: backend/components/bkmonitorv3/client.py:51 msgid "获取自定义指标详情" msgstr "获取自定义指标详情" -#: backend/components/bkmonitorv3/client.py:66 +#: backend/components/bkmonitorv3/client.py:56 msgid "获取业自定义事件详情" msgstr "获取业自定义事件详情" -#: backend/components/bkmonitorv3/client.py:73 +#: backend/components/bkmonitorv3/client.py:61 msgid "创建自定义指标" msgstr "创建自定义指标" -#: backend/components/bkmonitorv3/client.py:80 +#: backend/components/bkmonitorv3/client.py:66 msgid "创建自定义事件" msgstr "创建自定义事件" -#: backend/components/bkmonitorv3/client.py:87 +#: backend/components/bkmonitorv3/client.py:71 msgid "保存告警策略" msgstr "保存告警策略" -#: backend/components/bkmonitorv3/client.py:94 +#: backend/components/bkmonitorv3/client.py:76 +msgid "启停告警策略" +msgstr "启停告警策略" + +#: backend/components/bkmonitorv3/client.py:81 +msgid "批量更新策略局部配置" +msgstr "批量更新策略局部配置" + +#: backend/components/bkmonitorv3/client.py:86 +msgid "删除告警策略" +msgstr "删除告警策略" + +#: backend/components/bkmonitorv3/client.py:91 msgid "查询告警策略" msgstr "查询告警策略" -#: backend/components/bkmonitorv3/client.py:101 +#: backend/components/bkmonitorv3/client.py:96 msgid "保存采集策略" msgstr "保存采集策略" -#: backend/components/bkmonitorv3/client.py:108 +#: backend/components/bkmonitorv3/client.py:101 msgid "查询采集策略" msgstr "查询采集策略" -#: backend/components/bkmonitorv3/client.py:115 +#: backend/components/bkmonitorv3/client.py:106 msgid "查询采集配置列表" msgstr "查询采集配置列表" -#: backend/components/bkmonitorv3/client.py:122 +#: backend/components/bkmonitorv3/client.py:111 msgid "查询采集策略详情" msgstr "查询采集策略详情" -#: backend/components/cc/client.py:19 backend/iam_app/handlers/permission.py:89 +#: backend/components/bkmonitorv3/client.py:116 +msgid "查询用户组列表" +msgstr "查询用户组列表" + +#: backend/components/bkmonitorv3/client.py:121 +msgid "查询用户组详情" +msgstr "查询用户组详情" + +#: backend/components/bkmonitorv3/client.py:126 +msgid "删除用户组" +msgstr "删除用户组" + +#: backend/components/bkmonitorv3/client.py:131 +msgid "保存用户组" +msgstr "保存用户组" + +#: backend/components/bkmonitorv3/client.py:136 +msgid "保存轮值规则" +msgstr "保存轮值规则" + +#: backend/components/bkmonitorv3/client.py:141 +#: backend/db_monitor/views/duty_rule.py:34 +msgid "查询轮值规则列表" +msgstr "查询轮值规则列表" + +#: backend/components/bkmonitorv3/client.py:146 +#: backend/db_monitor/views/duty_rule.py:60 +msgid "删除轮值规则" +msgstr "删除轮值规则" + +#: backend/components/bkmonitorv3/client.py:151 +msgid "保存分派组" +msgstr "保存分派组" + +#: backend/components/bkmonitorv3/client.py:156 +msgid "查询分派组" +msgstr "查询分派组" + +#: backend/components/bkmonitorv3/client.py:161 +msgid "删除分派组" +msgstr "删除分派组" + +#: backend/components/bkmonitorv3/client.py:166 +msgid "查询事件" +msgstr "查询事件" + +#: backend/components/bkmonitorv3/client.py:171 +msgid "统一查询时序数据" +msgstr "统一查询时序数据" + +#: backend/components/bkmonitorv3/client.py:176 +msgid "获取自定义上报的 proxy 主机信息" +msgstr "获取自定义上报的 proxy 主机信息" + +#: backend/components/bknodeman/client.py:19 +msgid "节点管理" +msgstr "节点管理" + +#: backend/components/bknodeman/client.py:31 +msgid "插件操作任务" +msgstr "插件操作任务" + +#: backend/components/bknodeman/client.py:35 +msgid "查询任务详情" +msgstr "查询任务详情" + +#: backend/components/bknodeman/client.py:38 +msgid "查询agent状态" +msgstr "查询agent状态" + +#: backend/components/cc/client.py:19 backend/iam_app/handlers/permission.py:97 msgid "配置平台" msgstr "配置平台" -#: backend/components/cc/client.py:27 +#: backend/components/cc/client.py:32 msgid "没有业务信息的主机查询" msgstr "没有业务信息的主机查询" -#: backend/components/cc/client.py:34 +#: backend/components/cc/client.py:35 msgid "查询业务" msgstr "查询业务" -#: backend/components/cc/client.py:41 +#: backend/components/cc/client.py:40 msgid "查询模块" msgstr "查询模块" -#: backend/components/cc/client.py:48 +#: backend/components/cc/client.py:45 msgid "创建集群" msgstr "创建集群" -#: backend/components/cc/client.py:55 +#: backend/components/cc/client.py:50 msgid "查询集群" msgstr "查询集群" -#: backend/components/cc/client.py:62 +#: backend/components/cc/client.py:55 msgid "创建模块" msgstr "创建模块" -#: backend/components/cc/client.py:69 backend/components/cc/client.py:237 +#: backend/components/cc/client.py:60 backend/components/cc/client.py:190 msgid "删除模块" msgstr "删除模块" -#: backend/components/cc/client.py:76 +#: backend/components/cc/client.py:65 msgid "跨业务转移主机" msgstr "跨业务转移主机" -#: backend/components/cc/client.py:83 +#: backend/components/cc/client.py:70 msgid "业务内主机转移模块" msgstr "业务内主机转移模块" -#: backend/components/cc/client.py:87 +#: backend/components/cc/client.py:72 msgid "修改业务" msgstr "修改业务" -#: backend/components/cc/client.py:91 +#: backend/components/cc/client.py:73 msgid "修改主机" msgstr "修改主机" -#: backend/components/cc/client.py:95 +#: backend/components/cc/client.py:75 msgid "批量修改主机" msgstr "批量修改主机" -#: backend/components/cc/client.py:103 +#: backend/components/cc/client.py:80 msgid "创建自定义字段" msgstr "创建自定义字段" -#: backend/components/cc/client.py:111 +#: backend/components/cc/client.py:83 msgid "获取模型属性" msgstr "获取模型属性" -#: backend/components/cc/client.py:119 +#: backend/components/cc/client.py:88 msgid "创建模型属性" msgstr "创建模型属性" -#: backend/components/cc/client.py:127 +#: backend/components/cc/client.py:93 msgid "主机移动到空闲机模块" msgstr "主机移动到空闲机模块" -#: backend/components/cc/client.py:135 +#: backend/components/cc/client.py:98 msgid "主机移动到待回收模块" msgstr "主机移动到待回收模块" -#: backend/components/cc/client.py:143 +#: backend/components/cc/client.py:101 msgid "查询业务实例拓扑" msgstr "查询业务实例拓扑" -#: backend/components/cc/client.py:151 +#: backend/components/cc/client.py:106 msgid "查询业务下的主机" msgstr "查询业务下的主机" -#: backend/components/cc/client.py:159 +#: backend/components/cc/client.py:111 msgid "查询业务下的主机和拓扑信息" msgstr "查询业务下的主机和拓扑信息" -#: backend/components/cc/client.py:166 +#: backend/components/cc/client.py:114 msgid "查询业务的空闲机/故障机/待回收模块" msgstr "查询业务的空闲机/故障机/待回收模块" -#: backend/components/cc/client.py:173 +#: backend/components/cc/client.py:119 msgid "获取主机与拓扑的关系" msgstr "获取主机与拓扑的关系" -#: backend/components/cc/client.py:182 +#: backend/components/cc/client.py:125 msgid "查询云区域" msgstr "查询云区域" -#: backend/components/cc/client.py:189 +#: backend/components/cc/client.py:130 msgid "查询主机及其对应拓扑" msgstr "查询主机及其对应拓扑" -#: backend/components/cc/client.py:197 +#: backend/components/cc/client.py:135 msgid "创建服务实例" msgstr "创建服务实例" -#: backend/components/cc/client.py:205 +#: backend/components/cc/client.py:140 msgid "查询服务实例详细信息" msgstr "查询服务实例详细信息" -#: backend/components/cc/client.py:213 +#: backend/components/cc/client.py:145 msgid "直接通过bk_host_id查询服务实例详细信息" msgstr "直接通过bk_host_id查询服务实例详细信息" -#: backend/components/cc/client.py:221 +#: backend/components/cc/client.py:150 +msgid "获取服务实例详细信息" +msgstr "获取服务实例详细信息" + +#: backend/components/cc/client.py:155 msgid "服务实例添加标签" msgstr "服务实例添加标签" -#: backend/components/cc/client.py:229 +#: backend/components/cc/client.py:160 +msgid "从服务实例移除标签" +msgstr "从服务实例移除标签" + +#: backend/components/cc/client.py:165 msgid "删除服务实例" msgstr "删除服务实例" -#: backend/components/cc/client.py:245 +#: backend/components/cc/client.py:170 +msgid "创建实例进程" +msgstr "创建实例进程" + +#: backend/components/cc/client.py:175 +msgid "删除实例进程" +msgstr "删除实例进程" + +#: backend/components/cc/client.py:180 +msgid "查询实例进程列表" +msgstr "查询实例进程列表" + +#: backend/components/cc/client.py:185 +msgid "更新实例进程" +msgstr "更新实例进程" + +#: backend/components/cc/client.py:195 msgid "根据条件查询业务下的模块" msgstr "根据条件查询业务下的模块" -#: backend/components/cc/client.py:253 +#: backend/components/cc/client.py:200 msgid "根据模块ID查询主机和模块的关系" msgstr "根据模块ID查询主机和模块的关系" -#: backend/components/cc/client.py:261 +#: backend/components/cc/client.py:205 msgid "查询主机业务关系信息" msgstr "查询主机业务关系信息" -#: backend/components/cmsi/client.py:19 +#: backend/components/cc/client.py:210 +msgid "批量查询某业务的模块详情" +msgstr "批量查询某业务的模块详情" + +#: backend/components/celery_service/client.py:19 +msgid "周期任务服务" +msgstr "周期任务服务" + +#: backend/components/celery_service/client.py:27 +msgid "获取API列表" +msgstr "获取API列表" + +#: backend/components/celery_service/client.py:32 +msgid "获取周期任务的注册列表" +msgstr "获取周期任务的注册列表" + +#: backend/components/celery_service/client.py:37 +msgid "查询异步会话" +msgstr "查询异步会话" + +#: backend/components/celery_service/client.py:42 +msgid "结束异步会话" +msgstr "结束异步会话" + +#: backend/components/cmsi/client.py:21 msgid "消息管理" msgstr "消息管理" -#: backend/components/cmsi/client.py:27 +#: backend/components/cmsi/client.py:25 backend/db_monitor/mock_data.py:19 +msgid "短信" +msgstr "短信" + +#: backend/components/cmsi/client.py:26 backend/db_monitor/mock_data.py:17 +msgid "微信" +msgstr "微信" + +#: backend/components/cmsi/client.py:27 backend/db_monitor/mock_data.py:18 +msgid "邮件" +msgstr "邮件" + +#: backend/components/cmsi/client.py:28 backend/db_monitor/mock_data.py:20 +msgid "语音" +msgstr "语音" + +#: backend/components/cmsi/client.py:29 backend/db_monitor/mock_data.py:16 +msgid "企业微信" +msgstr "企业微信" + +#: backend/components/cmsi/client.py:30 +msgid "企业微信机器人" +msgstr "企业微信机器人" + +#: backend/components/cmsi/client.py:32 +msgid "未知" +msgstr "未知" + +#: backend/components/cmsi/client.py:38 msgid "通用消息发送" msgstr "通用消息发送" -#: backend/components/constants.py:20 +#: backend/components/cmsi/client.py:43 +#: backend/db_monitor/views/notice_group.py:129 +msgid "查询通知类型" +msgstr "查询通知类型" + +#: backend/components/constants.py:21 msgid "服务器证书文件" msgstr "服务器证书文件" -#: backend/components/constants.py:21 +#: backend/components/constants.py:22 msgid "服务器私钥" msgstr "服务器私钥" -#: backend/components/constants.py:22 +#: backend/components/constants.py:23 msgid "客户端证书文件" msgstr "客户端证书文件" -#: backend/components/constants.py:23 +#: backend/components/constants.py:24 msgid "客户端私钥" msgstr "客户端私钥" @@ -368,47 +576,47 @@ msgstr "客户端私钥" msgid "名字服务" msgstr "名字服务" -#: backend/components/db_name_service/client.py:27 +#: backend/components/db_name_service/client.py:26 msgid "创建clb并绑定后端主机" msgstr "创建clb并绑定后端主机" -#: backend/components/db_name_service/client.py:34 +#: backend/components/db_name_service/client.py:31 msgid "clb解绑部分后端主机" msgstr "clb解绑部分后端主机" -#: backend/components/db_name_service/client.py:41 +#: backend/components/db_name_service/client.py:36 msgid "clb新增绑定部分后端主机" msgstr "clb新增绑定部分后端主机" -#: backend/components/db_name_service/client.py:48 +#: backend/components/db_name_service/client.py:41 msgid "获取已绑定clb的后端主机私网IP" msgstr "获取已绑定clb的后端主机私网IP" -#: backend/components/db_name_service/client.py:55 +#: backend/components/db_name_service/client.py:46 msgid "通过IP查询该IP是否已经被clb绑定了" msgstr "通过IP查询该IP是否已经被clb绑定了" -#: backend/components/db_name_service/client.py:62 +#: backend/components/db_name_service/client.py:51 msgid "解绑后端主机并删除clb" msgstr "解绑后端主机并删除clb" -#: backend/components/db_name_service/client.py:69 +#: backend/components/db_name_service/client.py:56 msgid "创建北极星服务和别名并绑定后端主机" msgstr "创建北极星服务和别名并绑定后端主机" -#: backend/components/db_name_service/client.py:76 +#: backend/components/db_name_service/client.py:61 msgid "北极星解绑部分后端主机" msgstr "北极星解绑部分后端主机" -#: backend/components/db_name_service/client.py:83 +#: backend/components/db_name_service/client.py:66 msgid "北极星新增绑定部分后端主机" msgstr "北极星新增绑定部分后端主机" -#: backend/components/db_name_service/client.py:90 +#: backend/components/db_name_service/client.py:71 msgid "获取北极星已绑定的后端主机信息" msgstr "获取北极星已绑定的后端主机信息" -#: backend/components/db_name_service/client.py:97 +#: backend/components/db_name_service/client.py:76 msgid "解绑后端主机并删除别名和北极星服务" msgstr "解绑后端主机并删除别名和北极星服务" @@ -416,289 +624,369 @@ msgstr "解绑后端主机并删除别名和北极星服务" msgid "DB 远程服务" msgstr "DB 远程服务" -#: backend/components/db_remote_service/client.py:37 +#: backend/components/db_remote_service/client.py:39 msgid "DB 远程执行" msgstr "DB 远程执行" -#: backend/components/db_remote_service/client.py:46 +#: backend/components/db_remote_service/client.py:49 msgid "DB PROXY远程执行" msgstr "DB PROXY远程执行" -#: backend/components/db_remote_service/client.py:55 +#: backend/components/db_remote_service/client.py:59 msgid "redis 远程执行" msgstr "redis 远程执行" -#: backend/components/db_remote_service/client.py:64 +#: backend/components/db_remote_service/client.py:68 msgid "twemproxy 远程执行" msgstr "twemproxy 远程执行" +#: backend/components/db_remote_service/client.py:77 +msgid "sqlserver 远程执行" +msgstr "sqlserver 远程执行" + +#: backend/components/db_remote_service/client.py:86 +msgid "webconsole 远程执行(只读账号)" +msgstr "webconsole 远程执行(只读账号)" + #: backend/components/dbconfig/client.py:20 msgid "DB配置系统" msgstr "DB配置系统" -#: backend/components/dbconfig/client.py:28 +#: backend/components/dbconfig/client.py:27 msgid "新增平台级配置文件" msgstr "新增平台级配置文件" -#: backend/components/dbconfig/client.py:35 +#: backend/components/dbconfig/client.py:32 msgid "查询配置文件列表" msgstr "查询配置文件列表" -#: backend/components/dbconfig/client.py:42 +#: backend/components/dbconfig/client.py:37 msgid "编辑平台级配置" msgstr "编辑平台级配置" -#: backend/components/dbconfig/client.py:49 +#: backend/components/dbconfig/client.py:42 msgid "查询公共配置项列表" msgstr "查询公共配置项列表" -#: backend/components/dbconfig/client.py:56 +#: backend/components/dbconfig/client.py:47 msgid "查询定义的配置名列表" msgstr "查询定义的配置名列表" -#: backend/components/dbconfig/client.py:63 +#: backend/components/dbconfig/client.py:52 msgid "查询配置项列表" msgstr "查询配置项列表" -#: backend/components/dbconfig/client.py:72 +#: backend/components/dbconfig/client.py:59 msgid "保存不可变配置(如字符集等)" msgstr "保存不可变配置(如字符集等)" -#: backend/components/dbconfig/client.py:79 +#: backend/components/dbconfig/client.py:64 msgid "编辑发布层级(业务、集群、模块)配置" msgstr "编辑发布层级(业务、集群、模块)配置" -#: backend/components/dbconfig/client.py:86 +#: backend/components/dbconfig/client.py:69 msgid "批量获取多个对象的某一配置项" msgstr "批量获取多个对象的某一配置项" -#: backend/components/dbconfig/client.py:93 +#: backend/components/dbconfig/client.py:74 msgid "查询历史配置版本名列表" msgstr "查询历史配置版本名列表" -#: backend/components/dbconfig/client.py:100 +#: backend/components/dbconfig/client.py:79 msgid "查询版本详细信息" msgstr "查询版本详细信息" -#: backend/components/dbconfig/client.py:107 +#: backend/components/dbconfig/client.py:84 msgid "查询实例配置文件模版" msgstr "查询实例配置文件模版" -#: backend/components/dbconfig/constants.py:20 +#: backend/components/dbconfig/constants.py:21 msgid "平台层级" msgstr "平台层级" -#: backend/components/dbconfig/constants.py:21 +#: backend/components/dbconfig/constants.py:22 msgid "业务层级" msgstr "业务层级" -#: backend/components/dbconfig/constants.py:22 +#: backend/components/dbconfig/constants.py:23 msgid "模块层级" msgstr "模块层级" -#: backend/components/dbconfig/constants.py:23 +#: backend/components/dbconfig/constants.py:24 msgid "集群层级" msgstr "集群层级" -#: backend/components/dbconfig/constants.py:24 +#: backend/components/dbconfig/constants.py:25 msgid "实例层级" msgstr "实例层级" -#: backend/components/dbconfig/constants.py:30 +#: backend/components/dbconfig/constants.py:31 msgid "部署配置" msgstr "部署配置" -#: backend/components/dbconfig/constants.py:31 +#: backend/components/dbconfig/constants.py:32 +#: backend/iam_app/dataclass/actions.py:208 +#: backend/iam_app/dataclass/actions.py:220 +#: backend/iam_app/dataclass/actions.py:232 +#: backend/iam_app/dataclass/actions.py:244 +#: backend/iam_app/dataclass/actions.py:256 +#: backend/iam_app/dataclass/actions.py:1718 msgid "数据库配置" msgstr "数据库配置" -#: backend/components/dbconfig/constants.py:32 +#: backend/components/dbconfig/constants.py:33 msgid "备份配置" msgstr "备份配置" -#: backend/components/dbconfig/constants.py:33 +#: backend/components/dbconfig/constants.py:34 msgid "Proxy配置" msgstr "Proxy配置" -#: backend/components/dbconfig/constants.py:39 +#: backend/components/dbconfig/constants.py:40 msgid "新增" msgstr "新增" -#: backend/components/dbconfig/constants.py:40 -#: backend/db_services/mysql/permission/constants.py:24 +#: backend/components/dbconfig/constants.py:41 +#: backend/db_services/dbpermission/constants.py:34 msgid "更新" msgstr "更新" -#: backend/components/dbconfig/constants.py:41 -#: backend/db_services/mysql/permission/constants.py:25 +#: backend/components/dbconfig/constants.py:42 +#: backend/db_services/dbpermission/constants.py:35 backend/flow/consts.py:1368 msgid "删除" msgstr "删除" -#: backend/components/dbconfig/constants.py:47 +#: backend/components/dbconfig/constants.py:48 msgid "仅保存" msgstr "仅保存" -#: backend/components/dbconfig/constants.py:48 +#: backend/components/dbconfig/constants.py:49 msgid "生成并保存" msgstr "生成并保存" -#: backend/components/dbconfig/constants.py:49 +#: backend/components/dbconfig/constants.py:50 msgid "保存并发布" msgstr "保存并发布" -#: backend/components/dbconfig/constants.py:50 +#: backend/components/dbconfig/constants.py:51 msgid "生成并发布" msgstr "生成并发布" -#: backend/components/dbconfig/constants.py:56 +#: backend/components/dbconfig/constants.py:57 msgid "列表" msgstr "列表" -#: backend/components/dbconfig/constants.py:57 +#: backend/components/dbconfig/constants.py:58 msgid "字典" msgstr "字典" -#: backend/components/dbconfig/constants.py:58 +#: backend/components/dbconfig/constants.py:59 msgid "分级字典" msgstr "分级字典" +#: backend/components/dbconsole/client.py:21 +msgid "DBConsole" +msgstr "DBConsole" + #: backend/components/dbresource/client.py:19 msgid "资源池 服务" msgstr "资源池 服务" -#: backend/components/dbresource/client.py:27 -#: backend/db_services/dbresource/views/resource.py:122 +#: backend/components/dbresource/client.py:26 +#: backend/db_services/dbresource/views/resource.py:182 msgid "资源导入" msgstr "资源导入" -#: backend/components/dbresource/client.py:34 -#: backend/db_services/dbresource/views/resource.py:65 +#: backend/components/dbresource/client.py:31 +#: backend/db_services/dbresource/views/resource.py:94 msgid "资源池资源列表" msgstr "资源池资源列表" +#: backend/components/dbresource/client.py:36 +msgid "资源池全部资源列表" +msgstr "资源池全部资源列表" + #: backend/components/dbresource/client.py:41 msgid "资源池资源申请" msgstr "资源池资源申请" -#: backend/components/dbresource/client.py:48 -#: backend/db_services/dbresource/views/resource.py:192 +#: backend/components/dbresource/client.py:46 +#: backend/db_services/dbresource/views/resource.py:256 msgid "获取挂载点" msgstr "获取挂载点" -#: backend/components/dbresource/client.py:55 -#: backend/db_services/dbresource/views/resource.py:200 +#: backend/components/dbresource/client.py:51 +#: backend/db_services/dbresource/views/resource.py:265 msgid "获取磁盘类型" msgstr "获取磁盘类型" -#: backend/components/dbresource/client.py:62 -#: backend/db_services/dbresource/views/resource.py:208 +#: backend/components/dbresource/client.py:56 +#: backend/db_services/dbresource/views/resource.py:282 msgid "根据逻辑城市查询园区" msgstr "根据逻辑城市查询园区" -#: backend/components/dbresource/client.py:69 +#: backend/components/dbresource/client.py:61 msgid "资源申请预占用" msgstr "资源申请预占用" -#: backend/components/dbresource/client.py:76 +#: backend/components/dbresource/client.py:66 msgid "资源申请确认" msgstr "资源申请确认" -#: backend/components/dbresource/client.py:83 -#: backend/db_services/dbresource/views/resource.py:248 +#: backend/components/dbresource/client.py:71 +#: backend/db_services/dbresource/views/resource.py:322 msgid "资源删除" msgstr "资源删除" -#: backend/components/dbresource/client.py:90 -#: backend/db_services/dbresource/views/resource.py:258 +#: backend/components/dbresource/client.py:76 +#: backend/db_services/dbresource/views/resource.py:347 msgid "资源更新" msgstr "资源更新" -#: backend/components/dbresource/client.py:97 +#: backend/components/dbresource/client.py:81 +msgid "资源批量更新" +msgstr "资源批量更新" + +#: backend/components/dbresource/client.py:86 msgid "获取机型List" msgstr "获取机型List" -#: backend/components/dbresource/client.py:104 +#: backend/components/dbresource/client.py:91 msgid "获取操作记录" msgstr "获取操作记录" -#: backend/components/gcs_dns/client.py:19 -msgid "GCSDNS域名管理" -msgstr "GCSDNS域名管理" +#: backend/components/dbresource/client.py:96 +msgid "创建导入操作记录" +msgstr "创建导入操作记录" + +#: backend/components/dbresource/client.py:101 +msgid "预申请获取资源数量" +msgstr "预申请获取资源数量" -#: backend/components/gcs_dns/client.py:27 +#: backend/components/dns/client.py:19 +msgid "DNS域名管理" +msgstr "DNS域名管理" + +#: backend/components/dns/client.py:26 msgid "获取域名映射关系" msgstr "获取域名映射关系" -#: backend/components/gcs_dns/client.py:34 +#: backend/components/dns/client.py:31 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:56 msgid "删除域名映射" msgstr "删除域名映射" -#: backend/components/gcs_dns/client.py:41 +#: backend/components/dns/client.py:36 msgid "更新域名映射关系" msgstr "更新域名映射关系" -#: backend/components/gcs_dns/client.py:48 +#: backend/components/dns/client.py:41 msgid "新增域名映射关系" msgstr "新增域名映射关系" -#: backend/components/gcs_dns/client.py:55 +#: backend/components/dns/client.py:46 msgid "批量更新域名映射关系" msgstr "批量更新域名映射关系" -#: backend/components/gcs_dns/client.py:62 +#: backend/components/dns/client.py:51 msgid "获取所有ip、域名关系" msgstr "获取所有ip、域名关系" +#: backend/components/dns/client.py:56 +msgid "更新域名所属业务关系" +msgstr "更新域名所属业务关系" + +#: backend/components/gcs/client.py:19 backend/components/gcs/client.py:35 +msgid "Gcs平台" +msgstr "Gcs平台" + +#: backend/components/gcs/client.py:24 +msgid "gcs授权接口(mysql和spider)" +msgstr "gcs授权接口(mysql和spider)" + +#: backend/components/gcs/client.py:30 +msgid "查询gcs作业执行状态" +msgstr "查询gcs作业执行状态" + +#: backend/components/gcs/client.py:42 +msgid "直接授权接口" +msgstr "直接授权接口" + #: backend/components/gse/client.py:19 msgid "管控平台" msgstr "管控平台" -#: backend/components/gse/client.py:27 -msgid "Agent在线状态查询" -msgstr "Agent在线状态查询" +#: backend/components/gse/client.py:26 +msgid "Agent在线状态查询 - 1.0" +msgstr "Agent在线状态查询 - 1.0" + +#: backend/components/gse/client.py:32 +msgid "查询Agent状态列表信息 - 2.0" +msgstr "查询Agent状态列表信息 - 2.0" #: backend/components/hadb/client.py:19 msgid "HADB 服务" msgstr "HADB 服务" -#: backend/components/hadb/client.py:27 +#: backend/components/hadb/client.py:26 msgid "上报和查询ha的探测切换日志" msgstr "上报和查询ha的探测切换日志" -#: backend/components/hadb/client.py:34 +#: backend/components/hadb/client.py:31 msgid "上报和查询数据库实例的状态" msgstr "上报和查询数据库实例的状态" -#: backend/components/hadb/client.py:41 +#: backend/components/hadb/client.py:36 msgid "上报和查询ha服务的状态" msgstr "上报和查询ha服务的状态" -#: backend/components/hadb/client.py:48 +#: backend/components/hadb/client.py:41 msgid "查询和上报切换队列" msgstr "查询和上报切换队列" -#: backend/components/hadb/client.py:55 +#: backend/components/hadb/client.py:46 msgid "查询切换详情" msgstr "查询切换详情" +#: backend/components/hadb/client.py:51 +msgid "DBHA切换屏蔽配置" +msgstr "DBHA切换屏蔽配置" + #: backend/components/itsm/client.py:19 msgid "ITSM流程管理" msgstr "ITSM流程管理" -#: backend/components/itsm/client.py:27 backend/ticket/views.py:199 -#: backend/ticket/views.py:201 +#: backend/components/itsm/client.py:26 +#: backend/db_services/redis/autofix/enums.py:38 backend/ticket/views.py:278 +#: backend/ticket/views.py:279 msgid "创建单据" msgstr "创建单据" +#: backend/components/itsm/client.py:31 +msgid "单据状态查询" +msgstr "单据状态查询" + +#: backend/components/itsm/client.py:33 +msgid "处理单据节点" +msgstr "处理单据节点" + #: backend/components/itsm/client.py:34 +msgid "处理单据" +msgstr "处理单据" + +#: backend/components/itsm/client.py:35 +msgid "单据详情查询" +msgstr "单据详情查询" + +#: backend/components/itsm/client.py:39 msgid "审批结果查询" msgstr "审批结果查询" -#: backend/components/itsm/client.py:41 +#: backend/components/itsm/client.py:44 msgid "单据日志查询" msgstr "单据日志查询" -#: backend/components/itsm/client.py:48 +#: backend/components/itsm/client.py:49 msgid "服务目录查询" msgstr "服务目录查询" @@ -706,31 +994,31 @@ msgstr "服务目录查询" msgid "服务列表查询" msgstr "服务列表查询" -#: backend/components/itsm/client.py:58 +#: backend/components/itsm/client.py:55 msgid "创建服务目录" msgstr "创建服务目录" -#: backend/components/itsm/client.py:61 +#: backend/components/itsm/client.py:57 msgid "导入服务" msgstr "导入服务" -#: backend/components/itsm/client.py:64 +#: backend/components/itsm/client.py:58 msgid "更新服务" msgstr "更新服务" -#: backend/components/itsm/constants.py:18 backend/ticket/constants.py:52 +#: backend/components/itsm/constants.py:19 backend/ticket/constants.py:54 msgid "处理中" msgstr "处理中" -#: backend/components/itsm/constants.py:19 +#: backend/components/itsm/constants.py:20 msgid "已结束" msgstr "已结束" -#: backend/components/itsm/constants.py:20 +#: backend/components/itsm/constants.py:21 msgid "已撤单" msgstr "已撤单" -#: backend/components/itsm/constants.py:21 +#: backend/components/itsm/constants.py:22 msgid "被终止" msgstr "被终止" @@ -738,222 +1026,326 @@ msgstr "被终止" msgid "作业平台" msgstr "作业平台" -#: backend/components/job/client.py:27 +#: backend/components/job/client.py:26 msgid "快速执行脚本" msgstr "快速执行脚本" -#: backend/components/job/client.py:34 +#: backend/components/job/client.py:31 msgid "快速分发文件" msgstr "快速分发文件" -#: backend/components/job/client.py:41 +#: backend/components/job/client.py:36 msgid "快速分发配置" msgstr "快速分发配置" -#: backend/components/job/client.py:48 +#: backend/components/job/client.py:41 msgid "查询作业执行状态" msgstr "查询作业执行状态" -#: backend/components/job/client.py:55 +#: backend/components/job/client.py:46 msgid "根据作业实例ID查询作业执行日志" msgstr "根据作业实例ID查询作业执行日志" -#: backend/components/job/client.py:62 +#: backend/components/job/client.py:51 msgid "根据ip列表批量查询作业执行日志" msgstr "根据ip列表批量查询作业执行日志" -#: backend/components/job/client.py:69 +#: backend/components/job/client.py:56 msgid "新建凭据" msgstr "新建凭据" -#: backend/components/job/client.py:76 +#: backend/components/job/client.py:61 msgid "新建文件源" msgstr "新建文件源" +#: backend/components/job/client.py:66 +#: backend/components/mysql_priv_manager/client.py:65 +#: backend/db_services/dbpermission/db_account/views.py:84 +msgid "创建账号" +msgstr "创建账号" + +#: backend/components/job/client.py:71 +#: backend/components/mysql_priv_manager/client.py:80 +msgid "查询账号列表" +msgstr "查询账号列表" + #: backend/components/mysql_backup/client.py:18 -#: backend/components/mysql_backup/client.py:34 +#: backend/components/mysql_backup/client.py:30 msgid "备份文件下载" msgstr "备份文件下载" -#: backend/components/mysql_backup/client.py:26 +#: backend/components/mysql_backup/client.py:25 msgid "获取备份" msgstr "获取备份" -#: backend/components/mysql_backup/client.py:42 +#: backend/components/mysql_backup/client.py:36 backend/ticket/views.py:266 msgid "查询单据状态" msgstr "查询单据状态" +#: backend/components/mysql_backup/client.py:41 +msgid "backup_client下载,同步任务" +msgstr "backup_client下载,同步任务" + #: backend/components/mysql_partition/client.py:18 -#: backend/db_services/partition/constants.py:13 +#: backend/db_services/partition/constants.py:15 +#: backend/iam_app/dataclass/actions.py:451 +#: backend/iam_app/dataclass/actions.py:463 +#: backend/iam_app/dataclass/actions.py:475 +#: backend/iam_app/dataclass/actions.py:487 +#: backend/iam_app/dataclass/actions.py:830 +#: backend/iam_app/dataclass/actions.py:842 +#: backend/iam_app/dataclass/actions.py:854 +#: backend/iam_app/dataclass/actions.py:866 backend/ticket/constants.py:188 +#: backend/ticket/constants.py:211 msgid "分区管理" msgstr "分区管理" -#: backend/components/mysql_partition/client.py:26 +#: backend/components/mysql_partition/client.py:25 msgid "获取分区语句" msgstr "获取分区语句" -#: backend/components/mysql_partition/client.py:34 +#: backend/components/mysql_partition/client.py:30 msgid "添加分区配置" msgstr "添加分区配置" -#: backend/components/mysql_partition/client.py:42 +#: backend/components/mysql_partition/client.py:35 msgid "删除分区配置" msgstr "删除分区配置" -#: backend/components/mysql_partition/client.py:50 +#: backend/components/mysql_partition/client.py:40 +msgid "cluster_del_conf" +msgstr "cluster_del_conf" + +#: backend/components/mysql_partition/client.py:45 msgid "修改分区配置" msgstr "修改分区配置" -#: backend/components/mysql_partition/client.py:58 +#: backend/components/mysql_partition/client.py:50 msgid "查询分区配置" msgstr "查询分区配置" -#: backend/components/mysql_partition/client.py:66 +#: backend/components/mysql_partition/client.py:55 msgid "启用分区" msgstr "启用分区" -#: backend/components/mysql_partition/client.py:74 +#: backend/components/mysql_partition/client.py:60 +#: backend/components/mysql_partition/client.py:65 +#: backend/components/mysql_partition/client.py:70 msgid "禁用分区" msgstr "禁用分区" -#: backend/components/mysql_partition/client.py:82 +#: backend/components/mysql_partition/client.py:75 msgid "查询分区日志" msgstr "查询分区日志" -#: backend/components/mysql_priv_manager/client.py:20 -msgid "MySQL权限管理" -msgstr "MySQL权限管理" +#: backend/components/mysql_partition/client.py:80 +msgid "创建分区操作日志" +msgstr "创建分区操作日志" + +#: backend/components/mysql_partition/client.py:85 +msgid "获取巡检日志" +msgstr "获取巡检日志" + +#: backend/components/mysql_priv_manager/client.py:19 +msgid "DB权限管理" +msgstr "DB权限管理" #: backend/components/mysql_priv_manager/client.py:29 msgid "帐号规则详情" msgstr "帐号规则详情" -#: backend/components/mysql_priv_manager/client.py:36 +#: backend/components/mysql_priv_manager/client.py:34 msgid "帐号规则清单" msgstr "帐号规则清单" -#: backend/components/mysql_priv_manager/client.py:43 +#: backend/components/mysql_priv_manager/client.py:39 +msgid "添加帐号规则前置检查" +msgstr "添加帐号规则前置检查" + +#: backend/components/mysql_priv_manager/client.py:44 msgid "添加帐号规则" msgstr "添加帐号规则" -#: backend/components/mysql_priv_manager/client.py:50 +#: backend/components/mysql_priv_manager/client.py:49 msgid "删除帐号规则" msgstr "删除帐号规则" -#: backend/components/mysql_priv_manager/client.py:57 +#: backend/components/mysql_priv_manager/client.py:54 msgid "修改帐号规则" msgstr "修改帐号规则" -#: backend/components/mysql_priv_manager/client.py:65 +#: backend/components/mysql_priv_manager/client.py:60 msgid "请求公钥" msgstr "请求公钥" -#: backend/components/mysql_priv_manager/client.py:72 -#: backend/db_services/mysql/permission/db_account/views.py:61 -msgid "创建账号" -msgstr "创建账号" - -#: backend/components/mysql_priv_manager/client.py:79 -#: backend/db_services/mysql/permission/db_account/views.py:68 +#: backend/components/mysql_priv_manager/client.py:70 +#: backend/db_services/dbpermission/db_account/views.py:96 msgid "删除账号" msgstr "删除账号" -#: backend/components/mysql_priv_manager/client.py:86 -#: backend/db_services/mysql/permission/db_account/views.py:75 -msgid "修改密码" -msgstr "修改密码" +#: backend/components/mysql_priv_manager/client.py:75 +msgid "修改账号的密码" +msgstr "修改账号的密码" -#: backend/components/mysql_priv_manager/client.py:95 +#: backend/components/mysql_priv_manager/client.py:87 msgid "前置检查授权数据" msgstr "前置检查授权数据" -#: backend/components/mysql_priv_manager/client.py:102 +#: backend/components/mysql_priv_manager/client.py:92 msgid "添加授权" msgstr "添加授权" -#: backend/components/mysql_priv_manager/client.py:109 +#: backend/components/mysql_priv_manager/client.py:97 msgid "查询现网授权记录" msgstr "查询现网授权记录" -#: backend/components/mysql_priv_manager/client.py:118 +#: backend/components/mysql_priv_manager/client.py:104 msgid "实例间权限克隆" msgstr "实例间权限克隆" -#: backend/components/mysql_priv_manager/client.py:125 +#: backend/components/mysql_priv_manager/client.py:109 msgid "实例间权限克隆前置检查" msgstr "实例间权限克隆前置检查" -#: backend/components/mysql_priv_manager/client.py:132 +#: backend/components/mysql_priv_manager/client.py:114 msgid "客户端权限克隆" msgstr "客户端权限克隆" -#: backend/components/mysql_priv_manager/client.py:139 +#: backend/components/mysql_priv_manager/client.py:119 msgid "客户端权限克隆前置检查" msgstr "客户端权限克隆前置检查" -#: backend/components/mysql_priv_manager/client.py:146 +#: backend/components/mysql_priv_manager/client.py:124 msgid "mysql实例创建临时账号(切换专属接口)" msgstr "mysql实例创建临时账号(切换专属接口)" +#: backend/components/mysql_priv_manager/client.py:129 +msgid "新增或者修改实例中管理用户的密码" +msgstr "新增或者修改实例中管理用户的密码" + +#: backend/components/mysql_priv_manager/client.py:134 +msgid "获取密码" +msgstr "获取密码" + +#: backend/components/mysql_priv_manager/client.py:139 +msgid "新增或者修改密码" +msgstr "新增或者修改密码" + +#: backend/components/mysql_priv_manager/client.py:144 +msgid "生成随机字符串" +msgstr "生成随机字符串" + +#: backend/components/mysql_priv_manager/client.py:149 +msgid "获取安全规则" +msgstr "获取安全规则" + +#: backend/components/mysql_priv_manager/client.py:154 +msgid "添加安全规则" +msgstr "添加安全规则" + +#: backend/components/mysql_priv_manager/client.py:159 +msgid "修改安全规则" +msgstr "修改安全规则" + +#: backend/components/mysql_priv_manager/client.py:164 +msgid "删除安全规则" +msgstr "删除安全规则" + +#: backend/components/mysql_priv_manager/client.py:169 +msgid "获取不参与随机化的业务" +msgstr "获取不参与随机化的业务" + +#: backend/components/mysql_priv_manager/client.py:174 +msgid "修改不参与随机化的业务" +msgstr "修改不参与随机化的业务" + +#: backend/components/mysql_priv_manager/client.py:179 +msgid "校验密码强度" +msgstr "校验密码强度" + +#: backend/components/mysql_priv_manager/client.py:184 +msgid "获取mysql ADMIN的密码——mysql专用" +msgstr "获取mysql ADMIN的密码——mysql专用" + +#: backend/components/mysql_priv_manager/client.py:189 +msgid "删除实例密码记录" +msgstr "删除实例密码记录" + +#: backend/components/mysql_priv_manager/client.py:194 +msgid "查询账号和密码信息" +msgstr "查询账号和密码信息" + +#: backend/components/mysql_priv_manager/client.py:199 +msgid "从某个业务克隆账号和账号规则到其他业务" +msgstr "从某个业务克隆账号和账号规则到其他业务" + #: backend/components/proxy_api.py:35 msgid "ProxyApi 必须传入 bk_cloud_id 参数" msgstr "ProxyApi 必须传入 bk_cloud_id 参数" -#: backend/components/sops/client.py:24 +#: backend/components/proxy_api.py:68 +msgid "必须在请求体中传入 url 参数" +msgstr "必须在请求体中传入 url 参数" + +#: backend/components/scr/client.py:19 +msgid "Scr平台" +msgstr "Scr平台" + +#: backend/components/scr/client.py:27 +msgid "scr平台通用查询接口)" +msgstr "scr平台通用查询接口)" + +#: backend/components/sops/client.py:20 msgid "标准运维" msgstr "标准运维" -#: backend/components/sops/client.py:33 +#: backend/components/sops/client.py:28 msgid "通过业务流程模版创建任务" msgstr "通过业务流程模版创建任务" -#: backend/components/sops/client.py:40 +#: backend/components/sops/client.py:33 msgid "启动任务" msgstr "启动任务" -#: backend/components/sops/client.py:47 +#: backend/components/sops/client.py:38 msgid "查询任务状态" msgstr "查询任务状态" -#: backend/components/sops/client.py:54 -msgid "查询任务详情" -msgstr "查询任务详情" - -#: backend/components/sops/client.py:61 -msgid "查询任务Node详情" -msgstr "查询任务Node详情" +#: backend/components/sops/client.py:43 +msgid "查询任务节点执行详情" +msgstr "查询任务节点执行详情" -#: backend/components/sql_import/client.py:20 -msgid "SQL语句导入" -msgstr "SQL语句导入" +#: backend/components/sql_import/client.py:19 +msgid "SQL模拟执行" +msgstr "SQL模拟执行" -#: backend/components/sql_import/client.py:28 -#: backend/db_services/mysql/sql_import/views.py:67 +#: backend/components/sql_import/client.py:26 +#: backend/db_services/mysql/sql_import/views.py:77 msgid "sql语法检查" msgstr "sql语法检查" -#: backend/components/sql_import/client.py:34 -msgid "SQL模拟执行" -msgstr "SQL模拟执行" - -#: backend/components/sql_import/client.py:42 -#: backend/components/sql_import/client.py:58 +#: backend/components/sql_import/client.py:31 +#: backend/components/sql_import/client.py:41 msgid "容器化SQL模拟执行" msgstr "容器化SQL模拟执行" -#: backend/components/sql_import/client.py:50 +#: backend/components/sql_import/client.py:36 msgid "查询模拟执行任务状态也" msgstr "查询模拟执行任务状态也" +#: backend/components/sql_import/client.py:46 +msgid "查询语义执行结果" +msgstr "查询语义执行结果" + #: backend/components/usermanage/client.py:19 msgid "用户管理模块" msgstr "用户管理模块" -#: backend/components/usermanage/client.py:27 +#: backend/components/usermanage/client.py:26 msgid "获取所有用户" msgstr "获取所有用户" -#: backend/components/usermanage/client.py:35 +#: backend/components/usermanage/client.py:32 msgid "获取单个用户" msgstr "获取单个用户" @@ -961,188 +1353,530 @@ msgstr "获取单个用户" msgid "接口返回数据为空,请检查接口数据是否正常" msgstr "接口返回数据为空,请检查接口数据是否正常" -#: backend/configuration/apps.py:30 +#: backend/configuration/apps.py:32 backend/dbm_init/apps.py:26 msgid "初始化配置异常,错误信息:{}" msgstr "初始化配置异常,错误信息:{}" -#: backend/configuration/constants.py:21 -#: backend/db_services/mysql/permission/constants.py:47 -#: backend/flow/consts.py:246 +#: backend/configuration/constants.py:30 +msgid "默认密码策略" +msgstr "默认密码策略" + +#: backend/configuration/constants.py:31 +msgid "redis密码策略" +msgstr "redis密码策略" + +#: backend/configuration/constants.py:39 backend/flow/consts.py:1064 +msgid "tdbctl" +msgstr "tdbctl" + +#: backend/configuration/constants.py:40 +#: backend/db_meta/enums/machine_type.py:17 backend/flow/consts.py:354 +#: backend/flow/consts.py:1063 +msgid "spider" +msgstr "spider" + +#: backend/configuration/constants.py:41 +#: backend/db_meta/enums/access_layer.py:18 backend/ticket/constants.py:23 +msgid "storage" +msgstr "storage" + +#: backend/configuration/constants.py:50 +msgid "同城同subzone跨交换机跨机架" +msgstr "同城同subzone跨交换机跨机架" + +#: backend/configuration/constants.py:51 +msgid "同城同subzone" +msgstr "同城同subzone" + +#: backend/configuration/constants.py:52 +msgid "CROS_SUBZONE" +msgstr "CROS_SUBZONE" + +#: backend/configuration/constants.py:53 +msgid "跨机架" +msgstr "跨机架" + +#: backend/configuration/constants.py:54 +msgid "NONE" +msgstr "NONE" + +#: backend/configuration/constants.py:55 +msgid "每个subzone尽量均匀分布" +msgstr "每个subzone尽量均匀分布" + +#: backend/configuration/constants.py:59 +#: backend/db_services/dbpermission/constants.py:97 +#: backend/db_services/mysql/permission/constants.py:20 +#: backend/flow/consts.py:333 backend/iam_app/dataclass/actions.py:267 +#: backend/iam_app/dataclass/actions.py:279 +#: backend/iam_app/dataclass/actions.py:319 +#: backend/iam_app/dataclass/actions.py:335 +#: backend/iam_app/dataclass/actions.py:346 +#: backend/iam_app/dataclass/actions.py:358 +#: backend/iam_app/dataclass/actions.py:370 +#: backend/iam_app/dataclass/actions.py:382 +#: backend/iam_app/dataclass/actions.py:394 +#: backend/iam_app/dataclass/actions.py:406 +#: backend/iam_app/dataclass/actions.py:418 +#: backend/iam_app/dataclass/actions.py:430 +#: backend/iam_app/dataclass/actions.py:450 +#: backend/iam_app/dataclass/actions.py:462 +#: backend/iam_app/dataclass/actions.py:474 +#: backend/iam_app/dataclass/actions.py:486 +#: backend/iam_app/dataclass/actions.py:498 +#: backend/iam_app/dataclass/actions.py:510 +#: backend/iam_app/dataclass/actions.py:522 +#: backend/iam_app/dataclass/actions.py:534 +#: backend/iam_app/dataclass/actions.py:546 +#: backend/iam_app/dataclass/actions.py:558 +#: backend/iam_app/dataclass/actions.py:570 +#: backend/iam_app/dataclass/actions.py:582 +#: backend/iam_app/dataclass/actions.py:594 +#: backend/iam_app/dataclass/actions.py:606 +#: backend/iam_app/dataclass/actions.py:618 msgid "MySQL" msgstr "MySQL" -#: backend/configuration/constants.py:22 -msgid "TendbCluster" -msgstr "TendbCluster" - -#: backend/configuration/constants.py:23 +#: backend/configuration/constants.py:60 +#: backend/iam_app/dataclass/actions.py:630 +#: backend/iam_app/dataclass/actions.py:662 +#: backend/iam_app/dataclass/actions.py:678 +#: backend/iam_app/dataclass/actions.py:689 +#: backend/iam_app/dataclass/actions.py:701 +#: backend/iam_app/dataclass/actions.py:713 +#: backend/iam_app/dataclass/actions.py:725 +#: backend/iam_app/dataclass/actions.py:737 +#: backend/iam_app/dataclass/actions.py:747 +#: backend/iam_app/dataclass/actions.py:757 +#: backend/iam_app/dataclass/actions.py:769 +#: backend/iam_app/dataclass/actions.py:781 +#: backend/iam_app/dataclass/actions.py:793 +#: backend/iam_app/dataclass/actions.py:805 +#: backend/iam_app/dataclass/actions.py:817 +#: backend/iam_app/dataclass/actions.py:829 +#: backend/iam_app/dataclass/actions.py:841 +#: backend/iam_app/dataclass/actions.py:853 +#: backend/iam_app/dataclass/actions.py:865 +#: backend/iam_app/dataclass/actions.py:886 +#: backend/iam_app/dataclass/actions.py:899 +msgid "TenDBCluster" +msgstr "TenDBCluster" + +#: backend/configuration/constants.py:61 +#: backend/db_meta/enums/cluster_type.py:26 +#: backend/iam_app/dataclass/actions.py:911 +#: backend/iam_app/dataclass/actions.py:927 +#: backend/iam_app/dataclass/actions.py:943 +#: backend/iam_app/dataclass/actions.py:964 msgid "Redis" msgstr "Redis" -#: backend/configuration/constants.py:24 backend/flow/consts.py:130 +#: backend/configuration/constants.py:62 +#: backend/db_services/dbpermission/constants.py:99 +#: backend/iam_app/dataclass/actions.py:1281 +#: backend/iam_app/dataclass/actions.py:1293 +#: backend/iam_app/dataclass/actions.py:1305 +#: backend/iam_app/dataclass/actions.py:1316 +#: backend/iam_app/dataclass/actions.py:1327 +#: backend/iam_app/dataclass/actions.py:1339 +#: backend/iam_app/dataclass/actions.py:1351 +#: backend/iam_app/dataclass/actions.py:1363 +#: backend/iam_app/dataclass/actions.py:1375 +msgid "MongoDB" +msgstr "MongoDB" + +#: backend/configuration/constants.py:63 backend/flow/consts.py:197 +#: backend/iam_app/dataclass/actions.py:1104 +#: backend/iam_app/dataclass/actions.py:1116 +#: backend/iam_app/dataclass/actions.py:1136 msgid "Kafka" msgstr "Kafka" -#: backend/configuration/constants.py:25 +#: backend/configuration/constants.py:64 +#: backend/iam_app/dataclass/actions.py:1156 +#: backend/iam_app/dataclass/actions.py:1168 +#: backend/iam_app/dataclass/actions.py:1180 msgid "HDFS" msgstr "HDFS" -#: backend/configuration/constants.py:26 +#: backend/configuration/constants.py:65 msgid "ElasticSearch" msgstr "ElasticSearch" -#: backend/configuration/constants.py:27 backend/flow/consts.py:132 +#: backend/configuration/constants.py:66 backend/flow/consts.py:199 +#: backend/iam_app/dataclass/actions.py:1200 +#: backend/iam_app/dataclass/actions.py:1212 +#: backend/iam_app/dataclass/actions.py:1224 msgid "Pulsar" msgstr "Pulsar" -#: backend/configuration/constants.py:28 +#: backend/configuration/constants.py:67 msgid "InfluxDB" msgstr "InfluxDB" -#: backend/configuration/constants.py:29 +#: backend/configuration/constants.py:68 +#: backend/db_meta/enums/instance_role.py:81 backend/flow/consts.py:202 +#: backend/iam_app/dataclass/actions.py:1245 +#: backend/iam_app/dataclass/actions.py:1257 +#: backend/iam_app/dataclass/actions.py:1269 msgid "Riak" msgstr "Riak" -#: backend/configuration/constants.py:32 +#: backend/configuration/constants.py:69 +#: backend/db_services/dbpermission/constants.py:100 +#: backend/iam_app/dataclass/actions.py:1386 +#: backend/iam_app/dataclass/actions.py:1398 +#: backend/iam_app/dataclass/actions.py:1409 +#: backend/iam_app/dataclass/actions.py:1420 +#: backend/iam_app/dataclass/actions.py:1431 +#: backend/iam_app/dataclass/actions.py:1443 +#: backend/iam_app/dataclass/actions.py:1455 +#: backend/iam_app/dataclass/actions.py:1467 +#: backend/iam_app/dataclass/actions.py:1479 +#: backend/iam_app/dataclass/actions.py:1491 +msgid "SQLServer" +msgstr "SQLServer" + +#: backend/configuration/constants.py:70 backend/flow/consts.py:204 +#: backend/iam_app/dataclass/actions.py:1068 +#: backend/iam_app/dataclass/actions.py:1080 +#: backend/iam_app/dataclass/actions.py:1092 +msgid "Doris" +msgstr "Doris" + +#: backend/configuration/constants.py:71 backend/flow/consts.py:205 +msgid "Vm" +msgstr "Vm" + +#: backend/configuration/constants.py:74 msgid "Cloud" msgstr "Cloud" -#: backend/configuration/constants.py:81 -msgid "请补充:指定云区域的proxy信息" -msgstr "请补充:指定云区域的proxy信息" +#: backend/configuration/constants.py:77 +#: backend/db_meta/enums/cluster_type.py:24 +#: backend/db_meta/enums/machine_type.py:65 +msgid "TBinlogDumper" +msgstr "TBinlogDumper" #: backend/configuration/constants.py:83 -msgid "请补充:自定义指标-数据ID" -msgstr "请补充:自定义指标-数据ID" +msgid "DBM系统的管理集群拓扑" +msgstr "DBM系统的管理集群拓扑" #: backend/configuration/constants.py:84 -msgid "请补充:自定义指标-Token" -msgstr "请补充:自定义指标-Token" +msgid "DBM_SSL" +msgstr "DBM_SSL" -#: backend/configuration/constants.py:87 -msgid "请补充:自定义事件-数据ID" -msgstr "请补充:自定义事件-数据ID" +#: backend/configuration/constants.py:85 backend/configuration/constants.py:187 +msgid "监控数据源token" +msgstr "监控数据源token" -#: backend/configuration/constants.py:88 -msgid "请补充:自定义事件-Token" -msgstr "请补充:自定义事件-Token" +#: backend/configuration/constants.py:86 +msgid "mysql/redis-监控自定义上报: dataid/token" +msgstr "mysql/redis-监控自定义上报: dataid/token" + +#: backend/configuration/constants.py:87 backend/configuration/constants.py:189 +msgid "业务空闲模块ID" +msgstr "业务空闲模块ID" + +#: backend/configuration/constants.py:89 backend/configuration/constants.py:190 +msgid "独立托管机器的业务列表" +msgstr "独立托管机器的业务列表" + +#: backend/configuration/constants.py:90 backend/configuration/constants.py:191 +msgid "默认的规格参数偏移量" +msgstr "默认的规格参数偏移量" + +#: backend/configuration/constants.py:91 +msgid "机型列表" +msgstr "机型列表" + +#: backend/configuration/constants.py:92 +#: backend/iam_app/dataclass/actions.py:1891 +msgid "轮值通知设置" +msgstr "轮值通知设置" + +#: backend/configuration/constants.py:93 backend/configuration/constants.py:193 +msgid "具备迁移权限的人员名单" +msgstr "具备迁移权限的人员名单" #: backend/configuration/constants.py:94 -msgid "主从高可用-主域名配置" -msgstr "主从高可用-主域名配置" +msgid "全业务通用配置信息" +msgstr "全业务通用配置信息" #: backend/configuration/constants.py:95 -msgid "主从高可用-从域名配置" -msgstr "主从高可用-从域名配置" +msgid "容灾要求(各个环境可能不同,比如SG为空)" +msgstr "容灾要求(各个环境可能不同,比如SG为空)" -#: backend/configuration/constants.py:96 -msgid "单节点-域名配置" -msgstr "单节点-域名配置" +#: backend/configuration/constants.py:96 backend/configuration/constants.py:196 +msgid "系统消息通知方式" +msgstr "系统消息通知方式" -#: backend/configuration/constants.py:97 -msgid "端口默认值-Proxy起始端口" -msgstr "端口默认值-Proxy起始端口" - -#: backend/configuration/constants.py:98 -msgid "端口默认值-MySQL起始端口" -msgstr "端口默认值-MySQL起始端口" +#: backend/configuration/constants.py:97 backend/configuration/constants.py:197 +msgid "补全proxy的集群域名列表" +msgstr "补全proxy的集群域名列表" #: backend/configuration/constants.py:99 -msgid "监控数据源token" -msgstr "监控数据源token" +msgid "DBM的流程服务ID" +msgstr "DBM的流程服务ID" #: backend/configuration/constants.py:100 -msgid "监控数据源上报配置" -msgstr "监控数据源上报配置" +msgid "ITSM审批意见key" +msgstr "ITSM审批意见key" #: backend/configuration/constants.py:101 -msgid "业务空闲模块ID" -msgstr "业务空闲模块ID" +msgid "ITSM备注key" +msgstr "ITSM备注key" + +#: backend/configuration/constants.py:107 +msgid "开区模板的渲染变量" +msgstr "开区模板的渲染变量" + +#: backend/configuration/constants.py:108 +msgid "独立托管机器的数据库类型" +msgstr "独立托管机器的数据库类型" + +#: backend/configuration/constants.py:110 +msgid "是否跳过语义检查" +msgstr "是否跳过语义检查" + +#: backend/configuration/constants.py:141 +msgid "请补充:自定义指标-数据ID" +msgstr "请补充:自定义指标-数据ID" + +#: backend/configuration/constants.py:142 +msgid "请补充:自定义指标-Token" +msgstr "请补充:自定义指标-Token" + +#: backend/configuration/constants.py:145 +msgid "请补充:自定义事件-数据ID" +msgstr "请补充:自定义事件-数据ID" + +#: backend/configuration/constants.py:146 +msgid "请补充:自定义事件-Token" +msgstr "请补充:自定义事件-Token" + +#: backend/configuration/constants.py:188 +msgid "监控数据源上报配置" +msgstr "监控数据源上报配置" + +#: backend/configuration/constants.py:192 +msgid "默认通知配置" +msgstr "默认通知配置" + +#: backend/configuration/constants.py:194 +msgid "默认的全业务配置信息" +msgstr "默认的全业务配置信息" + +#: backend/configuration/constants.py:195 +msgid "环境的容灾要求" +msgstr "环境的容灾要求" + +#: backend/configuration/exceptions.py:23 +#: backend/configuration/exceptions.py:24 +msgid "密码策略相关异常" +msgstr "密码策略相关异常" + +#: backend/configuration/handlers/password.py:98 +msgid "目前暂未支持{}类型的查询" +msgstr "目前暂未支持{}类型的查询" + +#: backend/configuration/handlers/password.py:113 +msgid "请保证查询的实例输入格式合法,格式为[CLOUD_ID:]IP:PORT" +msgstr "请保证查询的实例输入格式合法,格式为[CLOUD_ID:]IP:PORT" + +#: backend/configuration/handlers/password.py:171 +msgid "请保证修改密码的实例属于同一DB组件" +msgstr "请保证修改密码的实例属于同一DB组件" + +#: backend/configuration/handlers/password.py:218 +msgid "{}-{}不存在相应的password角色" +msgstr "{}-{}不存在相应的password角色" #: backend/configuration/models/dba.py:21 #: backend/configuration/models/ip_whitelist.py:25 -#: backend/configuration/serializers.py:41 -#: backend/configuration/serializers.py:50 -#: backend/configuration/serializers.py:76 -#: backend/configuration/serializers.py:92 backend/core/storages/models.py:19 -#: backend/db_event/serializers.py:47 backend/db_event/serializers.py:61 -#: backend/db_meta/models/app.py:36 backend/db_meta/models/group.py:22 -#: backend/db_monitor/serializers.py:21 backend/db_proxy/models.py:127 -#: backend/db_proxy/views/db_meta/serializers.py:95 -#: backend/db_proxy/views/db_meta/serializers.py:105 +#: backend/configuration/models/system.py:123 +#: backend/configuration/serializers.py:47 +#: backend/configuration/serializers.py:57 +#: backend/configuration/serializers.py:69 +#: backend/configuration/serializers.py:78 +#: backend/configuration/serializers.py:96 +#: backend/configuration/serializers.py:197 +#: backend/configuration/serializers.py:213 backend/core/storages/models.py:19 +#: backend/db_dirty/models.py:25 backend/db_event/serializers.py:47 +#: backend/db_event/serializers.py:61 backend/db_meta/models/app.py:26 +#: backend/db_meta/models/group.py:22 backend/db_monitor/serializers.py:31 +#: backend/db_monitor/serializers.py:181 backend/db_monitor/serializers.py:218 +#: backend/db_monitor/views/policy.py:54 backend/db_proxy/models.py:150 +#: backend/db_proxy/views/db_meta/serializers.py:108 +#: backend/db_proxy/views/db_meta/serializers.py:118 +#: backend/db_proxy/views/db_meta/serializers.py:132 #: backend/db_proxy/views/dbconfig/serializers.py:21 -#: backend/db_services/cmdb/serializers.py:18 -#: backend/db_services/cmdb/serializers.py:25 -#: backend/db_services/cmdb/serializers.py:44 +#: backend/db_proxy/views/dumper/serializers.py:30 +#: backend/db_services/bigdata/resources/serializers.py:18 +#: backend/db_services/cmdb/serializers.py:36 +#: backend/db_services/cmdb/serializers.py:43 +#: backend/db_services/cmdb/serializers.py:74 +#: backend/db_services/dbbase/cluster/serializers.py:54 +#: backend/db_services/dbbase/instances/yasg_slz.py:18 +#: backend/db_services/dbbase/serializers.py:29 +#: backend/db_services/dbbase/serializers.py:38 +#: backend/db_services/dbbase/serializers.py:62 +#: backend/db_services/dbbase/serializers.py:78 +#: backend/db_services/dbbase/serializers.py:94 #: backend/db_services/dbconfig/serializers.py:74 #: backend/db_services/dbconfig/serializers.py:86 +#: backend/db_services/dbpermission/db_account/serializers.py:85 +#: backend/db_services/dbpermission/db_account/serializers.py:94 +#: backend/db_services/dbresource/serializers.py:375 #: backend/db_services/ipchooser/serializers/topo_sers.py:70 -#: backend/db_services/mysql/cluster/serializers.py:60 -#: backend/db_services/mysql/permission/db_account/serializers.py:84 -#: backend/db_services/mysql/permission/db_account/serializers.py:94 -#: backend/db_services/partition/serializers.py:20 -#: backend/db_services/partition/serializers.py:31 -#: backend/db_services/partition/serializers.py:37 -#: backend/db_services/partition/serializers.py:96 backend/flow/models.py:19 -#: backend/ticket/builders/common/base.py:32 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:65 -#: backend/ticket/models/ticket.py:86 backend/ticket/serializers.py:197 +#: backend/db_services/meta_import/serializers.py:71 +#: backend/db_services/meta_import/serializers.py:79 +#: backend/db_services/meta_import/serializers.py:127 +#: backend/db_services/mysql/cluster/serializers.py:31 +#: backend/db_services/mysql/open_area/filters.py:20 +#: backend/db_services/mysql/open_area/models.py:21 +#: backend/db_services/partition/serializers.py:25 +#: backend/db_services/partition/serializers.py:98 +#: backend/db_services/plugin/bf/serializers.py:18 +#: backend/db_services/plugin/mysql/authorize/serializers.py:17 +#: backend/db_services/redis/autofix/models.py:35 +#: backend/db_services/redis/autofix/models.py:51 +#: backend/db_services/redis/autofix/models.py:80 backend/flow/models.py:20 +#: backend/iam_app/serializers.py:31 backend/ticket/builders/common/base.py:103 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:27 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:32 +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:28 +#: backend/ticket/builders/mysql/mysql_openarea.py:37 +#: backend/ticket/builders/mysql/mysql_openarea.py:39 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:24 +#: backend/ticket/builders/spider/metadata_import.py:32 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:28 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:24 +#: backend/ticket/builders/tendbsingle/metadata_import.py:31 +#: backend/ticket/builders/tendbsingle/standardize.py:26 +#: backend/ticket/models/ticket.py:86 backend/ticket/models/ticket.py:235 +#: backend/ticket/serializers.py:250 backend/ticket/serializers.py:290 +#: backend/ticket/serializers.py:301 msgid "业务ID" msgstr "业务ID" #: backend/configuration/models/dba.py:22 -#: backend/configuration/serializers.py:45 backend/db_monitor/models.py:31 +#: backend/configuration/serializers.py:73 +#: backend/db_monitor/models/alarm.py:60 backend/db_monitor/models/alarm.py:245 +#: backend/db_monitor/serializers.py:217 backend/db_package/serializers.py:51 +#: backend/db_services/quick_search/serializers.py:23 msgid "数据库类型" msgstr "数据库类型" #: backend/configuration/models/dba.py:23 -#: backend/configuration/serializers.py:46 backend/db_monitor/models.py:32 -#: backend/db_services/user/views.py:26 +#: backend/configuration/serializers.py:74 backend/db_services/user/views.py:28 msgid "人员列表" msgstr "人员列表" #: backend/configuration/models/dba.py:26 -#: backend/configuration/models/dba.py:27 -msgid "DBA人员设置" -msgstr "DBA人员设置" +msgid "DBA人员设置(DBAdministrator)" +msgstr "DBA人员设置(DBAdministrator)" + +#: backend/configuration/models/function_controller.py:20 +msgid "大数据" +msgstr "大数据" + +#: backend/configuration/models/function_controller.py:21 +#: backend/iam_app/dataclass/actions.py:69 backend/ticket/constants.py:119 +msgid "工具箱" +msgstr "工具箱" + +#: backend/configuration/models/function_controller.py:22 +msgid "TenDBCluster 工具箱" +msgstr "TenDBCluster 工具箱" + +#: backend/configuration/models/function_controller.py:23 +msgid "Sqlserver 工具箱" +msgstr "Sqlserver 工具箱" + +#: backend/configuration/models/function_controller.py:24 +msgid "插件服务" +msgstr "插件服务" + +#: backend/configuration/models/function_controller.py:25 +msgid "监控告警" +msgstr "监控告警" + +#: backend/configuration/models/function_controller.py:101 +msgid "功能名称" +msgstr "功能名称" + +#: backend/configuration/models/function_controller.py:102 +msgid "是否开启" +msgstr "是否开启" + +#: backend/configuration/models/function_controller.py:103 +#: backend/db_periodic_task/models.py:35 +msgid "是否冻结" +msgstr "是否冻结" + +#: backend/configuration/models/function_controller.py:103 +msgid "人工冻结此开关,将不受更新影响" +msgstr "人工冻结此开关,将不受更新影响" + +#: backend/configuration/models/function_controller.py:104 +msgid "父功能名称" +msgstr "父功能名称" + +#: backend/configuration/models/function_controller.py:107 +msgid "功能控制器(FunctionController)" +msgstr "功能控制器(FunctionController)" #: backend/configuration/models/ip_whitelist.py:26 -#: backend/configuration/serializers.py:77 backend/ticket/models/ticket.py:100 -#: backend/ticket/serializers.py:68 +#: backend/configuration/serializers.py:198 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:90 +#: backend/ticket/filters.py:20 backend/ticket/models/ticket.py:100 +#: backend/ticket/serializers.py:86 msgid "备注" msgstr "备注" #: backend/configuration/models/ip_whitelist.py:27 -#: backend/configuration/serializers.py:78 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:36 +#: backend/configuration/serializers.py:199 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:61 msgid "ip列表" msgstr "ip列表" #: backend/configuration/models/ip_whitelist.py:30 -#: backend/configuration/models/ip_whitelist.py:31 -#: backend/configuration/views/ip_whitelist.py:31 -msgid "IP白名单" -msgstr "IP白名单" - -#: backend/configuration/models/password_policy.py:22 -#: backend/configuration/serializers.py:55 -#: backend/configuration/serializers.py:72 +msgid "IP白名单(IPWhitelist)" +msgstr "IP白名单(IPWhitelist)" + +#: backend/configuration/models/password_policy.py:24 +#: backend/configuration/serializers.py:193 +#: backend/db_services/dbpermission/db_account/serializers.py:26 +#: backend/db_services/dbpermission/db_account/serializers.py:69 +#: backend/db_services/dbpermission/db_account/serializers.py:105 +#: backend/db_services/dbpermission/db_account/serializers.py:120 +#: backend/db_services/dbpermission/db_account/serializers.py:172 +#: backend/db_services/dbpermission/db_account/serializers.py:187 msgid "账号类型" msgstr "账号类型" -#: backend/configuration/models/password_policy.py:23 #: backend/configuration/models/password_policy.py:26 -#: backend/configuration/serializers.py:56 -#: backend/configuration/views/password_policy.py:22 +#: backend/configuration/serializers.py:157 +#: backend/configuration/views/password_policy.py:39 msgid "密码安全策略" msgstr "密码安全策略" -#: backend/configuration/models/profile.py:19 backend/version_log/models.py:42 +#: backend/configuration/models/password_policy.py:29 +msgid "密码安全策略(PasswordPolicy)" +msgstr "密码安全策略(PasswordPolicy)" + +#: backend/configuration/models/profile.py:19 +#: backend/db_services/mysql/permission/authorize/serializers.py:29 +#: backend/db_services/plugin/bf/serializers.py:22 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:33 +#: backend/version_log/models.py:42 msgid "用户名" msgstr "用户名" #: backend/configuration/models/profile.py:20 -#: backend/db_services/dbresource/serializers.py:47 +#: backend/db_monitor/serializers.py:234 +#: backend/db_services/dbresource/serializers.py:55 msgid "标签" msgstr "标签" @@ -1150,59 +1884,398 @@ msgstr "标签" msgid "配置值" msgstr "配置值" -#: backend/configuration/models/system.py:29 -msgid "DBM的流程服务ID" -msgstr "DBM的流程服务ID" +#: backend/configuration/models/profile.py:24 +msgid "个人偏好(Profile)" +msgstr "个人偏好(Profile)" -#: backend/configuration/models/system.py:33 backend/ticket/serializers.py:213 +#: backend/configuration/models/system.py:30 +#: backend/db_report/views/dbmon_heartbeat_view.py:58 +#: backend/db_services/plugin/mysql/authorize/serializers.py:28 +#: backend/ticket/serializers.py:270 msgid "类型" msgstr "类型" -#: backend/configuration/models/system.py:34 +#: backend/configuration/models/system.py:31 msgid "关键字唯一标识" msgstr "关键字唯一标识" -#: backend/configuration/models/system.py:35 +#: backend/configuration/models/system.py:32 msgid "系统设置值" msgstr "系统设置值" -#: backend/configuration/models/system.py:36 +#: backend/configuration/models/system.py:33 #: backend/db_services/dbconfig/serializers.py:31 #: backend/db_services/dbconfig/serializers.py:82 -#: backend/db_services/dbresource/filters.py:20 +#: backend/db_services/dbresource/filters.py:21 #: backend/flow/plugins/components/collections/common/pause.py:71 msgid "描述" msgstr "描述" -#: backend/configuration/models/system.py:39 -#: backend/configuration/models/system.py:40 -#: backend/configuration/views/system.py:24 -#: backend/configuration/views/system.py:44 -#: backend/configuration/views/system.py:54 -msgid "系统设置" -msgstr "系统设置" +#: backend/configuration/models/system.py:70 +msgid "系统配置(SystemSettings)" +msgstr "系统配置(SystemSettings)" + +#: backend/configuration/models/system.py:133 +msgid "业务配置(BizSettings)" +msgstr "业务配置(BizSettings)" + +#: backend/configuration/serializers.py:48 +#: backend/db_services/taskflow/serializers.py:61 +msgid "查询key" +msgstr "查询key" + +#: backend/configuration/serializers.py:58 +msgid "更新key" +msgstr "更新key" + +#: backend/configuration/serializers.py:59 +msgid "更新value" +msgstr "更新value" + +#: backend/configuration/serializers.py:60 +msgid "value类型" +msgstr "value类型" + +#: backend/configuration/serializers.py:84 +msgid "分钟" +msgstr "分钟" + +#: backend/configuration/serializers.py:85 +msgid "小时" +msgstr "小时" + +#: backend/configuration/serializers.py:86 +msgid "每周几天(eg: 1,4,5 表示一周的周一,周四,周五)" +msgstr "每周几天(eg: 1,4,5 表示一周的周一,周四,周五)" + +#: backend/configuration/serializers.py:87 +msgid "每月几天(eg: 1, 11, 13 表示每月的1号,11号,13号)" +msgstr "每月几天(eg: 1, 11, 13 表示每月的1号,11号,13号)" + +#: backend/configuration/serializers.py:89 +msgid "crontab表达式" +msgstr "crontab表达式" + +#: backend/configuration/serializers.py:93 +#: backend/configuration/serializers.py:217 backend/db_dirty/serializers.py:26 +#: backend/db_proxy/views/dbpriv/serializers.py:31 +#: backend/db_services/mongodb/restore/serializers.py:36 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:66 +msgid "分页限制" +msgstr "分页限制" + +#: backend/configuration/serializers.py:94 +#: backend/configuration/serializers.py:218 backend/db_dirty/serializers.py:27 +#: backend/db_proxy/views/dbpriv/serializers.py:32 +#: backend/db_services/mongodb/restore/serializers.py:37 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:67 +msgid "分页起始" +msgstr "分页起始" + +#: backend/configuration/serializers.py:97 backend/db_event/serializers.py:51 +#: backend/db_event/serializers.py:66 +#: backend/db_proxy/views/dbpriv/serializers.py:33 +#: backend/db_services/partition/serializers.py:117 +#: backend/db_services/redis/redis_dts/serializers.py:27 +#: backend/ticket/builders/mysql/mysql_data_repair.py:34 +#: backend/ticket/builders/mysql/mysql_flashback.py:34 +#: backend/ticket/serializers.py:136 +msgid "开始时间" +msgstr "开始时间" + +#: backend/configuration/serializers.py:98 backend/db_event/serializers.py:52 +#: backend/db_event/serializers.py:53 backend/db_event/serializers.py:67 +#: backend/db_proxy/views/dbpriv/serializers.py:34 +#: backend/db_services/partition/serializers.py:118 +#: backend/db_services/redis/redis_dts/serializers.py:28 +#: backend/db_services/sqlserver/rollback/serializers.py:37 +#: backend/ticket/builders/mysql/mysql_data_repair.py:35 +#: backend/ticket/builders/mysql/mysql_flashback.py:35 +#: backend/ticket/serializers.py:137 +msgid "结束时间" +msgstr "结束时间" + +#: backend/configuration/serializers.py:99 +msgid "过滤的实例列表(通过,分割,实例格式为--cloud:ip:port)" +msgstr "过滤的实例列表(通过,分割,实例格式为--cloud:ip:port)" + +#: backend/configuration/serializers.py:101 +#: backend/db_monitor/views/policy.py:50 +#: backend/db_proxy/views/redis_dts/serializers.py:42 +#: backend/db_proxy/views/redis_dts/serializers.py:51 +#: backend/db_proxy/views/redis_dts/serializers.py:60 +#: backend/db_proxy/views/redis_dts/serializers.py:70 +msgid "db类型" +msgstr "db类型" + +#: backend/configuration/serializers.py:112 +#: backend/db_proxy/views/dbpriv/serializers.py:21 +msgid "实例ip" +msgstr "实例ip" + +#: backend/configuration/serializers.py:113 +#: backend/db_proxy/views/dbpriv/serializers.py:22 +msgid "实例port" +msgstr "实例port" + +#: backend/configuration/serializers.py:114 backend/db_proxy/models.py:151 +#: backend/db_proxy/views/cloud/serializers.py:19 +#: backend/db_proxy/views/jobapi/serializers.py:19 +#: backend/db_proxy/views/jobapi/serializers.py:58 +#: backend/db_proxy/views/jobapi/serializers.py:68 +#: backend/db_proxy/views/redis_dts/serializers.py:40 +#: backend/db_proxy/views/redis_dts/serializers.py:49 +#: backend/db_proxy/views/redis_dts/serializers.py:58 +#: backend/db_proxy/views/redis_dts/serializers.py:67 +#: backend/db_services/dbbase/cluster/serializers.py:37 +#: backend/db_services/dbbase/resources/serializers.py:138 +#: backend/db_services/dbresource/serializers.py:59 +#: backend/db_services/dbresource/serializers.py:376 +#: backend/db_services/ipchooser/serializers/base.py:33 +#: backend/db_services/mysql/permission/clone/models.py:28 +#: backend/db_services/mysql/permission/clone/serializers.py:25 +#: backend/db_services/partition/serializers.py:151 +#: backend/db_services/redis/autofix/models.py:34 +#: backend/db_services/redis/autofix/models.py:50 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:17 +#: backend/ticket/builders/cloud/dbha_add.py:27 +#: backend/ticket/builders/cloud/dbha_reduce.py:29 +#: backend/ticket/builders/cloud/dbha_reload.py:27 +#: backend/ticket/builders/cloud/dbha_replace.py:27 +#: backend/ticket/builders/cloud/dns_add.py:27 +#: backend/ticket/builders/cloud/dns_reduce.py:28 +#: backend/ticket/builders/cloud/dns_reload.py:27 +#: backend/ticket/builders/cloud/dns_replace.py:27 +#: backend/ticket/builders/cloud/drs_add.py:27 +#: backend/ticket/builders/cloud/drs_reduce.py:28 +#: backend/ticket/builders/cloud/drs_reload.py:27 +#: backend/ticket/builders/cloud/drs_replace.py:27 +#: backend/ticket/builders/cloud/nginx_reload.py:26 +#: backend/ticket/builders/cloud/nginx_replace.py:31 +#: backend/ticket/builders/cloud/redis_dts_add.py:27 +#: backend/ticket/builders/cloud/redis_dts_reduce.py:27 +#: backend/ticket/builders/cloud/service_apply.py:43 +#: backend/ticket/builders/common/base.py:100 +#: backend/ticket/builders/common/bigdata.py:124 +#: backend/ticket/builders/common/bigdata.py:227 +#: backend/ticket/builders/common/bigdata.py:305 +#: backend/ticket/builders/influxdb/influxdb_apply.py:43 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:31 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:26 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:32 +#: backend/ticket/builders/mysql/mysql_partition.py:48 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:25 +#: backend/ticket/builders/mysql/mysql_single_apply.py:46 +#: backend/ticket/builders/redis/redis_cluster_apply.py:27 +#: backend/ticket/builders/redis/redis_instance_apply.py:34 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:30 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:38 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:35 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:31 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:35 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:32 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:43 +#: backend/ticket/builders/riak/riak_apply.py:27 +#: backend/ticket/builders/riak/riak_migrate.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:45 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:23 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:30 +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:25 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:32 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:26 +#: backend/ticket/serializers.py:336 +msgid "云区域ID" +msgstr "云区域ID" + +#: backend/configuration/serializers.py:115 +#: backend/db_package/serializers.py:47 backend/db_proxy/models.py:149 +#: backend/db_proxy/views/db_meta/serializers.py:34 +#: backend/db_report/models/checksum_check_report.py:23 +#: backend/db_report/views/mysqlbackup_check_view.py:58 +#: backend/db_report/views/redis_dbmeta_check_view.py:57 +#: backend/db_report/views/redisbackup_check_view.py:62 +#: backend/db_services/bigdata/resources/query.py:40 +#: backend/db_services/cmdb/serializers.py:49 +#: backend/db_services/cmdb/serializers.py:54 +#: backend/db_services/dbbase/resources/query.py:86 +#: backend/db_services/dbbase/resources/query.py:162 +#: backend/db_services/dbbase/resources/serializers.py:35 +#: backend/db_services/dbbase/resources/serializers.py:105 +#: backend/db_services/dbbase/resources/serializers.py:134 +#: backend/db_services/dbbase/serializers.py:27 +#: backend/db_services/dbbase/serializers.py:95 +#: backend/db_services/dbconfig/serializers.py:20 +#: backend/db_services/dbpermission/db_authorize/serializers.py:29 +#: backend/db_services/dbpermission/db_authorize/serializers.py:50 +#: backend/db_services/dbresource/serializers.py:321 +#: backend/db_services/dbresource/serializers.py:343 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:26 +#: backend/db_services/mongodb/restore/serializers.py:22 +#: backend/db_services/mongodb/restore/serializers.py:39 +#: backend/db_services/mysql/cluster/serializers.py:34 +#: backend/db_services/mysql/open_area/filters.py:21 +#: backend/db_services/mysql/permission/clone/serializers.py:33 +#: backend/db_services/mysql/permission/clone/serializers.py:88 +#: backend/db_services/mysql/sql_import/serializers.py:35 +#: backend/db_services/mysql/sql_import/serializers.py:177 +#: backend/db_services/mysql/sql_import/serializers.py:213 +#: backend/db_services/partition/serializers.py:26 +#: backend/db_services/partition/serializers.py:97 +#: backend/db_services/partition/serializers.py:115 +#: backend/db_services/redis/autofix/models.py:37 +#: backend/db_services/redis/autofix/models.py:53 +#: backend/db_services/redis/autofix/models.py:82 +#: backend/db_services/redis/resources/redis_cluster/query.py:60 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:16 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:26 +#: backend/ticket/builders/mongodb/mongo_backup.py:34 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:40 +#: backend/ticket/builders/mongodb/mongo_restore.py:44 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:35 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:32 +#: backend/ticket/builders/mysql/mysql_openarea.py:45 +#: backend/ticket/builders/redis/redis_cluster_apply.py:37 +#: backend/ticket/builders/redis/redis_instance_apply.py:44 +msgid "集群类型" +msgstr "集群类型" + +#: backend/configuration/serializers.py:116 backend/db_event/serializers.py:50 +#: backend/db_services/bigdata/resources/serializers.py:20 +#: backend/db_services/dbbase/resources/query.py:156 +msgid "实例角色" +msgstr "实例角色" + +#: backend/configuration/serializers.py:118 +msgid "密码到期小时" +msgstr "密码到期小时" + +#: backend/configuration/serializers.py:119 +#: backend/db_services/mysql/permission/authorize/serializers.py:30 +msgid "密码" +msgstr "密码" + +#: backend/configuration/serializers.py:120 +msgid "实例信息" +msgstr "实例信息" + +#: backend/configuration/serializers.py:126 +msgid "修改密码中不允许包含单引号,双引号和反引号" +msgstr "修改密码中不允许包含单引号,双引号和反引号" + +#: backend/configuration/serializers.py:131 +msgid "一次只允许修改同种集群类型的密码" +msgstr "一次只允许修改同种集群类型的密码" + +#: backend/configuration/serializers.py:139 +msgid "是否包含数字" +msgstr "是否包含数字" + +#: backend/configuration/serializers.py:140 +msgid "是否包含特殊符号" +msgstr "是否包含特殊符号" + +#: backend/configuration/serializers.py:141 +msgid "是否包含小写字符" +msgstr "是否包含小写字符" + +#: backend/configuration/serializers.py:142 +msgid "是否包含大写字符" +msgstr "是否包含大写字符" + +#: backend/configuration/serializers.py:145 +msgid "最大连续长度" +msgstr "最大连续长度" + +#: backend/configuration/serializers.py:146 +msgid "是否限制连续字母" +msgstr "是否限制连续字母" + +#: backend/configuration/serializers.py:147 +msgid "是否限制连续数字" +msgstr "是否限制连续数字" + +#: backend/configuration/serializers.py:148 +msgid "是否限制连续重复字符" +msgstr "是否限制连续重复字符" + +#: backend/configuration/serializers.py:149 +msgid "是否限制连续特殊字符" +msgstr "是否限制连续特殊字符" + +#: backend/configuration/serializers.py:150 +msgid "是否限制连续键盘序" +msgstr "是否限制连续键盘序" -#: backend/configuration/serializers.py:64 +#: backend/configuration/serializers.py:152 +msgid "最大长度" +msgstr "最大长度" + +#: backend/configuration/serializers.py:153 +msgid "最小长度" +msgstr "最小长度" + +#: backend/configuration/serializers.py:154 +msgid "包含规则" +msgstr "包含规则" + +#: backend/configuration/serializers.py:155 +msgid "排除连续性规则" +msgstr "排除连续性规则" + +#: backend/configuration/serializers.py:158 +msgid "密码安全规则策略名称" +msgstr "密码安全规则策略名称" + +#: backend/configuration/serializers.py:159 +msgid "密码安全规则策略id" +msgstr "密码安全规则策略id" + +#: backend/configuration/serializers.py:167 msgid "密码最小长度不能大于最大长度" msgstr "密码最小长度不能大于最大长度" -#: backend/configuration/serializers.py:66 +#: backend/configuration/serializers.py:169 msgid "请确保密码长度范围为整型" msgstr "请确保密码长度范围为整型" -#: backend/configuration/serializers.py:88 +#: backend/configuration/serializers.py:176 +msgid "密码类型" +msgstr "密码类型" + +#: backend/configuration/serializers.py:184 +msgid "待校验密码" +msgstr "待校验密码" + +#: backend/configuration/serializers.py:209 msgid "id列表" msgstr "id列表" -#: backend/configuration/serializers.py:93 +#: backend/configuration/serializers.py:214 msgid "代过滤IP" msgstr "代过滤IP" -#: backend/configuration/serializers.py:94 +#: backend/configuration/serializers.py:215 msgid "待过滤白名单ID" msgstr "待过滤白名单ID" -#: backend/configuration/views/dba.py:21 +#: backend/configuration/serializers.py:222 +msgid "排期表通知" +msgstr "排期表通知" + +#: backend/configuration/serializers.py:223 +msgid "个人轮值通知" +msgstr "个人轮值通知" + +#: backend/configuration/tasks/password.py:45 +#: backend/flow/plugins/components/collections/mysql/randomize_admin_password.py:51 +msgid "「接口modify_mysql_admin_password返回结果异常」{}" +msgstr "「接口modify_mysql_admin_password返回结果异常」{}" + +#: backend/configuration/tasks/password.py:48 +msgid "「接口modify_mysql_admin_password调用异常」{}" +msgstr "「接口modify_mysql_admin_password调用异常」{}" + +#: backend/configuration/views/dba.py:23 msgid "DBA人员" msgstr "DBA人员" @@ -1214,43 +2287,84 @@ msgstr "查询DBA人员列表" msgid "更新DBA人员" msgstr "更新DBA人员" -#: backend/configuration/views/ip_whitelist.py:57 -#: backend/configuration/views/ip_whitelist.py:58 +#: backend/configuration/views/function_controller.py:20 +#: backend/configuration/views/function_controller.py:33 +msgid "功能开关" +msgstr "功能开关" + +#: backend/configuration/views/function_controller.py:32 +msgid "功能开关列表" +msgstr "功能开关列表" + +#: backend/configuration/views/ip_whitelist.py:37 +msgid "IP白名单" +msgstr "IP白名单" + +#: backend/configuration/views/ip_whitelist.py:83 +msgid "无法同时删除不同业务下的IP白名单" +msgstr "无法同时删除不同业务下的IP白名单" + +#: backend/configuration/views/ip_whitelist.py:108 +#: backend/configuration/views/ip_whitelist.py:109 msgid "IP白名单详情" msgstr "IP白名单详情" -#: backend/configuration/views/ip_whitelist.py:66 +#: backend/configuration/views/ip_whitelist.py:117 msgid "IP白名单列表" msgstr "IP白名单列表" -#: backend/configuration/views/ip_whitelist.py:78 -#: backend/configuration/views/ip_whitelist.py:80 +#: backend/configuration/views/ip_whitelist.py:135 +#: backend/configuration/views/ip_whitelist.py:137 msgid "创建IP白名单" msgstr "创建IP白名单" -#: backend/configuration/views/ip_whitelist.py:87 -#: backend/configuration/views/ip_whitelist.py:89 -#: backend/configuration/views/ip_whitelist.py:98 +#: backend/configuration/views/ip_whitelist.py:144 +#: backend/configuration/views/ip_whitelist.py:146 +#: backend/configuration/views/ip_whitelist.py:155 msgid "更新IP白名单" msgstr "更新IP白名单" -#: backend/configuration/views/ip_whitelist.py:96 +#: backend/configuration/views/ip_whitelist.py:153 msgid "删除IP白名单" msgstr "删除IP白名单" -#: backend/configuration/views/ip_whitelist.py:105 +#: backend/configuration/views/ip_whitelist.py:162 msgid "批量删除IP白名单" msgstr "批量删除IP白名单" -#: backend/configuration/views/password_policy.py:33 +#: backend/configuration/views/password_policy.py:55 msgid "查询密码安全策略" msgstr "查询密码安全策略" -#: backend/configuration/views/password_policy.py:46 +#: backend/configuration/views/password_policy.py:66 msgid "更新密码安全策略" msgstr "更新密码安全策略" -#: backend/configuration/views/profile.py:20 +#: backend/configuration/views/password_policy.py:77 +msgid "校验密码强度规则" +msgstr "校验密码强度规则" + +#: backend/configuration/views/password_policy.py:88 +msgid "获取符合密码强度的字符串" +msgstr "获取符合密码强度的字符串" + +#: backend/configuration/views/password_policy.py:100 +msgid "更新密码随机化周期" +msgstr "更新密码随机化周期" + +#: backend/configuration/views/password_policy.py:113 +msgid "查询密码随机化周期" +msgstr "查询密码随机化周期" + +#: backend/configuration/views/password_policy.py:131 +msgid "查询生效实例密码(admin)" +msgstr "查询生效实例密码(admin)" + +#: backend/configuration/views/password_policy.py:144 +msgid "修改db实例密码(admin)" +msgstr "修改db实例密码(admin)" + +#: backend/configuration/views/profile.py:22 msgid "个人配置" msgstr "个人配置" @@ -1258,57 +2372,106 @@ msgstr "个人配置" msgid "查询个人配置列表" msgstr "查询个人配置列表" -#: backend/configuration/views/profile.py:42 +#: backend/configuration/views/profile.py:46 msgid "新增/更新个人配置" msgstr "新增/更新个人配置" -#: backend/configuration/views/system.py:43 -msgid "系统设置列表" -msgstr "系统设置列表" +#: backend/configuration/views/system.py:35 +msgid "系统设置" +msgstr "系统设置" + +#: backend/configuration/views/system.py:49 +#: backend/db_services/ipchooser/views.py:207 +msgid "查询磁盘类型" +msgstr "查询磁盘类型" -#: backend/configuration/views/system.py:51 -msgid "系统设置键值映射表" -msgstr "系统设置键值映射表" +#: backend/configuration/views/system.py:57 +msgid "查询机型类型" +msgstr "查询机型类型" #: backend/configuration/views/system.py:65 +msgid "查询轮值通知配置" +msgstr "查询轮值通知配置" + +#: backend/configuration/views/system.py:73 +msgid "更新轮值通知配置" +msgstr "更新轮值通知配置" + +#: backend/configuration/views/system.py:83 msgid "查询环境变量" msgstr "查询环境变量" -#: backend/core/encrypt/constants.py:26 +#: backend/configuration/views/system.py:112 +msgid "查询敏感环境变量" +msgstr "查询敏感环境变量" + +#: backend/configuration/views/system.py:138 +msgid "业务设置列表" +msgstr "业务设置列表" + +#: backend/configuration/views/system.py:139 +msgid "业务设置" +msgstr "业务设置" + +#: backend/configuration/views/system.py:146 +msgid "业务设置列表键值映射表" +msgstr "业务设置列表键值映射表" + +#: backend/configuration/views/system.py:168 +msgid "更新业务设置列表键值" +msgstr "更新业务设置列表键值" + +#: backend/core/encrypt/constants.py:27 msgid "PKCS1" msgstr "PKCS1" -#: backend/core/encrypt/constants.py:27 +#: backend/core/encrypt/constants.py:28 msgid "PKCS1_OAEP" msgstr "PKCS1_OAEP" -#: backend/core/encrypt/constants.py:33 +#: backend/core/encrypt/constants.py:34 msgid "私钥对象" msgstr "私钥对象" -#: backend/core/encrypt/constants.py:34 +#: backend/core/encrypt/constants.py:35 msgid "公钥对象" msgstr "公钥对象" -#: backend/core/encrypt/constants.py:40 +#: backend/core/encrypt/constants.py:41 msgid "私钥" msgstr "私钥" -#: backend/core/encrypt/constants.py:41 +#: backend/core/encrypt/constants.py:42 msgid "公钥" msgstr "公钥" -#: backend/core/encrypt/constants.py:50 -msgid "MySQL的RSA秘钥" -msgstr "MySQL的RSA秘钥" - #: backend/core/encrypt/constants.py:51 -msgid "透传接口的RSA秘钥" -msgstr "透传接口的RSA秘钥" +msgid "平台密码的非对称秘钥" +msgstr "平台密码的非对称秘钥" #: backend/core/encrypt/constants.py:52 -msgid "云区域服务的RSA秘钥" -msgstr "云区域服务的RSA秘钥" +msgid "透传接口的非对称秘钥" +msgstr "透传接口的非对称秘钥" + +#: backend/core/encrypt/constants.py:53 +msgid "云区域服务的非对称秘钥" +msgstr "云区域服务的非对称秘钥" + +#: backend/core/encrypt/constants.py:63 +msgid "RSA" +msgstr "RSA" + +#: backend/core/encrypt/constants.py:64 +msgid "SM2" +msgstr "SM2" + +#: backend/core/encrypt/constants.py:70 +msgid "AES" +msgstr "AES" + +#: backend/core/encrypt/constants.py:71 +msgid "SM4" +msgstr "SM4" #: backend/core/encrypt/exceptions.py:19 msgid "密码加密失败" @@ -1318,43 +2481,39 @@ msgstr "密码加密失败" msgid "密码解密失败" msgstr "密码解密失败" -#: backend/core/encrypt/handlers.py:162 -msgid "密码加密失败: {}" -msgstr "密码加密失败: {}" - -#: backend/core/encrypt/handlers.py:181 -msgid "密码解密失败: {}" -msgstr "密码解密失败: {}" - -#: backend/core/encrypt/models.py:19 backend/core/encrypt/serializers.py:23 +#: backend/core/encrypt/models.py:20 backend/core/encrypt/serializers.py:23 msgid "密钥名称" msgstr "密钥名称" -#: backend/core/encrypt/models.py:20 +#: backend/core/encrypt/models.py:21 msgid "密钥类型" msgstr "密钥类型" -#: backend/core/encrypt/models.py:21 +#: backend/core/encrypt/models.py:22 +msgid "非对称加密算法" +msgstr "非对称加密算法" + +#: backend/core/encrypt/models.py:24 msgid "密钥描述" msgstr "密钥描述" -#: backend/core/encrypt/models.py:22 +#: backend/core/encrypt/models.py:25 msgid "密钥内容" msgstr "密钥内容" #: backend/core/encrypt/models.py:28 backend/core/encrypt/models.py:29 -msgid "RSA密钥" -msgstr "RSA密钥" +msgid "非对称密钥" +msgstr "非对称密钥" #: backend/core/encrypt/serializers.py:20 msgid "密钥名称列表" msgstr "密钥名称列表" -#: backend/core/encrypt/views.py:21 -msgid "RSA秘钥" -msgstr "RSA秘钥" +#: backend/core/encrypt/views.py:22 +msgid "秘钥管理" +msgstr "秘钥管理" -#: backend/core/encrypt/views.py:29 +#: backend/core/encrypt/views.py:30 msgid "查询公钥列表" msgstr "查询公钥列表" @@ -1399,7 +2558,7 @@ msgstr "公开仓库" msgid "私有仓库" msgstr "私有仓库" -#: backend/core/storages/constants.py:31 backend/flow/consts.py:241 +#: backend/core/storages/constants.py:31 backend/flow/consts.py:328 msgid "服务器文件" msgstr "服务器文件" @@ -1512,28 +2671,61 @@ msgstr "文件源接入参数" msgid "作业平台文件源" msgstr "作业平台文件源" -#: backend/core/storages/serializers.py:17 -#: backend/db_services/taskflow/serializers.py:62 +#: backend/core/storages/serializers.py:19 +#: backend/db_services/taskflow/serializers.py:72 msgid "文件路径列表" msgstr "文件路径列表" -#: backend/core/storages/serializers.py:21 -#: backend/db_proxy/views/jobapi/serializers.py:66 +#: backend/core/storages/serializers.py:23 +#: backend/core/storages/serializers.py:32 +#: backend/db_proxy/views/jobapi/serializers.py:63 msgid "文件路径" msgstr "文件路径" -#: backend/core/storages/views.py:25 +#: backend/core/storages/serializers.py:27 +msgid "临时下载的token" +msgstr "临时下载的token" + +#: backend/core/storages/serializers.py:28 +msgid "是否强制下载" +msgstr "是否强制下载" + +#: backend/core/storages/serializers.py:44 +msgid "目标目录列表" +msgstr "目标目录列表" + +#: backend/core/storages/serializers.py:45 +msgid "是否下载" +msgstr "是否下载" + +#: backend/core/storages/views.py:37 msgid "批量获取文件内容" msgstr "批量获取文件内容" -#: backend/core/storages/views.py:32 +#: backend/core/storages/views.py:45 +msgid "批量下载文件" +msgstr "批量下载文件" + +#: backend/core/storages/views.py:53 +msgid "临时下载文件" +msgstr "临时下载文件" + +#: backend/core/storages/views.py:67 msgid "获取文件内容" msgstr "获取文件内容" -#: backend/core/storages/views.py:38 +#: backend/core/storages/views.py:73 msgid "删除文件" msgstr "删除文件" +#: backend/core/storages/views.py:80 +msgid "获取临时凭证" +msgstr "获取临时凭证" + +#: backend/core/storages/views.py:91 +msgid "指定目录下载(返回下载链接)" +msgstr "指定目录下载(返回下载链接)" + #: backend/core/translation/exceptions.py:19 msgid "翻译目录未找到" msgstr "翻译目录未找到" @@ -1546,6 +2738,139 @@ msgstr "存在未翻译的文件/代码片段" msgid "存在包含特定翻译语言的f-string" msgstr "存在包含特定翻译语言的f-string" +#: backend/db_dirty/constants.py:14 backend/iam_app/dataclass/actions.py:1528 +msgid "污点池" +msgstr "污点池" + +#: backend/db_dirty/filters.py:24 +#: backend/db_services/mysql/open_area/filters.py:22 +#: backend/db_services/mysql/sql_import/serializers.py:94 +#: backend/db_services/mysql/sql_import/serializers.py:127 +#: backend/flow/models.py:23 backend/ticket/models/ticket.py:88 +#: backend/ticket/models/ticket.py:238 backend/ticket/serializers.py:83 +#: backend/ticket/serializers.py:292 backend/ticket/serializers.py:306 +#: backend/ticket/serializers.py:324 +msgid "单据类型" +msgstr "单据类型" + +#: backend/db_dirty/filters.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:86 +#: backend/db_services/mysql/permission/clone/serializers.py:131 +#: backend/db_services/mysql/permission/constants.py:34 +#: backend/db_services/redis/autofix/models.py:40 +#: backend/db_services/redis/redis_dts/serializers.py:34 +#: backend/db_services/sqlserver/data_migrate/serializers.py:22 +#: backend/db_services/sqlserver/data_migrate/serializers.py:39 +#: backend/flow/models.py:21 backend/flow/models.py:41 +#: backend/ticket/serializers.py:81 +msgid "单据ID" +msgstr "单据ID" + +#: backend/db_dirty/filters.py:26 +#: backend/db_proxy/views/redis_dts/serializers.py:22 +#: backend/db_proxy/views/redis_dts/serializers.py:28 +#: backend/db_proxy/views/redis_dts/serializers.py:74 +#: backend/db_proxy/views/redis_dts/serializers.py:80 +#: backend/db_services/plugin/mysql/authorize/serializers.py:43 +#: backend/db_services/plugin/mysql/authorize/serializers.py:51 +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:28 +msgid "任务ID" +msgstr "任务ID" + +#: backend/db_dirty/filters.py:27 +#: backend/db_services/dbresource/serializers.py:205 +#: backend/db_services/partition/serializers.py:99 +msgid "操作者" +msgstr "操作者" + +#: backend/db_dirty/filters.py:28 +msgid "过滤IP" +msgstr "过滤IP" + +#: backend/db_dirty/handlers.py:262 +msgid "【污点池】主机列表:{} 将从污点池挪出" +msgstr "【污点池】主机列表:{} 将从污点池挪出" + +#: backend/db_dirty/handlers.py:267 +msgid "【污点池】单据-{}:任务-{}执行失败,主机列表:{}挪到污点池" +msgstr "【污点池】单据-{}:任务-{}执行失败,主机列表:{}挪到污点池" + +#: backend/db_dirty/models.py:26 +#: backend/db_services/dbbase/cluster/serializers.py:39 +#: backend/db_services/dbbase/resources/serializers.py:130 +#: backend/db_services/ipchooser/serializers/topo_sers.py:78 +#: backend/db_services/plugin/bf/serializers.py:19 +#: backend/ticket/builders/common/base.py:102 +#: backend/ticket/builders/common/bigdata.py:226 +#: backend/ticket/builders/common/bigdata.py:304 +msgid "主机ID" +msgstr "主机ID" + +#: backend/db_dirty/models.py:27 +msgid "主机云区域" +msgstr "主机云区域" + +#: backend/db_dirty/models.py:28 +#: backend/db_proxy/views/dumper/serializers.py:21 +#: backend/db_services/plugin/bf/serializers.py:20 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:26 +msgid "主机IP" +msgstr "主机IP" + +#: backend/db_dirty/models.py:29 +msgid "关联任务" +msgstr "关联任务" + +#: backend/db_dirty/models.py:30 +msgid "关联单据" +msgstr "关联单据" + +#: backend/db_dirty/models.py:33 +msgid "污点池机器(DirtyMachine)" +msgstr "污点池机器(DirtyMachine)" + +#: backend/db_dirty/serializers.py:20 +msgid "过滤的主机IP列表,以逗号分隔" +msgstr "过滤的主机IP列表,以逗号分隔" + +#: backend/db_dirty/serializers.py:21 +msgid "过滤的单据ID" +msgstr "过滤的单据ID" + +#: backend/db_dirty/serializers.py:22 +msgid "过滤的任务ID" +msgstr "过滤的任务ID" + +#: backend/db_dirty/serializers.py:23 +msgid "过滤的单据类型" +msgstr "过滤的单据类型" + +#: backend/db_dirty/serializers.py:24 +#: backend/db_services/plugin/mysql/authorize/serializers.py:22 +#: backend/ticket/builders/mysql/mysql_openarea.py:40 +msgid "操作人" +msgstr "操作人" + +#: backend/db_dirty/serializers.py:42 +msgid "待转移的主机ID列表" +msgstr "待转移的主机ID列表" + +#: backend/db_dirty/serializers.py:46 +msgid "待删除的污点池记录主机ID" +msgstr "待删除的污点池记录主机ID" + +#: backend/db_dirty/views.py:45 +msgid "查询污点池列表" +msgstr "查询污点池列表" + +#: backend/db_dirty/views.py:83 +msgid "将污点池主机转移至待回收模块" +msgstr "将污点池主机转移至待回收模块" + +#: backend/db_dirty/views.py:99 +msgid "删除污点池记录" +msgstr "删除污点池记录" + #: backend/db_event/serializers.py:19 msgid "事件ID" msgstr "事件ID" @@ -1567,131 +2892,139 @@ msgid "日志列表" msgstr "日志列表" #: backend/db_event/serializers.py:45 -#: backend/db_meta/api/storage_instance/apis.py:165 -#: backend/db_services/dbbase/resources/constants.py:19 -#: backend/db_services/ipchooser/constants.py:82 +#: backend/db_report/views/checksum_check_report_view.py:58 +#: backend/db_services/dbbase/resources/constants.py:20 +#: backend/db_services/ipchooser/constants.py:118 #: backend/db_services/ipchooser/mock_data.py:43 #: backend/db_services/ipchooser/mock_data.py:62 -#: backend/db_services/ipchooser/mock_data.py:98 backend/ticket/handler.py:52 +#: backend/db_services/ipchooser/mock_data.py:98 backend/ticket/handler.py:78 msgid "集群" msgstr "集群" #: backend/db_event/serializers.py:48 -#: backend/db_proxy/views/db_meta/serializers.py:52 +#: backend/db_proxy/views/db_meta/serializers.py:65 +#: backend/db_services/mysql/dumper/filters.py:40 msgid "实例IP" msgstr "实例IP" #: backend/db_event/serializers.py:49 -#: backend/db_services/dbresource/serializers.py:203 +#: backend/db_report/views/meta_check_view.py:62 +#: backend/db_services/dbresource/serializers.py:334 +#: backend/db_services/redis/autofix/models.py:55 msgid "实例类型" msgstr "实例类型" -#: backend/db_event/serializers.py:50 -msgid "实例角色" -msgstr "实例角色" - -#: backend/db_event/serializers.py:51 backend/db_event/serializers.py:66 -#: backend/db_proxy/views/redis_dts/serializers.py:23 -#: backend/db_services/redis_dts/serializers.py:18 -#: backend/ticket/builders/mysql/mysql_data_repair.py:36 -#: backend/ticket/builders/mysql/mysql_flashback.py:28 -#: backend/ticket/serializers.py:111 -msgid "开始时间" -msgstr "开始时间" - -#: backend/db_event/serializers.py:52 backend/db_event/serializers.py:53 -#: backend/db_event/serializers.py:67 -#: backend/db_proxy/views/redis_dts/serializers.py:24 -#: backend/db_services/redis_dts/serializers.py:19 -#: backend/ticket/builders/mysql/mysql_data_repair.py:37 -#: backend/ticket/builders/mysql/mysql_flashback.py:29 -#: backend/ticket/serializers.py:112 -msgid "结束时间" -msgstr "结束时间" - -#: backend/db_event/views/dbha.py:24 +#: backend/db_event/views/dbha.py:27 msgid "DBHA事件" msgstr "DBHA事件" -#: backend/db_event/views/dbha.py:32 +#: backend/db_event/views/dbha.py:42 msgid "DBHA切换事件列表" msgstr "DBHA切换事件列表" -#: backend/db_event/views/dbha.py:71 +#: backend/db_event/views/dbha.py:86 msgid "DBHA切换事件详情(日志)" msgstr "DBHA切换事件详情(日志)" -#: backend/db_meta/api/cluster/base/graph.py:107 +#: backend/db_meta/api/cluster/base/graph.py:127 +#: backend/db_proxy/views/db_meta/serializers.py:149 +#: backend/iam_app/dataclass/actions.py:900 backend/ticket/constants.py:225 +#: backend/ticket/constants.py:226 msgid "访问入口" msgstr "访问入口" -#: backend/db_meta/api/cluster/base/graph.py:117 +#: backend/db_meta/api/cluster/base/graph.py:137 msgid "node" msgstr "node" -#: backend/db_meta/api/cluster/base/graph.py:118 +#: backend/db_meta/api/cluster/base/graph.py:138 msgid "group" msgstr "group" -#: backend/db_meta/api/cluster/base/graph.py:122 +#: backend/db_meta/api/cluster/base/graph.py:142 msgid "同步" msgstr "同步" -#: backend/db_meta/api/cluster/base/graph.py:123 +#: backend/db_meta/api/cluster/base/graph.py:143 msgid "访问" msgstr "访问" -#: backend/db_meta/api/cluster/base/graph.py:124 +#: backend/db_meta/api/cluster/base/graph.py:144 msgid "域名绑定" msgstr "域名绑定" -#: backend/db_meta/api/cluster/base/graph.py:125 +#: backend/db_meta/api/cluster/base/graph.py:145 msgid "读写" msgstr "读写" -#: backend/db_meta/api/cluster/base/graph.py:157 +#: backend/db_meta/api/cluster/base/graph.py:177 msgid "同步到其他集群" msgstr "同步到其他集群" -#: backend/db_meta/api/cluster/base/graph.py:158 +#: backend/db_meta/api/cluster/base/graph.py:178 msgid "从其他集群同步" msgstr "从其他集群同步" -#: backend/db_meta/api/cluster/base/graph.py:159 +#: backend/db_meta/api/cluster/base/graph.py:179 msgid "访问其他集群" msgstr "访问其他集群" -#: backend/db_meta/api/cluster/base/graph.py:160 +#: backend/db_meta/api/cluster/base/graph.py:180 msgid "从其他集群访问" msgstr "从其他集群访问" -#: backend/db_meta/api/cluster/es/detail.py:27 -msgid "Client 节点" -msgstr "Client 节点" +#: backend/db_meta/api/cluster/doris/detail.py:27 +msgid "Follower 节点" +msgstr "Follower 节点" -#: backend/db_meta/api/cluster/es/detail.py:32 -msgid "Master 节点" -msgstr "Master 节点" +#: backend/db_meta/api/cluster/doris/detail.py:32 +msgid "Observer 节点" +msgstr "Observer 节点" +#: backend/db_meta/api/cluster/doris/detail.py:35 #: backend/db_meta/api/cluster/es/detail.py:35 -#: backend/db_services/bigdata/es/query.py:35 +#: backend/db_meta/enums/instance_role.py:38 +#: backend/db_meta/enums/instance_role.py:62 +#: backend/db_services/bigdata/doris/query.py:37 +#: backend/db_services/bigdata/es/query.py:36 msgid "热节点" msgstr "热节点" +#: backend/db_meta/api/cluster/doris/detail.py:38 #: backend/db_meta/api/cluster/es/detail.py:38 -#: backend/db_services/bigdata/es/query.py:36 +#: backend/db_meta/enums/instance_role.py:39 +#: backend/db_meta/enums/instance_role.py:63 +#: backend/db_services/bigdata/doris/query.py:38 +#: backend/db_services/bigdata/es/query.py:37 msgid "冷节点" msgstr "冷节点" +#: backend/db_meta/api/cluster/es/detail.py:27 +#: backend/db_meta/enums/instance_role.py:41 +msgid "Client 节点" +msgstr "Client 节点" + +#: backend/db_meta/api/cluster/es/detail.py:32 +#: backend/db_meta/api/cluster/redisinstance/detail.py:26 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:28 +#: backend/db_meta/enums/instance_role.py:40 +msgid "Master 节点" +msgstr "Master 节点" + #: backend/db_meta/api/cluster/hdfs/create.py:33 #: backend/db_meta/api/cluster/kafka/create.py:38 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:59 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:65 -#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:34 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:52 +#: backend/db_meta/api/cluster/sqlserversingle/create_cluster.py:34 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:60 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:52 +#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:33 msgid "集群名 {} 在 bk_biz_id:{} db_module_id:{} 已存在" msgstr "集群名 {} 在 bk_biz_id:{} db_module_id:{} 已存在" -#: backend/db_meta/api/cluster/hdfs/destroy.py:38 +#: backend/db_meta/api/cluster/hdfs/destroy.py:37 +#: backend/db_meta/api/cluster/influxdb/destroy.py:39 +#: backend/db_meta/api/cluster/influxdb/replace.py:51 +#: backend/db_meta/api/cluster/kafka/destroy.py:37 msgid "将主机{}转移到待回收模块" msgstr "将主机{}转移到待回收模块" @@ -1706,6 +3039,7 @@ msgstr "DataNode 节点" #: backend/db_meta/api/cluster/hdfs/detail.py:35 #: backend/db_meta/api/cluster/kafka/detail.py:30 #: backend/db_meta/api/cluster/pulsar/detail.py:30 +#: backend/db_meta/api/cluster/vm/detail.py:30 msgid "Zookeeper 节点" msgstr "Zookeeper 节点" @@ -1713,73 +3047,82 @@ msgstr "Zookeeper 节点" msgid "Journal 节点" msgstr "Journal 节点" -#: backend/db_meta/api/cluster/influxdb/destroy.py:42 -#: backend/db_meta/api/cluster/influxdb/replace.py:54 -#: backend/db_meta/api/cluster/kafka/destroy.py:39 -#: backend/db_meta/api/cluster/kafka/replace.py:51 -msgid "将主机{}转移到待回收" -msgstr "将主机{}转移到待回收" - #: backend/db_meta/api/cluster/kafka/create.py:42 -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:260 -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:264 -#: backend/db_meta/api/cluster/riak/create.py:34 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:63 -#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:69 -#: backend/db_meta/api/cluster/tendbcluster/create_slave_cluster.py:30 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:69 -#: backend/db_meta/api/cluster/tendbha/create_cluster.py:73 -#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:37 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:142 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:279 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:283 +#: backend/db_meta/api/cluster/rediscluster/create.py:170 +#: backend/db_meta/api/cluster/riak/create.py:35 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:56 +#: backend/db_meta/api/cluster/sqlserverha/create_cluster.py:60 +#: backend/db_meta/api/cluster/sqlserversingle/create_cluster.py:37 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:64 +#: backend/db_meta/api/cluster/tendbcluster/create_cluster.py:70 +#: backend/db_meta/api/cluster/tendbcluster/create_slave_cluster.py:28 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:56 +#: backend/db_meta/api/cluster/tendbha/create_cluster.py:60 +#: backend/db_meta/api/cluster/tendbsingle/create_cluster.py:36 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:170 msgid "域名 {} 已存在" msgstr "域名 {} 已存在" #: backend/db_meta/api/cluster/kafka/detail.py:27 #: backend/db_meta/api/cluster/pulsar/detail.py:27 +#: backend/db_meta/api/cluster/vm/detail.py:27 msgid "Broker 节点" msgstr "Broker 节点" -#: backend/db_meta/api/cluster/mongocluster/detail.py:35 +#: backend/db_meta/api/cluster/kafka/replace.py:50 +#: backend/db_meta/api/cluster/vm/replace.py:50 +msgid "将主机{}转移到待回收" +msgstr "将主机{}转移到待回收" + +#: backend/db_meta/api/cluster/mongocluster/detail.py:45 msgid "Mongos 节点" msgstr "Mongos 节点" -#: backend/db_meta/api/cluster/mongocluster/detail.py:52 +#: backend/db_meta/api/cluster/mongocluster/detail.py:54 msgid "ConfigServer 节点" msgstr "ConfigServer 节点" -#: backend/db_meta/api/cluster/mongocluster/detail.py:69 -msgid "Shard 节点" -msgstr "Shard 节点" +#: backend/db_meta/api/cluster/mongocluster/detail.py:67 +msgid "分片{} 节点" +msgstr "分片{} 节点" + +#: backend/db_meta/api/cluster/mongorepset/detail.py:28 +msgid "M1 Primary 节点" +msgstr "M1 Primary 节点" -#: backend/db_meta/api/cluster/mongocluster/detail.py:72 -#: backend/db_meta/api/cluster/mongorepset/detail.py:44 +#: backend/db_meta/api/cluster/mongorepset/detail.py:45 +msgid "{} 节点" +msgstr "{} 节点" + +#: backend/db_meta/api/cluster/mongorepset/detail.py:53 msgid "Backup 节点" msgstr "Backup 节点" -#: backend/db_meta/api/cluster/mongorepset/detail.py:41 -msgid "提供服务 节点" -msgstr "提供服务 节点" - -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:113 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:110 msgid "{} 实例未分片规则" msgstr "{} 实例未分片规则" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:256 -#: backend/db_meta/api/cluster/riak/create.py:31 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:275 +#: backend/db_meta/api/cluster/riak/create.py:32 msgid "集群名 {} 在 bk_biz_id:{} 已存在" msgstr "集群名 {} 在 bk_biz_id:{} 已存在" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:271 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:149 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:290 +#: backend/db_meta/api/cluster/rediscluster/create.py:177 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:177 msgid "proxy {} 已属于其他集群" msgstr "proxy {} 已属于其他集群" -#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:277 -#: backend/db_meta/api/cluster/tendispluscluster/create.py:155 +#: backend/db_meta/api/cluster/nosqlcomm/create_cluster.py:297 +#: backend/db_meta/api/cluster/rediscluster/create.py:183 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:183 msgid "storage {} 已属于其他集群" msgstr "storage {} 已属于其他集群" #: backend/db_meta/api/cluster/nosqlcomm/decommission.py:43 +#: backend/flow/plugins/components/collections/mongodb/mongo_shutdown_meta.py:51 msgid "{} 存在不是本集群的实例下架列表" msgstr "{} 存在不是本集群的实例下架列表" @@ -1787,18 +3130,22 @@ msgstr "{} 存在不是本集群的实例下架列表" msgid "非集群下架模式,不允许直接下架所有实例 {}" msgstr "非集群下架模式,不允许直接下架所有实例 {}" -#: backend/db_meta/api/cluster/nosqlcomm/decommission.py:107 +#: backend/db_meta/api/cluster/nosqlcomm/decommission.py:111 msgid "非集群下架单,不允许直接下架状态为RUNNING状态实例 {}" msgstr "非集群下架单,不允许直接下架状态为RUNNING状态实例 {}" -#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:57 +#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:54 +#: backend/db_meta/api/cluster/rediscluster/detail.py:50 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:43 #: backend/db_meta/api/cluster/tendbcluster/detail.py:64 #: backend/db_meta/api/cluster/tendbha/detail.py:50 #: backend/db_meta/api/cluster/tendispluscluster/detail.py:50 msgid "访问入口(从)" msgstr "访问入口(从)" -#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:92 +#: backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py:89 +#: backend/db_meta/api/cluster/rediscluster/detail.py:85 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:32 #: backend/db_meta/api/cluster/tendbcluster/detail.py:57 #: backend/db_meta/api/cluster/tendbha/detail.py:84 #: backend/db_meta/api/cluster/tendispluscluster/detail.py:85 @@ -1806,11 +3153,31 @@ msgid "访问入口(主)" msgstr "访问入口(主)" #: backend/db_meta/api/cluster/pulsar/detail.py:33 +#: backend/db_meta/api/cluster/vm/detail.py:33 msgid "Bookkeeper 节点" msgstr "Bookkeeper 节点" -#: backend/db_meta/api/cluster/tendbcluster/decommission.py:80 -#: backend/db_meta/api/cluster/tendbha/decommission.py:79 +#: backend/db_meta/api/cluster/rediscluster/create.py:188 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:188 +msgid "proxy {} 未注册" +msgstr "proxy {} 未注册" + +#: backend/db_meta/api/cluster/rediscluster/create.py:192 +#: backend/db_meta/api/cluster/tendispluscluster/create.py:192 +msgid "storage {} 未注册" +msgstr "storage {} 未注册" + +#: backend/db_meta/api/cluster/redisinstance/detail.py:31 +#: backend/db_meta/api/cluster/sqlserverha/detail.py:39 +msgid "Slave 节点" +msgstr "Slave 节点" + +#: backend/db_meta/api/cluster/riak/detail.py:24 +msgid "Riak 节点" +msgstr "Riak 节点" + +#: backend/db_meta/api/cluster/tendbcluster/decommission.py:86 +#: backend/db_meta/api/cluster/tendbha/decommission.py:90 msgid "{} 与 {} 的 {} 有同步关系" msgstr "{} 与 {} 的 {} 有同步关系" @@ -1830,650 +3197,607 @@ msgstr "Spider Slave" msgid "spider_slave_entry_bind" msgstr "spider_slave_entry_bind" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:68 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:73 msgid "RemoteDB" msgstr "RemoteDB" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:72 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:77 msgid "RemoteDR" msgstr "RemoteDR" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:77 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:85 msgid "Spider 运维节点" msgstr "Spider 运维节点" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:84 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:91 msgid "controller_group" msgstr "controller_group" -#: backend/db_meta/api/cluster/tendbcluster/detail.py:84 +#: backend/db_meta/api/cluster/tendbcluster/detail.py:91 msgid "中控节点" msgstr "中控节点" -#: backend/db_meta/api/cluster/tendispluscluster/create.py:160 -msgid "proxy {} 未注册" -msgstr "proxy {} 未注册" - -#: backend/db_meta/api/cluster/tendispluscluster/create.py:164 -msgid "storage {} 未注册" -msgstr "storage {} 未注册" +#: backend/db_meta/api/cluster/tendbcluster/handler.py:314 +msgid "集群{}不具有该角色「{}」的实例" +msgstr "集群{}不具有该角色「{}」的实例" -#: backend/db_meta/api/dbha/apis.py:137 +#: backend/db_meta/api/dbha/apis.py:205 msgid "实例ip={}, port={}不存在,请检查输入参数或相关数据" msgstr "实例ip={}, port={}不存在,请检查输入参数或相关数据" -#: backend/db_meta/api/proxy_instance/apis.py:98 -msgid "proxy {} 在集群里边" -msgstr "proxy {} 在集群里边" - -#: backend/db_meta/api/proxy_instance/apis.py:102 -msgid "proxy {} 不存在" -msgstr "proxy {} 不存在" - -#: backend/db_meta/api/storage_instance/apis.py:161 -#: backend/db_services/dbbase/resources/serializers.py:49 -#: backend/ticket/builders/es/es_apply.py:29 -#: backend/ticket/builders/influxdb/influxdb_apply.py:33 -#: backend/ticket/builders/kafka/kafka_apply.py:81 -#: backend/ticket/builders/pulsar/pulsar_apply.py:33 -msgid "端口" -msgstr "端口" - -#: backend/db_meta/api/storage_instance/apis.py:162 -#: backend/db_meta/models/machine.py:25 -msgid "IP 地址" -msgstr "IP 地址" - -#: backend/db_meta/api/storage_instance/apis.py:163 -msgid "DB 模块 ID" -msgstr "DB 模块 ID" - -#: backend/db_meta/api/storage_instance/apis.py:164 -#: backend/db_services/ipchooser/serializers/base.py:32 -#: backend/db_services/ipchooser/serializers/base.py:41 -msgid "业务 ID" -msgstr "业务 ID" - -#: backend/db_meta/api/storage_instance/apis.py:166 -msgid "拓扑层级" -msgstr "拓扑层级" - -#: backend/db_meta/api/storage_instance/apis.py:167 -msgid "机器类型" -msgstr "机器类型" - -#: backend/db_meta/api/storage_instance/apis.py:168 -#: backend/db_services/dbbase/resources/serializers.py:71 -#: backend/db_services/dbbase/resources/serializers.py:84 -#: backend/ticket/serializers.py:198 -msgid "角色" -msgstr "角色" - -#: backend/db_meta/api/storage_instance/apis.py:169 -msgid "系统角色" -msgstr "系统角色" - -#: backend/db_meta/api/storage_instance/apis.py:170 -#: backend/db_meta/models/spec.py:73 backend/db_proxy/models.py:126 -#: backend/db_services/bigdata/resources/query.py:42 -#: backend/db_services/cmdb/serializers.py:31 -#: backend/db_services/cmdb/serializers.py:36 -#: backend/db_services/dbconfig/serializers.py:20 -#: backend/db_services/mysql/cluster/serializers.py:63 -#: backend/db_services/mysql/permission/authorize/serializers.py:30 -#: backend/db_services/mysql/permission/authorize/serializers.py:51 -#: backend/db_services/partition/serializers.py:21 -#: backend/db_services/partition/serializers.py:32 -#: backend/db_services/partition/serializers.py:39 -#: backend/db_services/partition/serializers.py:77 -#: backend/db_services/partition/serializers.py:90 -#: backend/db_services/partition/serializers.py:95 -#: backend/db_services/redis/resources/redis_cluster/query.py:56 -#: backend/ticket/builders/redis/redis_cluster_apply.py:36 -msgid "集群类型" -msgstr "集群类型" - -#: backend/db_meta/api/storage_instance/apis.py:171 -#: backend/db_services/bigdata/influxdb/serializers.py:19 -#: backend/db_services/dbbase/resources/serializers.py:70 -#: backend/ticket/serializers.py:67 backend/ticket/serializers.py:208 -msgid "状态" -msgstr "状态" - -#: backend/db_meta/api/storage_instance/apis.py:172 -msgid "同步后继" -msgstr "同步后继" - -#: backend/db_meta/api/storage_instance/apis.py:173 -msgid "同步上联" -msgstr "同步上联" - -#: backend/db_meta/api/storage_instance/apis.py:174 -msgid "绑定入口" -msgstr "绑定入口" - -#: backend/db_meta/api/storage_instance/apis.py:175 -msgid "接入层列表" -msgstr "接入层列表" - -#: backend/db_meta/api/storage_instance/apis.py:176 -msgid "IDC 城市 ID" -msgstr "IDC 城市 ID" - -#: backend/db_meta/api/storage_instance/apis.py:177 -#: backend/db_meta/models/city_map.py:36 -msgid "IDC 城市名" -msgstr "IDC 城市名" - -#: backend/db_meta/api/storage_instance/apis.py:178 -msgid "逻辑城市 ID" -msgstr "逻辑城市 ID" - -#: backend/db_meta/api/storage_instance/apis.py:179 -msgid "逻辑城市名" -msgstr "逻辑城市名" - -#: backend/db_meta/api/storage_instance/apis.py:180 -#: backend/db_meta/models/machine.py:36 -msgid "操作系统" -msgstr "操作系统" - -#: backend/db_meta/api/storage_instance/apis.py:181 -#: backend/db_meta/models/machine.py:37 -msgid "区域" -msgstr "区域" - -#: backend/db_meta/api/storage_instance/apis.py:182 -#: backend/db_meta/models/machine.py:38 -msgid "区域 ID" -msgstr "区域 ID" - -#: backend/db_meta/api/storage_instance/apis.py:183 -#: backend/db_meta/models/machine.py:39 -msgid "子 Zone" -msgstr "子 Zone" - -#: backend/db_meta/api/storage_instance/apis.py:184 -#: backend/db_meta/models/machine.py:40 -msgid "子 Zone ID" -msgstr "子 Zone ID" - -#: backend/db_meta/api/storage_instance/apis.py:185 -#: backend/db_meta/models/machine.py:41 -msgid "机架" -msgstr "机架" - -#: backend/db_meta/api/storage_instance/apis.py:186 -#: backend/db_meta/models/machine.py:42 -msgid "机架 ID" -msgstr "机架 ID" - -#: backend/db_meta/api/storage_instance/apis.py:187 -#: backend/db_meta/models/machine.py:43 -msgid "标准设备类型" -msgstr "标准设备类型" - -#: backend/db_meta/api/storage_instance/apis.py:188 -#: backend/db_meta/models/machine.py:44 -msgid "机房" -msgstr "机房" - -#: backend/db_meta/api/storage_instance/apis.py:189 -#: backend/db_meta/models/machine.py:45 -msgid "机房 ID" -msgstr "机房 ID" - -#: backend/db_meta/api/storage_instance/apis.py:190 -#: backend/db_meta/models/cluster.py:50 backend/db_meta/models/machine.py:46 -#: backend/db_proxy/models.py:28 backend/db_proxy/models.py:47 -#: backend/db_services/ipchooser/serializers/base.py:90 -msgid "云区域 ID" -msgstr "云区域 ID" - -#: backend/db_meta/api/storage_instance/apis.py:191 -msgid "网络设备 ID" -msgstr "网络设备 ID" - -#: backend/db_meta/enums/access_layer.py:16 -#: backend/db_meta/enums/machine_type.py:18 backend/flow/consts.py:253 -#: backend/flow/consts.py:541 backend/ticket/builders/common/constants.py:62 -#: backend/ticket/constants.py:23 +#: backend/db_meta/enums/access_layer.py:17 +#: backend/db_meta/enums/machine_type.py:19 backend/flow/consts.py:340 +#: backend/flow/consts.py:796 backend/flow/consts.py:1137 +#: backend/ticket/builders/common/constants.py:79 +#: backend/ticket/constants.py:24 msgid "proxy" msgstr "proxy" -#: backend/db_meta/enums/access_layer.py:17 backend/ticket/constants.py:22 -msgid "storage" -msgstr "storage" - -#: backend/db_meta/enums/access_layer.py:18 +#: backend/db_meta/enums/access_layer.py:19 msgid "config" msgstr "config" -#: backend/db_meta/enums/cluster_entry_role.py:17 +#: backend/db_meta/enums/cluster_entry_role.py:18 msgid "master_entry" msgstr "master_entry" -#: backend/db_meta/enums/cluster_entry_role.py:18 +#: backend/db_meta/enums/cluster_entry_role.py:19 msgid "slave_entry" msgstr "slave_entry" -#: backend/db_meta/enums/cluster_entry_type.py:16 +#: backend/db_meta/enums/cluster_entry_role.py:20 +msgid "proxy_entry" +msgstr "proxy_entry" + +#: backend/db_meta/enums/cluster_entry_role.py:21 +msgid "node_entry" +msgstr "node_entry" + +#: backend/db_meta/enums/cluster_entry_type.py:17 msgid "dns" msgstr "dns" -#: backend/db_meta/enums/cluster_entry_type.py:17 +#: backend/db_meta/enums/cluster_entry_type.py:18 backend/flow/consts.py:1083 msgid "clb" msgstr "clb" -#: backend/db_meta/enums/cluster_entry_type.py:18 +#: backend/db_meta/enums/cluster_entry_type.py:19 msgid "polaris" msgstr "polaris" -#: backend/db_meta/enums/cluster_phase.py:17 -#: backend/db_meta/enums/instance_phase.py:17 -msgid "online" -msgstr "online" +#: backend/db_meta/enums/cluster_entry_type.py:20 +msgid "clbDns" +msgstr "clbDns" #: backend/db_meta/enums/cluster_phase.py:18 #: backend/db_meta/enums/instance_phase.py:18 -msgid "offline" -msgstr "offline" +msgid "正常" +msgstr "正常" -#: backend/db_meta/enums/cluster_phase.py:21 -#: backend/db_meta/enums/instance_phase.py:21 -msgid "destroy" -msgstr "destroy" +#: backend/db_meta/enums/cluster_phase.py:19 +msgid "禁用" +msgstr "禁用" -#: backend/db_meta/enums/cluster_status.py:19 -msgid "normal" -msgstr "normal" +#: backend/db_meta/enums/cluster_phase.py:22 +#: backend/db_meta/enums/instance_phase.py:22 +msgid "销毁" +msgstr "销毁" -#: backend/db_meta/enums/cluster_status.py:20 backend/flow/consts.py:451 -msgid "ABNORMAL" -msgstr "ABNORMAL" +#: backend/db_meta/enums/cluster_phase.py:25 +msgid "scr/gcs迁移中" +msgstr "scr/gcs迁移中" -#: backend/db_meta/enums/cluster_type.py:16 -msgid "tendbsingle" -msgstr "tendbsingle" +#: backend/db_meta/enums/cluster_status.py:20 +msgid "normal" +msgstr "normal" -#: backend/db_meta/enums/cluster_type.py:17 -msgid "tendbha" -msgstr "tendbha" +#: backend/db_meta/enums/cluster_status.py:21 +msgid "abnormal" +msgstr "abnormal" -#: backend/db_meta/enums/cluster_type.py:18 backend/flow/consts.py:134 -msgid "tendbcluster" -msgstr "tendbcluster" +#: backend/db_meta/enums/cluster_status.py:23 backend/db_meta/enums/comm.py:36 +msgid "temporary" +msgstr "temporary" #: backend/db_meta/enums/cluster_type.py:20 +msgid "MySQL单节点集群" +msgstr "MySQL单节点集群" + #: backend/db_meta/enums/cluster_type.py:21 -msgid "Redis集群" -msgstr "Redis集群" +msgid "MySQL高可用集群" +msgstr "MySQL高可用集群" #: backend/db_meta/enums/cluster_type.py:22 +#: backend/iam_app/dataclass/resources.py:354 +msgid "TendbCluster集群" +msgstr "TendbCluster集群" + +#: backend/db_meta/enums/cluster_type.py:27 +#: backend/db_meta/enums/cluster_type.py:35 +msgid "RedisCluster集群" +msgstr "RedisCluster集群" + +#: backend/db_meta/enums/cluster_type.py:28 +#: backend/db_meta/enums/cluster_type.py:39 msgid "Tendisplus存储版集群" msgstr "Tendisplus存储版集群" -#: backend/db_meta/enums/cluster_type.py:23 +#: backend/db_meta/enums/cluster_type.py:29 +#: backend/db_meta/enums/cluster_type.py:40 msgid "TendisCache集群" msgstr "TendisCache集群" -#: backend/db_meta/enums/cluster_type.py:24 +#: backend/db_meta/enums/cluster_type.py:30 +#: backend/db_meta/enums/cluster_type.py:41 msgid "TendisSSD集群" msgstr "TendisSSD集群" -#: backend/db_meta/enums/cluster_type.py:25 +#: backend/db_meta/enums/cluster_type.py:31 msgid "Tendis存储版集群" msgstr "Tendis存储版集群" -#: backend/db_meta/enums/cluster_type.py:26 +#: backend/db_meta/enums/cluster_type.py:32 msgid "RedisCache主从版" msgstr "RedisCache主从版" -#: backend/db_meta/enums/cluster_type.py:27 +#: backend/db_meta/enums/cluster_type.py:33 msgid "TendisSSD主从版" msgstr "TendisSSD主从版" -#: backend/db_meta/enums/cluster_type.py:28 +#: backend/db_meta/enums/cluster_type.py:34 msgid "Tendisplus主从版" msgstr "Tendisplus主从版" -#: backend/db_meta/enums/cluster_type.py:29 -msgid "RedisCluster集群" -msgstr "RedisCluster集群" - -#: backend/db_meta/enums/cluster_type.py:30 +#: backend/db_meta/enums/cluster_type.py:36 msgid "TendisplusCluster集群" msgstr "TendisplusCluster集群" -#: backend/db_meta/enums/cluster_type.py:32 +#: backend/db_meta/enums/cluster_type.py:43 +#: backend/iam_app/dataclass/resources.py:370 msgid "ES集群" msgstr "ES集群" -#: backend/db_meta/enums/cluster_type.py:33 +#: backend/db_meta/enums/cluster_type.py:44 +#: backend/iam_app/dataclass/resources.py:386 msgid "Kafka集群" msgstr "Kafka集群" -#: backend/db_meta/enums/cluster_type.py:34 +#: backend/db_meta/enums/cluster_type.py:45 msgid "Hdfs集群" msgstr "Hdfs集群" -#: backend/db_meta/enums/cluster_type.py:35 +#: backend/db_meta/enums/cluster_type.py:46 msgid "Influxdb实例" msgstr "Influxdb实例" -#: backend/db_meta/enums/cluster_type.py:36 +#: backend/db_meta/enums/cluster_type.py:47 +#: backend/iam_app/dataclass/resources.py:402 msgid "Pulsar集群" msgstr "Pulsar集群" -#: backend/db_meta/enums/cluster_type.py:38 +#: backend/db_meta/enums/cluster_type.py:48 +msgid "Doris集群" +msgstr "Doris集群" + +#: backend/db_meta/enums/cluster_type.py:49 +msgid "vm集群" +msgstr "vm集群" + +#: backend/db_meta/enums/cluster_type.py:51 +msgid "redis监控" +msgstr "redis监控" + +#: backend/db_meta/enums/cluster_type.py:53 msgid "Mongo副本集" msgstr "Mongo副本集" -#: backend/db_meta/enums/cluster_type.py:39 +#: backend/db_meta/enums/cluster_type.py:54 msgid "Mongo分片集群" msgstr "Mongo分片集群" -#: backend/db_meta/enums/cluster_type.py:41 +#: backend/db_meta/enums/cluster_type.py:56 +#: backend/iam_app/dataclass/resources.py:410 msgid "Riak集群" msgstr "Riak集群" -#: backend/db_meta/enums/comm.py:17 backend/flow/consts.py:676 +#: backend/db_meta/enums/cluster_type.py:58 +msgid "sqlserver单节点版" +msgstr "sqlserver单节点版" + +#: backend/db_meta/enums/cluster_type.py:59 +msgid "sqlserver主从版" +msgstr "sqlserver主从版" + +#: backend/db_meta/enums/comm.py:18 backend/flow/consts.py:955 +msgid "ms" +msgstr "ms" + +#: backend/db_meta/enums/comm.py:19 msgid "sms" msgstr "sms" -#: backend/db_meta/enums/comm.py:18 backend/flow/consts.py:675 +#: backend/db_meta/enums/comm.py:20 backend/flow/consts.py:956 msgid "mms" msgstr "mms" -#: backend/db_meta/enums/comm.py:22 backend/db_meta/enums/machine_type.py:24 -#: backend/flow/consts.py:176 backend/flow/consts.py:254 +#: backend/db_meta/enums/comm.py:24 backend/db_meta/enums/machine_type.py:25 +#: backend/flow/consts.py:252 backend/flow/consts.py:341 +#: backend/flow/consts.py:1139 msgid "redis" msgstr "redis" -#: backend/db_meta/enums/comm.py:23 backend/db_meta/enums/machine_type.py:40 +#: backend/db_meta/enums/comm.py:25 backend/db_meta/enums/machine_type.py:41 +#: backend/flow/consts.py:288 msgid "mongodb" msgstr "mongodb" -#: backend/db_meta/enums/instance_inner_role.py:16 backend/flow/consts.py:542 -#: backend/flow/consts.py:554 backend/ticket/builders/common/constants.py:41 -#: backend/ticket/builders/common/constants.py:60 +#: backend/db_meta/enums/comm.py:29 backend/db_monitor/constants.py:51 +#: backend/db_monitor/constants.py:61 +msgid "custom" +msgstr "custom" + +#: backend/db_meta/enums/comm.py:30 +msgid "system" +msgstr "system" + +#: backend/db_meta/enums/comm.py:42 backend/db_meta/enums/instance_role.py:33 +msgid "Proxy" +msgstr "Proxy" + +#: backend/db_meta/enums/comm.py:43 +msgid "Backend" +msgstr "Backend" + +#: backend/db_meta/enums/extra_process_type.py:17 backend/flow/consts.py:357 +#: backend/flow/consts.py:1138 +msgid "tbinlogdumper" +msgstr "tbinlogdumper" + +#: backend/db_meta/enums/instance_inner_role.py:17 backend/flow/consts.py:797 +#: backend/flow/consts.py:810 backend/ticket/builders/common/constants.py:52 +#: backend/ticket/builders/common/constants.py:77 msgid "master" msgstr "master" -#: backend/db_meta/enums/instance_inner_role.py:17 backend/flow/consts.py:543 -#: backend/ticket/builders/common/constants.py:61 +#: backend/db_meta/enums/instance_inner_role.py:18 backend/flow/consts.py:798 +#: backend/ticket/builders/common/constants.py:78 msgid "slave" msgstr "slave" -#: backend/db_meta/enums/instance_inner_role.py:18 +#: backend/db_meta/enums/instance_inner_role.py:19 msgid "repeater" msgstr "repeater" -#: backend/db_meta/enums/instance_inner_role.py:19 -#: backend/db_meta/enums/instance_role.py:18 +#: backend/db_meta/enums/instance_inner_role.py:20 +#: backend/db_meta/enums/instance_role.py:20 msgid "orphan" msgstr "orphan" -#: backend/db_meta/enums/instance_role.py:21 -msgid "backend_master" -msgstr "backend_master" +#: backend/db_meta/enums/instance_phase.py:19 +msgid "下架" +msgstr "下架" -#: backend/db_meta/enums/instance_role.py:22 -msgid "backend_repeater" -msgstr "backend_repeater" +#: backend/db_meta/enums/instance_phase.py:24 +msgid " scr/gcs迁移中" +msgstr " scr/gcs迁移中" #: backend/db_meta/enums/instance_role.py:23 -msgid "backend_slave" -msgstr "backend_slave" +#: backend/db_meta/enums/instance_role.py:34 +msgid "Master" +msgstr "Master" -#: backend/db_meta/enums/instance_role.py:26 -msgid "remote_master" -msgstr "remote_master" +#: backend/db_meta/enums/instance_role.py:24 +msgid "Repeater" +msgstr "Repeater" -#: backend/db_meta/enums/instance_role.py:27 -msgid "remote_repeater" -msgstr "remote_repeater" +#: backend/db_meta/enums/instance_role.py:25 +#: backend/db_meta/enums/instance_role.py:35 +msgid "Slave" +msgstr "Slave" #: backend/db_meta/enums/instance_role.py:28 -msgid "remote_slave" -msgstr "remote_slave" +msgid "Remote Master" +msgstr "Remote Master" + +#: backend/db_meta/enums/instance_role.py:29 +msgid "Remote Repeater" +msgstr "Remote Repeater" #: backend/db_meta/enums/instance_role.py:30 -msgid "redis_proxy" -msgstr "redis_proxy" +msgid "Remote Slave" +msgstr "Remote Slave" -#: backend/db_meta/enums/instance_role.py:31 -msgid "redis_master" -msgstr "redis_master" +#: backend/db_meta/enums/instance_role.py:44 +#: backend/db_meta/enums/instance_role.py:59 +msgid "Broker" +msgstr "Broker" -#: backend/db_meta/enums/instance_role.py:32 -msgid "redis_slave" -msgstr "redis_slave" +#: backend/db_meta/enums/instance_role.py:45 +#: backend/db_meta/enums/instance_role.py:49 +#: backend/db_meta/enums/instance_role.py:58 +msgid "Zookeeper" +msgstr "Zookeeper" -#: backend/db_meta/enums/instance_role.py:34 -msgid "es_datanode_hot" -msgstr "es_datanode_hot" +#: backend/db_meta/enums/instance_role.py:48 +msgid "NameNode" +msgstr "NameNode" -#: backend/db_meta/enums/instance_role.py:35 -msgid "es_datanode_cold" -msgstr "es_datanode_cold" +#: backend/db_meta/enums/instance_role.py:50 +msgid "Journalnode" +msgstr "Journalnode" -#: backend/db_meta/enums/instance_role.py:36 -#: backend/db_meta/enums/machine_type.py:30 -msgid "es_master" -msgstr "es_master" +#: backend/db_meta/enums/instance_role.py:51 +msgid "DataNode" +msgstr "DataNode" -#: backend/db_meta/enums/instance_role.py:37 -#: backend/db_meta/enums/machine_type.py:31 -msgid "es_client" -msgstr "es_client" +#: backend/db_meta/enums/instance_role.py:54 +#: backend/db_meta/enums/machine_type.py:44 backend/flow/consts.py:267 +#: backend/flow/consts.py:351 +msgid "influxdb" +msgstr "influxdb" -#: backend/db_meta/enums/instance_role.py:39 -#: backend/db_meta/enums/machine_type.py:33 backend/flow/consts.py:609 -#: backend/ticket/builders/common/constants.py:51 -#: backend/ticket/builders/common/constants.py:56 -msgid "broker" -msgstr "broker" +#: backend/db_meta/enums/instance_role.py:57 +msgid "Bookkeeper" +msgstr "Bookkeeper" -#: backend/db_meta/enums/instance_role.py:40 -#: backend/db_meta/enums/machine_type.py:34 backend/flow/consts.py:603 -#: backend/flow/consts.py:610 backend/ticket/builders/common/constants.py:47 -#: backend/ticket/builders/common/constants.py:50 -#: backend/ticket/builders/common/constants.py:55 -msgid "zookeeper" -msgstr "zookeeper" +#: backend/db_meta/enums/instance_role.py:64 +msgid "Follower" +msgstr "Follower" -#: backend/db_meta/enums/instance_role.py:42 -msgid "hdfs_namenode" -msgstr "hdfs_namenode" +#: backend/db_meta/enums/instance_role.py:65 +msgid "Observer" +msgstr "Observer" -#: backend/db_meta/enums/instance_role.py:43 -msgid "hdfs_zookeeper" -msgstr "hdfs_zookeeper" +#: backend/db_meta/enums/instance_role.py:68 +msgid "mongo_m1" +msgstr "mongo_m1" -#: backend/db_meta/enums/instance_role.py:44 -msgid "hdfs_journalnode" -msgstr "hdfs_journalnode" +#: backend/db_meta/enums/instance_role.py:69 +msgid "mongo_m2" +msgstr "mongo_m2" -#: backend/db_meta/enums/instance_role.py:45 -#: backend/db_meta/enums/machine_type.py:37 -msgid "hdfs_datanode" -msgstr "hdfs_datanode" +#: backend/db_meta/enums/instance_role.py:70 +msgid "mongo_m3" +msgstr "mongo_m3" -#: backend/db_meta/enums/instance_role.py:47 -#: backend/db_meta/enums/machine_type.py:42 backend/flow/consts.py:189 -#: backend/flow/consts.py:262 -msgid "influxdb" -msgstr "influxdb" +#: backend/db_meta/enums/instance_role.py:71 +msgid "mongo_m4" +msgstr "mongo_m4" -#: backend/db_meta/enums/instance_role.py:49 -#: backend/db_meta/enums/machine_type.py:45 -msgid "pulsar_bookkeeper" -msgstr "pulsar_bookkeeper" - -#: backend/db_meta/enums/instance_role.py:50 -#: backend/db_meta/enums/machine_type.py:44 -msgid "pulsar_zookeeper" -msgstr "pulsar_zookeeper" - -#: backend/db_meta/enums/instance_role.py:51 -#: backend/db_meta/enums/machine_type.py:46 -msgid "pulsar_broker" -msgstr "pulsar_broker" - -#: backend/db_meta/enums/instance_role.py:53 -msgid "mongo_m1" -msgstr "mongo_m1" - -#: backend/db_meta/enums/instance_role.py:54 -msgid "mongo_m2" -msgstr "mongo_m2" - -#: backend/db_meta/enums/instance_role.py:55 -msgid "mongo_m3" -msgstr "mongo_m3" - -#: backend/db_meta/enums/instance_role.py:56 -msgid "mongo_m4" -msgstr "mongo_m4" - -#: backend/db_meta/enums/instance_role.py:57 +#: backend/db_meta/enums/instance_role.py:72 msgid "mongo_m5" msgstr "mongo_m5" -#: backend/db_meta/enums/instance_role.py:58 +#: backend/db_meta/enums/instance_role.py:73 msgid "mongo_m6" msgstr "mongo_m6" -#: backend/db_meta/enums/instance_role.py:59 +#: backend/db_meta/enums/instance_role.py:74 msgid "mongo_m7" msgstr "mongo_m7" -#: backend/db_meta/enums/instance_role.py:60 +#: backend/db_meta/enums/instance_role.py:75 msgid "mongo_m8" msgstr "mongo_m8" -#: backend/db_meta/enums/instance_role.py:61 +#: backend/db_meta/enums/instance_role.py:76 msgid "mongo_m9" msgstr "mongo_m9" -#: backend/db_meta/enums/instance_role.py:62 +#: backend/db_meta/enums/instance_role.py:77 msgid "mongo_m10" msgstr "mongo_m10" -#: backend/db_meta/enums/instance_role.py:63 +#: backend/db_meta/enums/instance_role.py:78 msgid "mongo_backup" msgstr "mongo_backup" -#: backend/db_meta/enums/instance_role.py:65 -msgid "riak_node" -msgstr "riak_node" +#: backend/db_meta/enums/instance_role.py:84 +#: backend/db_meta/enums/machine_type.py:59 backend/flow/consts.py:1509 +msgid "vmstorage" +msgstr "vmstorage" -#: backend/db_meta/enums/instance_role.py:70 +#: backend/db_meta/enums/instance_role.py:85 +#: backend/db_meta/enums/machine_type.py:60 backend/flow/consts.py:1507 +msgid "vminsert" +msgstr "vminsert" + +#: backend/db_meta/enums/instance_role.py:86 +#: backend/db_meta/enums/machine_type.py:61 backend/flow/consts.py:1508 +msgid "vmselect" +msgstr "vmselect" + +#: backend/db_meta/enums/instance_role.py:87 +#: backend/db_meta/enums/machine_type.py:62 backend/flow/consts.py:1506 +msgid "vmauth" +msgstr "vmauth" + +#: backend/db_meta/enums/instance_role.py:92 msgid "spider_master" msgstr "spider_master" -#: backend/db_meta/enums/instance_role.py:72 +#: backend/db_meta/enums/instance_role.py:94 msgid "spider_slave" msgstr "spider_slave" -#: backend/db_meta/enums/instance_role.py:74 +#: backend/db_meta/enums/instance_role.py:96 backend/flow/consts.py:1079 msgid "spider_mnt" msgstr "spider_mnt" -#: backend/db_meta/enums/instance_status.py:16 backend/db_proxy/constants.py:35 -#: backend/flow/consts.py:464 +#: backend/db_meta/enums/instance_role.py:97 +msgid "spider_slave_mnt" +msgstr "spider_slave_mnt" + +#: backend/db_meta/enums/instance_role.py:99 +msgid "spider_ctl" +msgstr "spider_ctl" + +#: backend/db_meta/enums/instance_status.py:17 backend/db_proxy/constants.py:42 +#: backend/flow/consts.py:687 msgid "running" msgstr "running" -#: backend/db_meta/enums/instance_status.py:17 backend/db_proxy/constants.py:36 -#: backend/flow/consts.py:466 +#: backend/db_meta/enums/instance_status.py:18 backend/db_proxy/constants.py:43 +#: backend/flow/consts.py:689 msgid "unavailable" msgstr "unavailable" -#: backend/db_meta/enums/instance_status.py:18 backend/db_proxy/constants.py:37 +#: backend/db_meta/enums/instance_status.py:19 backend/db_proxy/constants.py:44 msgid "restoring" msgstr "restoring" -#: backend/db_meta/enums/machine_type.py:16 backend/flow/consts.py:265 -#: backend/flow/consts.py:748 -msgid "spider" -msgstr "spider" - -#: backend/db_meta/enums/machine_type.py:17 +#: backend/db_meta/enums/machine_type.py:18 backend/flow/consts.py:1078 msgid "remote" msgstr "remote" -#: backend/db_meta/enums/machine_type.py:19 +#: backend/db_meta/enums/machine_type.py:20 msgid "backend" msgstr "backend" -#: backend/db_meta/enums/machine_type.py:20 backend/db_monitor/constants.py:28 +#: backend/db_meta/enums/machine_type.py:21 backend/db_monitor/constants.py:31 msgid "single" msgstr "single" -#: backend/db_meta/enums/machine_type.py:22 backend/flow/consts.py:183 -#: backend/flow/consts.py:257 +#: backend/db_meta/enums/machine_type.py:23 backend/flow/consts.py:261 +#: backend/flow/consts.py:346 msgid "predixy" msgstr "predixy" -#: backend/db_meta/enums/machine_type.py:23 backend/flow/consts.py:182 -#: backend/flow/consts.py:256 +#: backend/db_meta/enums/machine_type.py:24 backend/flow/consts.py:260 +#: backend/flow/consts.py:345 msgid "twemproxy" msgstr "twemproxy" -#: backend/db_meta/enums/machine_type.py:25 +#: backend/db_meta/enums/machine_type.py:26 msgid "tendiscache" msgstr "tendiscache" -#: backend/db_meta/enums/machine_type.py:26 backend/flow/consts.py:178 +#: backend/db_meta/enums/machine_type.py:27 backend/flow/consts.py:254 +#: backend/flow/consts.py:344 msgid "tendisssd" msgstr "tendisssd" -#: backend/db_meta/enums/machine_type.py:27 backend/flow/consts.py:177 +#: backend/db_meta/enums/machine_type.py:28 backend/flow/consts.py:253 +#: backend/flow/consts.py:343 msgid "tendisplus" msgstr "tendisplus" -#: backend/db_meta/enums/machine_type.py:29 +#: backend/db_meta/enums/machine_type.py:30 msgid "es_datanode" msgstr "es_datanode" -#: backend/db_meta/enums/machine_type.py:36 +#: backend/db_meta/enums/machine_type.py:31 +msgid "es_master" +msgstr "es_master" + +#: backend/db_meta/enums/machine_type.py:32 +msgid "es_client" +msgstr "es_client" + +#: backend/db_meta/enums/machine_type.py:34 backend/flow/consts.py:865 +#: backend/flow/consts.py:1055 backend/ticket/builders/common/constants.py:62 +#: backend/ticket/builders/common/constants.py:67 +msgid "broker" +msgstr "broker" + +#: backend/db_meta/enums/machine_type.py:35 backend/flow/consts.py:859 +#: backend/flow/consts.py:866 backend/flow/consts.py:1054 +#: backend/ticket/builders/common/constants.py:58 +#: backend/ticket/builders/common/constants.py:61 +#: backend/ticket/builders/common/constants.py:66 +msgid "zookeeper" +msgstr "zookeeper" + +#: backend/db_meta/enums/machine_type.py:37 msgid "hdfs_master" msgstr "hdfs_master" -#: backend/db_meta/enums/machine_type.py:39 +#: backend/db_meta/enums/machine_type.py:38 +msgid "hdfs_datanode" +msgstr "hdfs_datanode" + +#: backend/db_meta/enums/machine_type.py:40 backend/flow/consts.py:1189 +#: backend/flow/consts.py:1431 backend/flow/consts.py:1461 msgid "mongos" msgstr "mongos" -#: backend/db_meta/enums/machine_type.py:41 +#: backend/db_meta/enums/machine_type.py:42 msgid "mongo_config" msgstr "mongo_config" -#: backend/db_meta/enums/machine_type.py:48 backend/flow/consts.py:204 -#: backend/flow/consts.py:267 +#: backend/db_meta/enums/machine_type.py:46 +msgid "pulsar_zookeeper" +msgstr "pulsar_zookeeper" + +#: backend/db_meta/enums/machine_type.py:47 +msgid "pulsar_bookkeeper" +msgstr "pulsar_bookkeeper" + +#: backend/db_meta/enums/machine_type.py:48 +msgid "pulsar_broker" +msgstr "pulsar_broker" + +#: backend/db_meta/enums/machine_type.py:50 backend/flow/consts.py:282 +#: backend/flow/consts.py:356 msgid "riak" msgstr "riak" +#: backend/db_meta/enums/machine_type.py:52 +msgid "doris_backend" +msgstr "doris_backend" + +#: backend/db_meta/enums/machine_type.py:53 +msgid "doris_follower" +msgstr "doris_follower" + +#: backend/db_meta/enums/machine_type.py:54 +msgid "doris_observer" +msgstr "doris_observer" + +#: backend/db_meta/enums/machine_type.py:56 +msgid "sqlserver_single" +msgstr "sqlserver_single" + +#: backend/db_meta/enums/machine_type.py:57 +msgid "sqlserver_ha" +msgstr "sqlserver_ha" + #: backend/db_meta/exceptions.py:18 msgid "DBMeta模块异常" msgstr "DBMeta模块异常" #: backend/db_meta/exceptions.py:23 backend/db_meta/exceptions.py:101 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:23 #: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:23 #: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:22 #: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:22 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:22 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:22 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:23 msgid "通用异常" msgstr "通用异常" #: backend/db_meta/exceptions.py:24 backend/db_meta/exceptions.py:102 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:24 #: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:24 #: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:35 #: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:24 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:35 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:23 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:29 #: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:47 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:53 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:59 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:65 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:23 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:24 #, python-brace-format msgid "{message}" msgstr "{message}" @@ -2483,8 +3807,8 @@ msgid "新建TenDBHA前置检查异常" msgstr "新建TenDBHA前置检查异常" #: backend/db_meta/exceptions.py:30 backend/db_meta/exceptions.py:66 -#: backend/db_services/redis_dts/exceptions.py:24 -#: backend/db_services/redis_dts/exceptions.py:30 +#: backend/db_services/redis/redis_dts/exceptions.py:24 +#: backend/db_services/redis/redis_dts/exceptions.py:30 #: backend/flow/engine/exceptions.py:33 #: backend/flow/utils/mysql/db_table_filter/exception.py:24 #, python-brace-format @@ -2586,14 +3910,30 @@ msgid "集群访问入口 {entry} 不存在" msgstr "集群访问入口 {entry} 不存在" #: backend/db_meta/exceptions.py:107 +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:57 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:94 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:67 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:84 +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:69 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:70 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:63 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:53 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:40 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:72 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:86 +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:117 +#: backend/flow/plugins/components/collections/common/drop_random_job_user.py:151 +#: backend/flow/plugins/components/collections/sqlserver/create_random_job_user.py:82 +#: backend/flow/plugins/components/collections/sqlserver/drop_random_job_user.py:67 msgid "集群不存在" msgstr "集群不存在" #: backend/db_meta/exceptions.py:108 -msgid "" -"集群类型:{cluster_type}, ID:{cluster_id}, immute_domain:{immute_domain} 不存" -"在" -msgstr "集群类型:{cluster_type}, ID:{cluster_id}, immute_domain:{immute_domain} 不存在" +msgid "集群类型:{cluster_type}, ID:{cluster_id}, 域名:{immute_domain} 不存在" +msgstr "集群类型:{cluster_type}, ID:{cluster_id}, 域名:{immute_domain} 不存在" #: backend/db_meta/exceptions.py:113 msgid "实例不存在" @@ -2631,6 +3971,7 @@ msgid "集群不支持分片" msgstr "集群不支持分片" #: backend/db_meta/exceptions.py:132 +#, python-brace-format msgid "集群类型:{cluster_type}, ID:{cluster_id} 没有数据分片逻辑" msgstr "集群类型:{cluster_type}, ID:{cluster_id} 没有数据分片逻辑" @@ -2647,168 +3988,267 @@ msgid "集群 proxy 无附加信息" msgstr "集群 proxy 无附加信息" #: backend/db_meta/exceptions.py:144 +#, python-brace-format msgid "集群类型:{cluster_type} proxy 无附加信息" msgstr "集群类型:{cluster_type} proxy 无附加信息" #: backend/db_meta/exceptions.py:149 -msgid "部署方案不匹配" -msgstr "部署方案不匹配" - -#: backend/db_meta/exceptions.py:150 -msgid "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" -msgstr "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" - -#: backend/db_meta/exceptions.py:155 msgid "部署方案使用中" msgstr "部署方案使用中" -#: backend/db_meta/exceptions.py:156 +#: backend/db_meta/exceptions.py:150 #, python-brace-format msgid "部署方案:{name} 被 {ref_cnt} 个集群引用" msgstr "部署方案:{name} 被 {ref_cnt} 个集群引用" -#: backend/db_meta/exceptions.py:161 +#: backend/db_meta/exceptions.py:155 msgid "访问入口请求转发和IP绑定混用" msgstr "访问入口请求转发和IP绑定混用" -#: backend/db_meta/exceptions.py:162 +#: backend/db_meta/exceptions.py:156 #, python-brace-format msgid "" "访问入口 {entry} 绑定到 {bind_cnt} 台机器, 转发到 {forward_to} 不能同时存在" msgstr "" "访问入口 {entry} 绑定到 {bind_cnt} 台机器, 转发到 {forward_to} 不能同时存在" -#: backend/db_meta/exceptions.py:167 +#: backend/db_meta/exceptions.py:161 msgid "访问入口未绑定" msgstr "访问入口未绑定" -#: backend/db_meta/exceptions.py:168 +#: backend/db_meta/exceptions.py:162 +#, python-brace-format msgid "访问入口 {entry} 未绑定到 IP" msgstr "访问入口 {entry} 未绑定到 IP" -#: backend/db_meta/models/app.py:29 -msgid "业务的 cmdb id" -msgstr "业务的 cmdb id" - -#: backend/db_meta/models/app.py:30 -msgid "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" -msgstr "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" - -#: backend/db_meta/models/app.py:37 backend/db_services/cmdb/serializers.py:20 +#: backend/db_meta/models/app.py:27 backend/db_services/cmdb/serializers.py:38 msgid "业务英文名" msgstr "业务英文名" -#: backend/db_meta/models/app.py:38 +#: backend/db_meta/models/app.py:28 msgid "业务中文名" msgstr "业务中文名" -#: backend/db_meta/models/app.py:39 +#: backend/db_meta/models/app.py:29 msgid "语言" msgstr "语言" -#: backend/db_meta/models/app.py:40 +#: backend/db_meta/models/app.py:30 msgid "时区" msgstr "时区" -#: backend/db_meta/models/app.py:41 +#: backend/db_meta/models/app.py:31 backend/db_monitor/mock_data.py:25 msgid "运维人员" msgstr "运维人员" -#: backend/db_meta/models/app.py:44 backend/db_meta/models/app.py:45 -msgid "CMDB业务信息缓存表" -msgstr "CMDB业务信息缓存表" +#: backend/db_meta/models/app.py:34 +msgid "CMDB业务信息缓存表(AppCache)" +msgstr "CMDB业务信息缓存表(AppCache)" + +#: backend/db_meta/models/city_map.py:30 +msgid "逻辑城市表(LogicalCity)" +msgstr "逻辑城市表(LogicalCity)" + +#: backend/db_meta/models/city_map.py:39 +msgid "IDC 城市名" +msgstr "IDC 城市名" + +#: backend/db_meta/models/city_map.py:46 +msgid "蓝鲸城市表(BKCity)" +msgstr "蓝鲸城市表(BKCity)" -#: backend/db_meta/models/cluster.py:41 +#: backend/db_meta/models/cluster.py:56 msgid "集群英文名" msgstr "集群英文名" -#: backend/db_meta/models/cluster.py:42 -#: backend/db_services/bigdata/resources/query.py:41 -#: backend/db_services/redis/resources/redis_cluster/query.py:55 +#: backend/db_meta/models/cluster.py:57 +#: backend/db_services/bigdata/resources/query.py:39 +#: backend/db_services/dbbase/resources/query.py:85 +#: backend/db_services/dbbase/resources/query.py:161 +#: backend/db_services/redis/resources/redis_cluster/query.py:59 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:28 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:37 msgid "集群别名" msgstr "集群别名" -#: backend/db_meta/models/cluster.py:47 +#: backend/db_meta/models/cluster.py:62 +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:13 msgid "主版本号" msgstr "主版本号" -#: backend/db_meta/models/cluster.py:51 +#: backend/db_meta/models/cluster.py:65 backend/db_meta/models/machine.py:48 +#: backend/db_proxy/models.py:29 backend/db_proxy/models.py:48 +#: backend/db_services/dbbase/resources/query.py:153 +#: backend/db_services/ipchooser/serializers/base.py:90 +#: backend/db_services/redis/autofix/models.py:24 +msgid "云区域 ID" +msgstr "云区域 ID" + +#: backend/db_meta/models/cluster.py:66 +#: backend/db_services/dbbase/resources/query.py:90 msgid "地域" msgstr "地域" -#: backend/db_meta/models/cluster.py:52 +#: backend/db_meta/models/cluster.py:68 +msgid "容灾要求" +msgstr "容灾要求" + +#: backend/db_meta/models/cluster.py:70 msgid "集群所在的时区" msgstr "集群所在的时区" -#: backend/db_meta/models/cluster.py:53 -msgid "部署方法ID" -msgstr "部署方法ID" +#: backend/db_meta/models/cluster.py:75 +msgid "集群(Cluster)" +msgstr "集群(Cluster)" -#: backend/db_meta/models/cluster.py:95 -msgid "当前操作「{}」与集群{}的操作「{}」存在执行互斥" -msgstr "当前操作「{}」与集群{}的操作「{}」存在执行互斥" +#: backend/db_meta/models/cluster.py:150 +msgid "当前操作「{}」与集群(id:{})的操作「{}」存在执行互斥" +msgstr "当前操作「{}」与集群(id:{})的操作「{}」存在执行互斥" -#: backend/db_meta/models/cluster.py:103 +#: backend/db_meta/models/cluster.py:158 msgid "集群运行状态异常,请检查!" msgstr "集群运行状态异常,请检查!" -#: backend/db_meta/models/cluster.py:106 +#: backend/db_meta/models/cluster.py:161 msgid "集群已被禁用,请先启用!" msgstr "集群已被禁用,请先启用!" -#: backend/db_meta/models/cluster.py:152 -msgid "{} 未实现 status flag" -msgstr "{} 未实现 status flag" +#: backend/db_meta/models/cluster.py:231 +msgid "{} 未实现 status flag, 认为实例异常会导致集群异常" +msgstr "{} 未实现 status flag, 认为实例异常会导致集群异常" -#: backend/db_meta/models/cluster.py:172 +#: backend/db_meta/models/cluster.py:252 msgid "{} 未实现 main_storage_instance" msgstr "{} 未实现 main_storage_instance" -#: backend/db_meta/models/cluster.py:196 +#: backend/db_meta/models/cluster.py:300 +msgid "无法访问集群[]的访问端口,请检查实例信息" +msgstr "无法访问集群[]的访问端口,请检查实例信息" + +#: backend/db_meta/models/cluster.py:362 msgid "{} 类型集群没有中控节点" msgstr "{} 类型集群没有中控节点" -#: backend/db_meta/models/cluster.py:216 -msgid "find primary show slave status failed: {}" -msgstr "find primary show slave status failed: {}" +#: backend/db_meta/models/cluster.py:382 backend/db_meta/models/cluster.py:465 +msgid "get primary failed: {}" +msgstr "get primary failed: {}" + +#: backend/db_meta/models/cluster.py:440 +msgid "集群id:{} {} 类型集群没有中控节点" +msgstr "集群id:{} {} 类型集群没有中控节点" + +#: backend/db_meta/models/cluster.py:484 +msgid "屏蔽开始时间" +msgstr "屏蔽开始时间" + +#: backend/db_meta/models/cluster.py:485 +msgid "屏蔽结束时间" +msgstr "屏蔽结束时间" -#: backend/db_meta/models/cluster_monitor.py:204 -#: backend/db_meta/models/cluster_monitor.py:205 -msgid "业务监控拓扑" -msgstr "业务监控拓扑" +#: backend/db_meta/models/cluster_entry.py:54 +msgid "集群访问入口(ClusterEntry)" +msgstr "集群访问入口(ClusterEntry)" -#: backend/db_meta/models/cluster_monitor.py:217 +#: backend/db_meta/models/cluster_monitor.py:149 +#: backend/db_meta/models/cluster_monitor.py:150 +msgid "业务监控拓扑(AppMonitorTopo)" +msgstr "业务监控拓扑(AppMonitorTopo)" + +#: backend/db_meta/models/cluster_monitor.py:277 msgid "实例ID,兼容单实例存储组件influxdb" msgstr "实例ID,兼容单实例存储组件influxdb" -#: backend/db_meta/models/cluster_monitor.py:223 -#: backend/db_meta/models/cluster_monitor.py:224 -msgid "CMDB模块映射" -msgstr "CMDB模块映射" +#: backend/db_meta/models/cluster_monitor.py:283 +#: backend/db_meta/models/cluster_monitor.py:284 +msgid "CMDB模块映射(ClusterMonitorTopo)" +msgstr "CMDB模块映射(ClusterMonitorTopo)" + +#: backend/db_meta/models/cluster_monitor.py:295 +#: backend/db_meta/models/cluster_monitor.py:296 +msgid "同步失败的IP(SyncFailedMachine)" +msgstr "同步失败的IP(SyncFailedMachine)" + +#: backend/db_meta/models/db_module.py:31 +msgid "dbmodule 别名,用于生成域名" +msgstr "dbmodule 别名,用于生成域名" + +#: backend/db_meta/models/db_module.py:36 +msgid "DB模块(DBModule)" +msgstr "DB模块(DBModule)" + +#: backend/db_meta/models/extra_process.py:32 +#: backend/db_meta/models/sqlserver_dts.py:54 +#: backend/db_services/mysql/dumper/models.py:26 +msgid "关联的业务id,对应cmdb" +msgstr "关联的业务id,对应cmdb" + +#: backend/db_meta/models/extra_process.py:33 +msgid "关联的cluster_id" +msgstr "关联的cluster_id" + +#: backend/db_meta/models/extra_process.py:34 +msgid "云区域 ID,对应cmdb" +msgstr "云区域 ID,对应cmdb" + +#: backend/db_meta/models/extra_process.py:35 +msgid "服务实例id,对应cmdb" +msgstr "服务实例id,对应cmdb" + +#: backend/db_meta/models/extra_process.py:36 +#: backend/db_meta/models/machine.py:30 +msgid "IP 地址" +msgstr "IP 地址" + +#: backend/db_meta/models/extra_process.py:38 +msgid "进程类型" +msgstr "进程类型" + +#: backend/db_meta/models/extra_process.py:40 +#: backend/db_meta/models/instance.py:140 +#: backend/db_meta/models/instance.py:188 backend/db_package/models.py:28 +#: backend/ticket/builders/common/bigdata.py:122 +#: backend/ticket/builders/influxdb/influxdb_apply.py:37 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:41 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:38 +#: backend/ticket/builders/redis/redis_cluster_apply.py:38 +#: backend/ticket/builders/redis/redis_instance_apply.py:43 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:46 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:53 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:56 +msgid "版本号" +msgstr "版本号" + +#: backend/db_meta/models/extra_process.py:41 +msgid "进程监听端口" +msgstr "进程监听端口" -#: backend/db_meta/models/cluster_monitor.py:234 -#: backend/db_meta/models/cluster_monitor.py:235 -msgid "同步失败的IP" -msgstr "同步失败的IP" +#: backend/db_meta/models/extra_process.py:43 +msgid "进程的定制化属性" +msgstr "进程的定制化属性" + +#: backend/db_meta/models/extra_process.py:46 +msgid "附属进程实例(ExtraProcessInstance)" +msgstr "附属进程实例(ExtraProcessInstance)" #: backend/db_meta/models/group.py:23 msgid "分组名" msgstr "分组名" #: backend/db_meta/models/group.py:26 backend/db_meta/models/group.py:27 -msgid "分组表" -msgstr "分组表" +msgid "分组表(Group)" +msgstr "分组表(Group)" #: backend/db_meta/models/group.py:34 #: backend/db_services/bigdata/influxdb/serializers.py:20 -#: backend/ticket/builders/influxdb/influxdb_apply.py:34 +#: backend/ticket/builders/influxdb/influxdb_apply.py:40 msgid "分组ID" msgstr "分组ID" #: backend/db_meta/models/group.py:35 -#: backend/ticket/builders/common/bigdata.py:209 -#: backend/ticket/builders/common/bigdata.py:275 -#: backend/ticket/models/ticket.py:300 backend/ticket/serializers.py:225 +#: backend/db_services/dbresource/serializers.py:333 +#: backend/ticket/builders/common/bigdata.py:225 +#: backend/ticket/builders/common/bigdata.py:303 +#: backend/ticket/models/ticket.py:395 backend/ticket/serializers.py:282 msgid "实例ID" msgstr "实例ID" @@ -2816,282 +4256,1066 @@ msgstr "实例ID" msgid "分组和实例关系绑定表" msgstr "分组和实例关系绑定表" -#: backend/db_meta/models/instance.py:52 +#: backend/db_meta/models/instance.py:82 msgid "实例结构和状态变更中,请稍后!" msgstr "实例结构和状态变更中,请稍后!" -#: backend/db_meta/models/instance.py:55 +#: backend/db_meta/models/instance.py:85 msgid "实例运行状态异常,请检查!" msgstr "实例运行状态异常,请检查!" -#: backend/db_meta/models/instance.py:83 backend/db_meta/models/instance.py:156 -#: backend/db_package/models.py:26 -#: backend/ticket/builders/common/bigdata.py:115 -#: backend/ticket/builders/influxdb/influxdb_apply.py:31 -#: backend/ticket/builders/redis/redis_cluster_apply.py:37 -msgid "版本号" -msgstr "版本号" - -#: backend/db_meta/models/instance.py:100 -#: backend/db_meta/models/instance.py:174 +#: backend/db_meta/models/instance.py:157 +#: backend/db_meta/models/instance.py:207 msgid "实例所在的时区" msgstr "实例所在的时区" -#: backend/db_meta/models/instance.py:101 -#: backend/db_meta/models/instance.py:175 +#: backend/db_meta/models/instance.py:158 +#: backend/db_meta/models/instance.py:208 msgid "对应在cc的服务实例的id" msgstr "对应在cc的服务实例的id" -#: backend/db_meta/models/instance.py:102 +#: backend/db_meta/models/instance.py:159 msgid "多 slave 的备选标志" msgstr "多 slave 的备选标志" -#: backend/db_meta/models/machine.py:48 +#: backend/db_meta/models/instance.py:162 +msgid "存储实例(StorageInstance)" +msgstr "存储实例(StorageInstance)" + +#: backend/db_meta/models/instance.py:211 +msgid "代理实例(ProxyInstance)" +msgstr "代理实例(ProxyInstance)" + +#: backend/db_meta/models/machine.py:38 +msgid "操作系统" +msgstr "操作系统" + +#: backend/db_meta/models/machine.py:39 +msgid "区域" +msgstr "区域" + +#: backend/db_meta/models/machine.py:40 +msgid "区域 ID" +msgstr "区域 ID" + +#: backend/db_meta/models/machine.py:41 +msgid "子 Zone" +msgstr "子 Zone" + +#: backend/db_meta/models/machine.py:42 +msgid "子 Zone ID" +msgstr "子 Zone ID" + +#: backend/db_meta/models/machine.py:43 +msgid "机架" +msgstr "机架" + +#: backend/db_meta/models/machine.py:44 +msgid "机架 ID" +msgstr "机架 ID" + +#: backend/db_meta/models/machine.py:45 +msgid "标准设备类型" +msgstr "标准设备类型" + +#: backend/db_meta/models/machine.py:46 +#: backend/db_services/dbbase/resources/query.py:158 +msgid "机房" +msgstr "机房" + +#: backend/db_meta/models/machine.py:47 +msgid "机房 ID" +msgstr "机房 ID" + +#: backend/db_meta/models/machine.py:49 +msgid "Agent ID" +msgstr "Agent ID" + +#: backend/db_meta/models/machine.py:51 msgid "虚拟规格ID" msgstr "虚拟规格ID" -#: backend/db_meta/models/machine.py:49 +#: backend/db_meta/models/machine.py:52 msgid "当前的虚拟规格配置" msgstr "当前的虚拟规格配置" -#: backend/db_meta/models/spec.py:26 +#: backend/db_meta/models/machine.py:53 +msgid "机器采集的系统信息" +msgstr "机器采集的系统信息" + +#: backend/db_meta/models/machine.py:57 +msgid "机器主机(Machine)" +msgstr "机器主机(Machine)" + +#: backend/db_meta/models/spec.py:35 msgid "虚拟规格名称" msgstr "虚拟规格名称" -#: backend/db_meta/models/spec.py:28 +#: backend/db_meta/models/spec.py:37 msgid "集群类型:MySQL、Proxy、Spider" msgstr "集群类型:MySQL、Proxy、Spider" -#: backend/db_meta/models/spec.py:30 +#: backend/db_meta/models/spec.py:39 msgid "机器规格类型" msgstr "机器规格类型" -#: backend/db_meta/models/spec.py:31 backend/db_meta/models/spec.py:93 +#: backend/db_meta/models/spec.py:40 +msgid "cpu规格描述:{\"min\":1,\"max\":10}" +msgstr "cpu规格描述:{\"min\":1,\"max\":10}" + +#: backend/db_meta/models/spec.py:41 +msgid "mem规格描述:{\"min\":100,\"max\":1000}" +msgstr "mem规格描述:{\"min\":100,\"max\":1000}" + +#: backend/db_meta/models/spec.py:42 +msgid "实际机器机型: [\"class1\",\"class2\"]" +msgstr "实际机器机型: [\"class1\",\"class2\"]" + +#: backend/db_meta/models/spec.py:44 +msgid "" +"存储磁盘需求配置:[{\"mount_point\":\"/data\",\"size\":500,\"type\":\"ssd\"}]" +msgstr "存储磁盘需求配置:[{\"mount_point\":\"/data\",\"size\":500,\"type\":\"ssd\"}]" + +#: backend/db_meta/models/spec.py:46 backend/db_meta/models/spec.py:255 +msgid "资源规格描述" +msgstr "资源规格描述" + +#: backend/db_meta/models/spec.py:47 backend/db_monitor/models/alarm.py:241 +#: backend/db_monitor/models/alarm.py:351 +#: backend/db_monitor/models/alarm.py:371 backend/db_monitor/views/policy.py:52 +#: backend/db_package/models.py:40 +#: backend/db_services/dbresource/serializers.py:317 +msgid "是否启用" +msgstr "是否启用" + +#: backend/db_meta/models/spec.py:49 +msgid "实例数(es专属)" +msgstr "实例数(es专属)" + +#: backend/db_meta/models/spec.py:51 +msgid "qps规格描述:{\"min\": 1, \"max\": 100}" +msgstr "qps规格描述:{\"min\": 1, \"max\": 100}" + +#: backend/db_meta/models/spec.py:54 +msgid "资源规格(Spec)" +msgstr "资源规格(Spec)" + +#: backend/db_meta/models/spec.py:251 msgid "cpu规格描述:{'min':1,'max':10}" msgstr "cpu规格描述:{'min':1,'max':10}" -#: backend/db_meta/models/spec.py:32 backend/db_meta/models/spec.py:94 +#: backend/db_meta/models/spec.py:252 msgid "mem规格描述:{'min':100,'max':1000}" msgstr "mem规格描述:{'min':100,'max':1000}" -#: backend/db_meta/models/spec.py:33 backend/db_meta/models/spec.py:95 +#: backend/db_meta/models/spec.py:253 msgid "实际机器机型: ['class1','class2'] " msgstr "实际机器机型: ['class1','class2'] " -#: backend/db_meta/models/spec.py:34 -msgid "存储磁盘需求配置:{'mount_point':'/data','size':500,'type':'ssd'}" -msgstr "存储磁盘需求配置:{'mount_point':'/data','size':500,'type':'ssd'}" +#: backend/db_meta/models/sqlserver_dts.py:32 +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:146 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:137 +msgid "待执行" +msgstr "待执行" -#: backend/db_meta/models/spec.py:35 backend/db_meta/models/spec.py:97 -msgid "资源规格描述" -msgstr "资源规格描述" +#: backend/db_meta/models/sqlserver_dts.py:33 backend/ticket/constants.py:56 +#: backend/ticket/flow_manager/itsm.py:74 +msgid "已终止" +msgstr "已终止" + +#: backend/db_meta/models/sqlserver_dts.py:34 +msgid "中断中" +msgstr "中断中" + +#: backend/db_meta/models/sqlserver_dts.py:35 +msgid "已断开" +msgstr "已断开" + +#: backend/db_meta/models/sqlserver_dts.py:38 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:133 +msgid "全量传输中" +msgstr "全量传输中" + +#: backend/db_meta/models/sqlserver_dts.py:39 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:135 +msgid "全量传输失败" +msgstr "全量传输失败" + +#: backend/db_meta/models/sqlserver_dts.py:40 +msgid "全量传输完成" +msgstr "全量传输完成" + +#: backend/db_meta/models/sqlserver_dts.py:43 +msgid "增量传输中" +msgstr "增量传输中" + +#: backend/db_meta/models/sqlserver_dts.py:44 +msgid "增量传输失败" +msgstr "增量传输失败" + +#: backend/db_meta/models/sqlserver_dts.py:45 +msgid "增量传输完成" +msgstr "增量传输完成" + +#: backend/db_meta/models/sqlserver_dts.py:55 +#: backend/db_services/mysql/open_area/models.py:29 +#: backend/ticket/builders/mysql/mysql_data_migrate.py:26 +#: backend/ticket/builders/mysql/mysql_openarea.py:48 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:44 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:48 +msgid "源集群ID" +msgstr "源集群ID" + +#: backend/db_meta/models/sqlserver_dts.py:56 +#: backend/ticket/builders/mysql/mysql_openarea.py:31 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:45 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:49 +msgid "目标集群ID" +msgstr "目标集群ID" + +#: backend/db_meta/models/sqlserver_dts.py:57 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:50 +msgid "库正则" +msgstr "库正则" + +#: backend/db_meta/models/sqlserver_dts.py:58 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:47 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:51 +msgid "忽略库正则" +msgstr "忽略库正则" + +#: backend/db_meta/models/sqlserver_dts.py:59 +msgid "迁移类型" +msgstr "迁移类型" + +#: backend/db_meta/models/sqlserver_dts.py:60 +msgid "关联的单据id" +msgstr "关联的单据id" + +#: backend/db_meta/models/sqlserver_dts.py:61 +msgid "关联root_id" +msgstr "关联root_id" + +#: backend/db_meta/models/sqlserver_dts.py:63 +#: backend/db_services/bigdata/influxdb/serializers.py:19 +#: backend/db_services/dbbase/resources/serializers.py:32 +#: backend/db_services/dbbase/resources/serializers.py:102 +#: backend/db_services/plugin/mysql/authorize/serializers.py:56 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:21 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:34 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:40 +#: backend/db_services/redis/toolbox/serializers.py:190 +#: backend/ticket/serializers.py:85 backend/ticket/serializers.py:265 +msgid "状态" +msgstr "状态" + +#: backend/db_meta/models/sqlserver_dts.py:65 +msgid "迁移配置" +msgstr "迁移配置" + +#: backend/db_meta/models/sqlserver_dts.py:68 +msgid "sqlserver数据迁移记录表" +msgstr "sqlserver数据迁移记录表" -#: backend/db_meta/models/spec.py:69 -msgid "集群分片总数" -msgstr "集群分片总数" +#: backend/db_meta/models/sqlserver_dts.py:107 +msgid "当前操作「{}(单据:{})」与迁移记录(关联单据:{})存在执行互斥" +msgstr "当前操作「{}(单据:{})」与迁移记录(关联单据:{})存在执行互斥" -#: backend/db_meta/models/spec.py:70 -msgid "集群存储预估总容量/G" -msgstr "集群存储预估总容量/G" +#: backend/db_meta/models/storage_instance_tuple.py:33 +msgid "存储实例元组对(StorageInstanceTuple)" +msgstr "存储实例元组对(StorageInstanceTuple)" -#: backend/db_meta/models/spec.py:71 -msgid "机器组数: (每组两台)" -msgstr "机器组数: (每组两台)" +#: backend/db_meta/models/tag.py:21 +msgid "tag名称" +msgstr "tag名称" -#: backend/db_meta/models/spec.py:74 -msgid "方案描述" -msgstr "方案描述" +#: backend/db_meta/models/tag.py:22 +msgid "tag类型" +msgstr "tag类型" -#: backend/db_meta/views/helper/views.py:34 -msgid "drop_cluster - 方便调试,后面去掉" -msgstr "drop_cluster - 方便调试,后面去掉" +#: backend/db_meta/models/tag.py:23 +msgid "关联集群" +msgstr "关联集群" -#: backend/db_meta/views/helper/views.py:68 +#: backend/db_meta/utils.py:72 backend/db_meta/utils.py:143 msgid "清理集群" msgstr "清理集群" -#: backend/db_meta/views/helper/views.py:80 -msgid "drop_my_cluster - 方便调试,后面去掉" -msgstr "drop_my_cluster - 方便调试,后面去掉" - -#: backend/db_monitor/constants.py:25 +#: backend/db_monitor/constants.py:28 backend/db_monitor/constants.py:47 +#: backend/db_monitor/constants.py:57 msgid "platform" msgstr "platform" -#: backend/db_monitor/constants.py:26 +#: backend/db_monitor/constants.py:29 msgid "app" msgstr "app" -#: backend/db_monitor/constants.py:27 +#: backend/db_monitor/constants.py:30 msgid "cluster" msgstr "cluster" -#: backend/db_monitor/models.py:25 backend/db_monitor/models.py:49 -#: backend/db_monitor/models.py:67 backend/db_monitor/models.py:87 -msgid "业务ID, 0代表全业务" -msgstr "业务ID, 0代表全业务" +#: backend/db_monitor/constants.py:37 +msgid "固定值班" +msgstr "固定值班" -#: backend/db_monitor/models.py:26 -msgid "监控通知组ID" -msgstr "监控通知组ID" +#: backend/db_monitor/constants.py:38 +msgid "交替轮值" +msgstr "交替轮值" -#: backend/db_monitor/models.py:28 -msgid "告警通知组类别" -msgstr "告警通知组类别" +#: backend/db_monitor/constants.py:48 backend/db_monitor/constants.py:58 +msgid "app id" +msgstr "app id" -#: backend/db_monitor/models.py:34 -msgid "自动同步DBA人员配置" -msgstr "自动同步DBA人员配置" +#: backend/db_monitor/constants.py:49 backend/db_monitor/constants.py:59 +msgid "db module" +msgstr "db module" -#: backend/db_monitor/models.py:37 -msgid "告警通知组" -msgstr "告警通知组" +#: backend/db_monitor/constants.py:50 backend/db_monitor/constants.py:60 +msgid "cluster domain" +msgstr "cluster domain" -#: backend/db_monitor/models.py:50 backend/db_monitor/models.py:70 -msgid "监控策略ID" -msgstr "监控策略ID" +#: backend/db_monitor/constants.py:76 +msgid "有效" +msgstr "有效" -#: backend/db_monitor/models.py:52 backend/db_monitor/models.py:72 -msgid "策略名称" -msgstr "策略名称" +#: backend/db_monitor/constants.py:77 +msgid "监控目标已失效" +msgstr "监控目标已失效" -#: backend/db_monitor/models.py:54 backend/db_monitor/models.py:74 -#: backend/db_monitor/models.py:90 backend/db_package/filters.py:21 -msgid "DB类型" -msgstr "DB类型" +#: backend/db_monitor/constants.py:83 +msgid "等于" +msgstr "等于" -#: backend/db_monitor/models.py:57 -msgid "模板详情" -msgstr "模板详情" +#: backend/db_monitor/constants.py:84 +msgid "不等于" +msgstr "不等于" -#: backend/db_monitor/models.py:58 backend/db_monitor/models.py:78 -msgid "是否启用" -msgstr "是否启用" +#: backend/db_monitor/constants.py:85 +msgid "小于" +msgstr "小于" -#: backend/db_monitor/models.py:61 -msgid "告警策略模板" -msgstr "告警策略模板" +#: backend/db_monitor/constants.py:86 +msgid "大于" +msgstr "大于" -#: backend/db_monitor/models.py:69 -msgid "监控模板ID" -msgstr "监控模板ID" +#: backend/db_monitor/constants.py:87 +msgid "小于等于" +msgstr "小于等于" -#: backend/db_monitor/models.py:77 -msgid "实例详情" -msgstr "实例详情" +#: backend/db_monitor/constants.py:88 +msgid "大于等于" +msgstr "大于等于" -#: backend/db_monitor/models.py:81 -msgid "告警策略实例" -msgstr "告警策略实例" +#: backend/db_monitor/constants.py:94 +msgid "致命" +msgstr "致命" -#: backend/db_monitor/models.py:88 -msgid "插件ID" -msgstr "插件ID" +#: backend/db_monitor/constants.py:95 +msgid "预警" +msgstr "预警" -#: backend/db_monitor/models.py:92 backend/db_monitor/models.py:120 -#: backend/db_proxy/models.py:56 -msgid "详情" -msgstr "详情" +#: backend/db_monitor/constants.py:96 +msgid "提醒" +msgstr "提醒" -#: backend/db_monitor/models.py:96 backend/db_monitor/models.py:101 -msgid "采集策略模板" -msgstr "采集策略模板" +#: backend/db_monitor/constants.py:102 +msgid "时序数据" +msgstr "时序数据" -#: backend/db_monitor/models.py:107 -msgid "监控插件模板ID" -msgstr "监控插件模板ID" +#: backend/db_monitor/constants.py:103 +msgid "事件数据" +msgstr "事件数据" -#: backend/db_monitor/models.py:108 -msgid "监控采集策略ID" -msgstr "监控采集策略ID" +#: backend/db_monitor/constants.py:104 +msgid "日志关键字" +msgstr "日志关键字" -#: backend/db_monitor/models.py:111 -msgid "采集策略实例" +#: backend/db_monitor/constants.py:110 +msgid "阈值检测" +msgstr "阈值检测" + +#: backend/db_monitor/constants.py:116 +msgid "基于分派规则通知" +msgstr "基于分派规则通知" + +#: backend/db_monitor/constants.py:117 +msgid "基于告警组直接通知" +msgstr "基于告警组直接通知" + +#: backend/db_monitor/constants.py:177 +msgid "平台级分派给业务" +msgstr "平台级分派给业务" + +#: backend/db_monitor/exceptions.py:19 +msgid "监控异常" +msgstr "监控异常" + +#: backend/db_monitor/exceptions.py:24 +msgid "内置告警组不允许删除" +msgstr "内置告警组不允许删除" + +#: backend/db_monitor/exceptions.py:29 +msgid "监控策略保存失败" +msgstr "监控策略保存失败" + +#: backend/db_monitor/exceptions.py:30 +#, python-brace-format +msgid "监控策略保存失败: {message}" +msgstr "监控策略保存失败: {message}" + +#: backend/db_monitor/exceptions.py:35 +msgid "监控策略删除失败" +msgstr "监控策略删除失败" + +#: backend/db_monitor/exceptions.py:36 +#, python-brace-format +msgid "监控策略删除失败: {message}" +msgstr "监控策略删除失败: {message}" + +#: backend/db_monitor/exceptions.py:41 +msgid "故障自愈异常" +msgstr "故障自愈异常" + +#: backend/db_monitor/exceptions.py:42 +#, python-brace-format +msgid "故障自愈异常: {message}" +msgstr "故障自愈异常: {message}" + +#: backend/db_monitor/mock_data.py:21 +msgid "群机器人" +msgstr "群机器人" + +#: backend/db_monitor/mock_data.py:26 +msgid "产品人员" +msgstr "产品人员" + +#: backend/db_monitor/mock_data.py:27 +msgid "测试人员" +msgstr "测试人员" + +#: backend/db_monitor/mock_data.py:28 +msgid "开发人员" +msgstr "开发人员" + +#: backend/db_monitor/mock_data.py:29 +msgid "主负责人" +msgstr "主负责人" + +#: backend/db_monitor/mock_data.py:30 +msgid "备份负责人" +msgstr "备份负责人" + +#: backend/db_monitor/mock_data.py:111 +msgid "自定义告警组名称" +msgstr "自定义告警组名称" + +#: backend/db_monitor/mock_data.py:128 +msgid "新建告警组1" +msgstr "新建告警组1" + +#: backend/db_monitor/mock_data.py:134 +msgid "新建告警组2" +msgstr "新建告警组2" + +#: backend/db_monitor/mock_data.py:141 +msgid "更新告警组" +msgstr "更新告警组" + +#: backend/db_monitor/mock_data.py:143 +msgid "策略 A" +msgstr "策略 A" + +#: backend/db_monitor/mock_data.py:143 +msgid "策略 B" +msgstr "策略 B" + +#: backend/db_monitor/mock_data.py:146 +msgid "周末轮值" +msgstr "周末轮值" + +#: backend/db_monitor/mock_data.py:164 +msgid "固定排班" +msgstr "固定排班" + +#: backend/db_monitor/mock_data.py:223 +msgid "mysql 周末轮值 告警组" +msgstr "mysql 周末轮值 告警组" + +#: backend/db_monitor/models/alarm.py:56 backend/db_monitor/models/alarm.py:342 +#: backend/db_monitor/models/alarm.py:360 +#: backend/db_monitor/models/alarm.py:393 +#: backend/db_monitor/models/alarm.py:516 +#: backend/db_monitor/models/collect.py:41 +msgid "业务ID, 0代表全业务" +msgstr "业务ID, 0代表全业务" + +#: backend/db_monitor/models/alarm.py:57 +msgid "告警通知组名称" +msgstr "告警通知组名称" + +#: backend/db_monitor/models/alarm.py:58 +msgid "监控通知组ID" +msgstr "监控通知组ID" + +#: backend/db_monitor/models/alarm.py:59 backend/db_monitor/models/alarm.py:239 +msgid "监控轮值规则 ID" +msgstr "监控轮值规则 ID" + +#: backend/db_monitor/models/alarm.py:61 +msgid "告警接收人员/组列表" +msgstr "告警接收人员/组列表" + +#: backend/db_monitor/models/alarm.py:62 +msgid "通知方式详情" +msgstr "通知方式详情" + +#: backend/db_monitor/models/alarm.py:63 +msgid "是否内置" +msgstr "是否内置" + +#: backend/db_monitor/models/alarm.py:64 backend/db_monitor/models/alarm.py:400 +#: backend/db_monitor/models/alarm.py:603 +#: backend/db_monitor/models/collect.py:69 +msgid "最近一次的同步时间" +msgstr "最近一次的同步时间" + +#: backend/db_monitor/models/alarm.py:65 +msgid "自动同步DBA人员配置" +msgstr "自动同步DBA人员配置" + +#: backend/db_monitor/models/alarm.py:68 +msgid "告警通知组(NoticeGroup)" +msgstr "告警通知组(NoticeGroup)" + +#: backend/db_monitor/models/alarm.py:238 +msgid "轮值规则名称" +msgstr "轮值规则名称" + +#: backend/db_monitor/models/alarm.py:240 +msgid "优先级" +msgstr "优先级" + +#: backend/db_monitor/models/alarm.py:242 +msgid "生效时间" +msgstr "生效时间" + +#: backend/db_monitor/models/alarm.py:243 +msgid "截止时间" +msgstr "截止时间" + +#: backend/db_monitor/models/alarm.py:244 +msgid "轮值类型" +msgstr "轮值类型" + +#: backend/db_monitor/models/alarm.py:246 +msgid "轮值人员设置" +msgstr "轮值人员设置" + +#: backend/db_monitor/models/alarm.py:336 +msgid "轮值规则(DutyRule)" +msgstr "轮值规则(DutyRule)" + +#: backend/db_monitor/models/alarm.py:343 +#: backend/db_monitor/models/alarm.py:363 +msgid "监控策略ID" +msgstr "监控策略ID" + +#: backend/db_monitor/models/alarm.py:345 +msgid "策略名称监控侧要求唯一" +msgstr "策略名称监控侧要求唯一" + +#: backend/db_monitor/models/alarm.py:347 +#: backend/db_monitor/models/alarm.py:367 +#: backend/db_monitor/models/alarm.py:519 +#: backend/db_monitor/models/collect.py:45 backend/db_package/filters.py:21 +#: backend/iam_app/dataclass/resources.py:192 +msgid "DB类型" +msgstr "DB类型" + +#: backend/db_monitor/models/alarm.py:350 +msgid "模板详情" +msgstr "模板详情" + +#: backend/db_monitor/models/alarm.py:354 +msgid "告警策略模板" +msgstr "告警策略模板" + +#: backend/db_monitor/models/alarm.py:362 +msgid "监控模板ID" +msgstr "监控模板ID" + +#: backend/db_monitor/models/alarm.py:365 +msgid "策略名称" +msgstr "策略名称" + +#: backend/db_monitor/models/alarm.py:370 +msgid "实例详情" +msgstr "实例详情" + +#: backend/db_monitor/models/alarm.py:387 +msgid "告警策略实例" +msgstr "告警策略实例" + +#: backend/db_monitor/models/alarm.py:394 +msgid "蓝鲸监控分派策略组ID" +msgstr "蓝鲸监控分派策略组ID" + +#: backend/db_monitor/models/alarm.py:397 +msgid "策略模板详情" +msgstr "策略模板详情" + +#: backend/db_monitor/models/alarm.py:398 +#: backend/db_services/dbpermission/db_account/serializers.py:96 +#: backend/db_services/dbpermission/db_account/serializers.py:109 +#: backend/db_services/dbpermission/db_authorize/serializers.py:98 +msgid "规则列表" +msgstr "规则列表" + +#: backend/db_monitor/models/alarm.py:403 +msgid "分派策略组" +msgstr "分派策略组" + +#: backend/db_monitor/models/alarm.py:480 +msgid "DBM平台规则_勿动_{}" +msgstr "DBM平台规则_勿动_{}" + +#: backend/db_monitor/models/alarm.py:512 +msgid "父级策略ID,0代表父级" +msgstr "父级策略ID,0代表父级" + +#: backend/db_monitor/models/alarm.py:513 +msgid "父级策略模板详情,可用于还原" +msgstr "父级策略模板详情,可用于还原" + +#: backend/db_monitor/models/alarm.py:515 +#: backend/db_monitor/models/collect.py:43 +msgid "策略名称,全局唯一" +msgstr "策略名称,全局唯一" + +#: backend/db_monitor/models/alarm.py:522 +msgid "当前策略详情,可用于patch" +msgstr "当前策略详情,可用于patch" + +#: backend/db_monitor/models/alarm.py:523 +msgid "监控指标名" +msgstr "监控指标名" + +#: backend/db_monitor/models/alarm.py:560 +msgid "监控目标" +msgstr "监控目标" + +#: backend/db_monitor/models/alarm.py:562 +msgid "监控目标级别,跟随targets调整" +msgstr "监控目标级别,跟随targets调整" + +#: backend/db_monitor/models/alarm.py:567 +msgid "监控策略优先级,跟随targets调整" +msgstr "监控策略优先级,跟随targets调整" + +#: backend/db_monitor/models/alarm.py:568 +msgid "监控目标检索冗余字段" +msgstr "监控目标检索冗余字段" + +#: backend/db_monitor/models/alarm.py:571 +msgid "自定义过滤列表" +msgstr "自定义过滤列表" + +#: backend/db_monitor/models/alarm.py:591 +msgid "检测规则" +msgstr "检测规则" + +#: backend/db_monitor/models/alarm.py:594 +msgid "通知规则" +msgstr "通知规则" + +#: backend/db_monitor/models/alarm.py:596 +msgid "通知组" +msgstr "通知组" + +#: backend/db_monitor/models/alarm.py:600 +msgid "是否已启用" +msgstr "是否已启用" + +#: backend/db_monitor/models/alarm.py:604 +msgid "告警事件数量,初始值设置为-1" +msgstr "告警事件数量,初始值设置为-1" + +#: backend/db_monitor/models/alarm.py:608 +msgid "策略状态" +msgstr "策略状态" + +#: backend/db_monitor/models/alarm.py:614 +msgid "蓝鲸监控策略ID" +msgstr "蓝鲸监控策略ID" + +#: backend/db_monitor/models/alarm.py:617 +#: backend/db_monitor/models/collect.py:51 +#: backend/db_services/bigdata/influxdb/query.py:35 +#: backend/db_services/bigdata/resources/query.py:43 +msgid "版本" +msgstr "版本" + +#: backend/db_monitor/models/alarm.py:620 +msgid "告警数据来源" +msgstr "告警数据来源" + +#: backend/db_monitor/models/alarm.py:627 +msgid "告警策略(MonitorPolicy)" +msgstr "告警策略(MonitorPolicy)" + +#: backend/db_monitor/models/collect.py:42 +msgid "插件ID" +msgstr "插件ID" + +#: backend/db_monitor/models/collect.py:47 +msgid "绑定machine" +msgstr "绑定machine" + +#: backend/db_monitor/models/collect.py:48 +#: backend/db_monitor/models/dashboard.py:33 backend/db_proxy/models.py:57 +#: backend/db_proxy/views/cloud/serializers.py:21 +#: backend/db_report/views/meta_check_view.py:72 +#: backend/db_report/views/mysqlbackup_check_view.py:68 +#: backend/db_report/views/redis_dbmeta_check_view.py:67 +#: backend/db_report/views/redisbackup_check_view.py:72 +msgid "详情" +msgstr "详情" + +#: backend/db_monitor/models/collect.py:55 +#: backend/db_monitor/models/collect.py:60 +msgid "采集策略模板" +msgstr "采集策略模板" + +#: backend/db_monitor/models/collect.py:66 +msgid "监控插件模板ID" +msgstr "监控插件模板ID" + +#: backend/db_monitor/models/collect.py:67 +msgid "监控采集策略ID" +msgstr "监控采集策略ID" + +#: backend/db_monitor/models/collect.py:163 +msgid "采集策略实例" msgstr "采集策略实例" -#: backend/db_monitor/models.py:117 backend/ticket/serializers.py:193 +#: backend/db_monitor/models/dashboard.py:28 backend/ticket/serializers.py:246 msgid "名称" msgstr "名称" -#: backend/db_monitor/models.py:121 +#: backend/db_monitor/models/dashboard.py:29 +msgid "视图类型" +msgstr "视图类型" + +#: backend/db_monitor/models/dashboard.py:34 msgid "变量" msgstr "变量" -#: backend/db_monitor/models.py:124 +#: backend/db_monitor/models/dashboard.py:37 msgid "grafana-org_id" msgstr "grafana-org_id" -#: backend/db_monitor/models.py:125 +#: backend/db_monitor/models/dashboard.py:38 msgid "grafana-org_name" msgstr "grafana-org_name" -#: backend/db_monitor/models.py:126 +#: backend/db_monitor/models/dashboard.py:39 msgid "grafana-uid" msgstr "grafana-uid" -#: backend/db_monitor/models.py:127 +#: backend/db_monitor/models/dashboard.py:40 msgid "grafana-url" msgstr "grafana-url" -#: backend/db_monitor/models.py:130 +#: backend/db_monitor/models/dashboard.py:43 msgid "仪表盘" msgstr "仪表盘" -#: backend/db_monitor/serializers.py:23 -#: backend/db_services/cmdb/serializers.py:51 -#: backend/db_services/dbbase/resources/serializers.py:72 -#: backend/db_services/dbbase/resources/serializers.py:79 -#: backend/db_services/dbresource/serializers.py:202 -#: backend/db_services/mysql/cluster/serializers.py:61 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:19 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:24 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:30 -#: backend/db_services/mysql/remote_service/serializers.py:36 -#: backend/db_services/partition/serializers.py:44 -#: backend/db_services/partition/serializers.py:98 -#: backend/ticket/builders/common/bigdata.py:70 +#: backend/db_monitor/serializers.py:33 +#: backend/db_services/bigdata/resources/serializers.py:17 +#: backend/db_services/cmdb/serializers.py:81 +#: backend/db_services/dbbase/cluster/serializers.py:55 +#: backend/db_services/dbbase/resources/serializers.py:104 +#: backend/db_services/dbbase/resources/serializers.py:120 +#: backend/db_services/dbbase/serializers.py:172 +#: backend/db_services/dbresource/serializers.py:332 +#: backend/db_services/mysql/cluster/serializers.py:32 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:23 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:43 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:61 +#: backend/db_services/mysql/remote_service/serializers.py:61 +#: backend/db_services/mysql/remote_service/serializers.py:77 +#: backend/db_services/mysql/remote_service/serializers.py:93 +#: backend/db_services/partition/serializers.py:49 +#: backend/db_services/partition/serializers.py:131 +#: backend/db_services/partition/serializers.py:144 +#: backend/db_services/redis/autofix/models.py:36 +#: backend/db_services/redis/autofix/models.py:52 +#: backend/db_services/redis/autofix/models.py:81 +#: backend/db_services/redis/toolbox/serializers.py:218 +#: backend/db_services/redis/toolbox/serializers.py:224 +#: backend/db_services/sqlserver/cluster/serializers.py:17 +#: backend/db_services/sqlserver/cluster/serializers.py:28 +#: backend/db_services/sqlserver/cluster/serializers.py:45 +#: backend/db_services/sqlserver/cluster/serializers.py:56 +#: backend/db_services/sqlserver/rollback/serializers.py:26 +#: backend/db_services/sqlserver/rollback/serializers.py:36 +#: backend/db_services/sqlserver/rollback/serializers.py:46 +#: backend/db_services/sqlserver/rollback/serializers.py:72 +#: backend/ticket/builders/common/bigdata.py:69 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:31 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:33 +#: backend/ticket/builders/mongodb/mongo_backup.py:35 +#: backend/ticket/builders/mongodb/mongo_cutoff.py:39 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:24 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:27 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:29 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:28 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:36 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:36 #: backend/ticket/builders/mysql/base.py:165 -#: backend/ticket/builders/mysql/mysql_checksum.py:37 -#: backend/ticket/builders/mysql/mysql_data_repair.py:28 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:28 -#: backend/ticket/builders/mysql/mysql_flashback.py:27 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:28 +#: backend/ticket/builders/mysql/mysql_checksum.py:44 +#: backend/ticket/builders/mysql/mysql_data_repair.py:26 +#: backend/ticket/builders/mysql/mysql_dump_data.py:29 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:33 +#: backend/ticket/builders/mysql/mysql_flashback.py:33 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:27 #: backend/ticket/builders/mysql/mysql_ha_clear.py:29 +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:28 #: backend/ticket/builders/mysql/mysql_ha_rename.py:30 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:60 #: backend/ticket/builders/mysql/mysql_partition.py:47 -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:29 -#: backend/ticket/builders/redis/base.py:33 backend/ticket/models/ticket.py:245 -#: backend/ticket/serializers.py:217 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:27 +#: backend/ticket/builders/redis/base.py:35 +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:30 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:37 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:44 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:45 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:50 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:59 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:64 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:65 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:30 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:34 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:29 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:27 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:31 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:42 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:46 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:47 +#: backend/ticket/builders/riak/riak_reboot.py:29 +#: backend/ticket/builders/riak/riak_shrink.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:41 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:25 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:26 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:31 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:25 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:56 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:42 +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:26 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:29 +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:24 +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:23 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:29 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:25 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:30 +#: backend/ticket/models/ticket.py:326 backend/ticket/serializers.py:274 msgid "集群ID" msgstr "集群ID" -#: backend/db_monitor/serializers.py:24 +#: backend/db_monitor/serializers.py:34 #: backend/db_services/ipchooser/serializers/base.py:49 msgid "节点实例ID" msgstr "节点实例ID" -#: backend/db_monitor/serializers.py:28 +#: backend/db_monitor/serializers.py:38 msgid "监控仪表盘地址" msgstr "监控仪表盘地址" -#: backend/db_monitor/tasks.py:79 -msgid "DBA系统专用" -msgstr "DBA系统专用" - -#: backend/db_monitor/views/grafana.py:27 -msgid "监控告警管理" -msgstr "监控告警管理" - -#: backend/db_monitor/views/grafana.py:39 +#: backend/db_monitor/serializers.py:109 +msgid "策略ID : {} AND 状态 : {}" +msgstr "策略ID : {} AND 状态 : {}" + +#: backend/db_monitor/serializers.py:109 +msgid "未恢复" +msgstr "未恢复" + +#: backend/db_monitor/serializers.py:194 +msgid "请确认告警目标包含当前业务" +msgstr "请确认告警目标包含当前业务" + +#: backend/db_monitor/serializers.py:231 +msgid "告警事件" +msgstr "告警事件" + +#: backend/db_monitor/serializers.py:232 +#: backend/iam_app/dataclass/actions.py:1622 +#: backend/iam_app/dataclass/actions.py:1634 +#: backend/iam_app/dataclass/actions.py:1646 +#: backend/iam_app/dataclass/actions.py:1658 +#: backend/iam_app/dataclass/actions.py:1670 +#: backend/iam_app/dataclass/actions.py:1682 +#: backend/iam_app/dataclass/actions.py:1694 +#: backend/iam_app/dataclass/actions.py:1706 +#: backend/iam_app/dataclass/resources.py:551 +msgid "监控策略" +msgstr "监控策略" + +#: backend/db_monitor/serializers.py:233 +msgid "最新异常点信息" +msgstr "最新异常点信息" + +#: backend/db_monitor/serializers.py:236 +msgid "告警负责人" +msgstr "告警负责人" + +#: backend/db_monitor/serializers.py:237 +msgid "回调消息体" +msgstr "回调消息体" + +#: backend/db_monitor/serializers.py:255 +msgid "未匹配到对应的故障自愈处理单据,请确认是否配置正确" +msgstr "未匹配到对应的故障自愈处理单据,请确认是否配置正确" + +#: backend/db_monitor/views/duty_rule.py:29 +msgid "告警轮值规则" +msgstr "告警轮值规则" + +#: backend/db_monitor/views/duty_rule.py:39 +msgid "新建轮值规则" +msgstr "新建轮值规则" + +#: backend/db_monitor/views/duty_rule.py:44 +msgid "获取轮值规则" +msgstr "获取轮值规则" + +#: backend/db_monitor/views/duty_rule.py:49 +msgid "更新轮值规则" +msgstr "更新轮值规则" + +#: backend/db_monitor/views/duty_rule.py:55 +msgid "部分更新轮值规则" +msgstr "部分更新轮值规则" + +#: backend/db_monitor/views/duty_rule.py:107 +msgid "轮值规则优先级统计" +msgstr "轮值规则优先级统计" + +#: backend/db_monitor/views/grafana.py:36 msgid "查询内嵌仪表盘地址" msgstr "查询内嵌仪表盘地址" -#: backend/db_package/constants.py:20 +#: backend/db_monitor/views/notice_group.py:32 +msgid "监控告警组" +msgstr "监控告警组" + +#: backend/db_monitor/views/notice_group.py:37 +msgid "查询监控告警组列表" +msgstr "查询监控告警组列表" + +#: backend/db_monitor/views/notice_group.py:42 +msgid "新建监控告警组" +msgstr "新建监控告警组" + +#: backend/db_monitor/views/notice_group.py:47 +msgid "获取监控告警组" +msgstr "获取监控告警组" + +#: backend/db_monitor/views/notice_group.py:52 +msgid "更新监控告警组" +msgstr "更新监控告警组" + +#: backend/db_monitor/views/notice_group.py:57 +msgid "删除监控告警组" +msgstr "删除监控告警组" + +#: backend/db_monitor/views/notice_group.py:134 +msgid "查询告警组名称" +msgstr "查询告警组名称" + +#: backend/db_monitor/views/notice_group.py:140 +msgid "获取默认告警组名称" +msgstr "获取默认告警组名称" + +#: backend/db_monitor/views/policy.py:47 +msgid "策略名" +msgstr "策略名" + +#: backend/db_monitor/views/policy.py:48 +#: backend/db_services/bigdata/influxdb/query.py:39 +#: backend/db_services/bigdata/resources/query.py:47 +#: backend/db_services/dbconfig/serializers.py:67 +#: backend/db_services/redis/resources/redis_cluster/query.py:67 +msgid "更新人" +msgstr "更新人" + +#: backend/db_monitor/views/policy.py:51 +msgid "目标关键字检索" +msgstr "目标关键字检索" + +#: backend/db_monitor/views/policy.py:64 +#: backend/iam_app/dataclass/actions.py:1562 +#: backend/iam_app/dataclass/actions.py:1574 +#: backend/iam_app/dataclass/actions.py:1586 +#: backend/iam_app/dataclass/actions.py:1598 +#: backend/iam_app/dataclass/actions.py:1610 +#: backend/iam_app/dataclass/resources.py:622 +msgid "告警组" +msgstr "告警组" + +#: backend/db_monitor/views/policy.py:98 +msgid "获取策略列表" +msgstr "获取策略列表" + +#: backend/db_monitor/views/policy.py:106 +msgid "获取策略详情" +msgstr "获取策略详情" + +#: backend/db_monitor/views/policy.py:117 +msgid "删除策略" +msgstr "删除策略" + +#: backend/db_monitor/views/policy.py:197 +msgid "启用策略" +msgstr "启用策略" + +#: backend/db_monitor/views/policy.py:206 +msgid "停用策略" +msgstr "停用策略" + +#: backend/db_monitor/views/policy.py:215 +msgid "克隆策略" +msgstr "克隆策略" + +#: backend/db_monitor/views/policy.py:224 +msgid "更新策略" +msgstr "更新策略" + +#: backend/db_monitor/views/policy.py:242 +msgid "根据db类型查询集群列表" +msgstr "根据db类型查询集群列表" + +#: backend/db_monitor/views/policy.py:271 +msgid "根据db类型查询模块列表" +msgstr "根据db类型查询模块列表" + +#: backend/db_monitor/views/policy.py:292 +msgid "告警策略回调(处理套餐、故障自愈)" +msgstr "告警策略回调(处理套餐、故障自愈)" + +#: backend/db_package/constants.py:26 msgid "用户定义" msgstr "用户定义" -#: backend/db_package/constants.py:21 +#: backend/db_package/constants.py:27 msgid "系统内置" msgstr "系统内置" @@ -3112,232 +5336,604 @@ msgstr "{version}-{pkg_type}-{db_type}介质包不存在" msgid "介质类型" msgstr "介质类型" -#: backend/db_package/models.py:25 +#: backend/db_package/models.py:27 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:28 msgid "文件名" msgstr "文件名" -#: backend/db_package/models.py:27 +#: backend/db_package/models.py:29 msgid "安装包类型" msgstr "安装包类型" -#: backend/db_package/models.py:29 backend/db_package/serializers.py:31 +#: backend/db_package/models.py:31 backend/db_package/serializers.py:33 msgid "存储类型" msgstr "存储类型" -#: backend/db_package/models.py:31 +#: backend/db_package/models.py:33 msgid "包路径" msgstr "包路径" -#: backend/db_package/models.py:32 +#: backend/db_package/models.py:34 msgid "包大小" msgstr "包大小" -#: backend/db_package/models.py:33 +#: backend/db_package/models.py:35 msgid "md5值" msgstr "md5值" -#: backend/db_package/models.py:35 +#: backend/db_package/models.py:37 msgid "允许的业务列表" msgstr "允许的业务列表" -#: backend/db_package/models.py:36 +#: backend/db_package/models.py:38 msgid "安装包模式" msgstr "安装包模式" #: backend/db_package/models.py:39 +msgid "文件优先级(目前只用作区分是否为默认版本)" +msgstr "文件优先级(目前只用作区分是否为默认版本)" + +#: backend/db_package/models.py:46 msgid "介质包(Package)" msgstr "介质包(Package)" -#: backend/db_package/serializers.py:28 +#: backend/db_package/serializers.py:30 msgid "版本包" msgstr "版本包" -#: backend/db_package/serializers.py:29 +#: backend/db_package/serializers.py:31 #: backend/db_services/dbconfig/serializers.py:40 #: backend/db_services/dbconfig/serializers.py:52 #: backend/db_services/dbconfig/serializers.py:65 #: backend/db_services/dbconfig/serializers.py:87 +#: backend/db_services/version/serializers.py:26 #: backend/ticket/builders/mysql/mysql_single_apply.py:65 -#: backend/ticket/builders/spider/tendb_apply.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:64 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:51 msgid "数据库版本" msgstr "数据库版本" -#: backend/db_package/serializers.py:30 +#: backend/db_package/serializers.py:32 backend/db_package/serializers.py:40 msgid "包类型" msgstr "包类型" -#: backend/db_package/views.py:43 +#: backend/db_package/serializers.py:46 +msgid "介质同步信息" +msgstr "介质同步信息" + +#: backend/db_package/serializers.py:52 +#: backend/db_services/version/serializers.py:21 +msgid "查询关键字" +msgstr "查询关键字" + +#: backend/db_package/views.py:71 msgid "新建版本文件" msgstr "新建版本文件" -#: backend/db_package/views.py:50 +#: backend/db_package/views.py:78 +msgid "同步制品库的文件信息(适用于medium初始化)" +msgstr "同步制品库的文件信息(适用于medium初始化)" + +#: backend/db_package/views.py:110 msgid "查询版本文件列表" msgstr "查询版本文件列表" -#: backend/db_package/views.py:57 +#: backend/db_package/views.py:122 +msgid "查询组件安装包类型" +msgstr "查询组件安装包类型" + +#: backend/db_package/views.py:130 +msgid "查询组件安装包列表" +msgstr "查询组件安装包列表" + +#: backend/db_package/views.py:139 +msgid "请保证过滤类型是[{}]安装包类型" +msgstr "请保证过滤类型是[{}]安装包类型" + +#: backend/db_package/views.py:151 +msgid "更新版本文件属性" +msgstr "更新版本文件属性" + +#: backend/db_package/views.py:166 msgid "删除版本文件" msgstr "删除版本文件" -#: backend/db_package/views.py:65 +#: backend/db_package/views.py:177 #: backend/db_proxy/views/bkrepo/serializers.py:18 msgid "上传文件" msgstr "上传文件" -#: backend/db_proxy/constants.py:16 -msgid "透传服务" -msgstr "透传服务" +#: backend/db_periodic_task/constants.py:24 +msgid "远程 API 周期任务" +msgstr "远程 API 周期任务" + +#: backend/db_periodic_task/constants.py:25 +msgid "本地函数周期任务" +msgstr "本地函数周期任务" + +#: backend/db_periodic_task/constants.py:29 +msgid "告警恢复时" +msgstr "告警恢复时" + +#: backend/db_periodic_task/constants.py:30 +msgid "告警触发时" +msgstr "告警触发时" + +#: backend/db_periodic_task/constants.py:31 +msgid "告警关闭时" +msgstr "告警关闭时" + +#: backend/db_periodic_task/constants.py:32 +msgid "告警确认时" +msgstr "告警确认时" + +#: backend/db_periodic_task/constants.py:33 +msgid "无数据告警" +msgstr "无数据告警" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:85 +#: backend/ticket/tasks/ticket_tasks.py:123 +msgid "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" +msgstr "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:143 +msgid "数据不一致" +msgstr "数据不一致" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:148 +msgid "近2天未校验" +msgstr "近2天未校验" + +#: backend/db_periodic_task/local_tasks/check_checksum.py:150 +msgid ";近2天未校验" +msgstr ";近2天未校验" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:32 +msgid "有 {} 个接入层实例" +msgstr "有 {} 个接入层实例" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:35 +msgid "有 {} 个存储层实例" +msgstr "有 {} 个存储层实例" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_cluster_topo.py:45 +msgid "实例 {} ({}-{}-{}) 与集群类型不匹配" +msgstr "实例 {} ({}-{}-{}) 与集群类型不匹配" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_instance_belong.py:31 +msgid "{} 属于 {} 个集群" +msgstr "{} 属于 {} 个集群" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_instance_belong.py:33 +msgid "{} 不属于任何集群" +msgstr "{} 不属于任何集群" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:63 +msgid "cluster:{} now had proxies[{}] < 2" +msgstr "cluster:{} now had proxies[{}] < 2" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:82 +msgid "集群{}的master:{} 获取slave失败" +msgstr "集群{}的master:{} 获取slave失败" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:84 +msgid "集群{}的master{}get slave_obj failed" +msgstr "集群{}的master{}get slave_obj failed" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:89 +msgid "unsupport mutil slave with cluster {} 4:{}" +msgstr "unsupport mutil slave with cluster {} 4:{}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:98 +msgid "集群{}的master实例:{} 没有slave" +msgstr "集群{}的master实例:{} 没有slave" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:107 +msgid "集群{}的slave:{} 获取master失败" +msgstr "集群{}的slave:{} 获取master失败" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:109 +msgid "集群{}的slave{} get master_obj failed" +msgstr "集群{}的slave{} get master_obj failed" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:114 +msgid "unsupport mutil master with cluster {} 4:{}" +msgstr "unsupport mutil master with cluster {} 4:{}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:123 +msgid "集群{}的slave实例:{} 没有master" +msgstr "集群{}的slave实例:{} 没有master" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_redis_instance.py:152 +msgid "集群{}的实例:{}实例状态异常:{}" +msgstr "集群{}的实例:{}实例状态异常:{}" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_replicate_role.py:39 +msgid "{} {} 不能作为同步 ejector" +msgstr "{} {} 不能作为同步 ejector" + +#: backend/db_periodic_task/local_tasks/db_meta/db_meta_check/check_replicate_role.py:59 +msgid "{} {} 不能作为同步 receiver" +msgstr "{} {} 不能作为同步 receiver" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:56 +msgid "nginx机器{}当前agent异常,跳过文件下发。请管理员检查机器运行状态" +msgstr "nginx机器{}当前agent异常,跳过文件下发。请管理员检查机器运行状态" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:66 +msgid "nginx配置文件下发参数:{}" +msgstr "nginx配置文件下发参数:{}" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:69 +msgid "下发文件job启动失败,错误信息: {}" +msgstr "下发文件job启动失败,错误信息: {}" + +#: backend/db_periodic_task/local_tasks/db_proxy.py:98 +msgid "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" +msgstr "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" + +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:146 +msgid "+===+++++=== missing_heartbeat_ips 实例:{} +++++===++++ " +msgstr "+===+++++=== missing_heartbeat_ips 实例:{} +++++===++++ " + +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:192 +msgid "实例 {} dbmon 心跳超时" +msgstr "实例 {} dbmon 心跳超时" -#: backend/db_proxy/constants.py:26 +#: backend/db_periodic_task/local_tasks/dbmon_heartbeat/heartbeat_report.py:207 +msgid "+===+++++=== 实例 {} dbmon 心跳超时 +++++===++++ " +msgstr "+===+++++=== 实例 {} dbmon 心跳超时 +++++===++++ " + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:37 +msgid "分区服务check_log接口异常: {}" +msgstr "分区服务check_log接口异常: {}" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:41 +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:43 +msgid "未执行" +msgstr "未执行" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:42 +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:44 +#: backend/db_services/redis/autofix/models.py:73 backend/flow/consts.py:683 +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:98 +#: backend/ticket/constants.py:80 backend/ticket/constants.py:92 +msgid "失败" +msgstr "失败" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:47 +msgid "环境变量MYSQL_CHATID未设置" +msgstr "环境变量MYSQL_CHATID未设置" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:50 +msgid "环境变量WECOM_ROBOT未设置" +msgstr "环境变量WECOM_ROBOT未设置" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:58 +msgid "" +"【DBM】分区表异常情况 {} \n" +"业务名称 bk_biz_id DB类型 失败/未执行 数量 DBA\n" +"{}" +msgstr "【DBM】分区表异常情况 {} \n业务名称 bk_biz_id DB类型 失败/未执行 数量 DBA\n{}" + +#: backend/db_periodic_task/local_tasks/mysql_check_partition.py:80 +msgid "{}{} {} {} {} {} <@{}>\n" +msgstr "{}{} {} {} {} {} <@{}>\n" + +#: backend/db_periodic_task/local_tasks/redis_backup/bklog_query.py:84 +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:118 +#: backend/db_services/redis/rollback/handlers.py:138 +msgid "无法查找到在时间范围内{}-{},集群{}的全备份日志" +msgstr "无法查找到在时间范围内{}-{},集群{}的全备份日志" + +#: backend/db_periodic_task/local_tasks/redis_backup/bklog_query.py:115 +msgid "无法查找到在时间范围内{}-{},集群{}的binlog备份日志" +msgstr "无法查找到在时间范围内{}-{},集群{}的binlog备份日志" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:96 +msgid "无法查找到在时间范围内{}-{},集群{}:{}的binlog备份日志" +msgstr "无法查找到在时间范围内{}-{},集群{}:{}的binlog备份日志" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:100 +msgid "+===+++++=== {} 集群{} 实例维度日志不为空 +++++===++++ " +msgstr "+===+++++=== {} 集群{} 实例维度日志不为空 +++++===++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:125 +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:139 +#: backend/db_services/redis/rollback/handlers.py:247 +#: backend/db_services/redis/rollback/handlers.py:268 +msgid "" +"重复/缺失的binlog共{}个,重复/缺失的binlog index是:{},详细信息请查看error日志" +msgstr "重复/缺失的binlog共{}个,重复/缺失的binlog index是:{},详细信息请查看error日志" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:145 +msgid "+===+++++=== {} binlog 序号连续 +++++===++++ " +msgstr "+===+++++=== {} binlog 序号连续 +++++===++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:152 +msgid "+===++=== 实例{}binlog备份失败,集群类型{}写入表 ++++++++ " +msgstr "+===++=== 实例{}binlog备份失败,集群类型{}写入表 ++++++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:198 +msgid "文件序号重复: {}" +msgstr "文件序号重复: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:199 +msgid "文件重复: {}" +msgstr "文件重复: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:203 +msgid "缺失时打印排序后的当前文件:{}和上一个文件: {}" +msgstr "缺失时打印排序后的当前文件:{}和上一个文件: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_binlog_backup.py:210 +#: backend/db_services/redis/rollback/handlers.py:316 +msgid "缺少的文件序号: {}" +msgstr "缺少的文件序号: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:124 +msgid "+===+++++=== {} 集群维度日志不为空 +++++===++++ " +msgstr "+===+++++=== {} 集群维度日志不为空 +++++===++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:146 +msgid "+===++==={}正常备份次数{},集群类型{} ++++++++ " +msgstr "+===++==={}正常备份次数{},集群类型{} ++++++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_full_backup.py:172 +msgid "+===++=== 实例{}全备份失败,集群类型{}写入表 ++++++++ " +msgstr "+===++=== 实例{}全备份失败,集群类型{}写入表 ++++++++ " + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:82 +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:100 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:925 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:944 +msgid "获取实例 {}:{} 的binlog备份信息失败" +msgstr "获取实例 {}:{} 的binlog备份信息失败" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:85 +msgid "get_instance_backupfile instance_full_backupfile: {}" +msgstr "get_instance_backupfile instance_full_backupfile: {}" + +#: backend/db_periodic_task/local_tasks/redis_backup/check_rollback_time_backup.py:118 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:513 +msgid "redis_data_structure_flow cluster_type: {}" +msgstr "redis_data_structure_flow cluster_type: {}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:118 +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:166 +msgid "根据上报的immute_domain找不到对应的集群" +msgstr "根据上报的immute_domain找不到对应的集群" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:141 +msgid "集群:{} 存在'{}({})'的单据正在执行" +msgstr "集群:{} 存在'{}({})'的单据正在执行" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:212 +msgid "{}:{} 状态变成了不可用\n" +msgstr "{}:{} 状态变成了不可用\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:219 +msgid "域名{} 删除 {} 记录成功" +msgstr "域名{} 删除 {} 记录成功" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:222 +msgid "域名{} 删除 {} 记录失败,{}" +msgstr "域名{} 删除 {} 记录失败,{}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:225 +msgid "{}:{} 状态变成了可用\n" +msgstr "{}:{} 状态变成了可用\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:232 +msgid "域名{} 新增 {} 记录成功" +msgstr "域名{} 新增 {} 记录成功" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:235 +msgid "域名{} 新增 {} 记录失败,{}" +msgstr "域名{} 新增 {} 记录失败,{}" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:257 +msgid "slave:{} 变成了master\n" +msgstr "slave:{} 变成了master\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:277 +msgid "master:{} 变成了slave\n" +msgstr "master:{} 变成了slave\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:288 +msgid "" +"master:{} 变成了slave,但是其master({}:{})不在集群meta数据中,所以不做处理\n" +msgstr "master:{} 变成了slave,但是其master({}:{})不在集群meta数据中,所以不做处理\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:314 +msgid "" +"master:{} 变成了disconnected状态,其slave:{}变成了master,现将old_master变成其" +"slave,便于发起自愈\n" +msgstr "master:{} 变成了disconnected状态,其slave:{}变成了master,现将old_master变成其slave,便于发起自愈\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:390 +msgid "存在机器:{} 所有实例均变成了unrunning状态,发起自愈流程\n" +msgstr "存在机器:{} 所有实例均变成了unrunning状态,发起自愈流程\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:411 +msgid "开始更新集群:{} 元数据" +msgstr "开始更新集群:{} 元数据" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:426 +msgid "master:{} 和 slave:{} 主从状态和关系都没变,不做处理\n" +msgstr "master:{} 和 slave:{} 主从状态和关系都没变,不做处理\n" + +#: backend/db_periodic_task/local_tasks/redis_clusternodes_update/task.py:444 +msgid "处理异常,{}" +msgstr "处理异常,{}" + +#: backend/db_periodic_task/models.py:32 +msgid "周期任务名称" +msgstr "周期任务名称" + +#: backend/db_periodic_task/models.py:33 +msgid "celery 周期任务实例" +msgstr "celery 周期任务实例" + +#: backend/db_periodic_task/models.py:34 +msgid "任务类型" +msgstr "任务类型" + +#: backend/db_periodic_task/models.py:35 +msgid "人工冻结此任务,将不受更新影响" +msgstr "人工冻结此任务,将不受更新影响" + +#: backend/db_periodic_task/models.py:40 +msgid "周期任务(PeriodicTask)" +msgstr "周期任务(PeriodicTask)" + +#: backend/db_proxy/constants.py:19 +msgid "透传服务(proxypass)" +msgstr "透传服务(proxypass)" + +#: backend/db_proxy/constants.py:32 msgid "nginx 转发服务" msgstr "nginx 转发服务" -#: backend/db_proxy/constants.py:27 +#: backend/db_proxy/constants.py:33 msgid "域名解析服务" msgstr "域名解析服务" -#: backend/db_proxy/constants.py:28 +#: backend/db_proxy/constants.py:34 msgid "SQL 远程执行服务" msgstr "SQL 远程执行服务" -#: backend/db_proxy/constants.py:29 +#: backend/db_proxy/constants.py:35 msgid "数据库高可用服务" msgstr "数据库高可用服务" -#: backend/db_proxy/constants.py:43 +#: backend/db_proxy/constants.py:36 +msgid "Redis DTS服务" +msgstr "Redis DTS服务" + +#: backend/db_proxy/constants.py:50 msgid "kibana-ES管理端" msgstr "kibana-ES管理端" -#: backend/db_proxy/constants.py:44 +#: backend/db_proxy/constants.py:51 msgid "kafka_manager-Kafka管理端" msgstr "kafka_manager-Kafka管理端" -#: backend/db_proxy/constants.py:45 +#: backend/db_proxy/constants.py:52 msgid "haproxy-HDFS管理端" msgstr "haproxy-HDFS管理端" -#: backend/db_proxy/constants.py:46 +#: backend/db_proxy/constants.py:53 msgid "pulsar_manager管理端" msgstr "pulsar_manager管理端" -#: backend/db_proxy/models.py:30 +#: backend/db_proxy/constants.py:59 +msgid "user" +msgstr "user" + +#: backend/db_proxy/constants.py:60 +msgid "pwd" +msgstr "pwd" + +#: backend/db_proxy/constants.py:61 +msgid "webconsole_user" +msgstr "webconsole_user" + +#: backend/db_proxy/constants.py:62 +msgid "webconsole_pwd" +msgstr "webconsole_pwd" + +#: backend/db_proxy/models.py:31 msgid "代理内部地址" msgstr "代理内部地址" -#: backend/db_proxy/models.py:31 +#: backend/db_proxy/models.py:32 msgid "代理外部地址" msgstr "代理外部地址" -#: backend/db_proxy/models.py:34 -msgid "云区域代理" -msgstr "云区域代理" +#: backend/db_proxy/models.py:35 +msgid "云区域代理(DBCloudProxy)" +msgstr "云区域代理(DBCloudProxy)" -#: backend/db_proxy/models.py:49 +#: backend/db_proxy/models.py:50 backend/db_proxy/views/cloud/serializers.py:20 msgid "扩展类型" msgstr "扩展类型" -#: backend/db_proxy/models.py:54 +#: backend/db_proxy/models.py:55 msgid "服务状态" msgstr "服务状态" -#: backend/db_proxy/models.py:122 +#: backend/db_proxy/models.py:60 +msgid "云区域组件扩展(DBExtension)" +msgstr "云区域组件扩展(DBExtension)" + +#: backend/db_proxy/models.py:134 +msgid "" +"在业务{}下已经存在同种配置的服务组件记录,请检查是否在同一业务下部署了同名的" +"集群" +msgstr "在业务{}下已经存在同种配置的服务组件记录,请检查是否在同一业务下部署了同名的集群" + +#: backend/db_proxy/models.py:145 msgid "部署机器ip" msgstr "部署机器ip" -#: backend/db_proxy/models.py:123 +#: backend/db_proxy/models.py:146 msgid "部署机器port" msgstr "部署机器port" -#: backend/db_proxy/models.py:124 +#: backend/db_proxy/models.py:147 backend/db_services/dbbase/serializers.py:121 msgid "服务类型" msgstr "服务类型" -#: backend/db_proxy/models.py:125 -#: backend/db_proxy/views/db_meta/serializers.py:94 -#: backend/db_proxy/views/db_meta/serializers.py:104 -#: backend/db_services/bigdata/resources/query.py:40 -#: backend/db_services/mysql/permission/authorize/serializers.py:28 -#: backend/db_services/mysql/resources/spider/query.py:36 -#: backend/db_services/mysql/resources/tendbha/query.py:39 -#: backend/db_services/mysql/resources/tendbsingle/query.py:38 -#: backend/db_services/redis/resources/redis_cluster/query.py:54 -#: backend/ticket/builders/spider/tendb_apply.py:30 +#: backend/db_proxy/models.py:148 +#: backend/db_proxy/views/db_meta/serializers.py:107 +#: backend/db_proxy/views/db_meta/serializers.py:117 +#: backend/db_services/bigdata/resources/query.py:38 +#: backend/db_services/dbbase/serializers.py:28 +#: backend/db_services/dbpermission/db_authorize/serializers.py:27 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:25 +#: backend/db_services/mysql/resources/tendbcluster/query.py:40 +#: backend/db_services/mysql/resources/tendbha/query.py:34 +#: backend/db_services/mysql/resources/tendbsingle/query.py:32 +#: backend/db_services/quick_search/constants.py:17 +#: backend/db_services/redis/redis_dts/serializers.py:26 +#: backend/db_services/redis/resources/redis_cluster/query.py:58 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:19 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:25 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:31 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:31 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:32 msgid "集群名" msgstr "集群名" -#: backend/db_proxy/models.py:128 -#: backend/db_proxy/views/jobapi/serializers.py:20 -#: backend/db_proxy/views/jobapi/serializers.py:61 -#: backend/db_proxy/views/jobapi/serializers.py:71 -#: backend/db_proxy/views/jobapi/serializers.py:79 -#: backend/db_proxy/views/redis_dts/serializers.py:59 -#: backend/db_proxy/views/redis_dts/serializers.py:68 -#: backend/db_proxy/views/redis_dts/serializers.py:77 -#: backend/db_proxy/views/redis_dts/serializers.py:86 -#: backend/db_services/dbresource/serializers.py:51 -#: backend/db_services/ipchooser/serializers/base.py:33 -#: backend/db_services/mysql/cluster/serializers.py:40 -#: backend/db_services/mysql/instance/serializers.py:37 -#: backend/db_services/mysql/permission/clone/models.py:28 -#: backend/db_services/mysql/permission/clone/serializers.py:24 -#: backend/db_services/partition/serializers.py:38 -#: backend/db_services/partition/serializers.py:101 -#: backend/ticket/builders/cloud/dbha_add.py:29 -#: backend/ticket/builders/cloud/dbha_reduce.py:30 -#: backend/ticket/builders/cloud/dbha_reload.py:28 -#: backend/ticket/builders/cloud/dbha_replace.py:28 -#: backend/ticket/builders/cloud/dns_add.py:28 -#: backend/ticket/builders/cloud/dns_reduce.py:29 -#: backend/ticket/builders/cloud/dns_reload.py:28 -#: backend/ticket/builders/cloud/dns_replace.py:28 -#: backend/ticket/builders/cloud/drs_add.py:28 -#: backend/ticket/builders/cloud/drs_reduce.py:29 -#: backend/ticket/builders/cloud/drs_reload.py:28 -#: backend/ticket/builders/cloud/drs_replace.py:28 -#: backend/ticket/builders/cloud/nginx_reload.py:27 -#: backend/ticket/builders/cloud/nginx_replace.py:32 -#: backend/ticket/builders/cloud/service_apply.py:40 -#: backend/ticket/builders/cloud/service_apply.py:49 -#: backend/ticket/builders/common/base.py:29 -#: backend/ticket/builders/common/bigdata.py:117 -#: backend/ticket/builders/common/bigdata.py:211 -#: backend/ticket/builders/common/bigdata.py:277 -#: backend/ticket/builders/influxdb/influxdb_apply.py:37 -#: backend/ticket/builders/mysql/mysql_partition.py:48 -#: backend/ticket/builders/mysql/mysql_single_apply.py:46 -#: backend/ticket/builders/redis/redis_cluster_apply.py:29 -#: backend/ticket/builders/spider/tendb_apply.py:29 -#: backend/ticket/serializers.py:234 -msgid "云区域ID" -msgstr "云区域ID" - -#: backend/db_proxy/models.py:132 +#: backend/db_proxy/models.py:155 msgid "是否刷新(该条记录是否执行)" msgstr "是否刷新(该条记录是否执行)" -#: backend/db_proxy/models.py:133 +#: backend/db_proxy/models.py:156 msgid "是否删除" msgstr "是否删除" -#: backend/db_proxy/models.py:135 +#: backend/db_proxy/models.py:157 msgid "服务访问地址" msgstr "服务访问地址" -#: backend/db_proxy/tasks.py:47 -msgid "[{}] nginx配置文件下发参数:{}" -msgstr "[{}] nginx配置文件下发参数:{}" - -#: backend/db_proxy/tasks.py:50 -msgid "下发文件job启动失败,错误信息: {}" -msgstr "下发文件job启动失败,错误信息: {}" - -#: backend/db_proxy/tasks.py:73 -msgid "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" -msgstr "集群类型:{} 的nginx配置文件不存在,跳过对该nginx配置的下发" +#: backend/db_proxy/models.py:163 +msgid "集群扩展服务(ClusterExtension)" +msgstr "集群扩展服务(ClusterExtension)" #: backend/db_proxy/views/bkrepo/views.py:31 msgid "[bkrepo]上传文件" msgstr "[bkrepo]上传文件" +#: backend/db_proxy/views/cloud/views.py:36 +msgid "[容器化]写入云区域组件记录" +msgstr "[容器化]写入云区域组件记录" + +#: backend/db_proxy/views/cloud/views.py:125 +msgid "[容器化]获取云区域nginx子配置文件" +msgstr "[容器化]获取云区域nginx子配置文件" + #: backend/db_proxy/views/db_meta/serializers.py:20 msgid "逻辑城市ID列表" msgstr "逻辑城市ID列表" @@ -3350,149 +5946,239 @@ msgstr "地址列表" msgid "状态列表" msgstr "状态列表" -#: backend/db_proxy/views/db_meta/serializers.py:45 +#: backend/db_proxy/views/db_meta/serializers.py:40 +msgid "哈希分片数" +msgstr "哈希分片数" + +#: backend/db_proxy/views/db_meta/serializers.py:41 +msgid "哈希分片值" +msgstr "哈希分片值" + +#: backend/db_proxy/views/db_meta/serializers.py:58 msgid "角色交换信息列表" msgstr "角色交换信息列表" -#: backend/db_proxy/views/db_meta/serializers.py:53 +#: backend/db_proxy/views/db_meta/serializers.py:66 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:29 msgid "实例Port" msgstr "实例Port" -#: backend/db_proxy/views/db_meta/serializers.py:57 +#: backend/db_proxy/views/db_meta/serializers.py:70 msgid "domain信息" msgstr "domain信息" -#: backend/db_proxy/views/db_meta/serializers.py:59 +#: backend/db_proxy/views/db_meta/serializers.py:72 msgid "tendis-swap的payload信息" msgstr "tendis-swap的payload信息" -#: backend/db_proxy/views/db_meta/serializers.py:70 +#: backend/db_proxy/views/db_meta/serializers.py:83 msgid "更新状态的信息列表" msgstr "更新状态的信息列表" -#: backend/db_proxy/views/db_meta/serializers.py:76 +#: backend/db_proxy/views/db_meta/serializers.py:89 msgid "查询的domain列表" msgstr "查询的domain列表" -#: backend/db_proxy/views/db_meta/serializers.py:80 +#: backend/db_proxy/views/db_meta/serializers.py:93 msgid "查询的Hosts列表" msgstr "查询的Hosts列表" -#: backend/db_proxy/views/db_meta/serializers.py:84 +#: backend/db_proxy/views/db_meta/serializers.py:97 msgid "查询的集群IDs" msgstr "查询的集群IDs" -#: backend/db_proxy/views/db_meta/serializers.py:88 +#: backend/db_proxy/views/db_meta/serializers.py:101 msgid "逻辑城市名称" msgstr "逻辑城市名称" -#: backend/db_proxy/views/db_meta/serializers.py:92 -#: backend/db_services/mysql/resources/tendbsingle/query.py:40 -#: backend/ticket/handler.py:63 +#: backend/db_proxy/views/db_meta/serializers.py:105 +#: backend/db_services/mysql/resources/tendbsingle/query.py:34 +#: backend/db_services/quick_search/constants.py:19 +#: backend/ticket/handler.py:89 msgid "实例" msgstr "实例" -#: backend/db_proxy/views/db_meta/serializers.py:93 -#: backend/db_services/mysql/cluster/serializers.py:62 -#: backend/db_services/mysql/permission/clone/serializers.py:26 -#: backend/db_services/partition/serializers.py:22 -#: backend/db_services/partition/serializers.py:40 -#: backend/db_services/partition/serializers.py:99 +#: backend/db_proxy/views/db_meta/serializers.py:106 +#: backend/db_proxy/views/dumper/serializers.py:26 +#: backend/db_report/views/dbmon_heartbeat_view.py:53 +#: backend/db_report/views/mysqlbackup_check_view.py:53 +#: backend/db_report/views/redis_dbmeta_check_view.py:52 +#: backend/db_report/views/redisbackup_check_view.py:52 +#: backend/db_services/dbbase/serializers.py:40 +#: backend/db_services/mongodb/restore/serializers.py:38 +#: backend/db_services/mysql/cluster/serializers.py:33 +#: backend/db_services/mysql/permission/clone/serializers.py:27 +#: backend/db_services/partition/serializers.py:27 +#: backend/db_services/quick_search/constants.py:18 +#: backend/db_services/redis/autofix/models.py:54 +#: backend/db_services/redis/autofix/models.py:83 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:26 +#: backend/db_services/redis/rollback/views.py:35 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:29 #: backend/ticket/builders/mysql/mysql_partition.py:49 +#: backend/ticket/filters.py:21 msgid "集群域名" msgstr "集群域名" -#: backend/db_proxy/views/db_meta/serializers.py:96 -#: backend/db_proxy/views/db_meta/serializers.py:106 -#: backend/db_services/cmdb/serializers.py:50 +#: backend/db_proxy/views/db_meta/serializers.py:109 +#: backend/db_proxy/views/db_meta/serializers.py:119 +#: backend/db_services/cmdb/serializers.py:80 +#: backend/db_services/meta_import/serializers.py:58 +#: backend/db_services/meta_import/serializers.py:89 +#: backend/db_services/meta_import/serializers.py:117 +#: backend/dbm_tools/management/commands/fix_process_ip.py:26 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:33 +#: backend/ticket/builders/spider/metadata_import.py:33 +#: backend/ticket/builders/tendbsingle/metadata_import.py:32 msgid "模块ID" msgstr "模块ID" -#: backend/db_proxy/views/db_meta/serializers.py:100 +#: backend/db_proxy/views/db_meta/serializers.py:113 msgid "代理列表" msgstr "代理列表" -#: backend/db_proxy/views/db_meta/serializers.py:101 -#: backend/db_proxy/views/db_meta/serializers.py:112 +#: backend/db_proxy/views/db_meta/serializers.py:114 +#: backend/db_proxy/views/db_meta/serializers.py:125 msgid "master实例" msgstr "master实例" -#: backend/db_proxy/views/db_meta/serializers.py:102 -#: backend/db_proxy/views/db_meta/serializers.py:113 +#: backend/db_proxy/views/db_meta/serializers.py:115 +#: backend/db_proxy/views/db_meta/serializers.py:126 msgid "slave实例" msgstr "slave实例" -#: backend/db_proxy/views/db_meta/serializers.py:103 -#: backend/db_proxy/views/db_meta/serializers.py:114 -#: backend/db_services/bigdata/resources/query.py:44 -#: backend/db_services/dbbase/resources/serializers.py:69 -#: backend/db_services/redis/resources/redis_cluster/query.py:57 +#: backend/db_proxy/views/db_meta/serializers.py:116 +#: backend/db_proxy/views/db_meta/serializers.py:127 +#: backend/db_services/bigdata/resources/query.py:42 +#: backend/db_services/cluster_entry/serializers.py:22 +#: backend/db_services/dbbase/resources/serializers.py:101 +#: backend/db_services/redis/resources/redis_cluster/query.py:61 +#: backend/flow/consts.py:1085 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:29 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:30 msgid "域名" msgstr "域名" -#: backend/db_proxy/views/db_meta/serializers.py:107 +#: backend/db_proxy/views/db_meta/serializers.py:120 msgid "从库域名" msgstr "从库域名" -#: backend/db_proxy/views/db_meta/serializers.py:111 +#: backend/db_proxy/views/db_meta/serializers.py:124 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:39 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:36 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:32 msgid "proxy列表" msgstr "proxy列表" -#: backend/db_proxy/views/db_meta/serializers.py:115 +#: backend/db_proxy/views/db_meta/serializers.py:128 msgid "slave域名" msgstr "slave域名" -#: backend/db_proxy/views/db_meta/views.py:45 +#: backend/db_proxy/views/db_meta/serializers.py:134 +#: backend/db_proxy/views/db_meta/serializers.py:139 +#: backend/db_proxy/views/dns/serializers.py:45 +#: backend/db_proxy/views/dns/serializers.py:92 +#: backend/ticket/builders/mysql/mysql_single_apply.py:61 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:60 +msgid "域名列表" +msgstr "域名列表" + +#: backend/db_proxy/views/db_meta/serializers.py:143 +#: backend/db_services/bigdata/resources/serializers.py:19 +#: backend/db_services/redis/toolbox/serializers.py:186 +#: backend/ticket/builders/mysql/mysql_partition.py:38 +msgid "ip" +msgstr "ip" + +#: backend/db_proxy/views/db_meta/serializers.py:144 +#: backend/ticket/builders/mysql/mysql_partition.py:39 +msgid "port" +msgstr "port" + +#: backend/db_proxy/views/db_meta/serializers.py:145 +msgid "bk_cloud_id" +msgstr "bk_cloud_id" + +#: backend/db_proxy/views/db_meta/views.py:48 msgid "[dbmeta]过滤实例列表" msgstr "[dbmeta]过滤实例列表" -#: backend/db_proxy/views/db_meta/views.py:56 +#: backend/db_proxy/views/db_meta/views.py:59 msgid "[dbmeta]实例角色交换" msgstr "[dbmeta]实例角色交换" -#: backend/db_proxy/views/db_meta/views.py:66 +#: backend/db_proxy/views/db_meta/views.py:69 +msgid "[dbmeta]sqlserver实例角色交换" +msgstr "[dbmeta]sqlserver实例角色交换" + +#: backend/db_proxy/views/db_meta/views.py:84 msgid "[dbmeta]tendis集群交换" msgstr "[dbmeta]tendis集群交换" -#: backend/db_proxy/views/db_meta/views.py:81 +#: backend/db_proxy/views/db_meta/views.py:99 msgid "[dbmeta]状态更新" msgstr "[dbmeta]状态更新" -#: backend/db_proxy/views/db_meta/views.py:93 +#: backend/db_proxy/views/db_meta/views.py:111 msgid "[dbmeta]查询entry信息" msgstr "[dbmeta]查询entry信息" -#: backend/db_proxy/views/db_meta/views.py:105 +#: backend/db_proxy/views/db_meta/views.py:123 msgid "[dbmeta]根据逻辑城市查询具体城市名称" msgstr "[dbmeta]根据逻辑城市查询具体城市名称" -#: backend/db_proxy/views/db_meta/views.py:118 +#: backend/db_proxy/views/db_meta/views.py:136 msgid "[dbmeta]构建测试单节点集群数据" msgstr "[dbmeta]构建测试单节点集群数据" -#: backend/db_proxy/views/db_meta/views.py:135 +#: backend/db_proxy/views/db_meta/views.py:153 msgid "[dbmeta]构建测试高可用集群数据" msgstr "[dbmeta]构建测试高可用集群数据" -#: backend/db_proxy/views/db_meta/views.py:153 +#: backend/db_proxy/views/db_meta/views.py:171 msgid "[dbmeta]查询主机信息" msgstr "[dbmeta]查询主机信息" -#: backend/db_proxy/views/db_meta/views.py:169 -msgid "[dbmeta]查询集群信息" -msgstr "[dbmeta]查询集群信息" +#: backend/db_proxy/views/db_meta/views.py:187 +msgid "[dbmeta]查询redis集群信息" +msgstr "[dbmeta]查询redis集群信息" -#: backend/db_proxy/views/db_meta/views.py:185 +#: backend/db_proxy/views/db_meta/views.py:203 msgid "[dbmeta]fake重置dbha集群" msgstr "[dbmeta]fake重置dbha集群" +#: backend/db_proxy/views/db_meta/views.py:220 +msgid "[dbmeta]priv_manager根据域名查询集群信息" +msgstr "[dbmeta]priv_manager根据域名查询集群信息" + +#: backend/db_proxy/views/db_meta/views.py:239 +msgid "[dbmeta]priv_manager查询tendbsingle集群实例信息" +msgstr "[dbmeta]priv_manager查询tendbsingle集群实例信息" + +#: backend/db_proxy/views/db_meta/views.py:255 +msgid "[dbmeta]priv_manager查询tendbha集群实例信息" +msgstr "[dbmeta]priv_manager查询tendbha集群实例信息" + +#: backend/db_proxy/views/db_meta/views.py:271 +msgid "[dbmeta]priv_manager查询tendbcluster集群实例信息" +msgstr "[dbmeta]priv_manager查询tendbcluster集群实例信息" + +#: backend/db_proxy/views/db_meta/views.py:287 +msgid "[dbmeta]priv_manager查询SqlserverHA集群信息" +msgstr "[dbmeta]priv_manager查询SqlserverHA集群信息" + +#: backend/db_proxy/views/db_meta/views.py:306 +msgid "[dbmeta]priv_manager查询SqlserverSingle集群信息" +msgstr "[dbmeta]priv_manager查询SqlserverSingle集群信息" + #: backend/db_proxy/views/db_remote_service/serializers.py:19 -#: backend/db_proxy/views/gcs_dns/serializers.py:42 -#: backend/db_proxy/views/gcs_dns/serializers.py:86 -#: backend/db_services/mysql/cluster/serializers.py:45 -#: backend/db_services/mysql/instance/serializers.py:42 -#: backend/ticket/builders/common/bigdata.py:213 -#: backend/ticket/builders/common/bigdata.py:279 +#: backend/db_proxy/views/dbpriv/serializers.py:29 +#: backend/db_proxy/views/dns/serializers.py:42 +#: backend/db_proxy/views/dns/serializers.py:86 +#: backend/db_services/dbbase/cluster/serializers.py:42 +#: backend/db_services/redis/autofix/models.py:56 +#: backend/ticket/builders/common/bigdata.py:229 +#: backend/ticket/builders/common/bigdata.py:307 msgid "实例列表" msgstr "实例列表" @@ -3501,19 +6187,30 @@ msgid "SQL命令列表" msgstr "SQL命令列表" #: backend/db_proxy/views/db_remote_service/serializers.py:21 +#: backend/ticket/builders/mysql/mysql_dump_data.py:37 +#: backend/ticket/builders/mysql/mysql_flashback.py:46 #: backend/ticket/builders/mysql/mysql_ha_clear.py:35 -#: backend/ticket/builders/mysql/mysql_ha_rename.py:33 +#: backend/ticket/builders/mysql/mysql_ha_rename.py:36 +#: backend/ticket/builders/mysql/mysql_openarea.py:50 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:31 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:61 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:45 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:35 msgid "是否强制执行" msgstr "是否强制执行" -#: backend/db_proxy/views/db_remote_service/views.py:35 +#: backend/db_proxy/views/db_remote_service/views.py:30 msgid "[db-remote-service]SQL远程执行" msgstr "[db-remote-service]SQL远程执行" -#: backend/db_proxy/views/db_remote_service/views.py:46 +#: backend/db_proxy/views/db_remote_service/views.py:41 msgid "[db-remote-service]Proxy SQL远程执行" msgstr "[db-remote-service]Proxy SQL远程执行" +#: backend/db_proxy/views/db_remote_service/views.py:52 +msgid "[db-remote-service]sqlserver SQL远程执行" +msgstr "[db-remote-service]sqlserver SQL远程执行" + #: backend/db_proxy/views/dbconfig/serializers.py:22 msgid "" "conf_file 可以是,号分隔的多个文件名,返回结果是一个按照配置文件名组合的一个 " @@ -3532,6 +6229,7 @@ msgstr "" #: backend/db_proxy/views/dbconfig/serializers.py:29 #: backend/db_services/dbconfig/serializers.py:21 +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:31 msgid "配置类型" msgstr "配置类型" @@ -3580,106 +6278,154 @@ msgstr "level name" msgid "level value列表" msgstr "level value列表" -#: backend/db_proxy/views/dbconfig/views.py:40 +#: backend/db_proxy/views/dbconfig/views.py:35 msgid "[dbconfig]查询配置项列表" msgstr "[dbconfig]查询配置项列表" -#: backend/db_proxy/views/dbconfig/views.py:53 +#: backend/db_proxy/views/dbconfig/views.py:48 msgid "[dbconfig]批量获取多个对象的某一配置项" msgstr "[dbconfig]批量获取多个对象的某一配置项" -#: backend/db_proxy/views/gcs_dns/serializers.py:28 -#: backend/db_proxy/views/gcs_dns/serializers.py:44 -#: backend/db_proxy/views/gcs_dns/serializers.py:58 -#: backend/db_proxy/views/gcs_dns/serializers.py:72 -#: backend/db_proxy/views/gcs_dns/serializers.py:91 +#: backend/db_proxy/views/dbpriv/serializers.py:23 +msgid "云区域id,如果传入ip、port也要传入bk_cloud_id" +msgstr "云区域id,如果传入ip、port也要传入bk_cloud_id" + +#: backend/db_proxy/views/dbpriv/serializers.py:26 +msgid "用户名称" +msgstr "用户名称" + +#: backend/db_proxy/views/dbpriv/serializers.py:27 +msgid "组件,比如mysql、redis、tbinlogdumper等" +msgstr "组件,比如mysql、redis、tbinlogdumper等" + +#: backend/db_proxy/views/dbpriv/serializers.py:30 +msgid "信息列表" +msgstr "信息列表" + +#: backend/db_proxy/views/dbpriv/views.py:30 +msgid "[dbpriv]获取proxy密码" +msgstr "[dbpriv]获取proxy密码" + +#: backend/db_proxy/views/dns/serializers.py:28 +#: backend/db_proxy/views/dns/serializers.py:44 +#: backend/db_proxy/views/dns/serializers.py:58 +#: backend/db_proxy/views/dns/serializers.py:72 +#: backend/db_proxy/views/dns/serializers.py:91 msgid "GCS业务英文缩写" msgstr "GCS业务英文缩写" -#: backend/db_proxy/views/gcs_dns/serializers.py:29 +#: backend/db_proxy/views/dns/serializers.py:29 msgid "查询的域名列表" msgstr "查询的域名列表" -#: backend/db_proxy/views/gcs_dns/serializers.py:30 +#: backend/db_proxy/views/dns/serializers.py:30 msgid "查询的IP列表" msgstr "查询的IP列表" -#: backend/db_proxy/views/gcs_dns/serializers.py:31 +#: backend/db_proxy/views/dns/serializers.py:31 msgid "返回数据列表字段" msgstr "返回数据列表字段" -#: backend/db_proxy/views/gcs_dns/serializers.py:41 -#: backend/db_proxy/views/gcs_dns/serializers.py:59 -#: backend/db_proxy/views/gcs_dns/serializers.py:73 -#: backend/db_proxy/views/gcs_dns/serializers.py:85 +#: backend/db_proxy/views/dns/serializers.py:41 +#: backend/db_proxy/views/dns/serializers.py:59 +#: backend/db_proxy/views/dns/serializers.py:73 +#: backend/db_proxy/views/dns/serializers.py:85 msgid "查询的域名" msgstr "查询的域名" -#: backend/db_proxy/views/gcs_dns/serializers.py:45 -#: backend/db_proxy/views/gcs_dns/serializers.py:92 -#: backend/ticket/builders/mysql/mysql_single_apply.py:61 -msgid "域名列表" -msgstr "域名列表" - -#: backend/db_proxy/views/gcs_dns/serializers.py:55 +#: backend/db_proxy/views/dns/serializers.py:55 msgid "旧实例节点" msgstr "旧实例节点" -#: backend/db_proxy/views/gcs_dns/serializers.py:56 +#: backend/db_proxy/views/dns/serializers.py:56 msgid "新实例节点" msgstr "新实例节点" -#: backend/db_proxy/views/gcs_dns/serializers.py:60 +#: backend/db_proxy/views/dns/serializers.py:60 msgid "修改数组" msgstr "修改数组" -#: backend/db_proxy/views/gcs_dns/serializers.py:70 +#: backend/db_proxy/views/dns/serializers.py:70 msgid "新的实例节点" msgstr "新的实例节点" -#: backend/db_proxy/views/gcs_dns/serializers.py:74 +#: backend/db_proxy/views/dns/serializers.py:74 msgid "修改列列表" msgstr "修改列列表" -#: backend/db_proxy/views/gcs_dns/serializers.py:75 +#: backend/db_proxy/views/dns/serializers.py:75 +#: backend/db_report/views/redisbackup_check_view.py:57 msgid "实例节点" msgstr "实例节点" -#: backend/db_proxy/views/gcs_dns/serializers.py:87 +#: backend/db_proxy/views/dns/serializers.py:87 msgid "管理者" msgstr "管理者" -#: backend/db_proxy/views/gcs_dns/serializers.py:88 +#: backend/db_proxy/views/dns/serializers.py:88 msgid "域名备注信息" msgstr "域名备注信息" -#: backend/db_proxy/views/gcs_dns/serializers.py:89 +#: backend/db_proxy/views/dns/serializers.py:89 msgid "域名类型" msgstr "域名类型" -#: backend/db_proxy/views/gcs_dns/views.py:49 -msgid "[gcsdns]获取所有ip、域名关系" -msgstr "[gcsdns]获取所有ip、域名关系" +#: backend/db_proxy/views/dns/views.py:30 +msgid "[dns]获取所有ip、域名关系" +msgstr "[dns]获取所有ip、域名关系" + +#: backend/db_proxy/views/dns/views.py:46 +msgid "[dns]获取域名映射关系" +msgstr "[dns]获取域名映射关系" + +#: backend/db_proxy/views/dns/views.py:59 +msgid "[dns]批量更新域名映射关系" +msgstr "[dns]批量更新域名映射关系" + +#: backend/db_proxy/views/dns/views.py:75 +msgid "[dns]更新域名映射关系" +msgstr "[dns]更新域名映射关系" + +#: backend/db_proxy/views/dns/views.py:88 +msgid "[dns]删除域名映射" +msgstr "[dns]删除域名映射" + +#: backend/db_proxy/views/dns/views.py:104 +msgid "[dns]新增域名映射关系" +msgstr "[dns]新增域名映射关系" -#: backend/db_proxy/views/gcs_dns/views.py:60 -msgid "[gcsdns]获取域名映射关系" -msgstr "[gcsdns]获取域名映射关系" +#: backend/db_proxy/views/dumper/serializers.py:22 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:27 +msgid "主机端口" +msgstr "主机端口" -#: backend/db_proxy/views/gcs_dns/views.py:71 -msgid "[gcsdns]批量更新域名映射关系" -msgstr "[gcsdns]批量更新域名映射关系" +#: backend/db_proxy/views/dumper/serializers.py:23 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:28 +msgid "待切换后需要同步的binlog文件" +msgstr "待切换后需要同步的binlog文件" -#: backend/db_proxy/views/gcs_dns/views.py:82 -msgid "[gcsdns]更新域名映射关系" -msgstr "[gcsdns]更新域名映射关系" +#: backend/db_proxy/views/dumper/serializers.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:29 +msgid "待切换后需要同步的binlog文件的为位点" +msgstr "待切换后需要同步的binlog文件的为位点" -#: backend/db_proxy/views/gcs_dns/views.py:93 -msgid "[gcsdns]删除域名映射" -msgstr "[gcsdns]删除域名映射" +#: backend/db_proxy/views/dumper/serializers.py:27 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:32 +msgid "dumper切换信息" +msgstr "dumper切换信息" -#: backend/db_proxy/views/gcs_dns/views.py:104 -msgid "[gcsdns]新增域名映射关系" -msgstr "[gcsdns]新增域名映射关系" +#: backend/db_proxy/views/dumper/serializers.py:31 +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:35 +msgid "是否安全切换" +msgstr "是否安全切换" + +#: backend/db_proxy/views/dumper/views.py:34 +msgid "[dumper]迁移" +msgstr "[dumper]迁移" + +#: backend/db_proxy/views/dumper/views.py:78 +msgid "透传接口dumper迁移创建的单据" +msgstr "透传接口dumper迁移创建的单据" #: backend/db_proxy/views/hadb/serializers.py:19 msgid "名字" @@ -3706,81 +6452,133 @@ msgid "[hadb]上报和查询ha服务的状态" msgstr "[hadb]上报和查询ha服务的状态" #: backend/db_proxy/views/hadb/views.py:60 +msgid "[hadb]查询和上报切换队列" +msgstr "[hadb]查询和上报切换队列" + #: backend/db_proxy/views/hadb/views.py:70 -msgid "[gcsdns]查询和上报切换队列" -msgstr "[gcsdns]查询和上报切换队列" +msgid "[hadb]查询和上报切换日志" +msgstr "[hadb]查询和上报切换日志" + +#: backend/db_proxy/views/hadb/views.py:80 +msgid "[hadb]DBHA切换屏蔽配置" +msgstr "[hadb]DBHA切换屏蔽配置" + +#: backend/db_proxy/views/job_callback/serialiers.py:17 +msgid "作业实例ID" +msgstr "作业实例ID" + +#: backend/db_proxy/views/job_callback/serialiers.py:18 +msgid "作业状态码" +msgstr "作业状态码" + +#: backend/db_proxy/views/job_callback/serialiers.py:19 +msgid "步骤块中包含的各个步骤执行状态" +msgstr "步骤块中包含的各个步骤执行状态" + +#: backend/db_proxy/views/job_callback/views.py:44 +msgid "nginx文件下发job回调视图" +msgstr "nginx文件下发job回调视图" + +#: backend/db_proxy/views/job_callback/views.py:55 +msgid "[{}]nginx配置文件下发失败" +msgstr "[{}]nginx配置文件下发失败" + +#: backend/db_proxy/views/job_callback/views.py:58 +msgid "[{}]nginx配置文件下发成功" +msgstr "[{}]nginx配置文件下发成功" + +#: backend/db_proxy/views/job_callback/views.py:62 +msgid "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" +msgstr "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" + +#: backend/db_proxy/views/job_callback/views.py:87 +msgid "nginx重启参数:{}" +msgstr "nginx重启参数:{}" + +#: backend/db_proxy/views/job_callback/views.py:92 +msgid "nginx重启失败,错误信息: {}" +msgstr "nginx重启失败,错误信息: {}" + +#: backend/db_proxy/views/job_callback/views.py:97 +msgid "nginx重启job回调视图" +msgstr "nginx重启job回调视图" -#: backend/db_proxy/views/jobapi/serializers.py:21 +#: backend/db_proxy/views/job_callback/views.py:106 +msgid "[{}]nginx重启失败,请前往作业平台查看详情" +msgstr "[{}]nginx重启失败,请前往作业平台查看详情" + +#: backend/db_proxy/views/job_callback/views.py:108 +msgid "[{}]nginx重启成功" +msgstr "[{}]nginx重启成功" + +#: backend/db_proxy/views/jobapi/serializers.py:20 msgid "主机ip" msgstr "主机ip" -#: backend/db_proxy/views/jobapi/serializers.py:26 -#: backend/db_proxy/views/jobapi/serializers.py:51 +#: backend/db_proxy/views/jobapi/serializers.py:24 +#: backend/db_proxy/views/jobapi/serializers.py:48 msgid "执行脚本的主机ip列表" msgstr "执行脚本的主机ip列表" -#: backend/db_proxy/views/jobapi/serializers.py:27 +#: backend/db_proxy/views/jobapi/serializers.py:25 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:29 msgid "脚本内容" msgstr "脚本内容" -#: backend/db_proxy/views/jobapi/serializers.py:28 +#: backend/db_proxy/views/jobapi/serializers.py:26 msgid "脚本语言类型" msgstr "脚本语言类型" -#: backend/db_proxy/views/jobapi/serializers.py:29 +#: backend/db_proxy/views/jobapi/serializers.py:27 msgid "执行脚本的账号" msgstr "执行脚本的账号" -#: backend/db_proxy/views/jobapi/serializers.py:30 -#: backend/db_proxy/views/jobapi/serializers.py:78 +#: backend/db_proxy/views/jobapi/serializers.py:28 +#: backend/db_proxy/views/jobapi/serializers.py:75 msgid "超时时间,单位秒" msgstr "超时时间,单位秒" -#: backend/db_proxy/views/jobapi/serializers.py:39 -#: backend/db_proxy/views/jobapi/serializers.py:49 +#: backend/db_proxy/views/jobapi/serializers.py:37 +#: backend/db_proxy/views/jobapi/serializers.py:46 msgid "任务实例ID" msgstr "任务实例ID" -#: backend/db_proxy/views/jobapi/serializers.py:50 +#: backend/db_proxy/views/jobapi/serializers.py:47 msgid "步骤实例ID" msgstr "步骤实例ID" -#: backend/db_proxy/views/jobapi/serializers.py:62 +#: backend/db_proxy/views/jobapi/serializers.py:59 msgid "源主机ip" msgstr "源主机ip" -#: backend/db_proxy/views/jobapi/serializers.py:63 +#: backend/db_proxy/views/jobapi/serializers.py:60 msgid "源主机账号" msgstr "源主机账号" -#: backend/db_proxy/views/jobapi/serializers.py:65 +#: backend/db_proxy/views/jobapi/serializers.py:62 msgid "文件列表" msgstr "文件列表" -#: backend/db_proxy/views/jobapi/serializers.py:72 +#: backend/db_proxy/views/jobapi/serializers.py:69 msgid "目标主机ip" msgstr "目标主机ip" -#: backend/db_proxy/views/jobapi/serializers.py:74 +#: backend/db_proxy/views/jobapi/serializers.py:71 msgid "源文件列表" msgstr "源文件列表" -#: backend/db_proxy/views/jobapi/serializers.py:75 +#: backend/db_proxy/views/jobapi/serializers.py:72 msgid "目标账号" msgstr "目标账号" -#: backend/db_proxy/views/jobapi/serializers.py:76 +#: backend/db_proxy/views/jobapi/serializers.py:73 msgid "目标目录" msgstr "目标目录" -#: backend/db_proxy/views/jobapi/serializers.py:77 +#: backend/db_proxy/views/jobapi/serializers.py:74 msgid "目标主机ip列表" msgstr "目标主机ip列表" -#: backend/db_proxy/views/jobapi/serializers.py:80 -msgid "db_cloud_token" -msgstr "db_cloud_token" - #: backend/db_proxy/views/jobapi/views.py:42 msgid "[jobapi]快速执行脚本" msgstr "[jobapi]快速执行脚本" @@ -3834,395 +6632,740 @@ msgstr "北极星服务token" msgid "需要解绑的后端主机端口数组, 格式为“ip:port" msgstr "需要解绑的后端主机端口数组, 格式为“ip:port" -#: backend/db_proxy/views/nameservice/views.py:38 +#: backend/db_proxy/views/nameservice/views.py:33 msgid "[name service]clb解绑部分后端主机" msgstr "[name service]clb解绑部分后端主机" -#: backend/db_proxy/views/nameservice/views.py:53 +#: backend/db_proxy/views/nameservice/views.py:48 msgid "[name service]获取clb已绑定后端主机的IP" msgstr "[name service]获取clb已绑定后端主机的IP" -#: backend/db_proxy/views/nameservice/views.py:68 +#: backend/db_proxy/views/nameservice/views.py:63 msgid "[name service]获取polaris后端主机信息" msgstr "[name service]获取polaris后端主机信息" -#: backend/db_proxy/views/nameservice/views.py:83 +#: backend/db_proxy/views/nameservice/views.py:78 msgid "[name service]polaris解绑部分后端主机" msgstr "[name service]polaris解绑部分后端主机" #: backend/db_proxy/views/redis_dts/serializers.py:18 -#: backend/db_proxy/views/redis_dts/serializers.py:60 -#: backend/db_proxy/views/redis_dts/serializers.py:69 -#: backend/db_proxy/views/redis_dts/serializers.py:78 +#: backend/db_proxy/views/redis_dts/serializers.py:41 +#: backend/db_proxy/views/redis_dts/serializers.py:50 +#: backend/db_proxy/views/redis_dts/serializers.py:59 msgid "DTS_server IP" msgstr "DTS_server IP" -#: backend/db_proxy/views/redis_dts/serializers.py:28 -#: backend/db_proxy/views/redis_dts/serializers.py:34 -#: backend/db_proxy/views/redis_dts/serializers.py:93 -#: backend/db_proxy/views/redis_dts/serializers.py:99 -#: backend/db_services/redis_dts/serializers.py:23 -msgid "任务ID" -msgstr "任务ID" - +#: backend/db_proxy/views/redis_dts/serializers.py:23 #: backend/db_proxy/views/redis_dts/serializers.py:29 -#: backend/db_proxy/views/redis_dts/serializers.py:35 -#: backend/db_proxy/views/redis_dts/serializers.py:94 -#: backend/db_proxy/views/redis_dts/serializers.py:100 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:43 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:24 -#: backend/db_services/redis_dts/serializers.py:24 +#: backend/db_proxy/views/redis_dts/serializers.py:75 +#: backend/db_proxy/views/redis_dts/serializers.py:81 +#: backend/db_proxy/views/redis_dts/serializers.py:101 +#: backend/db_services/mysql/dumper/filters.py:43 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:75 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:22 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:28 +#: backend/db_services/redis/redis_dts/serializers.py:35 +#: backend/db_services/redis/redis_dts/serializers.py:46 msgid "源集群" msgstr "源集群" +#: backend/db_proxy/views/redis_dts/serializers.py:24 #: backend/db_proxy/views/redis_dts/serializers.py:30 -#: backend/db_proxy/views/redis_dts/serializers.py:36 -#: backend/db_proxy/views/redis_dts/serializers.py:95 -#: backend/db_proxy/views/redis_dts/serializers.py:101 -#: backend/db_services/mysql/permission/authorize/models.py:28 -#: backend/db_services/mysql/permission/authorize/serializers.py:28 -#: backend/db_services/redis_dts/serializers.py:25 +#: backend/db_proxy/views/redis_dts/serializers.py:76 +#: backend/db_proxy/views/redis_dts/serializers.py:82 +#: backend/db_proxy/views/redis_dts/serializers.py:103 +#: backend/db_services/dbpermission/db_authorize/models.py:27 +#: backend/db_services/dbpermission/db_authorize/serializers.py:27 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:25 +#: backend/db_services/mysql/open_area/serializers.py:66 +#: backend/db_services/redis/redis_dts/serializers.py:36 +#: backend/db_services/redis/redis_dts/serializers.py:48 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:25 msgid "目标集群" msgstr "目标集群" -#: backend/db_proxy/views/redis_dts/serializers.py:41 -#: backend/db_proxy/views/redis_dts/serializers.py:47 -#: backend/db_proxy/views/redis_dts/serializers.py:114 -#: backend/db_services/redis_dts/serializers.py:30 -#: backend/db_services/redis_dts/serializers.py:36 -msgid "子任务ID列表" -msgstr "子任务ID列表" - -#: backend/db_proxy/views/redis_dts/serializers.py:49 -#: backend/db_services/dbconfig/serializers.py:27 -#: backend/db_services/dbresource/serializers.py:144 -#: backend/db_services/redis_dts/serializers.py:38 -#: backend/ticket/serializers.py:220 backend/ticket/serializers.py:228 -msgid "操作类型" -msgstr "操作类型" - -#: backend/db_proxy/views/redis_dts/serializers.py:53 +#: backend/db_proxy/views/redis_dts/serializers.py:34 msgid "锁key名" msgstr "锁key名" -#: backend/db_proxy/views/redis_dts/serializers.py:54 +#: backend/db_proxy/views/redis_dts/serializers.py:35 msgid "锁持有者" msgstr "锁持有者" -#: backend/db_proxy/views/redis_dts/serializers.py:55 +#: backend/db_proxy/views/redis_dts/serializers.py:36 msgid "锁ttl时间(seconds)" msgstr "锁ttl时间(seconds)" -#: backend/db_proxy/views/redis_dts/serializers.py:61 -#: backend/db_proxy/views/redis_dts/serializers.py:70 -#: backend/db_proxy/views/redis_dts/serializers.py:79 -#: backend/db_proxy/views/redis_dts/serializers.py:89 -msgid "db类型" -msgstr "db类型" - -#: backend/db_proxy/views/redis_dts/serializers.py:63 -#: backend/db_proxy/views/redis_dts/serializers.py:72 -#: backend/db_proxy/views/redis_dts/serializers.py:104 +#: backend/db_proxy/views/redis_dts/serializers.py:44 +#: backend/db_proxy/views/redis_dts/serializers.py:53 +#: backend/db_proxy/views/redis_dts/serializers.py:85 msgid "task类型列表" msgstr "task类型列表" -#: backend/db_proxy/views/redis_dts/serializers.py:80 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:52 +#: backend/db_proxy/views/redis_dts/serializers.py:61 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:57 msgid "task类型" msgstr "task类型" -#: backend/db_proxy/views/redis_dts/serializers.py:81 +#: backend/db_proxy/views/redis_dts/serializers.py:62 msgid "限制条数" msgstr "限制条数" -#: backend/db_proxy/views/redis_dts/serializers.py:82 -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:55 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:65 +#: backend/db_proxy/views/redis_dts/serializers.py:63 +#: backend/db_services/redis/autofix/models.py:86 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:89 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:70 msgid "任务状态" msgstr "任务状态" -#: backend/db_proxy/views/redis_dts/serializers.py:87 +#: backend/db_proxy/views/redis_dts/serializers.py:68 msgid "最大数据量" msgstr "最大数据量" -#: backend/db_proxy/views/redis_dts/serializers.py:88 +#: backend/db_proxy/views/redis_dts/serializers.py:69 +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:20 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:54 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:50 #: backend/ticket/builders/mysql/mysql_single_apply.py:67 -#: backend/ticket/builders/redis/redis_cluster_apply.py:35 -#: backend/ticket/builders/spider/tendb_apply.py:48 +#: backend/ticket/builders/redis/redis_cluster_apply.py:36 +#: backend/ticket/builders/redis/redis_instance_apply.py:51 +#: backend/ticket/builders/riak/riak_apply.py:33 +#: backend/ticket/builders/riak/riak_migrate.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:66 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:53 msgid "城市名" msgstr "城市名" -#: backend/db_proxy/views/redis_dts/serializers.py:102 +#: backend/db_proxy/views/redis_dts/serializers.py:83 msgid "源redis slave IP" msgstr "源redis slave IP" -#: backend/db_proxy/views/redis_dts/serializers.py:109 +#: backend/db_proxy/views/redis_dts/serializers.py:90 msgid "子任务ID" msgstr "子任务ID" -#: backend/db_proxy/views/redis_dts/views.py:62 +#: backend/db_proxy/views/redis_dts/serializers.py:95 +#: backend/db_services/redis/redis_dts/serializers.py:41 +msgid "子任务ID列表" +msgstr "子任务ID列表" + +#: backend/db_proxy/views/redis_dts/serializers.py:102 +#: backend/db_services/redis/redis_dts/serializers.py:47 +msgid "源集群密码" +msgstr "源集群密码" + +#: backend/db_proxy/views/redis_dts/serializers.py:104 +#: backend/db_services/redis/redis_dts/serializers.py:49 +msgid "目标集群密码" +msgstr "目标集群密码" + +#: backend/db_proxy/views/redis_dts/serializers.py:108 +#: backend/db_services/redis/redis_dts/serializers.py:53 +msgid "数据复制类型" +msgstr "数据复制类型" + +#: backend/db_proxy/views/redis_dts/serializers.py:110 +#: backend/db_services/redis/redis_dts/serializers.py:55 +msgid "复制列表" +msgstr "复制列表" + +#: backend/db_proxy/views/redis_dts/views.py:56 msgid "dtsserver是否在黑名单中" msgstr "dtsserver是否在黑名单中" -#: backend/db_proxy/views/redis_dts/views.py:77 -#: backend/db_services/redis_dts/views.py:32 -msgid "获取DTS历史任务以及其对应task cnt" -msgstr "获取DTS历史任务以及其对应task cnt" - -#: backend/db_proxy/views/redis_dts/views.py:89 +#: backend/db_proxy/views/redis_dts/views.py:71 msgid "获取dts任务详情" msgstr "获取dts任务详情" -#: backend/db_proxy/views/redis_dts/views.py:99 -#: backend/db_services/redis_dts/views.py:43 +#: backend/db_proxy/views/redis_dts/views.py:81 +#: backend/db_services/redis/redis_dts/views.py:73 msgid "获取迁移任务task列表,失败的排在前面" msgstr "获取迁移任务task列表,失败的排在前面" -#: backend/db_proxy/views/redis_dts/views.py:109 -#: backend/db_services/redis_dts/views.py:54 -msgid "" -"dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) 两" -"个操作" -msgstr "" -"dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) 两" -"个操作" - -#: backend/db_proxy/views/redis_dts/views.py:121 -#: backend/db_services/redis_dts/views.py:65 -msgid "dts tasks重新开始" -msgstr "dts tasks重新开始" - -#: backend/db_proxy/views/redis_dts/views.py:131 -#: backend/db_services/redis_dts/views.py:76 -msgid "dts tasks重试当前步骤" -msgstr "dts tasks重试当前步骤" - -#: backend/db_proxy/views/redis_dts/views.py:141 +#: backend/db_proxy/views/redis_dts/views.py:91 msgid "dts 分布式锁,trylock,成功返回True,失败返回False" msgstr "dts 分布式锁,trylock,成功返回True,失败返回False" -#: backend/db_proxy/views/redis_dts/views.py:156 +#: backend/db_proxy/views/redis_dts/views.py:106 msgid "dts 分布式锁,unlock" msgstr "dts 分布式锁,unlock" -#: backend/db_proxy/views/redis_dts/views.py:171 +#: backend/db_proxy/views/redis_dts/views.py:121 msgid "获取dts server迁移中的任务" msgstr "获取dts server迁移中的任务" -#: backend/db_proxy/views/redis_dts/views.py:186 +#: backend/db_proxy/views/redis_dts/views.py:136 msgid "获取DtsServer上syncPort最大的task" msgstr "获取DtsServer上syncPort最大的task" -#: backend/db_proxy/views/redis_dts/views.py:201 +#: backend/db_proxy/views/redis_dts/views.py:151 msgid "获取最近30天内task_type类型的等待执行的tasks" msgstr "获取最近30天内task_type类型的等待执行的tasks" -#: backend/db_proxy/views/redis_dts/views.py:216 +#: backend/db_proxy/views/redis_dts/views.py:166 msgid "获取最近30天内的等待调度的jobs" msgstr "获取最近30天内的等待调度的jobs" -#: backend/db_proxy/views/redis_dts/views.py:231 -#: backend/db_proxy/views/redis_dts/views.py:246 -#: backend/db_proxy/views/redis_dts/views.py:261 +#: backend/db_proxy/views/redis_dts/views.py:181 +#: backend/db_proxy/views/redis_dts/views.py:196 +#: backend/db_proxy/views/redis_dts/views.py:211 msgid "获取一个job的所有待调度的tasks" msgstr "获取一个job的所有待调度的tasks" -#: backend/db_proxy/views/redis_dts/views.py:276 +#: backend/db_proxy/views/redis_dts/views.py:226 msgid "批量更新dts_tasks" msgstr "批量更新dts_tasks" -#: backend/db_proxy/views/serialiers.py:29 +#: backend/db_proxy/views/redis_dts/views.py:238 +msgid "redis 连接性测试" +msgstr "redis 连接性测试" + +#: backend/db_proxy/views/serialiers.py:24 msgid "调用的校验token" msgstr "调用的校验token" -#: backend/db_proxy/views/serialiers.py:30 +#: backend/db_proxy/views/serialiers.py:25 msgid "请求服务所属的云区域ID" msgstr "请求服务所属的云区域ID" -#: backend/db_proxy/views/serialiers.py:47 -msgid "token:{}解密失败,请检查token是否合法" -msgstr "token:{}解密失败,请检查token是否合法" - -#: backend/db_proxy/views/serialiers.py:49 -msgid "token:{}不存在,请传入校验token" -msgstr "token:{}不存在,请传入校验token" - -#: backend/db_proxy/views/serialiers.py:54 -msgid "解析的云区域ID{}与请求参数的云区域ID{}不相同,请检查token是否合法" -msgstr "解析的云区域ID{}与请求参数的云区域ID{}不相同,请检查token是否合法" - -#: backend/db_proxy/views/serialiers.py:62 -msgid "作业实例ID" -msgstr "作业实例ID" - -#: backend/db_proxy/views/serialiers.py:63 -msgid "作业状态码" -msgstr "作业状态码" - -#: backend/db_proxy/views/serialiers.py:64 -msgid "步骤块中包含的各个步骤执行状态" -msgstr "步骤块中包含的各个步骤执行状态" - -#: backend/db_proxy/views/views.py:55 -msgid "nginx文件下发job回调视图" -msgstr "nginx文件下发job回调视图" +#: backend/db_report/enums/__init__.py:20 +msgid "巡检报告" +msgstr "巡检报告" -#: backend/db_proxy/views/views.py:66 -msgid "[{}]nginx配置文件下发失败" -msgstr "[{}]nginx配置文件下发失败" +#: backend/db_report/enums/__init__.py:24 +msgid "文本渲染" +msgstr "文本渲染" -#: backend/db_proxy/views/views.py:69 -msgid "[{}]nginx配置文件下发成功" -msgstr "[{}]nginx配置文件下发成功" +#: backend/db_report/enums/__init__.py:25 +msgid "状态渲染" +msgstr "状态渲染" -#: backend/db_proxy/views/views.py:73 -msgid "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" -msgstr "[{}]nginx文件下发job信息缓存已过期,请考虑是否下发时间过长" +#: backend/db_report/enums/__init__.py:27 +msgid "数据校验失败详情渲染" +msgstr "数据校验失败详情渲染" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:17 +msgid "TWEMPROXY" +msgstr "TWEMPROXY" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:18 +msgid "PREDIXY" +msgstr "PREDIXY" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:19 +msgid "REDIS_SSD" +msgstr "REDIS_SSD" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:20 +msgid "REDIS_CACHE" +msgstr "REDIS_CACHE" + +#: backend/db_report/enums/dbmon_heartbeat_report_sub_type.py:21 +msgid "TENDISPLUS" +msgstr "TENDISPLUS" + +#: backend/db_report/enums/meta_check_sub_type.py:17 +#: backend/db_report/views/meta_check_view.py:43 +msgid "实例集群归属" +msgstr "实例集群归属" + +#: backend/db_report/enums/meta_check_sub_type.py:18 +msgid "数据同步实例角色" +msgstr "数据同步实例角色" + +#: backend/db_report/enums/meta_check_sub_type.py:19 +msgid "集群结构" +msgstr "集群结构" + +#: backend/db_report/enums/meta_check_sub_type.py:20 +msgid "孤立的实例" +msgstr "孤立的实例" + +#: backend/db_report/enums/meta_check_sub_type.py:21 +msgid "不属于RUNNING状态" +msgstr "不属于RUNNING状态" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:17 +msgid "集群可用全备" +msgstr "集群可用全备" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:18 +msgid "主库binlog备份" +msgstr "主库binlog备份" + +#: backend/db_report/enums/mysqlbackup_check_sub_type.py:19 +msgid "binlog连续性检查" +msgstr "binlog连续性检查" + +#: backend/db_report/enums/redisbackup_check_sub_type.py:17 +msgid "集群全备" +msgstr "集群全备" + +#: backend/db_report/enums/redisbackup_check_sub_type.py:18 +msgid "从库binlog备份" +msgstr "从库binlog备份" + +#: backend/db_report/models/checksum_check_report.py:21 +#: backend/db_services/dbbase/resources/query.py:84 +#: backend/db_services/dbbase/resources/query.py:160 +#: backend/db_services/sqlserver/data_migrate/serializers.py:48 +msgid "集群名称" +msgstr "集群名称" + +#: backend/db_report/models/checksum_check_report.py:25 +msgid "失败的slave实例数量" +msgstr "失败的slave实例数量" + +#: backend/db_report/models/checksum_check_report.py:29 +msgid "slave部署机器ip" +msgstr "slave部署机器ip" + +#: backend/db_report/models/checksum_check_report.py:30 +msgid "slave部署机器port" +msgstr "slave部署机器port" + +#: backend/db_report/models/checksum_check_report.py:31 +msgid "master部署机器ip" +msgstr "master部署机器ip" + +#: backend/db_report/models/checksum_check_report.py:32 +msgid "master部署机器port" +msgstr "master部署机器port" + +#: backend/db_report/models/checksum_check_report.py:33 +msgid "不一致库表详情" +msgstr "不一致库表详情" + +#: backend/db_report/models/dbmon_heartbeat_report.py:20 +msgid "实例类型子项" +msgstr "实例类型子项" + +#: backend/db_report/models/dbmon_heartbeat_report.py:22 +#: backend/db_report/models/redisbackup_check_report.py:21 +msgid "实例节点 ip:port" +msgstr "实例节点 ip:port" + +#: backend/db_report/models/dbmon_heartbeat_report.py:23 +#: backend/db_report/views/dbmon_heartbeat_view.py:63 +#: backend/db_services/cmdb/serializers.py:37 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:12 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:12 +#: backend/ticket/builders/__init__.py:160 backend/ticket/serializers.py:94 +msgid "业务名" +msgstr "业务名" -#: backend/db_proxy/views/views.py:91 -msgid "[{}] nginx重启参数:{}" -msgstr "[{}] nginx重启参数:{}" +#: backend/db_report/models/dbmon_heartbeat_report.py:24 +#: backend/db_report/views/dbmon_heartbeat_view.py:68 +msgid "业务所属dba" +msgstr "业务所属dba" -#: backend/db_proxy/views/views.py:96 -msgid "nginx重启失败,错误信息: {}" -msgstr "nginx重启失败,错误信息: {}" +#: backend/db_report/models/meta_check_report.py:26 +msgid "元数据检查子项" +msgstr "元数据检查子项" -#: backend/db_proxy/views/views.py:101 -msgid "nginx重启job回调视图" -msgstr "nginx重启job回调视图" +#: backend/db_report/models/mysqlbackup_check_report.py:23 +#: backend/db_report/models/redisbackup_check_report.py:23 +msgid "备份检查子项" +msgstr "备份检查子项" -#: backend/db_proxy/views/views.py:110 -msgid "[{}]nginx重启失败,请前往作业平台查看详情" -msgstr "[{}]nginx重启失败,请前往作业平台查看详情" +#: backend/db_report/report_basemodel.py:18 +msgid "业务的 cmdb id" +msgstr "业务的 cmdb id" -#: backend/db_proxy/views/views.py:112 -msgid "[{}]nginx重启成功" -msgstr "[{}]nginx重启成功" +#: backend/db_report/report_basemodel.py:19 +msgid "云区域 id" +msgstr "云区域 id" + +#: backend/db_report/report_basemodel.py:20 +msgid "巡检结果状态, 默认正常" +msgstr "巡检结果状态, 默认正常" + +#: backend/db_report/report_basemodel.py:21 +msgid "备注信息" +msgstr "备注信息" + +#: backend/db_report/views/checksum_check_report_view.py:44 +#: backend/db_report/views/checksum_check_report_view.py:84 +msgid "数据校验" +msgstr "数据校验" + +#: backend/db_report/views/checksum_check_report_view.py:48 +msgid "报告ID" +msgstr "报告ID" + +#: backend/db_report/views/checksum_check_report_view.py:53 +#: backend/db_report/views/dbmon_heartbeat_view.py:48 +#: backend/db_report/views/meta_check_view.py:47 +#: backend/db_report/views/mysqlbackup_check_view.py:48 +#: backend/db_report/views/redis_dbmeta_check_view.py:47 +#: backend/db_report/views/redisbackup_check_view.py:47 +#: backend/db_services/dbbase/resources/constants.py:19 +#: backend/db_services/dbbase/resources/query.py:238 +#: backend/db_services/ipchooser/constants.py:95 +#: backend/db_services/ipchooser/constants.py:118 +#: backend/db_services/ipchooser/mock_data.py:36 +#: backend/db_services/ipchooser/mock_data.py:92 +#: backend/db_services/meta_import/serializers.py:57 +#: backend/db_services/meta_import/serializers.py:88 +#: backend/db_services/meta_import/serializers.py:103 +#: backend/db_services/meta_import/serializers.py:115 +#: backend/iam_app/dataclass/actions.py:116 +#: backend/iam_app/dataclass/actions.py:150 +#: backend/iam_app/dataclass/actions.py:195 +#: backend/iam_app/dataclass/actions.py:1908 +#: backend/iam_app/dataclass/actions.py:1918 +#: backend/iam_app/dataclass/resources.py:169 +msgid "业务" +msgstr "业务" -#: backend/db_services/bigdata/es/query.py:34 -msgid "Master节点" -msgstr "Master节点" +#: backend/db_report/views/checksum_check_report_view.py:63 +msgid "校验结果" +msgstr "校验结果" + +#: backend/db_report/views/checksum_check_report_view.py:68 +msgid "失败的从库实例数量" +msgstr "失败的从库实例数量" + +#: backend/db_report/views/checksum_check_report_view.py:73 +msgid "失败信息" +msgstr "失败信息" + +#: backend/db_report/views/checksum_check_report_view.py:78 +#: backend/db_report/views/meta_check_view.py:77 +#: backend/db_report/views/mysqlbackup_check_view.py:73 +#: backend/db_report/views/redis_dbmeta_check_view.py:72 +#: backend/db_report/views/redisbackup_check_view.py:77 +msgid "巡检时间" +msgstr "巡检时间" + +#: backend/db_report/views/checksum_instance_view.py:38 +#: backend/db_report/views/checksum_instance_view.py:42 +msgid "失败的从库实例详情" +msgstr "失败的从库实例详情" + +#: backend/db_report/views/dbmon_heartbeat_view.py:44 +msgid "dbmon心跳超时检查" +msgstr "dbmon心跳超时检查" + +#: backend/db_report/views/dbmon_heartbeat_view.py:73 +msgid "实例节点信息" +msgstr "实例节点信息" + +#: backend/db_report/views/dbmon_heartbeat_view.py:78 +msgid "心跳超时时间" +msgstr "心跳超时时间" + +#: backend/db_report/views/dbmon_heartbeat_view.py:84 +msgid "dbmon心跳超时检查报告" +msgstr "dbmon心跳超时检查报告" + +#: backend/db_report/views/meta_check_view.py:52 +#: backend/db_services/dbbase/resources/query.py:154 +#: backend/db_services/dbbase/resources/serializers.py:70 +#: backend/db_services/mongodb/resources/query.py:36 +#: backend/ticket/builders/common/bigdata.py:222 +#: backend/ticket/builders/common/bigdata.py:301 +msgid "IP" +msgstr "IP" -#: backend/db_services/bigdata/es/query.py:37 -msgid "代理节点" -msgstr "代理节点" +#: backend/db_report/views/meta_check_view.py:57 +#: backend/db_services/dbbase/resources/serializers.py:71 +#: backend/ticket/builders/es/es_apply.py:31 +#: backend/ticket/builders/influxdb/influxdb_apply.py:39 +#: backend/ticket/builders/kafka/kafka_apply.py:81 +#: backend/ticket/builders/pulsar/pulsar_apply.py:33 +msgid "端口" +msgstr "端口" -#: backend/db_services/bigdata/es/views.py:28 -#: backend/db_services/bigdata/hdfs/views.py:36 -#: backend/db_services/bigdata/kafka/views.py:26 -#: backend/db_services/bigdata/pulsar/views.py:26 -#: backend/db_services/redis/resources/redis_cluster/views.py:32 +#: backend/db_report/views/meta_check_view.py:67 +#: backend/db_report/views/redis_dbmeta_check_view.py:62 +msgid "元数据状态" +msgstr "元数据状态" + +#: backend/db_report/views/meta_check_view.py:83 +msgid "元数据检查报告列表" +msgstr "元数据检查报告列表" + +#: backend/db_report/views/mysqlbackup_check_view.py:44 +msgid "集群全备检查" +msgstr "集群全备检查" + +#: backend/db_report/views/mysqlbackup_check_view.py:63 +msgid "全备状态" +msgstr "全备状态" + +#: backend/db_report/views/mysqlbackup_check_view.py:79 +#: backend/db_report/views/redisbackup_check_view.py:83 +msgid "备份检查报告" +msgstr "备份检查报告" + +#: backend/db_report/views/mysqlbackup_check_view.py:91 +msgid "MySQL 全备检查" +msgstr "MySQL 全备检查" + +#: backend/db_report/views/mysqlbackup_check_view.py:94 +msgid "MySQL 全备检查报告" +msgstr "MySQL 全备检查报告" + +#: backend/db_report/views/mysqlbackup_check_view.py:105 +msgid "集群binlog检查" +msgstr "集群binlog检查" + +#: backend/db_report/views/mysqlbackup_check_view.py:108 +msgid "MySQL binlog检查报告" +msgstr "MySQL binlog检查报告" + +#: backend/db_report/views/redis_dbmeta_check_view.py:43 +msgid "redis 元数据检查" +msgstr "redis 元数据检查" + +#: backend/db_report/views/redis_dbmeta_check_view.py:78 +msgid "redis 元数据检查报告" +msgstr "redis 元数据检查报告" + +#: backend/db_report/views/redis_dbmeta_check_view.py:90 +msgid "孤立节点检查" +msgstr "孤立节点检查" + +#: backend/db_report/views/redis_dbmeta_check_view.py:93 +msgid "孤立节点检查报告" +msgstr "孤立节点检查报告" + +#: backend/db_report/views/redis_dbmeta_check_view.py:104 +#: backend/db_report/views/redis_dbmeta_check_view.py:107 +msgid "实例状态异常检查" +msgstr "实例状态异常检查" + +#: backend/db_report/views/redisbackup_check_view.py:43 +msgid "集群备份检查" +msgstr "集群备份检查" + +#: backend/db_report/views/redisbackup_check_view.py:67 +msgid "备份状态" +msgstr "备份状态" + +#: backend/db_report/views/redisbackup_check_view.py:95 +msgid "Redis 全备检查" +msgstr "Redis 全备检查" + +#: backend/db_report/views/redisbackup_check_view.py:98 +msgid "Redis 全备检查报告" +msgstr "Redis 全备检查报告" + +#: backend/db_report/views/redisbackup_check_view.py:110 +msgid "Redis集群binlog检查" +msgstr "Redis集群binlog检查" + +#: backend/db_report/views/redisbackup_check_view.py:113 +msgid "Redis binlog检查报告" +msgstr "Redis binlog检查报告" + +#: backend/db_services/bigdata/doris/query.py:35 +msgid "Follower节点" +msgstr "Follower节点" + +#: backend/db_services/bigdata/doris/query.py:36 +msgid "Observer节点" +msgstr "Observer节点" + +#: backend/db_services/bigdata/doris/views.py:29 +#: backend/db_services/bigdata/es/views.py:29 +#: backend/db_services/bigdata/hdfs/views.py:37 +#: backend/db_services/bigdata/kafka/views.py:27 +#: backend/db_services/bigdata/pulsar/views.py:27 +#: backend/db_services/bigdata/riak/views.py:27 +#: backend/db_services/redis/resources/redis_cluster/views.py:34 msgid "获取集群列表" msgstr "获取集群列表" -#: backend/db_services/bigdata/es/views.py:37 -#: backend/db_services/bigdata/hdfs/views.py:45 -#: backend/db_services/bigdata/kafka/views.py:35 -#: backend/db_services/bigdata/pulsar/views.py:35 -#: backend/db_services/redis/resources/redis_cluster/views.py:41 +#: backend/db_services/bigdata/doris/views.py:38 +#: backend/db_services/bigdata/es/views.py:38 +#: backend/db_services/bigdata/hdfs/views.py:46 +#: backend/db_services/bigdata/kafka/views.py:36 +#: backend/db_services/bigdata/pulsar/views.py:36 +#: backend/db_services/bigdata/riak/views.py:36 +#: backend/db_services/redis/resources/redis_cluster/views.py:43 msgid "获取集群详情" msgstr "获取集群详情" -#: backend/db_services/bigdata/es/views.py:45 -#: backend/db_services/bigdata/hdfs/views.py:53 -#: backend/db_services/bigdata/influxdb/views.py:27 -#: backend/db_services/bigdata/kafka/views.py:43 -#: backend/db_services/bigdata/pulsar/views.py:43 +#: backend/db_services/bigdata/doris/views.py:46 +#: backend/db_services/bigdata/es/views.py:46 +#: backend/db_services/bigdata/hdfs/views.py:54 +#: backend/db_services/bigdata/influxdb/views.py:29 +#: backend/db_services/bigdata/kafka/views.py:44 +#: backend/db_services/bigdata/pulsar/views.py:44 +#: backend/db_services/bigdata/riak/views.py:44 msgid "获取实例列表" msgstr "获取实例列表" -#: backend/db_services/bigdata/es/views.py:54 -#: backend/db_services/bigdata/hdfs/views.py:62 -#: backend/db_services/bigdata/influxdb/views.py:36 -#: backend/db_services/bigdata/kafka/views.py:52 -#: backend/db_services/bigdata/pulsar/views.py:52 +#: backend/db_services/bigdata/doris/views.py:55 +#: backend/db_services/bigdata/es/views.py:55 +#: backend/db_services/bigdata/hdfs/views.py:63 +#: backend/db_services/bigdata/influxdb/views.py:38 +#: backend/db_services/bigdata/kafka/views.py:53 +#: backend/db_services/bigdata/pulsar/views.py:53 +#: backend/db_services/bigdata/riak/views.py:53 msgid "获取实例详情" msgstr "获取实例详情" -#: backend/db_services/bigdata/es/views.py:62 -#: backend/db_services/bigdata/hdfs/views.py:70 -#: backend/db_services/bigdata/influxdb/views.py:44 -#: backend/db_services/bigdata/kafka/views.py:60 -#: backend/db_services/bigdata/pulsar/views.py:60 +#: backend/db_services/bigdata/doris/views.py:63 +#: backend/db_services/bigdata/es/views.py:63 +#: backend/db_services/bigdata/hdfs/views.py:71 +#: backend/db_services/bigdata/influxdb/views.py:46 +#: backend/db_services/bigdata/kafka/views.py:61 +#: backend/db_services/bigdata/pulsar/views.py:61 +#: backend/db_services/bigdata/riak/views.py:61 msgid "获取查询返回字段" msgstr "获取查询返回字段" -#: backend/db_services/bigdata/es/views.py:70 -#: backend/db_services/bigdata/hdfs/views.py:78 -#: backend/db_services/bigdata/influxdb/views.py:52 -#: backend/db_services/bigdata/kafka/views.py:68 -#: backend/db_services/bigdata/pulsar/views.py:68 -#: backend/db_services/redis/resources/redis_cluster/views.py:71 +#: backend/db_services/bigdata/doris/views.py:71 +#: backend/db_services/bigdata/es/views.py:71 +#: backend/db_services/bigdata/hdfs/views.py:79 +#: backend/db_services/bigdata/influxdb/views.py:54 +#: backend/db_services/bigdata/kafka/views.py:69 +#: backend/db_services/bigdata/pulsar/views.py:69 +#: backend/db_services/bigdata/riak/views.py:69 +#: backend/db_services/redis/resources/redis_cluster/views.py:73 msgid "获取集群拓扑" msgstr "获取集群拓扑" -#: backend/db_services/bigdata/es/views.py:78 -#: backend/db_services/redis/resources/redis_cluster/views.py:79 +#: backend/db_services/bigdata/doris/views.py:79 +#: backend/db_services/bigdata/es/views.py:79 +#: backend/db_services/redis/resources/redis_cluster/views.py:89 msgid "获取集群节点" msgstr "获取集群节点" -#: backend/db_services/bigdata/hdfs/query.py:34 +#: backend/db_services/bigdata/es/query.py:35 +msgid "Master节点" +msgstr "Master节点" + +#: backend/db_services/bigdata/es/query.py:38 +msgid "代理节点" +msgstr "代理节点" + +#: backend/db_services/bigdata/hdfs/query.py:36 msgid "namenode节点" msgstr "namenode节点" -#: backend/db_services/bigdata/hdfs/query.py:35 -#: backend/db_services/bigdata/kafka/query.py:28 -#: backend/db_services/bigdata/pulsar/query.py:27 +#: backend/db_services/bigdata/hdfs/query.py:37 +#: backend/db_services/bigdata/kafka/query.py:30 +#: backend/db_services/bigdata/pulsar/query.py:29 msgid "zookeeper节点" msgstr "zookeeper节点" -#: backend/db_services/bigdata/hdfs/query.py:36 +#: backend/db_services/bigdata/hdfs/query.py:38 msgid "journalnode节点" msgstr "journalnode节点" -#: backend/db_services/bigdata/hdfs/query.py:37 +#: backend/db_services/bigdata/hdfs/query.py:39 msgid "datanode节点" msgstr "datanode节点" -#: backend/db_services/bigdata/hdfs/views.py:88 +#: backend/db_services/bigdata/hdfs/views.py:90 msgid "获取集群访问xml配置" msgstr "获取集群访问xml配置" -#: backend/db_services/bigdata/influxdb/query.py:33 -#: backend/db_services/bigdata/resources/query.py:45 -msgid "版本" -msgstr "版本" - -#: backend/db_services/bigdata/influxdb/query.py:37 -#: backend/db_services/bigdata/resources/query.py:49 -#: backend/db_services/dbconfig/serializers.py:67 -#: backend/db_services/redis/resources/redis_cluster/query.py:63 -msgid "更新人" -msgstr "更新人" - -#: backend/db_services/bigdata/kafka/query.py:27 -#: backend/db_services/bigdata/pulsar/query.py:26 +#: backend/db_services/bigdata/kafka/query.py:29 +#: backend/db_services/bigdata/pulsar/query.py:28 msgid "broker节点" msgstr "broker节点" -#: backend/db_services/bigdata/pulsar/query.py:28 +#: backend/db_services/bigdata/pulsar/query.py:30 msgid "bookkeeper节点" msgstr "bookkeeper节点" -#: backend/db_services/bigdata/resources/query.py:43 +#: backend/db_services/bigdata/resources/query.py:41 msgid "集群类型名" msgstr "集群类型名" -#: backend/db_services/bigdata/resources/views.py:80 -#: backend/db_services/redis/resources/redis_cluster/views.py:95 +#: backend/db_services/bigdata/resources/serializers.py:21 +msgid "Agent状态" +msgstr "Agent状态" + +#: backend/db_services/bigdata/resources/serializers.py:22 +#: backend/db_services/dbresource/serializers.py:203 +msgid "排序字段" +msgstr "排序字段" + +#: backend/db_services/bigdata/resources/serializers.py:30 +msgid "排序参数只能是 'create_at' 或 'node_count'。" +msgstr "排序参数只能是 'create_at' 或 'node_count'。" + +#: backend/db_services/bigdata/resources/views.py:98 +#: backend/db_services/redis/resources/redis_cluster/views.py:130 msgid "获取集群访问密码" msgstr "获取集群访问密码" -#: backend/db_services/bigdata/resources/views.py:121 +#: backend/db_services/bigdata/resources/views.py:158 msgid "获取集群节点列表信息" msgstr "获取集群节点列表信息" -#: backend/db_services/bigdata/resources/views.py:139 -#: backend/db_services/mysql/resources/views.py:85 -#: backend/db_services/redis/resources/views.py:83 +#: backend/db_services/bigdata/resources/views.py:188 +#: backend/db_services/mongodb/resources/views.py:113 +#: backend/db_services/mysql/resources/views.py:45 +#: backend/db_services/redis/resources/views.py:43 +#: backend/db_services/sqlserver/resources/views.py:48 msgid "获取资源拓扑树" msgstr "获取资源拓扑树" +#: backend/db_services/bigdata/riak/query.py:29 +msgid "riak节点" +msgstr "riak节点" + +#: backend/db_services/cluster_entry/serializers.py:20 +msgid "访问入口类型" +msgstr "访问入口类型" + +#: backend/db_services/cluster_entry/serializers.py:24 +msgid "目标实例,格式为 ip#port " +msgstr "目标实例,格式为 ip#port " + +#: backend/db_services/cluster_entry/serializers.py:24 +msgid "目标实例列表" +msgstr "目标实例列表" + +#: backend/db_services/cluster_entry/serializers.py:27 +#: backend/db_services/cluster_entry/serializers.py:43 +#: backend/db_services/dbbase/resources/query.py:83 +#: backend/db_services/dbbase/resources/query.py:159 +msgid "集群 ID" +msgstr "集群 ID" + +#: backend/db_services/cluster_entry/serializers.py:29 +msgid "访问入口详情" +msgstr "访问入口详情" + +#: backend/db_services/cluster_entry/serializers.py:36 +msgid "修改 DNS 访问入口需要传入 domain_name 和 target_instances" +msgstr "修改 DNS 访问入口需要传入 domain_name 和 target_instances" + +#: backend/db_services/cluster_entry/serializers.py:38 +msgid "修改 DNS,目标实例列表不能为空" +msgstr "修改 DNS,目标实例列表不能为空" + +#: backend/db_services/cluster_entry/serializers.py:44 +#: backend/db_services/ipchooser/serializers/base.py:32 +#: backend/db_services/ipchooser/serializers/base.py:41 +#: backend/db_services/redis/autofix/models.py:25 +msgid "业务 ID" +msgstr "业务 ID" + +#: backend/db_services/cluster_entry/serializers.py:45 +msgid "入口类型" +msgstr "入口类型" + +#: backend/db_services/cluster_entry/views.py:32 +msgid "集群访问入口" +msgstr "集群访问入口" + +#: backend/db_services/cluster_entry/views.py:63 +msgid "修改集群访问入口" +msgstr "修改集群访问入口" + +#: backend/db_services/cluster_entry/views.py:73 +msgid "获取集群入口列表" +msgstr "获取集群入口列表" + #: backend/db_services/cmdb/exceptions.py:18 msgid "CMDB模块异常" msgstr "CMDB模块异常" @@ -4231,107 +7374,456 @@ msgstr "CMDB模块异常" msgid "英文缩写已存在,不允许修改" msgstr "英文缩写已存在,不允许修改" -#: backend/db_services/cmdb/serializers.py:19 backend/ticket/serializers.py:76 -msgid "业务名" -msgstr "业务名" - #: backend/db_services/cmdb/serializers.py:21 +msgid "查询的权限动作" +msgstr "查询的权限动作" + +#: backend/db_services/cmdb/serializers.py:30 +msgid "只允许查询关联资源为业务的动作权限" +msgstr "只允许查询关联资源为业务的动作权限" + +#: backend/db_services/cmdb/serializers.py:39 msgid "业务权限列表" msgstr "业务权限列表" -#: backend/db_services/cmdb/serializers.py:26 +#: backend/db_services/cmdb/serializers.py:44 +#: backend/db_services/dbconfig/serializers.py:94 #: backend/ticket/builders/mysql/mysql_single_apply.py:51 -#: backend/ticket/builders/spider/tendb_apply.py:34 +#: backend/ticket/builders/riak/riak_apply.py:28 +#: backend/ticket/builders/riak/riak_migrate.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:50 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:36 msgid "DB模块ID" msgstr "DB模块ID" -#: backend/db_services/cmdb/serializers.py:27 -#: backend/db_services/cmdb/serializers.py:35 +#: backend/db_services/cmdb/serializers.py:45 +#: backend/db_services/cmdb/serializers.py:53 #: backend/ticket/builders/mysql/mysql_single_apply.py:66 -#: backend/ticket/builders/spider/tendb_apply.py:47 +#: backend/ticket/builders/riak/riak_apply.py:32 +#: backend/ticket/builders/riak/riak_migrate.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:65 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:52 msgid "DB模块名" msgstr "DB模块名" -#: backend/db_services/cmdb/serializers.py:40 +#: backend/db_services/cmdb/serializers.py:58 +msgid "请确保模块名称的长度不超过: {}" +msgstr "请确保模块名称的长度不超过: {}" + +#: backend/db_services/cmdb/serializers.py:64 msgid "英文缩写" msgstr "英文缩写" -#: backend/db_services/cmdb/serializers.py:48 -#: backend/db_services/dbresource/serializers.py:83 +#: backend/db_services/cmdb/serializers.py:68 +msgid "请确保业务CODE的长度不超过: {}" +msgstr "请确保业务CODE的长度不超过: {}" + +#: backend/db_services/cmdb/serializers.py:78 +#: backend/db_services/dbresource/serializers.py:94 msgid "单页数量" msgstr "单页数量" -#: backend/db_services/cmdb/serializers.py:49 +#: backend/db_services/cmdb/serializers.py:79 msgid "页数" msgstr "页数" -#: backend/db_services/cmdb/views.py:36 +#: backend/db_services/cmdb/views.py:43 +#: backend/db_services/quick_search/serializers.py:20 msgid "业务列表" msgstr "业务列表" -#: backend/db_services/cmdb/views.py:37 +#: backend/db_services/cmdb/views.py:45 msgid "业务信息" msgstr "业务信息" -#: backend/db_services/cmdb/views.py:46 +#: backend/db_services/cmdb/views.py:55 msgid "业务下的模块列表" msgstr "业务下的模块列表" -#: backend/db_services/cmdb/views.py:48 +#: backend/db_services/cmdb/views.py:57 msgid "模块信息" msgstr "模块信息" -#: backend/db_services/cmdb/views.py:59 +#: backend/db_services/cmdb/views.py:75 msgid "创建数据库模块" msgstr "创建数据库模块" -#: backend/db_services/cmdb/views.py:71 +#: backend/db_services/cmdb/views.py:87 msgid "设置业务英文缩写" msgstr "设置业务英文缩写" -#: backend/db_services/dbbase/constants.py:31 +#: backend/db_services/cmdb/views.py:97 +msgid "查询 CC 角色对象" +msgstr "查询 CC 角色对象" + +#: backend/db_services/dbbase/cluster/handlers.py:43 +msgid "集群[]不存在,请检查集群ID" +msgstr "集群[]不存在,请检查集群ID" + +#: backend/db_services/dbbase/cluster/handlers.py:185 +msgid "无法找到集群{}所包含实例,请检查集群相关信息" +msgstr "无法找到集群{}所包含实例,请检查集群相关信息" + +#: backend/db_services/dbbase/cluster/serializers.py:24 +#: backend/db_services/mongodb/restore/serializers.py:21 +#: backend/db_services/mysql/cluster/serializers.py:48 +#: backend/db_services/mysql/cluster/serializers.py:57 +#: backend/db_services/mysql/cluster/serializers.py:79 +#: backend/db_services/mysql/remote_service/serializers.py:28 +#: backend/db_services/mysql/remote_service/serializers.py:32 +#: backend/db_services/mysql/remote_service/serializers.py:43 +#: backend/db_services/mysql/sql_import/serializers.py:92 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:33 +#: backend/ticket/builders/mongodb/mongo_backup.py:35 +#: backend/ticket/builders/mongodb/mongo_clear.py:28 +#: backend/ticket/builders/mongodb/mongo_destroy.py:23 +#: backend/ticket/builders/mongodb/mongo_disable.py:24 +#: backend/ticket/builders/mongodb/mongo_enable.py:24 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:28 +#: backend/ticket/builders/mongodb/mongo_script_exec.py:31 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:25 +#: backend/ticket/builders/mysql/mysql_add_slave.py:28 +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:26 +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:24 +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:37 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:30 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:35 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:29 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:34 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:24 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:22 +#: backend/ticket/builders/mysql/mysql_restore_slave.py:28 +#: backend/ticket/builders/redis/redis_close.py:55 +#: backend/ticket/builders/redis/redis_cluster_version_update.py:23 +#: backend/ticket/builders/redis/redis_destroy.py:54 +#: backend/ticket/builders/redis/redis_maxmemory_set.py:65 +#: backend/ticket/builders/redis/redis_open.py:52 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:29 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:32 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:46 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:26 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:25 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:23 +#: backend/ticket/builders/tendbsingle/standardize.py:24 +#: backend/ticket/models/ticket.py:236 backend/ticket/serializers.py:303 +msgid "集群ID列表" +msgstr "集群ID列表" + +#: backend/db_services/dbbase/cluster/serializers.py:38 +#: backend/ticket/builders/common/base.py:101 +msgid "IP地址" +msgstr "IP地址" + +#: backend/db_services/dbbase/cluster/serializers.py:40 +#: backend/ticket/builders/common/base.py:115 +#: backend/ticket/builders/common/bigdata.py:223 +#: backend/ticket/builders/common/bigdata.py:302 +msgid "端口号" +msgstr "端口号" + +#: backend/db_services/dbbase/cluster/serializers.py:56 +#: backend/db_services/sqlserver/cluster/serializers.py:18 +#: backend/db_services/sqlserver/cluster/serializers.py:46 +#: backend/db_services/sqlserver/cluster/serializers.py:57 +msgid "db列表" +msgstr "db列表" + +#: backend/db_services/dbbase/cluster/views.py:36 +msgid "通过集群查询同机关联集群" +msgstr "通过集群查询同机关联集群" + +#: backend/db_services/dbbase/cluster/views.py:49 +msgid "通过实例查询同机关联集群" +msgstr "通过实例查询同机关联集群" + +#: backend/db_services/dbbase/constants.py:36 msgid "手动录入" msgstr "手动录入" -#: backend/db_services/dbbase/constants.py:32 -#: backend/db_services/dbresource/constants.py:15 +#: backend/db_services/dbbase/constants.py:37 +#: backend/db_services/dbresource/constants.py:25 +#: backend/iam_app/dataclass/actions.py:1504 +#: backend/iam_app/dataclass/actions.py:1516 msgid "资源池" msgstr "资源池" -#: backend/db_services/dbbase/resources/constants.py:18 -#: backend/db_services/dbbase/resources/query.py:27 -#: backend/db_services/ipchooser/constants.py:59 -#: backend/db_services/ipchooser/constants.py:82 -#: backend/db_services/ipchooser/mock_data.py:36 -#: backend/db_services/ipchooser/mock_data.py:92 -#: backend/iam_app/dataclass/resources.py:61 -msgid "业务" -msgstr "业务" +#: backend/db_services/dbbase/constants.py:43 +msgid "污点主机" +msgstr "污点主机" -#: backend/db_services/dbbase/resources/constants.py:20 -#: backend/db_services/ipchooser/constants.py:82 +#: backend/db_services/dbbase/constants.py:44 +msgid "资源操作记录" +msgstr "资源操作记录" + +#: backend/db_services/dbbase/instances/views.py:29 +msgid "根据用户手动输入的 ip:port 查询真实的实例" +msgstr "根据用户手动输入的 ip:port 查询真实的实例" + +#: backend/db_services/dbbase/instances/yasg_slz.py:20 +msgid "实例地址列表" +msgstr "实例地址列表" + +#: backend/db_services/dbbase/instances/yasg_slz.py:20 +#: backend/db_services/dbbase/resources/serializers.py:69 +#: backend/db_services/dbbase/resources/serializers.py:121 +msgid "实例地址(ip:port)" +msgstr "实例地址(ip:port)" + +#: backend/db_services/dbbase/instances/yasg_slz.py:23 +msgid "实例所属组件类型" +msgstr "实例所属组件类型" + +#: backend/db_services/dbbase/instances/yasg_slz.py:25 +msgid "实例所在的集群列表" +msgstr "实例所在的集群列表" + +#: backend/db_services/dbbase/instances/yasg_slz.py:53 +msgid "测试业务" +msgstr "测试业务" + +#: backend/db_services/dbbase/resources/constants.py:21 +#: backend/db_services/ipchooser/constants.py:118 #: backend/db_services/ipchooser/mock_data.py:50 #: backend/db_services/ipchooser/mock_data.py:69 msgid "模块" msgstr "模块" -#: backend/db_services/dbbase/resources/serializers.py:47 -#: backend/db_services/dbbase/resources/serializers.py:80 -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:113 -msgid "实例地址(ip:port)" -msgstr "实例地址(ip:port)" +#: backend/db_services/dbbase/resources/query.py:87 +#: backend/db_services/dbbase/resources/query.py:163 +#: backend/db_services/mongodb/resources/query.py:35 +#: backend/db_services/mysql/resources/tendbcluster/query.py:41 +#: backend/db_services/mysql/resources/tendbha/query.py:35 +#: backend/db_services/mysql/resources/tendbsingle/query.py:33 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:32 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:32 +msgid "主域名" +msgstr "主域名" + +#: backend/db_services/dbbase/resources/query.py:88 +#: backend/db_services/mysql/resources/tendbcluster/query.py:42 +#: backend/db_services/mysql/resources/tendbha/query.py:36 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:33 +msgid "从域名" +msgstr "从域名" + +#: backend/db_services/dbbase/resources/query.py:89 +#: backend/db_services/dbbase/resources/query.py:164 +msgid "主版本" +msgstr "主版本" + +#: backend/db_services/dbbase/resources/query.py:91 +#: backend/ticket/builders/common/bigdata.py:114 +#: backend/ticket/builders/influxdb/influxdb_apply.py:35 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:37 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:32 +#: backend/ticket/builders/mysql/mysql_ha_apply.py:38 +#: backend/ticket/builders/redis/redis_cluster_apply.py:34 +#: backend/ticket/builders/redis/redis_instance_apply.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:34 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:41 +msgid "容灾级别" +msgstr "容灾级别" + +#: backend/db_services/dbbase/resources/query.py:152 +msgid "主机 ID" +msgstr "主机 ID" + +#: backend/db_services/dbbase/resources/query.py:155 +msgid "IP 端口" +msgstr "IP 端口" + +#: backend/db_services/dbbase/resources/query.py:157 +#: backend/db_services/dbresource/serializers.py:80 +#: backend/db_services/dbresource/serializers.py:378 +msgid "城市" +msgstr "城市" + +#: backend/db_services/dbbase/resources/serializers.py:30 +msgid "精确域名查询" +msgstr "精确域名查询" + +#: backend/db_services/dbbase/resources/serializers.py:31 +msgid "排序字段,非必填" +msgstr "排序字段,非必填" + +#: backend/db_services/dbbase/resources/serializers.py:33 +#: backend/db_services/dbbase/resources/serializers.py:110 +msgid "所属DB模块" +msgstr "所属DB模块" + +#: backend/db_services/dbbase/resources/serializers.py:34 +msgid "管控区域" +msgstr "管控区域" #: backend/db_services/dbbase/resources/serializers.py:48 -#: backend/ticket/builders/common/bigdata.py:206 -#: backend/ticket/builders/common/bigdata.py:273 -msgid "IP" -msgstr "IP" +msgid "模块类型" +msgstr "模块类型" + +#: backend/db_services/dbbase/resources/serializers.py:52 +msgid "批量域名查询(逗号分割)" +msgstr "批量域名查询(逗号分割)" + +#: backend/db_services/dbbase/resources/serializers.py:103 +#: backend/db_services/dbbase/resources/serializers.py:125 +#: backend/db_services/redis/toolbox/serializers.py:189 +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:30 +#: backend/ticket/serializers.py:251 +msgid "角色" +msgstr "角色" + +#: backend/db_services/dbbase/resources/serializers.py:114 +msgid "精确IP查询" +msgstr "精确IP查询" -#: backend/db_services/dbbase/resources/serializers.py:85 -#: backend/ticket/serializers.py:199 +#: backend/db_services/dbbase/resources/serializers.py:126 +#: backend/db_services/quick_search/serializers.py:32 +#: backend/ticket/serializers.py:252 msgid "关键字过滤" msgstr "关键字过滤" +#: backend/db_services/dbbase/resources/serializers.py:131 +msgid "IP(多个IP过滤以逗号分隔)" +msgstr "IP(多个IP过滤以逗号分隔)" + +#: backend/db_services/dbbase/resources/serializers.py:132 +msgid "集群ID(多个过滤以逗号分隔)" +msgstr "集群ID(多个过滤以逗号分隔)" + +#: backend/db_services/dbbase/resources/serializers.py:133 +#: backend/db_services/dbbase/resources/serializers.py:142 +#: backend/db_services/redis/toolbox/serializers.py:191 +msgid "集群状态" +msgstr "集群状态" + +#: backend/db_services/dbbase/resources/serializers.py:135 +msgid "城市名(多个过滤以逗号分隔)" +msgstr "城市名(多个过滤以逗号分隔)" + +#: backend/db_services/dbbase/resources/serializers.py:136 +#: backend/db_services/dbresource/serializers.py:322 +msgid "机器类型" +msgstr "机器类型" + +#: backend/db_services/dbbase/resources/serializers.py:137 +msgid "os名字" +msgstr "os名字" + +#: backend/db_services/dbbase/resources/serializers.py:139 +msgid "agent id" +msgstr "agent id" + +#: backend/db_services/dbbase/resources/serializers.py:140 +msgid "机器部署的实例角色" +msgstr "机器部署的实例角色" + +#: backend/db_services/dbbase/resources/serializers.py:144 +#: backend/db_services/dbpermission/db_account/serializers.py:88 +#: backend/db_services/dbpermission/db_account/serializers.py:97 +#: backend/iam_app/dataclass/resources.py:231 +#: backend/iam_app/dataclass/resources.py:277 +#: backend/iam_app/dataclass/resources.py:323 +#: backend/iam_app/dataclass/resources.py:473 +#: backend/iam_app/dataclass/resources.py:555 +#: backend/iam_app/dataclass/resources.py:626 +#: backend/iam_app/dataclass/resources.py:680 +#: backend/iam_app/dataclass/resources.py:703 +msgid "创建者" +msgstr "创建者" + +#: backend/db_services/dbbase/resources/serializers.py:153 +msgid "spider角色" +msgstr "spider角色" + +#: backend/db_services/dbbase/serializers.py:39 +#: backend/db_services/dbbase/serializers.py:63 +msgid "集群类型(逗号分隔)" +msgstr "集群类型(逗号分隔)" + +#: backend/db_services/dbbase/serializers.py:42 +msgid "集群阶段状态" +msgstr "集群阶段状态" + +#: backend/db_services/dbbase/serializers.py:64 +#: backend/db_services/dbbase/serializers.py:80 +msgid "集群ID(逗号分割)" +msgstr "集群ID(逗号分割)" + +#: backend/db_services/dbbase/serializers.py:79 +msgid "域名精确查询" +msgstr "域名精确查询" + +#: backend/db_services/dbbase/serializers.py:96 +msgid "查询集群属性字段(逗号分隔)" +msgstr "查询集群属性字段(逗号分隔)" + +#: backend/db_services/dbbase/serializers.py:97 +msgid "查询实例属性字段(逗号分隔)" +msgstr "查询实例属性字段(逗号分隔)" + +#: backend/db_services/dbbase/serializers.py:108 +msgid "未知的集群类型:{}" +msgstr "未知的集群类型:{}" + +#: backend/db_services/dbbase/serializers.py:111 +msgid "所有集群类型必须属于同一种DBtype类型" +msgstr "所有集群类型必须属于同一种DBtype类型" + +#: backend/db_services/dbbase/serializers.py:173 +#: backend/db_services/mysql/sql_import/serializers.py:29 +#: backend/db_services/sqlserver/sql_import/serializers.py:19 +msgid "sql语句" +msgstr "sql语句" + +#: backend/db_services/dbbase/serializers.py:175 +msgid "数据库编号(redis 额外参数)" +msgstr "数据库编号(redis 额外参数)" + +#: backend/db_services/dbbase/serializers.py:176 +msgid "源编码(redis 额外参数)" +msgstr "源编码(redis 额外参数)" + +#: backend/db_services/dbbase/views.py:50 +msgid "集群通用接口" +msgstr "集群通用接口" + +#: backend/db_services/dbbase/views.py:71 +msgid "查询集群名字是否重复" +msgstr "查询集群名字是否重复" + +#: backend/db_services/dbbase/views.py:84 +msgid "查询业务集群简略信息" +msgstr "查询业务集群简略信息" + +#: backend/db_services/dbbase/views.py:99 +msgid "查询业务下集群通用信息" +msgstr "查询业务下集群通用信息" + +#: backend/db_services/dbbase/views.py:112 +msgid "根据过滤条件查询业务下集群详细信息" +msgstr "根据过滤条件查询业务下集群详细信息" + +#: backend/db_services/dbbase/views.py:138 +msgid "根据用户手动输入的ip[:port]查询真实的实例" +msgstr "根据用户手动输入的ip[:port]查询真实的实例" + +#: backend/db_services/dbbase/views.py:155 +msgid "查询集群的库是否存在" +msgstr "查询集群的库是否存在" + +#: backend/db_services/dbbase/views.py:167 +msgid "查询业务下集群的属性字段" +msgstr "查询业务下集群的属性字段" + +#: backend/db_services/dbbase/views.py:234 +msgid "查询资源池,污点主机管理表头筛选数据" +msgstr "查询资源池,污点主机管理表头筛选数据" + +#: backend/db_services/dbbase/views.py:247 +msgid "webconsole查询" +msgstr "webconsole查询" + #: backend/db_services/dbconfig/exceptions.py:18 msgid "配置模块异常" msgstr "配置模块异常" @@ -4382,6 +7874,13 @@ msgstr "参数项" msgid "是否锁定" msgstr "是否锁定" +#: backend/db_services/dbconfig/serializers.py:27 +#: backend/db_services/dbresource/serializers.py:196 +#: backend/db_services/mysql/open_area/serializers.py:80 +#: backend/ticket/serializers.py:277 backend/ticket/serializers.py:285 +msgid "操作类型" +msgstr "操作类型" + #: backend/db_services/dbconfig/serializers.py:32 msgid "是否重启实例生效" msgstr "是否重启实例生效" @@ -4409,22 +7908,22 @@ msgid "配置文件名" msgstr "配置文件名" #: backend/db_services/dbconfig/serializers.py:42 -#: backend/db_services/dbconfig/serializers.py:94 +#: backend/db_services/dbconfig/serializers.py:98 msgid "配置项列表" msgstr "配置项列表" #: backend/db_services/dbconfig/serializers.py:43 -#: backend/db_services/dbconfig/serializers.py:95 +#: backend/db_services/dbconfig/serializers.py:99 msgid "是否确认" msgstr "是否确认" #: backend/db_services/dbconfig/serializers.py:44 -#: backend/db_services/dbconfig/serializers.py:96 +#: backend/db_services/dbconfig/serializers.py:100 msgid "配置文件描述" msgstr "配置文件描述" #: backend/db_services/dbconfig/serializers.py:45 -#: backend/db_services/dbconfig/serializers.py:97 +#: backend/db_services/dbconfig/serializers.py:101 msgid "发布描述" msgstr "发布描述" @@ -4440,10111 +7939,22519 @@ msgstr "层级值" msgid "层级关系" msgstr "层级关系" -#: backend/db_services/dbconfig/serializers.py:114 +#: backend/db_services/dbconfig/serializers.py:118 msgid "历史版本号" msgstr "历史版本号" -#: backend/db_services/dbconfig/views.py:35 +#: backend/db_services/dbconfig/views.py:68 msgid "查询配置项名称列表" msgstr "查询配置项名称列表" -#: backend/db_services/dbconfig/views.py:47 +#: backend/db_services/dbconfig/views.py:80 msgid "查询平台配置列表" msgstr "查询平台配置列表" -#: backend/db_services/dbconfig/views.py:59 +#: backend/db_services/dbconfig/views.py:97 msgid "新建平台配置" msgstr "新建平台配置" -#: backend/db_services/dbconfig/views.py:73 +#: backend/db_services/dbconfig/views.py:111 msgid "编辑平台配置" msgstr "编辑平台配置" -#: backend/db_services/dbconfig/views.py:87 +#: backend/db_services/dbconfig/views.py:125 msgid "查询平台配置详情" msgstr "查询平台配置详情" -#: backend/db_services/dbconfig/views.py:99 +#: backend/db_services/dbconfig/views.py:137 msgid "查询业务配置列表" msgstr "查询业务配置列表" -#: backend/db_services/dbconfig/views.py:112 +#: backend/db_services/dbconfig/views.py:158 msgid "编辑层级(业务、模块、集群)配置" msgstr "编辑层级(业务、模块、集群)配置" -#: backend/db_services/dbconfig/views.py:125 +#: backend/db_services/dbconfig/views.py:171 msgid "保存模块部署配置" msgstr "保存模块部署配置" -#: backend/db_services/dbconfig/views.py:141 +#: backend/db_services/dbconfig/views.py:187 msgid "查询层级(业务、模块、集群)配置详情" msgstr "查询层级(业务、模块、集群)配置详情" -#: backend/db_services/dbconfig/views.py:153 +#: backend/db_services/dbconfig/views.py:199 +msgid "查询模块配置详情" +msgstr "查询模块配置详情" + +#: backend/db_services/dbconfig/views.py:221 msgid "查询配置发布历史记录" msgstr "查询配置发布历史记录" -#: backend/db_services/dbconfig/views.py:165 +#: backend/db_services/dbconfig/views.py:233 msgid "查询配置发布记录详情" msgstr "查询配置发布记录详情" -#: backend/db_services/dbresource/constants.py:22 -msgid "导入主机" -msgstr "导入主机" +#: backend/db_services/dbpermission/constants.py:32 +msgid "选择" +msgstr "选择" -#: backend/db_services/dbresource/constants.py:23 -msgid "消费主机" -msgstr "消费主机" +#: backend/db_services/dbpermission/constants.py:33 +msgid "插入" +msgstr "插入" -#: backend/db_services/dbresource/exceptions.py:18 -msgid "资源池服务异常" -msgstr "资源池服务异常" +#: backend/db_services/dbpermission/constants.py:36 +msgid "查看视图" +msgstr "查看视图" -#: backend/db_services/dbresource/exceptions.py:23 -#: backend/db_services/dbresource/exceptions.py:24 -msgid "资源池申请资源异常" -msgstr "资源池申请资源异常" +#: backend/db_services/dbpermission/constants.py:41 +msgid "创建表" +msgstr "创建表" -#: backend/db_services/dbresource/exceptions.py:29 -#: backend/db_services/dbresource/exceptions.py:30 -msgid "规格操作失败" -msgstr "规格操作失败" +#: backend/db_services/dbpermission/constants.py:42 +msgid "修改表" +msgstr "修改表" -#: backend/db_services/dbresource/exceptions.py:35 -#: backend/db_services/dbresource/exceptions.py:36 -msgid "部署方案操作失败" -msgstr "部署方案操作失败" +#: backend/db_services/dbpermission/constants.py:43 backend/flow/consts.py:1330 +msgid "删除表" +msgstr "删除表" -#: backend/db_services/dbresource/filters.py:19 -msgid "规格名称" -msgstr "规格名称" +#: backend/db_services/dbpermission/constants.py:44 +msgid "索引" +msgstr "索引" -#: backend/db_services/dbresource/filters.py:21 -msgid "规格集群类型" -msgstr "规格集群类型" +#: backend/db_services/dbpermission/constants.py:45 +msgid "创建视图" +msgstr "创建视图" -#: backend/db_services/dbresource/filters.py:22 -msgid "规格机器类型" -msgstr "规格机器类型" +#: backend/db_services/dbpermission/constants.py:46 +msgid "执行" +msgstr "执行" -#: backend/db_services/dbresource/filters.py:30 -msgid "Redis部署方案名称" -msgstr "Redis部署方案名称" +#: backend/db_services/dbpermission/constants.py:47 +msgid "触发器" +msgstr "触发器" -#: backend/db_services/dbresource/filters.py:31 -msgid "Redis集群类型" -msgstr "Redis集群类型" +#: backend/db_services/dbpermission/constants.py:48 +msgid "事件" +msgstr "事件" -#: backend/db_services/dbresource/serializers.py:31 -msgid "专属业务的ID列表" -msgstr "专属业务的ID列表" +#: backend/db_services/dbpermission/constants.py:49 +msgid "create routine" +msgstr "create routine" -#: backend/db_services/dbresource/serializers.py:33 -#: backend/db_services/dbresource/serializers.py:52 -#: backend/db_services/dbresource/serializers.py:68 -#: backend/db_services/dbresource/serializers.py:133 -msgid "专属DB" -msgstr "专属DB" +#: backend/db_services/dbpermission/constants.py:50 +msgid "alter routine" +msgstr "alter routine" -#: backend/db_services/dbresource/serializers.py:35 -msgid "机器当前所属的业务id\t" -msgstr "机器当前所属的业务id\t" +#: backend/db_services/dbpermission/constants.py:51 +msgid "references" +msgstr "references" -#: backend/db_services/dbresource/serializers.py:36 -msgid "主机" -msgstr "主机" +#: backend/db_services/dbpermission/constants.py:52 +msgid "create temporary tables" +msgstr "create temporary tables" -#: backend/db_services/dbresource/serializers.py:37 -#: backend/db_services/dbresource/serializers.py:81 -msgid "标签信息" -msgstr "标签信息" +#: backend/db_services/dbpermission/constants.py:57 +msgid "file" +msgstr "file" -#: backend/db_services/dbresource/serializers.py:42 -msgid "分组类型" -msgstr "分组类型" +#: backend/db_services/dbpermission/constants.py:58 +msgid "reload" +msgstr "reload" -#: backend/db_services/dbresource/serializers.py:43 -#: backend/db_services/dbresource/serializers.py:69 -msgid "机型" -msgstr "机型" +#: backend/db_services/dbpermission/constants.py:59 +msgid "show databases" +msgstr "show databases" -#: backend/db_services/dbresource/serializers.py:44 -msgid "cpu&mem参数" -msgstr "cpu&mem参数" +#: backend/db_services/dbpermission/constants.py:60 +msgid "process" +msgstr "process" -#: backend/db_services/dbresource/serializers.py:45 -msgid "磁盘参数" -msgstr "磁盘参数" +#: backend/db_services/dbpermission/constants.py:61 +msgid "replication slave" +msgstr "replication slave" -#: backend/db_services/dbresource/serializers.py:46 -msgid "位置匹配参数" -msgstr "位置匹配参数" +#: backend/db_services/dbpermission/constants.py:62 +msgid "replication client" +msgstr "replication client" -#: backend/db_services/dbresource/serializers.py:48 -msgid "亲和性" -msgstr "亲和性" +#: backend/db_services/dbpermission/constants.py:66 +msgid "Read" +msgstr "Read" -#: backend/db_services/dbresource/serializers.py:49 -msgid "数量" -msgstr "数量" +#: backend/db_services/dbpermission/constants.py:67 backend/flow/consts.py:1413 +msgid "readWrite" +msgstr "readWrite" -#: backend/db_services/dbresource/serializers.py:53 -msgid "业务专属ID" -msgstr "业务专属ID" +#: backend/db_services/dbpermission/constants.py:68 backend/flow/consts.py:1411 +msgid "readAnyDatabase" +msgstr "readAnyDatabase" -#: backend/db_services/dbresource/serializers.py:54 -msgid "资源申请参数" -msgstr "资源申请参数" +#: backend/db_services/dbpermission/constants.py:69 backend/flow/consts.py:1416 +msgid "readWriteAnyDatabase" +msgstr "readWriteAnyDatabase" -#: backend/db_services/dbresource/serializers.py:64 -msgid "资源最小值" -msgstr "资源最小值" +#: backend/db_services/dbpermission/constants.py:72 +msgid "dbAdmin" +msgstr "dbAdmin" -#: backend/db_services/dbresource/serializers.py:65 -msgid "资源最大值" -msgstr "资源最大值" +#: backend/db_services/dbpermission/constants.py:73 backend/flow/consts.py:450 +#: backend/flow/consts.py:1200 backend/flow/consts.py:1409 +msgid "backup" +msgstr "backup" -#: backend/db_services/dbresource/serializers.py:67 -msgid "专属业务" -msgstr "专属业务" +#: backend/db_services/dbpermission/constants.py:74 +msgid "restore" +msgstr "restore" -#: backend/db_services/dbresource/serializers.py:70 -msgid "主机IP列表" -msgstr "主机IP列表" +#: backend/db_services/dbpermission/constants.py:75 +msgid "userAdmin" +msgstr "userAdmin" -#: backend/db_services/dbresource/serializers.py:71 -msgid "城市" -msgstr "城市" +#: backend/db_services/dbpermission/constants.py:76 backend/flow/consts.py:1417 +msgid "clusterAdmin" +msgstr "clusterAdmin" -#: backend/db_services/dbresource/serializers.py:72 -msgid "园区" -msgstr "园区" +#: backend/db_services/dbpermission/constants.py:77 +msgid "clusterManager" +msgstr "clusterManager" -#: backend/db_services/dbresource/serializers.py:74 -msgid "cpu资源限制" -msgstr "cpu资源限制" +#: backend/db_services/dbpermission/constants.py:78 backend/flow/consts.py:1410 +msgid "clusterMonitor" +msgstr "clusterMonitor" -#: backend/db_services/dbresource/serializers.py:75 -msgid "内存资源限制" -msgstr "内存资源限制" +#: backend/db_services/dbpermission/constants.py:79 backend/flow/consts.py:1412 +msgid "hostManager" +msgstr "hostManager" -#: backend/db_services/dbresource/serializers.py:76 -msgid "磁盘资源限制" -msgstr "磁盘资源限制" +#: backend/db_services/dbpermission/constants.py:80 backend/flow/consts.py:1414 +msgid "userAdminAnyDatabase" +msgstr "userAdminAnyDatabase" -#: backend/db_services/dbresource/serializers.py:77 -msgid "磁盘类型" -msgstr "磁盘类型" +#: backend/db_services/dbpermission/constants.py:81 backend/flow/consts.py:1415 +msgid "dbAdminAnyDatabase" +msgstr "dbAdminAnyDatabase" -#: backend/db_services/dbresource/serializers.py:78 -msgid "磁盘挂载点" -msgstr "磁盘挂载点" +#: backend/db_services/dbpermission/constants.py:82 +msgid "dbOwner" +msgstr "dbOwner" -#: backend/db_services/dbresource/serializers.py:80 -msgid "agent状态" -msgstr "agent状态" +#: backend/db_services/dbpermission/constants.py:83 backend/flow/consts.py:1408 +msgid "root" +msgstr "root" -#: backend/db_services/dbresource/serializers.py:84 -msgid "偏移量" -msgstr "偏移量" +#: backend/db_services/dbpermission/constants.py:87 +msgid "db_datawriter" +msgstr "db_datawriter" -#: backend/db_services/dbresource/serializers.py:119 -msgid "资源申请的request_id" -msgstr "资源申请的request_id" +#: backend/db_services/dbpermission/constants.py:88 +msgid "db_datareader" +msgstr "db_datareader" -#: backend/db_services/dbresource/serializers.py:120 -#: backend/db_services/dbresource/serializers.py:124 -msgid "主机ID列表" -msgstr "主机ID列表" +#: backend/db_services/dbpermission/constants.py:91 +msgid "db_owner" +msgstr "db_owner" -#: backend/db_services/dbresource/serializers.py:129 -#: backend/db_services/ipchooser/serializers/topo_sers.py:78 -#: backend/db_services/mysql/cluster/serializers.py:42 -#: backend/db_services/mysql/instance/serializers.py:39 -#: backend/ticket/builders/common/base.py:31 -#: backend/ticket/builders/common/bigdata.py:210 -#: backend/ticket/builders/common/bigdata.py:276 -msgid "主机ID" -msgstr "主机ID" +#: backend/db_services/dbpermission/constants.py:98 +#: backend/db_services/mysql/permission/constants.py:21 +msgid "TendbCluster" +msgstr "TendbCluster" -#: backend/db_services/dbresource/serializers.py:130 -msgid "Labels" -msgstr "Labels" +#: backend/db_services/dbpermission/constants.py:106 +msgid "账号(单个)" +msgstr "账号(单个)" -#: backend/db_services/dbresource/serializers.py:131 -msgid "专用业务ID" -msgstr "专用业务ID" +#: backend/db_services/dbpermission/constants.py:107 +msgid "访问源(多个)" +msgstr "访问源(多个)" -#: backend/db_services/dbresource/serializers.py:137 -msgid "磁盘挂载点信息" -msgstr "磁盘挂载点信息" +#: backend/db_services/dbpermission/constants.py:108 +msgid "访问集群域名(多个)" +msgstr "访问集群域名(多个)" -#: backend/db_services/dbresource/serializers.py:146 -msgid "过滤的单据ID列表" -msgstr "过滤的单据ID列表" +#: backend/db_services/dbpermission/constants.py:109 +msgid "访问DB名(多个)" +msgstr "访问DB名(多个)" -#: backend/db_services/dbresource/serializers.py:147 -msgid "过滤的任务ID列表" -msgstr "过滤的任务ID列表" +#: backend/db_services/dbpermission/constants.py:110 +#: backend/db_services/dbpermission/db_authorize/models.py:31 +msgid "错误信息/提示信息" +msgstr "错误信息/提示信息" -#: backend/db_services/dbresource/serializers.py:148 -#: backend/db_services/partition/serializers.py:78 -msgid "操作者" -msgstr "操作者" +#: backend/db_services/dbpermission/db_account/handlers.py:230 +msgid "当前授权规则已被开区模板{}引用,不允许删除" +msgstr "当前授权规则已被开区模板{}引用,不允许删除" + +#: backend/db_services/dbpermission/db_account/serializers.py:24 +#: backend/db_services/dbpermission/db_account/serializers.py:61 +#: backend/db_services/dbpermission/db_account/serializers.py:77 +#: backend/db_services/dbpermission/db_account/serializers.py:86 +#: backend/db_services/dbpermission/db_account/serializers.py:107 +#: backend/db_services/dbpermission/db_account/serializers.py:118 +#: backend/db_services/dbpermission/db_authorize/models.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:25 +#: backend/db_services/dbpermission/db_authorize/serializers.py:94 +msgid "账号名称" +msgstr "账号名称" -#: backend/db_services/dbresource/serializers.py:149 -msgid "操作开始时间" -msgstr "操作开始时间" +#: backend/db_services/dbpermission/db_account/serializers.py:25 +msgid "账号密码" +msgstr "账号密码" -#: backend/db_services/dbresource/serializers.py:150 -msgid "操作结束时间" -msgstr "操作结束时间" +#: backend/db_services/dbpermission/db_account/serializers.py:36 +msgid "账号名称不符合要求, 请重新更改账号名" +msgstr "账号名称不符合要求, 请重新更改账号名" -#: backend/db_services/dbresource/serializers.py:151 -#: backend/ticket/models/ticket.py:95 -msgid "单据状态" -msgstr "单据状态" +#: backend/db_services/dbpermission/db_account/serializers.py:39 +msgid "账号名称不符合过长,请不要超过31位" +msgstr "账号名称不符合过长,请不要超过31位" -#: backend/db_services/dbresource/serializers.py:153 -msgid "分页大小" -msgstr "分页大小" +#: backend/db_services/dbpermission/db_account/serializers.py:45 +#: backend/ticket/builders/redis/redis_cluster_apply.py:85 +msgid "密码强度不符合要求,请重新输入密码。" +msgstr "密码强度不符合要求,请重新输入密码。" -#: backend/db_services/dbresource/serializers.py:154 -msgid "分页起始位置" -msgstr "分页起始位置" +#: backend/db_services/dbpermission/db_account/serializers.py:68 +#: backend/db_services/dbpermission/db_account/serializers.py:76 +#: backend/db_services/dbpermission/db_account/serializers.py:87 +#: backend/db_services/dbpermission/db_account/serializers.py:93 +#: backend/db_services/dbpermission/db_account/serializers.py:169 +msgid "账号ID" +msgstr "账号ID" -#: backend/db_services/dbresource/serializers.py:176 -msgid "规格id列表" -msgstr "规格id列表" +#: backend/db_services/dbpermission/db_account/serializers.py:92 +#: backend/db_services/dbpermission/db_account/serializers.py:179 +#: backend/db_services/dbpermission/db_account/serializers.py:186 +msgid "规则ID" +msgstr "规则ID" -#: backend/db_services/dbresource/serializers.py:183 -msgid "部署方案id列表" -msgstr "部署方案id列表" +#: backend/db_services/dbpermission/db_account/serializers.py:95 +#: backend/db_services/dbpermission/db_account/serializers.py:108 +#: backend/db_services/dbpermission/db_account/serializers.py:170 +#: backend/db_services/dbpermission/db_authorize/serializers.py:28 +msgid "访问DB" +msgstr "访问DB" -#: backend/db_services/dbresource/serializers.py:190 -msgid "逻辑城市" -msgstr "逻辑城市" +#: backend/db_services/dbpermission/db_account/serializers.py:100 +msgid "账号信息" +msgstr "账号信息" -#: backend/db_services/dbresource/views/deploy_plan.py:37 -msgid "新建{}部署方案" -msgstr "新建{}部署方案" +#: backend/db_services/dbpermission/db_account/serializers.py:101 +msgid "权限列表信息" +msgstr "权限列表信息" -#: backend/db_services/dbresource/views/deploy_plan.py:44 -msgid "更新{}部署方案" -msgstr "更新{}部署方案" +#: backend/db_services/dbpermission/db_account/serializers.py:106 +msgid "规则ID列表(通过,分割)" +msgstr "规则ID列表(通过,分割)" -#: backend/db_services/dbresource/views/deploy_plan.py:50 -msgid "部署方案: {} 正在被引用,无法修改相关参数" -msgstr "部署方案: {} 正在被引用,无法修改相关参数" +#: backend/db_services/dbpermission/db_account/serializers.py:119 +#: backend/db_services/dbpermission/db_authorize/serializers.py:28 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:22 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:22 +msgid "访问DB列表" +msgstr "访问DB列表" -#: backend/db_services/dbresource/views/deploy_plan.py:54 -msgid "查询{}部署方案列表" -msgstr "查询{}部署方案列表" +#: backend/db_services/dbpermission/db_account/serializers.py:124 +msgid "规则数量" +msgstr "规则数量" -#: backend/db_services/dbresource/views/deploy_plan.py:61 -msgid "删除{}部署方案" -msgstr "删除{}部署方案" +#: backend/db_services/dbpermission/db_account/serializers.py:125 +msgid "规则信息" +msgstr "规则信息" -#: backend/db_services/dbresource/views/deploy_plan.py:67 -msgid "部署方案: {} 正在被引用,无法删除" -msgstr "部署方案: {} 正在被引用,无法删除" +#: backend/db_services/dbpermission/db_account/serializers.py:134 +#: backend/db_services/dbpermission/db_account/serializers.py:139 +msgid "dml" +msgstr "dml" -#: backend/db_services/dbresource/views/deploy_plan.py:72 -msgid "批量删除{}部署方案" -msgstr "批量删除{}部署方案" +#: backend/db_services/dbpermission/db_account/serializers.py:144 +msgid "glob" +msgstr "glob" -#: backend/db_services/dbresource/views/deploy_plan.py:80 -msgid "部署方案: {} 存在被引用,无法删除" -msgstr "部署方案: {} 存在被引用,无法删除" +#: backend/db_services/dbpermission/db_account/serializers.py:149 +msgid "mongo用户权限" +msgstr "mongo用户权限" -#: backend/db_services/dbresource/views/resource.py:104 -msgid "获取DBA业务下的主机信息" -msgstr "获取DBA业务下的主机信息" +#: backend/db_services/dbpermission/db_account/serializers.py:154 +msgid "mongo管理权限" +msgstr "mongo管理权限" -#: backend/db_services/dbresource/views/resource.py:157 -msgid "查询资源导入任务" -msgstr "查询资源导入任务" +#: backend/db_services/dbpermission/db_account/serializers.py:159 +msgid "sqlserver-dml权限" +msgstr "sqlserver-dml权限" -#: backend/db_services/dbresource/views/resource.py:182 -#: backend/ticket/builders/__init__.py:333 backend/ticket/constants.py:323 -msgid "资源申请" -msgstr "资源申请" +#: backend/db_services/dbpermission/db_account/serializers.py:164 +msgid "sqlserver-owner权限" +msgstr "sqlserver-owner权限" -#: backend/db_services/dbresource/views/resource.py:218 -msgid "获取机型列表" -msgstr "获取机型列表" +#: backend/db_services/dbpermission/db_account/serializers.py:171 +msgid "授权规则" +msgstr "授权规则" -#: backend/db_services/dbresource/views/resource.py:226 -msgid "资源预申请" -msgstr "资源预申请" +#: backend/db_services/dbpermission/db_account/views.py:108 +msgid "修改密码" +msgstr "修改密码" -#: backend/db_services/dbresource/views/resource.py:238 -msgid "资源确认" -msgstr "资源确认" +#: backend/db_services/dbpermission/db_account/views.py:120 +msgid "添加账号规则" +msgstr "添加账号规则" -#: backend/db_services/dbresource/views/resource.py:268 -msgid "获取资源导入相关链接" -msgstr "获取资源导入相关链接" +#: backend/db_services/dbpermission/db_account/views.py:132 +msgid "查询账号规则清单" +msgstr "查询账号规则清单" -#: backend/db_services/dbresource/views/resource.py:278 -msgid "查询资源操作记录" -msgstr "查询资源操作记录" +#: backend/db_services/dbpermission/db_account/views.py:155 +msgid "查询账号规则" +msgstr "查询账号规则" -#: backend/db_services/dbresource/views/sepc.py:44 -msgid "新建规格" -msgstr "新建规格" +#: backend/db_services/dbpermission/db_account/views.py:170 +msgid "修改账号规则" +msgstr "修改账号规则" -#: backend/db_services/dbresource/views/sepc.py:51 -msgid "更新规格" -msgstr "更新规格" +#: backend/db_services/dbpermission/db_account/views.py:182 +msgid "删除账号规则" +msgstr "删除账号规则" -#: backend/db_services/dbresource/views/sepc.py:71 -msgid "规格: {}已经被引用,只允许拓展机型" -msgstr "规格: {}已经被引用,只允许拓展机型" +#: backend/db_services/dbpermission/db_authorize/handlers.py:151 +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:77 +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:68 +msgid "前置校验成功" +msgstr "前置校验成功" -#: backend/db_services/dbresource/views/sepc.py:74 -msgid "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" -msgstr "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" +#: backend/db_services/dbpermission/db_authorize/models.py:23 +#: backend/db_services/mysql/permission/clone/models.py:25 +#: backend/ticket/models/ticket.py:46 backend/ticket/models/ticket.py:328 +#: backend/ticket/models/ticket.py:398 backend/ticket/models/todo.py:52 +msgid "关联工单" +msgstr "关联工单" -#: backend/db_services/dbresource/views/sepc.py:79 -msgid "查询规格列表" -msgstr "查询规格列表" +#: backend/db_services/dbpermission/db_authorize/models.py:26 +#: backend/db_services/dbpermission/db_authorize/serializers.py:26 +msgid "源ip列表" +msgstr "源ip列表" -#: backend/db_services/dbresource/views/sepc.py:86 -msgid "删除规格" -msgstr "删除规格" +#: backend/db_services/dbpermission/db_authorize/models.py:28 +msgid "访问DB名列表" +msgstr "访问DB名列表" -#: backend/db_services/dbresource/views/sepc.py:92 -msgid "规格: {}已经被引用,无法被删除" -msgstr "规格: {}已经被引用,无法被删除" +#: backend/db_services/dbpermission/db_authorize/models.py:30 +msgid "是否授权成功" +msgstr "是否授权成功" -#: backend/db_services/dbresource/views/sepc.py:98 -msgid "批量删除规格" -msgstr "批量删除规格" +#: backend/db_services/dbpermission/db_authorize/models.py:32 +#: backend/db_services/mysql/permission/clone/models.py:34 +msgid "记录时间" +msgstr "记录时间" -#: backend/db_services/dbresource/views/sepc.py:106 -msgid "规格: {}已经被引用,无法删除!" -msgstr "规格: {}已经被引用,无法删除!" +#: backend/db_services/dbpermission/db_authorize/models.py:35 +#: backend/db_services/dbpermission/db_authorize/models.py:36 +msgid "授权记录" +msgstr "授权记录" -#: backend/db_services/dbresource/views/sepc.py:110 -msgid "获取推荐规格" -msgstr "获取推荐规格" +#: backend/db_services/dbpermission/db_authorize/serializers.py:22 +msgid "ip地址" +msgstr "ip地址" -#: backend/db_services/group/serializers.py:20 -msgid "实例数量" -msgstr "实例数量" +#: backend/db_services/dbpermission/db_authorize/serializers.py:23 +msgid "资源池主机ID" +msgstr "资源池主机ID" -#: backend/db_services/group/serializers.py:28 -msgid "在该业务下已存在同名的分组,请重新命名分组" -msgstr "在该业务下已存在同名的分组,请重新命名分组" +#: backend/db_services/dbpermission/db_authorize/serializers.py:31 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:28 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:28 +msgid "集群id列表" +msgstr "集群id列表" -#: backend/db_services/group/serializers.py:38 -msgid "新分组ID" -msgstr "新分组ID" +#: backend/db_services/dbpermission/db_authorize/serializers.py:39 +#: backend/db_services/dbpermission/db_authorize/serializers.py:76 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:36 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:36 +msgid "前置检查结果" +msgstr "前置检查结果" -#: backend/db_services/group/serializers.py:39 -msgid "待移动实例的ID列表" -msgstr "待移动实例的ID列表" +#: backend/db_services/dbpermission/db_authorize/serializers.py:40 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:37 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:37 +msgid "检查结果信息" +msgstr "检查结果信息" -#: backend/db_services/group/views.py:29 -msgid "分组" -msgstr "分组" +#: backend/db_services/dbpermission/db_authorize/serializers.py:41 +#: backend/db_services/dbpermission/db_authorize/serializers.py:77 +#: backend/db_services/dbpermission/db_authorize/serializers.py:85 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:38 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:38 +#: backend/ticket/builders/mongodb/mongo_authorize.py:25 +#: backend/ticket/builders/mongodb/mongo_authorize.py:37 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:40 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:65 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:38 +msgid "授权数据缓存uid" +msgstr "授权数据缓存uid" -#: backend/db_services/group/views.py:57 backend/db_services/group/views.py:58 -msgid "分组详情" -msgstr "分组详情" +#: backend/db_services/dbpermission/db_authorize/serializers.py:42 +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:39 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:39 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:41 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:29 +msgid "授权数据信息" +msgstr "授权数据信息" -#: backend/db_services/group/views.py:66 -msgid "分组列表" -msgstr "分组列表" +#: backend/db_services/dbpermission/db_authorize/serializers.py:49 +msgid "授权excel文件" +msgstr "授权excel文件" -#: backend/db_services/group/views.py:74 backend/db_services/group/views.py:76 -msgid "创建新分组" -msgstr "创建新分组" +#: backend/db_services/dbpermission/db_authorize/serializers.py:60 +msgid "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" +msgstr "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" -#: backend/db_services/group/views.py:83 backend/db_services/group/views.py:85 -msgid "更新分组信息" -msgstr "更新分组信息" +#: backend/db_services/dbpermission/db_authorize/serializers.py:64 +msgid "excel表格为空!" +msgstr "excel表格为空!" -#: backend/db_services/group/views.py:92 backend/db_services/group/views.py:94 -msgid "删除分组" -msgstr "删除分组" +#: backend/db_services/dbpermission/db_authorize/serializers.py:69 +#: backend/db_services/mysql/permission/clone/serializers.py:109 +msgid "excel包含空的单元格!请检查数据的完整性和合法性" +msgstr "excel包含空的单元格!请检查数据的完整性和合法性" -#: backend/db_services/group/views.py:102 -msgid "移动实例到新组" -msgstr "移动实例到新组" +#: backend/db_services/dbpermission/db_authorize/serializers.py:78 +msgid "授权信息excel文件下载url" +msgstr "授权信息excel文件下载url" -#: backend/db_services/infras/constants.py:18 -msgid "不足" -msgstr "不足" +#: backend/db_services/dbpermission/db_authorize/serializers.py:90 +msgid "授权执行错误excel" +msgstr "授权执行错误excel" -#: backend/db_services/infras/constants.py:19 -msgid "充足" -msgstr "充足" +#: backend/db_services/dbpermission/db_authorize/serializers.py:95 +msgid "访问源ip" +msgstr "访问源ip" -#: backend/db_services/infras/host.py:40 backend/db_services/infras/host.py:42 -msgid "标准型SA2" -msgstr "标准型SA2" +#: backend/db_services/dbpermission/db_authorize/serializers.py:96 +msgid "访问集群名称" +msgstr "访问集群名称" -#: backend/db_services/infras/host.py:40 backend/db_services/infras/host.py:42 -#: backend/db_services/infras/host.py:44 -msgid "1核" -msgstr "1核" +#: backend/db_services/dbpermission/db_authorize/serializers.py:97 +msgid "访问db名称" +msgstr "访问db名称" -#: backend/db_services/infras/host.py:41 -msgid "标准型S6" -msgstr "标准型S6" +#: backend/db_services/dbpermission/db_authorize/serializers.py:103 +msgid "现网授权列表" +msgstr "现网授权列表" -#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 -#: backend/db_services/infras/host.py:45 -msgid "2核" -msgstr "2核" +#: backend/db_services/dbpermission/db_authorize/serializers.py:103 +#: backend/ticket/builders/mysql/mysql_openarea.py:53 +msgid "授权信息" +msgstr "授权信息" -#: backend/db_services/infras/host.py:43 -msgid "标准型S5" -msgstr "标准型S5" +#: backend/db_services/dbpermission/db_authorize/views.py:71 +#: backend/db_services/mongodb/permission/db_authorize/views.py:42 +#: backend/db_services/sqlserver/permission/db_authorize/views.py:41 +msgid "规则前置检查" +msgstr "规则前置检查" -#: backend/db_services/infras/serializers.py:56 -#: backend/ticket/builders/common/bigdata.py:89 -#: backend/ticket/builders/common/bigdata.py:116 -#: backend/ticket/builders/common/bigdata.py:169 -#: backend/ticket/builders/common/bigdata.py:290 -#: backend/ticket/builders/influxdb/influxdb_apply.py:32 -#: backend/ticket/builders/mysql/mysql_single_apply.py:57 -#: backend/ticket/builders/pulsar/pulsar_shrink.py:31 -#: backend/ticket/builders/redis/redis_cluster_apply.py:44 -#: backend/ticket/builders/spider/tendb_apply.py:36 -msgid "主机来源" -msgstr "主机来源" +#: backend/db_services/dbpermission/db_authorize/views.py:83 +msgid "excel规则前置检查" +msgstr "excel规则前置检查" -#: backend/db_services/infras/serializers.py:57 -#: backend/ticket/builders/mysql/mysql_single_apply.py:59 -#: backend/ticket/builders/redis/redis_cluster_apply.py:45 -msgid "部署节点" -msgstr "部署节点" +#: backend/db_services/dbpermission/db_authorize/views.py:95 +msgid "获得授权信息excel文件" +msgstr "获得授权信息excel文件" -#: backend/db_services/infras/views.py:31 -msgid "查询集群类型" -msgstr "查询集群类型" +#: backend/db_services/dbpermission/db_authorize/views.py:107 +msgid "现网授权查询(暂搁置)" +msgstr "现网授权查询(暂搁置)" -#: backend/db_services/infras/views.py:42 -msgid "查询服务器资源的城市信息" -msgstr "查询服务器资源的城市信息" +#: backend/db_services/dbresource/constants.py:45 +msgid "导入主机" +msgstr "导入主机" -#: backend/db_services/infras/views.py:43 -msgid "城市信息" -msgstr "城市信息" +#: backend/db_services/dbresource/constants.py:46 +msgid "消费主机" +msgstr "消费主机" -#: backend/db_services/infras/views.py:56 -msgid "服务器规格列表" -msgstr "服务器规格列表" +#: backend/db_services/dbresource/enmus.py:17 backend/flow/consts.py:1038 +msgid "原地变更" +msgstr "原地变更" -#: backend/db_services/infras/views.py:57 -msgid "服务器规格信息" -msgstr "服务器规格信息" +#: backend/db_services/dbresource/enmus.py:18 +msgid "替换变更" +msgstr "替换变更" -#: backend/db_services/infras/views.py:70 -msgid "容量规格列表" -msgstr "容量规格列表" +#: backend/db_services/dbresource/exceptions.py:18 +msgid "资源池服务异常" +msgstr "资源池服务异常" -#: backend/db_services/infras/views.py:72 -msgid "申请容量规格信息" -msgstr "申请容量规格信息" +#: backend/db_services/dbresource/exceptions.py:23 +#: backend/db_services/dbresource/exceptions.py:24 +msgid "资源池申请资源异常" +msgstr "资源池申请资源异常" -#: backend/db_services/infras/views.py:104 -msgid "主机{}配置异常,无法获取到合法的cpu({})或内存({})" -msgstr "主机{}配置异常,无法获取到合法的cpu({})或内存({})" +#: backend/db_services/dbresource/exceptions.py:29 +#: backend/db_services/dbresource/exceptions.py:30 +msgid "资源池申请不足异常" +msgstr "资源池申请不足异常" -#: backend/db_services/infras/views.py:120 -msgid "暂不支持该集群类型: {}" -msgstr "暂不支持该集群类型: {}" +#: backend/db_services/dbresource/exceptions.py:35 +#: backend/db_services/dbresource/exceptions.py:36 +msgid "规格操作失败" +msgstr "规格操作失败" -#: backend/db_services/ipchooser/constants.py:45 -msgid "字段分隔符" -msgstr "字段分隔符" +#: backend/db_services/dbresource/exceptions.py:41 +#: backend/db_services/dbresource/exceptions.py:42 +msgid "规格筛选类不存在" +msgstr "规格筛选类不存在" -#: backend/db_services/ipchooser/constants.py:46 -msgid "全量返回标志" -msgstr "全量返回标志" +#: backend/db_services/dbresource/filters.py:20 +#: backend/db_services/dbresource/serializers.py:323 +msgid "规格名称" +msgstr "规格名称" -#: backend/db_services/ipchooser/constants.py:47 -msgid "默认模糊查询字段" -msgstr "默认模糊查询字段" +#: backend/db_services/dbresource/filters.py:22 +msgid "规格集群类型" +msgstr "规格集群类型" -#: backend/db_services/ipchooser/constants.py:48 -msgid "主机列表默认返回字段" -msgstr "主机列表默认返回字段" +#: backend/db_services/dbresource/filters.py:23 +msgid "规格机器类型" +msgstr "规格机器类型" -#: backend/db_services/ipchooser/constants.py:70 -msgid "完整模式" -msgstr "完整模式" +#: backend/db_services/dbresource/filters.py:24 +#: backend/db_services/dbresource/serializers.py:241 +msgid "规格组件类型" +msgstr "规格组件类型" -#: backend/db_services/ipchooser/constants.py:70 -msgid "空闲机模式" -msgstr "空闲机模式" +#: backend/db_services/dbresource/filters.py:25 +msgid "ID过滤(逗号分隔)" +msgstr "ID过滤(逗号分隔)" -#: backend/db_services/ipchooser/constants.py:93 -msgid "存活" -msgstr "存活" +#: backend/db_services/dbresource/filters.py:26 +msgid "根据时间正序/逆序" +msgstr "根据时间正序/逆序" -#: backend/db_services/ipchooser/constants.py:93 -msgid "未存活" -msgstr "未存活" +#: backend/db_services/dbresource/filters.py:27 +msgid "过滤启用/禁用的规格" +msgstr "过滤启用/禁用的规格" -#: backend/db_services/ipchooser/exceptions.py:21 -#: backend/db_services/ipchooser/exceptions.py:22 -msgid "参数校验失败" -msgstr "参数校验失败" +#: backend/db_services/dbresource/handlers.py:332 +msgid "请保证输入的集群类型是MongoShardedCluster,且机器规格为mongodb" +msgstr "请保证输入的集群类型是MongoShardedCluster,且机器规格为mongodb" -#: backend/db_services/ipchooser/exceptions.py:27 -#, python-brace-format -msgid "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" -msgstr "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" +#: backend/db_services/dbresource/handlers.py:349 +msgid "{}核{}G内存{}G容量" +msgstr "{}核{}G内存{}G容量" -#: backend/db_services/ipchooser/exceptions.py:28 -msgid "业务拓扑不存在" -msgstr "业务拓扑不存在" +#: backend/db_services/dbresource/handlers.py:393 +msgid "请保证请求的规格类型一致" +msgstr "请保证请求的规格类型一致" -#: backend/db_services/ipchooser/mock_data.py:30 -#: backend/db_services/ipchooser/mock_data.py:89 -#: backend/db_services/ipchooser/mock_data.py:110 -#: backend/db_services/ipchooser/mock_data.py:138 -#: backend/db_services/ipchooser/mock_data.py:149 -#: backend/db_services/ipchooser/mock_data.py:171 -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:94 -#: backend/ticket/constants.py:65 backend/ticket/constants.py:75 -msgid "成功" -msgstr "成功" +#: backend/db_services/dbresource/serializers.py:39 +msgid "专属业务的ID列表" +msgstr "专属业务的ID列表" -#: backend/db_services/ipchooser/mock_data.py:34 -#: backend/db_services/ipchooser/mock_data.py:92 -#: backend/db_services/ipchooser/mock_data.py:124 -msgid "蓝鲸" -msgstr "蓝鲸" +#: backend/db_services/dbresource/serializers.py:41 +#: backend/db_services/dbresource/serializers.py:60 +#: backend/db_services/dbresource/serializers.py:76 +#: backend/db_services/dbresource/serializers.py:181 +msgid "专属DB" +msgstr "专属DB" -#: backend/db_services/ipchooser/mock_data.py:41 -#: backend/db_services/ipchooser/mock_data.py:96 -msgid "mark测试" -msgstr "mark测试" +#: backend/db_services/dbresource/serializers.py:43 +msgid "机器当前所属的业务id\t" +msgstr "机器当前所属的业务id\t" -#: backend/db_services/ipchooser/mock_data.py:48 -msgid "空闲机模块" -msgstr "空闲机模块" +#: backend/db_services/dbresource/serializers.py:44 +#: backend/db_services/quick_search/constants.py:22 +msgid "主机" +msgstr "主机" -#: backend/db_services/ipchooser/mock_data.py:60 -msgid "空闲机池" -msgstr "空闲机池" +#: backend/db_services/dbresource/serializers.py:45 +#: backend/db_services/dbresource/serializers.py:92 +msgid "标签信息" +msgstr "标签信息" -#: backend/db_services/ipchooser/mock_data.py:67 -#: backend/ticket/builders/common/base.py:63 -msgid "空闲机" -msgstr "空闲机" +#: backend/db_services/dbresource/serializers.py:50 +msgid "分组类型" +msgstr "分组类型" -#: backend/db_services/ipchooser/query/resource.py:467 -msgid "直连区域" -msgstr "直连区域" +#: backend/db_services/dbresource/serializers.py:51 +#: backend/db_services/dbresource/serializers.py:77 +msgid "机型" +msgstr "机型" -#: backend/db_services/ipchooser/serializers/base.py:18 -msgid "数据起始位置" -msgstr "数据起始位置" +#: backend/db_services/dbresource/serializers.py:52 +msgid "cpu&mem参数" +msgstr "cpu&mem参数" -#: backend/db_services/ipchooser/serializers/base.py:20 -msgid "拉取数据数量,不传或传 `-1` 表示拉取所有" -msgstr "拉取数据数量,不传或传 `-1` 表示拉取所有" +#: backend/db_services/dbresource/serializers.py:53 +msgid "磁盘参数" +msgstr "磁盘参数" -#: backend/db_services/ipchooser/serializers/base.py:29 -msgid "资源范围类型" -msgstr "资源范围类型" +#: backend/db_services/dbresource/serializers.py:54 +msgid "位置匹配参数" +msgstr "位置匹配参数" -#: backend/db_services/ipchooser/serializers/base.py:30 -msgid "资源范围ID" -msgstr "资源范围ID" +#: backend/db_services/dbresource/serializers.py:56 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:37 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:40 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:41 +msgid "亲和性" +msgstr "亲和性" -#: backend/db_services/ipchooser/serializers/base.py:48 -msgid "节点类型ID" -msgstr "节点类型ID" +#: backend/db_services/dbresource/serializers.py:57 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:35 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:38 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:39 +msgid "数量" +msgstr "数量" -#: backend/db_services/ipchooser/serializers/base.py:54 -msgid "内网IP" -msgstr "内网IP" +#: backend/db_services/dbresource/serializers.py:61 +msgid "业务专属ID" +msgstr "业务专属ID" -#: backend/db_services/ipchooser/serializers/base.py:55 -msgid "内网IPv6" -msgstr "内网IPv6" +#: backend/db_services/dbresource/serializers.py:62 +msgid "资源申请参数" +msgstr "资源申请参数" + +#: backend/db_services/dbresource/serializers.py:72 +msgid "资源最小值" +msgstr "资源最小值" + +#: backend/db_services/dbresource/serializers.py:73 +msgid "资源最大值" +msgstr "资源最大值" + +#: backend/db_services/dbresource/serializers.py:75 +msgid "专属业务" +msgstr "专属业务" + +#: backend/db_services/dbresource/serializers.py:78 +msgid "主机IP列表" +msgstr "主机IP列表" + +#: backend/db_services/dbresource/serializers.py:79 +msgid "云区域ID列表" +msgstr "云区域ID列表" + +#: backend/db_services/dbresource/serializers.py:81 +msgid "园区" +msgstr "园区" +#: backend/db_services/dbresource/serializers.py:83 #: backend/db_services/ipchooser/serializers/base.py:56 msgid "操作系统类型" msgstr "操作系统类型" -#: backend/db_services/ipchooser/serializers/base.py:57 -msgid "主机名称" -msgstr "主机名称" +#: backend/db_services/dbresource/serializers.py:84 +msgid "cpu资源限制" +msgstr "cpu资源限制" -#: backend/db_services/ipchooser/serializers/base.py:58 -#: backend/db_services/ipchooser/serializers/base.py:68 -msgid "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" -msgstr "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" +#: backend/db_services/dbresource/serializers.py:85 +msgid "内存资源限制" +msgstr "内存资源限制" -#: backend/db_services/ipchooser/serializers/base.py:62 -msgid "是否获取所有资源范围的拓扑结构,默认为 `false`" -msgstr "是否获取所有资源范围的拓扑结构,默认为 `false`" +#: backend/db_services/dbresource/serializers.py:86 +msgid "磁盘资源限制" +msgstr "磁盘资源限制" -#: backend/db_services/ipchooser/serializers/base.py:63 -msgid "要获取拓扑结构的资源范围数组" -msgstr "要获取拓扑结构的资源范围数组" +#: backend/db_services/dbresource/serializers.py:87 +msgid "磁盘类型" +msgstr "磁盘类型" -#: backend/db_services/ipchooser/serializers/base.py:70 -msgid "云区域过滤id" -msgstr "云区域过滤id" +#: backend/db_services/dbresource/serializers.py:88 +msgid "磁盘挂载点" +msgstr "磁盘挂载点" -#: backend/db_services/ipchooser/serializers/base.py:91 -msgid "IPv4 协议下的主机IP" -msgstr "IPv4 协议下的主机IP" +#: backend/db_services/dbresource/serializers.py:89 +msgid "过滤的规格ID" +msgstr "过滤的规格ID" -#: backend/db_services/ipchooser/serializers/base.py:92 -msgid "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" -msgstr "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" +#: backend/db_services/dbresource/serializers.py:91 +msgid "agent状态" +msgstr "agent状态" -#: backend/db_services/ipchooser/serializers/base.py:96 -msgid "请传入 host_id 或者 cloud_id + ip" -msgstr "请传入 host_id 或者 cloud_id + ip" +#: backend/db_services/dbresource/serializers.py:95 +msgid "偏移量" +msgstr "偏移量" -#: backend/db_services/ipchooser/serializers/host_sers.py:20 -#: backend/db_services/ipchooser/serializers/host_sers.py:52 -#: backend/db_services/ipchooser/serializers/topo_sers.py:20 -#: backend/db_services/ipchooser/serializers/topo_sers.py:46 -msgid "模式" -msgstr "模式" +#: backend/db_services/dbresource/serializers.py:164 +msgid "主机ID列表(逗号分隔)" +msgstr "主机ID列表(逗号分隔)" -#: backend/db_services/ipchooser/serializers/host_sers.py:23 -msgid "IPv4 列表" -msgstr "IPv4 列表" +#: backend/db_services/dbresource/serializers.py:168 +msgid "资源申请的request_id" +msgstr "资源申请的request_id" -#: backend/db_services/ipchooser/serializers/host_sers.py:24 -msgid "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" -msgstr "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" +#: backend/db_services/dbresource/serializers.py:169 +#: backend/db_services/dbresource/serializers.py:173 +#: backend/db_services/dbresource/serializers.py:177 +msgid "主机ID列表" +msgstr "主机ID列表" -#: backend/db_services/ipchooser/serializers/host_sers.py:29 -msgid "IPv6 列表" -msgstr "IPv6 列表" +#: backend/db_services/dbresource/serializers.py:178 +msgid "Labels" +msgstr "Labels" -#: backend/db_services/ipchooser/serializers/host_sers.py:30 -msgid "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" -msgstr "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" +#: backend/db_services/dbresource/serializers.py:179 +msgid "专用业务ID" +msgstr "专用业务ID" -#: backend/db_services/ipchooser/serializers/host_sers.py:35 -msgid "关键字列表" -msgstr "关键字列表" +#: backend/db_services/dbresource/serializers.py:185 +msgid "是否无专用业务" +msgstr "是否无专用业务" -#: backend/db_services/ipchooser/serializers/host_sers.py:36 -msgid "关键字,解析出的`主机名`、`host_id` 等关键字信息" -msgstr "关键字,解析出的`主机名`、`host_id` 等关键字信息" +#: backend/db_services/dbresource/serializers.py:186 +msgid "是否无专用资源类型" +msgstr "是否无专用资源类型" -#: backend/db_services/ipchooser/serializers/topo_sers.py:71 -msgid "查询过滤条件" -msgstr "查询过滤条件" +#: backend/db_services/dbresource/serializers.py:187 +msgid "磁盘挂载点信息" +msgstr "磁盘挂载点信息" -#: backend/db_services/ipchooser/serializers/topo_sers.py:79 -msgid "拓扑信息列表" -msgstr "拓扑信息列表" - -#: backend/db_services/ipchooser/serializers/topo_sers.py:79 -msgid "拓扑信息" -msgstr "拓扑信息" +#: backend/db_services/dbresource/serializers.py:188 +msgid "机架ID" +msgstr "机架ID" -#: backend/db_services/ipchooser/views.py:32 -msgid "批量获取含各节点主机数量的拓扑树" -msgstr "批量获取含各节点主机数量的拓扑树" +#: backend/db_services/dbresource/serializers.py:199 +msgid "过滤的单据ID列表" +msgstr "过滤的单据ID列表" -#: backend/db_services/ipchooser/views.py:48 -msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" -msgstr "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" +#: backend/db_services/dbresource/serializers.py:200 +msgid "过滤的单据类型列表" +msgstr "过滤的单据类型列表" -#: backend/db_services/ipchooser/views.py:66 -msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" -msgstr "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" +#: backend/db_services/dbresource/serializers.py:201 +msgid "过滤的任务ID列表" +msgstr "过滤的任务ID列表" -#: backend/db_services/ipchooser/views.py:83 -msgid "根据主机过滤查询主机的拓扑信息" -msgstr "根据主机过滤查询主机的拓扑信息" +#: backend/db_services/dbresource/serializers.py:202 +msgid "过滤IP列表" +msgstr "过滤IP列表" -#: backend/db_services/ipchooser/views.py:105 -msgid "" -"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" -"器信息" -msgstr "" -"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" -"器信息" +#: backend/db_services/dbresource/serializers.py:206 +msgid "操作开始时间" +msgstr "操作开始时间" -#: backend/db_services/ipchooser/views.py:123 -msgid "根据主机关键信息获取机器详情信息" -msgstr "根据主机关键信息获取机器详情信息" +#: backend/db_services/dbresource/serializers.py:207 +msgid "操作结束时间" +msgstr "操作结束时间" -#: backend/db_services/ipchooser/views.py:164 -msgid "获取自定义配置,比如表格列字段及顺序" -msgstr "获取自定义配置,比如表格列字段及顺序" +#: backend/db_services/dbresource/serializers.py:208 +#: backend/ticket/models/ticket.py:95 +msgid "单据状态" +msgstr "单据状态" -#: backend/db_services/ipchooser/views.py:180 -msgid "保存用户自定义配置" -msgstr "保存用户自定义配置" +#: backend/db_services/dbresource/serializers.py:210 +#: backend/db_services/quick_search/serializers.py:33 +msgid "分页大小" +msgstr "分页大小" -#: backend/db_services/ipchooser/views.py:194 -msgid "查询云区域的信息" -msgstr "查询云区域的信息" +#: backend/db_services/dbresource/serializers.py:211 +msgid "分页起始位置" +msgstr "分页起始位置" -#: backend/db_services/ipchooser/views.py:203 -msgid "查询磁盘类型" -msgstr "查询磁盘类型" +#: backend/db_services/dbresource/serializers.py:218 +msgid "排序参数只能是 'update_time' 或 'total_count'。" +msgstr "排序参数只能是 'update_time' 或 'total_count'。" -#: backend/db_services/mysql/cluster/handlers.py:52 -msgid "无法找到集群{}所包含实例,请检查集群相关信息" -msgstr "无法找到集群{}所包含实例,请检查集群相关信息" +#: backend/db_services/dbresource/serializers.py:256 +msgid "请保证CPU/MEM的最小最大范围合理" +msgstr "请保证CPU/MEM的最小最大范围合理" -#: backend/db_services/mysql/cluster/serializers.py:27 -#: backend/db_services/mysql/cluster/serializers.py:79 -#: backend/db_services/mysql/instance/serializers.py:24 -#: backend/db_services/mysql/remote_service/serializers.py:24 -#: backend/db_services/mysql/remote_service/serializers.py:36 -#: backend/db_services/mysql/sql_import/serializers.py:83 -#: backend/ticket/builders/mysql/mysql_add_slave.py:33 -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:29 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:34 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:35 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:32 -#: backend/ticket/builders/mysql/mysql_restore_slave.py:29 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:25 -msgid "集群ID列表" -msgstr "集群ID列表" +#: backend/db_services/dbresource/serializers.py:268 +msgid "已存在同名规格,请保证集群类型-规格类型-规格名称必须唯一" +msgstr "已存在同名规格,请保证集群类型-规格类型-规格名称必须唯一" -#: backend/db_services/mysql/cluster/serializers.py:41 -#: backend/db_services/mysql/instance/serializers.py:38 -#: backend/ticket/builders/common/base.py:30 -msgid "IP地址" -msgstr "IP地址" +#: backend/db_services/dbresource/serializers.py:281 +msgid "已存在同种规格配置,请不要在相同规格类型下重复录入" +msgstr "已存在同种规格配置,请不要在相同规格类型下重复录入" -#: backend/db_services/mysql/cluster/serializers.py:43 -#: backend/db_services/mysql/instance/serializers.py:40 -#: backend/ticket/builders/common/base.py:36 -#: backend/ticket/builders/common/bigdata.py:207 -#: backend/ticket/builders/common/bigdata.py:274 -msgid "端口号" -msgstr "端口号" +#: backend/db_services/dbresource/serializers.py:291 +msgid "【{}】后端磁盘挂载点必须包含/data,可选/data1" +msgstr "【{}】后端磁盘挂载点必须包含/data,可选/data1" -#: backend/db_services/mysql/cluster/serializers.py:66 -msgid "集群过滤条件列表" -msgstr "集群过滤条件列表" +#: backend/db_services/dbresource/serializers.py:299 +msgid "【{}】后端磁盘挂载点必须包含/data" +msgstr "【{}】后端磁盘挂载点必须包含/data" -#: backend/db_services/mysql/cluster/views.py:41 -msgid "通过集群查询同机关联集群" -msgstr "通过集群查询同机关联集群" +#: backend/db_services/dbresource/serializers.py:309 +#: backend/db_services/dbresource/serializers.py:316 +msgid "规格id列表" +msgstr "规格id列表" -#: backend/db_services/mysql/cluster/views.py:54 -msgid "通过实例查询同机关联集群" -msgstr "通过实例查询同机关联集群" +#: backend/db_services/dbresource/serializers.py:324 +msgid "规格ID(更新时传递)" +msgstr "规格ID(更新时传递)" -#: backend/db_services/mysql/cluster/views.py:69 -msgid "通过过滤条件批量查询集群" -msgstr "通过过滤条件批量查询集群" +#: backend/db_services/dbresource/serializers.py:328 +msgid "逻辑城市" +msgstr "逻辑城市" -#: backend/db_services/mysql/cluster/views.py:84 -msgid "获取关联集群从库的交集" -msgstr "获取关联集群从库的交集" +#: backend/db_services/dbresource/serializers.py:344 +msgid "角色类型" +msgstr "角色类型" + +#: backend/db_services/dbresource/serializers.py:345 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:47 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:51 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:54 +msgid "当前容量需求" +msgstr "当前容量需求" + +#: backend/db_services/dbresource/serializers.py:346 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:48 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:52 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:55 +msgid "未来容量需求" +msgstr "未来容量需求" + +#: backend/db_services/dbresource/serializers.py:347 +msgid "所需分片数" +msgstr "所需分片数" + +#: backend/db_services/dbresource/serializers.py:356 +msgid "qps范围" +msgstr "qps范围" + +#: backend/db_services/dbresource/serializers.py:377 +msgid "规格ID列表" +msgstr "规格ID列表" + +#: backend/db_services/dbresource/views/resource.py:142 +msgid "获取DBA业务下的主机信息" +msgstr "获取DBA业务下的主机信息" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:220 -msgid "无法查找到在时间范围内{}-{},主机{}的binlog日志" -msgstr "无法查找到在时间范围内{}-{},主机{}的binlog日志" +#: backend/db_services/dbresource/views/resource.py:170 +msgid "查询DBA业务下的主机信息" +msgstr "查询DBA业务下的主机信息" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:248 -msgid "查询集群{}的备份日志" -msgstr "查询集群{}的备份日志" +#: backend/db_services/dbresource/views/resource.py:222 +msgid "查询资源导入任务" +msgstr "查询资源导入任务" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:290 -msgid "作业【{}】执行失败,job_instance_id: {}" -msgstr "作业【{}】执行失败,job_instance_id: {}" +#: backend/db_services/dbresource/views/resource.py:246 +#: backend/ticket/builders/__init__.py:383 +#: backend/ticket/builders/mongodb/mongo_restore.py:242 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:55 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:50 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:53 +#: backend/ticket/constants.py:477 +msgid "资源申请" +msgstr "资源申请" -#: backend/db_services/mysql/fixpoint_rollback/handlers.py:331 -msgid "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" -msgstr "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +#: backend/db_services/dbresource/views/resource.py:274 +msgid "获取操作系统类型" +msgstr "获取操作系统类型" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:20 -msgid "查询时间间隔" -msgstr "查询时间间隔" +#: backend/db_services/dbresource/views/resource.py:292 +msgid "获取机型列表" +msgstr "获取机型列表" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:25 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:32 -msgid "回档时间" -msgstr "回档时间" +#: backend/db_services/dbresource/views/resource.py:300 +msgid "资源预申请" +msgstr "资源预申请" -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:26 -#: backend/db_services/mysql/fixpoint_rollback/serializers.py:31 -msgid "JOB实例ID" -msgstr "JOB实例ID" +#: backend/db_services/dbresource/views/resource.py:312 +#: backend/ticket/builders/mongodb/mongo_restore.py:261 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +msgid "资源确认" +msgstr "资源确认" -#: backend/db_services/mysql/fixpoint_rollback/views.py:36 -msgid "通过日志平台获取集群备份记录" -msgstr "通过日志平台获取集群备份记录" +#: backend/db_services/dbresource/views/resource.py:357 +msgid "获取资源导入相关链接" +msgstr "获取资源导入相关链接" -#: backend/db_services/mysql/fixpoint_rollback/views.py:51 -msgid "通过下发脚本到机器获取集群备份记录" -msgstr "通过下发脚本到机器获取集群备份记录" +#: backend/db_services/dbresource/views/resource.py:367 +msgid "查询资源操作记录" +msgstr "查询资源操作记录" -#: backend/db_services/mysql/fixpoint_rollback/views.py:62 -msgid "根据job id查询任务执行状态和执行结果" -msgstr "根据job id查询任务执行状态和执行结果" +#: backend/db_services/dbresource/views/resource.py:418 +msgid "规格数量的预计" +msgstr "规格数量的预计" -#: backend/db_services/mysql/fixpoint_rollback/views.py:75 -msgid "查询小于回档时间点最近的备份记录" -msgstr "查询小于回档时间点最近的备份记录" +#: backend/db_services/dbresource/views/sepc.py:100 +msgid "新建规格" +msgstr "新建规格" -#: backend/db_services/mysql/instance/views.py:31 -msgid "根据用户手动输入的 ip:port 查询真实的实例" -msgstr "根据用户手动输入的 ip:port 查询真实的实例" +#: backend/db_services/dbresource/views/sepc.py:107 +msgid "规格详情" +msgstr "规格详情" -#: backend/db_services/mysql/permission/authorize/handlers.py:79 -msgid "「接口返回结果异常」{}" -msgstr "「接口返回结果异常」{}" +#: backend/db_services/dbresource/views/sepc.py:114 +msgid "更新规格" +msgstr "更新规格" -#: backend/db_services/mysql/permission/authorize/handlers.py:82 -#: backend/db_services/mysql/permission/clone/handlers.py:120 -msgid "「接口调用异常」{}" -msgstr "「接口调用异常」{}" +#: backend/db_services/dbresource/views/sepc.py:137 +msgid "规格: {}已经被引用,只允许拓展机型" +msgstr "规格: {}已经被引用,只允许拓展机型" -#: backend/db_services/mysql/permission/authorize/models.py:24 -#: backend/db_services/mysql/permission/clone/models.py:25 -#: backend/ticket/models/ticket.py:45 backend/ticket/models/ticket.py:247 -#: backend/ticket/models/ticket.py:303 backend/ticket/models/todo.py:32 -msgid "关联工单" -msgstr "关联工单" +#: backend/db_services/dbresource/views/sepc.py:140 +msgid "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" +msgstr "规格: {}已经被引用,无法修改配置!(只允许拓展机型和修改描述)" -#: backend/db_services/mysql/permission/authorize/models.py:26 -#: backend/db_services/mysql/permission/authorize/serializers.py:26 -#: backend/db_services/mysql/permission/authorize/serializers.py:99 -#: backend/db_services/mysql/permission/db_account/serializers.py:24 -#: backend/db_services/mysql/permission/db_account/serializers.py:77 -#: backend/db_services/mysql/permission/db_account/serializers.py:85 -#: backend/db_services/mysql/permission/db_account/serializers.py:109 -#: backend/db_services/mysql/permission/db_account/serializers.py:115 -msgid "账号名称" -msgstr "账号名称" +#: backend/db_services/dbresource/views/sepc.py:145 +msgid "更新规格的启用禁用态" +msgstr "更新规格的启用禁用态" -#: backend/db_services/mysql/permission/authorize/models.py:27 -#: backend/db_services/mysql/permission/authorize/serializers.py:27 -msgid "源ip列表" -msgstr "源ip列表" +#: backend/db_services/dbresource/views/sepc.py:155 +msgid "查询规格列表" +msgstr "查询规格列表" -#: backend/db_services/mysql/permission/authorize/models.py:29 -msgid "访问DB名列表" -msgstr "访问DB名列表" +#: backend/db_services/dbresource/views/sepc.py:174 +msgid "删除规格" +msgstr "删除规格" -#: backend/db_services/mysql/permission/authorize/models.py:31 -msgid "是否授权成功" -msgstr "是否授权成功" +#: backend/db_services/dbresource/views/sepc.py:180 +msgid "规格: {}已经被引用,无法被删除" +msgstr "规格: {}已经被引用,无法被删除" -#: backend/db_services/mysql/permission/authorize/models.py:32 -#: backend/db_services/mysql/permission/constants.py:64 -msgid "错误信息/提示信息" -msgstr "错误信息/提示信息" +#: backend/db_services/dbresource/views/sepc.py:186 +msgid "校验是否存在同名规格" +msgstr "校验是否存在同名规格" -#: backend/db_services/mysql/permission/authorize/models.py:33 -#: backend/db_services/mysql/permission/clone/models.py:34 -msgid "记录时间" -msgstr "记录时间" +#: backend/db_services/dbresource/views/sepc.py:200 +msgid "批量删除规格" +msgstr "批量删除规格" -#: backend/db_services/mysql/permission/authorize/models.py:36 -#: backend/db_services/mysql/permission/authorize/models.py:37 -msgid "授权记录" -msgstr "授权记录" +#: backend/db_services/dbresource/views/sepc.py:208 +msgid "规格: {}已经被引用,无法删除!" +msgstr "规格: {}已经被引用,无法删除!" -#: backend/db_services/mysql/permission/authorize/serializers.py:23 -msgid "ip地址" -msgstr "ip地址" +#: backend/db_services/dbresource/views/sepc.py:212 +msgid "获取推荐规格" +msgstr "获取推荐规格" -#: backend/db_services/mysql/permission/authorize/serializers.py:24 -msgid "资源池主机ID" -msgstr "资源池主机ID" +#: backend/db_services/dbresource/views/sepc.py:263 +msgid "获取qps的范围" +msgstr "获取qps的范围" -#: backend/db_services/mysql/permission/authorize/serializers.py:29 -#: backend/db_services/mysql/permission/db_account/serializers.py:116 -msgid "访问DB列表" -msgstr "访问DB列表" +#: backend/db_services/dbresource/views/sepc.py:282 +msgid "集群: {}后端没有可选任何规格,请前往规格页面配置" +msgstr "集群: {}后端没有可选任何规格,请前往规格页面配置" -#: backend/db_services/mysql/permission/authorize/serializers.py:29 -#: backend/db_services/mysql/permission/db_account/serializers.py:95 -#: backend/db_services/mysql/permission/db_account/serializers.py:110 -#: backend/db_services/mysql/permission/db_account/serializers.py:143 -msgid "访问DB" -msgstr "访问DB" +#: backend/db_services/dbresource/views/sepc.py:296 +msgid "筛选集群部署规格方案" +msgstr "筛选集群部署规格方案" -#: backend/db_services/mysql/permission/authorize/serializers.py:32 -msgid "集群id列表" -msgstr "集群id列表" +#: backend/db_services/dbresource/views/sepc.py:313 +msgid "集群:{}的规格筛选类不存在,请实现相应接口" +msgstr "集群:{}的规格筛选类不存在,请实现相应接口" -#: backend/db_services/mysql/permission/authorize/serializers.py:40 -#: backend/db_services/mysql/permission/authorize/serializers.py:81 -msgid "前置检查结果" -msgstr "前置检查结果" +#: backend/db_services/group/serializers.py:20 +msgid "实例数量" +msgstr "实例数量" -#: backend/db_services/mysql/permission/authorize/serializers.py:41 -msgid "检查结果信息" -msgstr "检查结果信息" +#: backend/db_services/group/serializers.py:28 +msgid "在该业务下已存在同名的分组,请重新命名分组" +msgstr "在该业务下已存在同名的分组,请重新命名分组" -#: backend/db_services/mysql/permission/authorize/serializers.py:42 -#: backend/db_services/mysql/permission/authorize/serializers.py:82 -#: backend/db_services/mysql/permission/authorize/serializers.py:90 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:31 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:40 -msgid "授权数据缓存uid" -msgstr "授权数据缓存uid" +#: backend/db_services/group/serializers.py:38 +msgid "新分组ID" +msgstr "新分组ID" -#: backend/db_services/mysql/permission/authorize/serializers.py:43 -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:32 -msgid "授权数据信息" -msgstr "授权数据信息" +#: backend/db_services/group/serializers.py:39 +msgid "待移动实例的ID列表" +msgstr "待移动实例的ID列表" -#: backend/db_services/mysql/permission/authorize/serializers.py:50 -msgid "授权excel文件" -msgstr "授权excel文件" +#: backend/db_services/group/views.py:29 +msgid "分组" +msgstr "分组" -#: backend/db_services/mysql/permission/authorize/serializers.py:61 -msgid "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" -msgstr "excel内容解析失败, 错误信息:{}。提示: 请按照模板填写授权数据" +#: backend/db_services/group/views.py:76 backend/db_services/group/views.py:77 +msgid "分组详情" +msgstr "分组详情" -#: backend/db_services/mysql/permission/authorize/serializers.py:65 -msgid "excel表格为空!" -msgstr "excel表格为空!" +#: backend/db_services/group/views.py:85 +msgid "分组列表" +msgstr "分组列表" -#: backend/db_services/mysql/permission/authorize/serializers.py:69 -msgid "excel表头校验不正确! 提示: 请按照模板填写授权数据" -msgstr "excel表头校验不正确! 提示: 请按照模板填写授权数据" +#: backend/db_services/group/views.py:99 backend/db_services/group/views.py:101 +msgid "创建新分组" +msgstr "创建新分组" -#: backend/db_services/mysql/permission/authorize/serializers.py:74 -#: backend/db_services/mysql/permission/clone/serializers.py:104 -msgid "excel包含空的单元格!请检查数据的完整性和合法性" -msgstr "excel包含空的单元格!请检查数据的完整性和合法性" +#: backend/db_services/group/views.py:108 +#: backend/db_services/group/views.py:110 +msgid "更新分组信息" +msgstr "更新分组信息" -#: backend/db_services/mysql/permission/authorize/serializers.py:83 -msgid "授权信息excel文件下载url" -msgstr "授权信息excel文件下载url" +#: backend/db_services/group/views.py:117 +#: backend/db_services/group/views.py:119 +msgid "删除分组" +msgstr "删除分组" -#: backend/db_services/mysql/permission/authorize/serializers.py:91 -#: backend/db_services/mysql/permission/clone/serializers.py:126 -#: backend/db_services/mysql/permission/constants.py:53 -#: backend/db_services/mysql/permission/constants.py:77 -#: backend/flow/models.py:20 backend/flow/models.py:37 -#: backend/ticket/serializers.py:63 -msgid "单据ID" -msgstr "单据ID" +#: backend/db_services/group/views.py:127 +msgid "移动实例到新组" +msgstr "移动实例到新组" -#: backend/db_services/mysql/permission/authorize/serializers.py:95 -msgid "授权执行错误excel" -msgstr "授权执行错误excel" +#: backend/db_services/infras/constants.py:19 +msgid "不足" +msgstr "不足" -#: backend/db_services/mysql/permission/authorize/serializers.py:100 -msgid "访问源ip" -msgstr "访问源ip" +#: backend/db_services/infras/constants.py:20 +msgid "充足" +msgstr "充足" -#: backend/db_services/mysql/permission/authorize/serializers.py:101 -msgid "访问集群名称" -msgstr "访问集群名称" +#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 +msgid "标准型SA2" +msgstr "标准型SA2" -#: backend/db_services/mysql/permission/authorize/serializers.py:102 -msgid "访问db名称" -msgstr "访问db名称" +#: backend/db_services/infras/host.py:41 backend/db_services/infras/host.py:43 +#: backend/db_services/infras/host.py:45 +msgid "1核" +msgstr "1核" -#: backend/db_services/mysql/permission/authorize/serializers.py:103 -#: backend/db_services/mysql/permission/db_account/serializers.py:96 -#: backend/db_services/mysql/permission/db_account/serializers.py:111 -msgid "规则列表" -msgstr "规则列表" +#: backend/db_services/infras/host.py:42 +msgid "标准型S6" +msgstr "标准型S6" -#: backend/db_services/mysql/permission/authorize/serializers.py:108 -msgid "现网授权列表" -msgstr "现网授权列表" +#: backend/db_services/infras/host.py:42 backend/db_services/infras/host.py:44 +#: backend/db_services/infras/host.py:46 +msgid "2核" +msgstr "2核" -#: backend/db_services/mysql/permission/authorize/serializers.py:108 -msgid "授权信息" -msgstr "授权信息" +#: backend/db_services/infras/host.py:44 +msgid "标准型S5" +msgstr "标准型S5" -#: backend/db_services/mysql/permission/authorize/serializers.py:116 -#: backend/ticket/models/ticket_result_relation.py:24 -msgid "单据id" -msgstr "单据id" +#: backend/db_services/infras/host.py:60 +msgid "无限制" +msgstr "无限制" -#: backend/db_services/mysql/permission/authorize/serializers.py:117 -msgid "过滤搜索关键字" -msgstr "过滤搜索关键字" +#: backend/db_services/infras/serializers.py:65 +#: backend/ticket/builders/common/bigdata.py:89 +#: backend/ticket/builders/common/bigdata.py:123 +#: backend/ticket/builders/common/bigdata.py:182 +#: backend/ticket/builders/influxdb/influxdb_apply.py:38 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:37 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:41 +#: backend/ticket/builders/mongodb/mongo_cutoff.py:45 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:50 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:40 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:42 +#: backend/ticket/builders/mysql/mysql_single_apply.py:57 +#: backend/ticket/builders/pulsar/pulsar_shrink.py:31 +#: backend/ticket/builders/redis/redis_cluster_apply.py:46 +#: backend/ticket/builders/redis/redis_instance_apply.py:48 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:46 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:43 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:41 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:75 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:36 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:57 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:82 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:85 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:40 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:56 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:38 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:45 +msgid "主机来源" +msgstr "主机来源" -#: backend/db_services/mysql/permission/authorize/views.py:71 -msgid "规则前置检查" -msgstr "规则前置检查" +#: backend/db_services/infras/serializers.py:66 +#: backend/ticket/builders/mysql/mysql_single_apply.py:59 +#: backend/ticket/builders/redis/redis_cluster_apply.py:47 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:58 +msgid "部署节点" +msgstr "部署节点" -#: backend/db_services/mysql/permission/authorize/views.py:81 -msgid "excel规则前置检查" -msgstr "excel规则前置检查" +#: backend/db_services/infras/views.py:40 +msgid "查询集群类型" +msgstr "查询集群类型" -#: backend/db_services/mysql/permission/authorize/views.py:93 -msgid "获得授权信息excel文件" -msgstr "获得授权信息excel文件" +#: backend/db_services/infras/views.py:53 +msgid "查询服务器资源的城市信息" +msgstr "查询服务器资源的城市信息" -#: backend/db_services/mysql/permission/authorize/views.py:105 -msgid "现网授权查询(暂搁置)" -msgstr "现网授权查询(暂搁置)" +#: backend/db_services/infras/views.py:54 +#: backend/db_services/infras/views.py:64 +msgid "城市信息" +msgstr "城市信息" -#: backend/db_services/mysql/permission/authorize/views.py:114 -msgid "查询授权主机的信息" -msgstr "查询授权主机的信息" +#: backend/db_services/infras/views.py:63 +msgid "查询逻辑城市映射关系" +msgstr "查询逻辑城市映射关系" -#: backend/db_services/mysql/permission/clone/models.py:27 -#: backend/db_services/mysql/permission/clone/serializers.py:33 -#: backend/db_services/mysql/permission/clone/serializers.py:84 -#: backend/db_services/mysql/permission/clone/serializers.py:124 -#: backend/ticket/builders/mysql/mysql_clone_rules.py:29 -msgid "权限克隆类型" -msgstr "权限克隆类型" +#: backend/db_services/infras/views.py:78 +msgid "服务器规格列表" +msgstr "服务器规格列表" -#: backend/db_services/mysql/permission/clone/models.py:29 -#: backend/db_services/mysql/permission/clone/serializers.py:22 -msgid "旧实例/旧客户端IP" -msgstr "旧实例/旧客户端IP" +#: backend/db_services/infras/views.py:79 +msgid "服务器规格信息" +msgstr "服务器规格信息" -#: backend/db_services/mysql/permission/clone/models.py:30 -msgid "新实例/新客户端IP列表" -msgstr "新实例/新客户端IP列表" +#: backend/db_services/infras/views.py:93 +msgid "容量规格列表" +msgstr "容量规格列表" -#: backend/db_services/mysql/permission/clone/models.py:32 -msgid "是否克隆成功" -msgstr "是否克隆成功" +#: backend/db_services/infras/views.py:95 +msgid "申请容量规格信息" +msgstr "申请容量规格信息" -#: backend/db_services/mysql/permission/clone/models.py:33 -#: backend/ticket/models/ticket.py:57 -msgid "错误信息" -msgstr "错误信息" +#: backend/db_services/infras/views.py:127 +msgid "主机{}配置异常,无法获取到合法的cpu({})或内存({})" +msgstr "主机{}配置异常,无法获取到合法的cpu({})或内存({})" -#: backend/db_services/mysql/permission/clone/models.py:38 -#: backend/db_services/mysql/permission/clone/models.py:39 -msgid "权限克隆记录" -msgstr "权限克隆记录" +#: backend/db_services/infras/views.py:143 +msgid "暂不支持该集群类型: {}" +msgstr "暂不支持该集群类型: {}" -#: backend/db_services/mysql/permission/clone/serializers.py:23 -msgid "新实例/新客户端IP" -msgstr "新实例/新客户端IP" +#: backend/db_services/ipchooser/constants.py:54 +msgid "字段分隔符" +msgstr "字段分隔符" -#: backend/db_services/mysql/permission/clone/serializers.py:25 -msgid "模块名" -msgstr "模块名" +#: backend/db_services/ipchooser/constants.py:55 +msgid "全量返回标志" +msgstr "全量返回标志" -#: backend/db_services/mysql/permission/clone/serializers.py:35 -msgid "克隆元素列表" -msgstr "克隆元素列表" +#: backend/db_services/ipchooser/constants.py:56 +msgid "默认模糊查询字段" +msgstr "默认模糊查询字段" -#: backend/db_services/mysql/permission/clone/serializers.py:35 -msgid "克隆元素信息" -msgstr "克隆元素信息" +#: backend/db_services/ipchooser/constants.py:57 +msgid "主机列表默认返回字段" +msgstr "主机列表默认返回字段" -#: backend/db_services/mysql/permission/clone/serializers.py:49 -msgid "源克隆对象{}与目的克隆对象{}相同" -msgstr "源克隆对象{}与目的克隆对象{}相同" +#: backend/db_services/ipchooser/constants.py:106 +msgid "完整模式" +msgstr "完整模式" -#: backend/db_services/mysql/permission/clone/serializers.py:66 -msgid "实例{}不属于本业务{},请保证所有实例均在本业务下" -msgstr "实例{}不属于本业务{},请保证所有实例均在本业务下" +#: backend/db_services/ipchooser/constants.py:106 +msgid "空闲机模式" +msgstr "空闲机模式" -#: backend/db_services/mysql/permission/clone/serializers.py:73 -#: backend/db_services/mysql/permission/clone/serializers.py:115 -msgid "权限克隆前置检查结果" -msgstr "权限克隆前置检查结果" +#: backend/db_services/ipchooser/constants.py:129 +msgid "存活" +msgstr "存活" -#: backend/db_services/mysql/permission/clone/serializers.py:74 -#: backend/db_services/mysql/permission/clone/serializers.py:116 -msgid "权限克隆前置检查信息" -msgstr "权限克隆前置检查信息" +#: backend/db_services/ipchooser/constants.py:129 +msgid "未存活" +msgstr "未存活" -#: backend/db_services/mysql/permission/clone/serializers.py:75 -#: backend/db_services/mysql/permission/clone/serializers.py:117 -msgid "权限克隆数据uid" -msgstr "权限克隆数据uid" +#: backend/db_services/ipchooser/exceptions.py:21 +#: backend/db_services/ipchooser/exceptions.py:22 +msgid "参数校验失败" +msgstr "参数校验失败" -#: backend/db_services/mysql/permission/clone/serializers.py:76 -msgid "权限克隆数据列表" -msgstr "权限克隆数据列表" +#: backend/db_services/ipchooser/exceptions.py:27 +#, python-brace-format +msgid "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" +msgstr "业务【bk_biz_id: {bk_biz_id}】拓扑不存在" -#: backend/db_services/mysql/permission/clone/serializers.py:83 -msgid "克隆实例/客户端excel文件" -msgstr "克隆实例/客户端excel文件" +#: backend/db_services/ipchooser/exceptions.py:28 +msgid "业务拓扑不存在" +msgstr "业务拓扑不存在" -#: backend/db_services/mysql/permission/clone/serializers.py:91 -msgid "excel内容解析失败, 错误信息:{}。" -msgstr "excel内容解析失败, 错误信息:{}。" +#: backend/db_services/ipchooser/mock_data.py:30 +#: backend/db_services/ipchooser/mock_data.py:89 +#: backend/db_services/ipchooser/mock_data.py:110 +#: backend/db_services/ipchooser/mock_data.py:138 +#: backend/db_services/ipchooser/mock_data.py:149 +#: backend/db_services/ipchooser/mock_data.py:171 +#: backend/db_services/redis/autofix/models.py:75 +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:98 +#: backend/ticket/constants.py:79 backend/ticket/constants.py:90 +msgid "成功" +msgstr "成功" -#: backend/db_services/mysql/permission/clone/serializers.py:95 -msgid "excel表头校验不正确!" -msgstr "excel表头校验不正确!" +#: backend/db_services/ipchooser/mock_data.py:34 +#: backend/db_services/ipchooser/mock_data.py:92 +#: backend/db_services/ipchooser/mock_data.py:124 +msgid "蓝鲸" +msgstr "蓝鲸" -#: backend/db_services/mysql/permission/clone/serializers.py:99 -msgid "excel内容为空!" -msgstr "excel内容为空!" +#: backend/db_services/ipchooser/mock_data.py:41 +#: backend/db_services/ipchooser/mock_data.py:96 +msgid "mark测试" +msgstr "mark测试" -#: backend/db_services/mysql/permission/clone/serializers.py:125 -#: backend/ticket/builders/mysql/mysql_clone_rules.py:28 -msgid "权限克隆数据缓存uid" -msgstr "权限克隆数据缓存uid" +#: backend/db_services/ipchooser/mock_data.py:48 +msgid "空闲机模块" +msgstr "空闲机模块" -#: backend/db_services/mysql/permission/clone/views.py:65 -msgid "权限克隆前置检查" -msgstr "权限克隆前置检查" +#: backend/db_services/ipchooser/mock_data.py:60 +msgid "空闲机池" +msgstr "空闲机池" -#: backend/db_services/mysql/permission/clone/views.py:75 -msgid "权限克隆excel前置检查" -msgstr "权限克隆excel前置检查" +#: backend/db_services/ipchooser/mock_data.py:67 +#: backend/ticket/builders/common/base.py:152 +msgid "空闲机" +msgstr "空闲机" -#: backend/db_services/mysql/permission/clone/views.py:85 -msgid "获得权限克隆信息excel文件" -msgstr "获得权限克隆信息excel文件" +#: backend/db_services/ipchooser/query/resource.py:487 +msgid "直连区域" +msgstr "直连区域" -#: backend/db_services/mysql/permission/constants.py:22 -msgid "选择" -msgstr "选择" +#: backend/db_services/ipchooser/serializers/base.py:18 +msgid "数据起始位置" +msgstr "数据起始位置" -#: backend/db_services/mysql/permission/constants.py:23 -msgid "插入" -msgstr "插入" +#: backend/db_services/ipchooser/serializers/base.py:20 +msgid "拉取数据数量,不传或传 `-1` 表示拉取所有" +msgstr "拉取数据数量,不传或传 `-1` 表示拉取所有" -#: backend/db_services/mysql/permission/constants.py:30 -msgid "创建表" -msgstr "创建表" +#: backend/db_services/ipchooser/serializers/base.py:29 +msgid "资源范围类型" +msgstr "资源范围类型" -#: backend/db_services/mysql/permission/constants.py:31 -msgid "修改表" -msgstr "修改表" +#: backend/db_services/ipchooser/serializers/base.py:30 +msgid "资源范围ID" +msgstr "资源范围ID" -#: backend/db_services/mysql/permission/constants.py:32 -msgid "删除表" -msgstr "删除表" +#: backend/db_services/ipchooser/serializers/base.py:48 +msgid "节点类型ID" +msgstr "节点类型ID" -#: backend/db_services/mysql/permission/constants.py:33 -msgid "索引" -msgstr "索引" +#: backend/db_services/ipchooser/serializers/base.py:54 +msgid "内网IP" +msgstr "内网IP" -#: backend/db_services/mysql/permission/constants.py:34 -msgid "执行" -msgstr "执行" +#: backend/db_services/ipchooser/serializers/base.py:55 +msgid "内网IPv6" +msgstr "内网IPv6" -#: backend/db_services/mysql/permission/constants.py:39 -msgid "replication client" -msgstr "replication client" +#: backend/db_services/ipchooser/serializers/base.py:57 +msgid "主机名称" +msgstr "主机名称" -#: backend/db_services/mysql/permission/constants.py:40 -msgid "replication slave" -msgstr "replication slave" +#: backend/db_services/ipchooser/serializers/base.py:58 +#: backend/db_services/ipchooser/serializers/base.py:68 +msgid "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" +msgstr "模糊搜索内容(支持同时对`主机IP`/`主机名`/`操作系统`进行模糊搜索" -#: backend/db_services/mysql/permission/constants.py:41 -msgid "file" -msgstr "file" +#: backend/db_services/ipchooser/serializers/base.py:62 +msgid "是否获取所有资源范围的拓扑结构,默认为 `false`" +msgstr "是否获取所有资源范围的拓扑结构,默认为 `false`" -#: backend/db_services/mysql/permission/constants.py:54 -msgid "授权数据缓存UID" -msgstr "授权数据缓存UID" +#: backend/db_services/ipchooser/serializers/base.py:63 +msgid "要获取拓扑结构的资源范围数组" +msgstr "要获取拓扑结构的资源范围数组" -#: backend/db_services/mysql/permission/constants.py:60 -msgid "账号(单个)" -msgstr "账号(单个)" +#: backend/db_services/ipchooser/serializers/base.py:70 +msgid "云区域过滤id" +msgstr "云区域过滤id" -#: backend/db_services/mysql/permission/constants.py:61 -msgid "访问源(多个)" -msgstr "访问源(多个)" +#: backend/db_services/ipchooser/serializers/base.py:89 +msgid "主机元信息" +msgstr "主机元信息" -#: backend/db_services/mysql/permission/constants.py:62 -msgid "访问集群域名(多个)" -msgstr "访问集群域名(多个)" +#: backend/db_services/ipchooser/serializers/base.py:91 +msgid "IPv4 协议下的主机IP" +msgstr "IPv4 协议下的主机IP" -#: backend/db_services/mysql/permission/constants.py:63 -msgid "访问DB名(多个)" -msgstr "访问DB名(多个)" +#: backend/db_services/ipchooser/serializers/base.py:92 +msgid "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" +msgstr "主机 ID,优先取 `host_id`,否则取 `ip` + `cloud_id`" -#: backend/db_services/mysql/permission/constants.py:70 -msgid "实例克隆" -msgstr "实例克隆" +#: backend/db_services/ipchooser/serializers/base.py:96 +msgid "请传入 host_id 或者 cloud_id + ip" +msgstr "请传入 host_id 或者 cloud_id + ip" -#: backend/db_services/mysql/permission/constants.py:71 -msgid "客户端克隆" -msgstr "客户端克隆" +#: backend/db_services/ipchooser/serializers/host_sers.py:20 +#: backend/db_services/ipchooser/serializers/host_sers.py:52 +#: backend/db_services/ipchooser/serializers/topo_sers.py:20 +#: backend/db_services/ipchooser/serializers/topo_sers.py:46 +msgid "模式" +msgstr "模式" -#: backend/db_services/mysql/permission/constants.py:78 -msgid "克隆数据缓存UID" -msgstr "克隆数据缓存UID" +#: backend/db_services/ipchooser/serializers/host_sers.py:23 +msgid "IPv4 列表" +msgstr "IPv4 列表" -#: backend/db_services/mysql/permission/db_account/serializers.py:25 -msgid "账号密码" -msgstr "账号密码" +#: backend/db_services/ipchooser/serializers/host_sers.py:24 +msgid "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" +msgstr "IPv4,支持的输入格式:`cloud_id:ip` / `ip`" -#: backend/db_services/mysql/permission/db_account/serializers.py:33 -msgid "账号名称不符合要求, 请重新账号名" -msgstr "账号名称不符合要求, 请重新账号名" +#: backend/db_services/ipchooser/serializers/host_sers.py:29 +msgid "IPv6 列表" +msgstr "IPv6 列表" -#: backend/db_services/mysql/permission/db_account/serializers.py:43 -msgid "密码强度不符合要求, 请重新输入密码" -msgstr "密码强度不符合要求, 请重新输入密码" +#: backend/db_services/ipchooser/serializers/host_sers.py:30 +msgid "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" +msgstr "IPv6,支持的输入格式:`cloud_id:ipv6` / `ipv6`" -#: backend/db_services/mysql/permission/db_account/serializers.py:54 -msgid "待校验密码" -msgstr "待校验密码" +#: backend/db_services/ipchooser/serializers/host_sers.py:35 +msgid "关键字列表" +msgstr "关键字列表" -#: backend/db_services/mysql/permission/db_account/serializers.py:61 -msgid "密码是否满足强度" -msgstr "密码是否满足强度" +#: backend/db_services/ipchooser/serializers/host_sers.py:36 +msgid "关键字,解析出的`主机名`、`host_id` 等关键字信息" +msgstr "关键字,解析出的`主机名`、`host_id` 等关键字信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:62 -msgid "密码校验信息字典" -msgstr "密码校验信息字典" +#: backend/db_services/ipchooser/serializers/topo_sers.py:71 +msgid "查询过滤条件" +msgstr "查询过滤条件" -#: backend/db_services/mysql/permission/db_account/serializers.py:69 -#: backend/db_services/mysql/permission/db_account/serializers.py:76 -#: backend/db_services/mysql/permission/db_account/serializers.py:86 -#: backend/db_services/mysql/permission/db_account/serializers.py:93 -#: backend/db_services/mysql/permission/db_account/serializers.py:142 -msgid "账号ID" -msgstr "账号ID" +#: backend/db_services/ipchooser/serializers/topo_sers.py:79 +msgid "拓扑信息列表" +msgstr "拓扑信息列表" -#: backend/db_services/mysql/permission/db_account/serializers.py:87 -#: backend/db_services/mysql/permission/db_account/serializers.py:97 -#: backend/db_services/partition/serializers.py:51 -msgid "创建者" -msgstr "创建者" +#: backend/db_services/ipchooser/serializers/topo_sers.py:79 +msgid "拓扑信息" +msgstr "拓扑信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:92 -#: backend/db_services/mysql/permission/db_account/serializers.py:151 -#: backend/db_services/mysql/permission/db_account/serializers.py:158 -msgid "规则ID" -msgstr "规则ID" +#: backend/db_services/ipchooser/views.py:34 +msgid "批量获取含各节点主机数量的拓扑树" +msgstr "批量获取含各节点主机数量的拓扑树" -#: backend/db_services/mysql/permission/db_account/serializers.py:102 -msgid "账号信息" -msgstr "账号信息" +#: backend/db_services/ipchooser/views.py:50 +msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" +msgstr "根据多个拓扑节点与搜索条件批量分页查询所包含的主机信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:104 -msgid "权限列表信息" -msgstr "权限列表信息" +#: backend/db_services/ipchooser/views.py:68 +msgid "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" +msgstr "根据多个拓扑节点与搜索条件批量分页查询所包含的主机 ID 信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:120 -msgid "规则数量" -msgstr "规则数量" +#: backend/db_services/ipchooser/views.py:85 +msgid "根据主机过滤查询主机的拓扑信息" +msgstr "根据主机过滤查询主机的拓扑信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:122 -msgid "规则信息" -msgstr "规则信息" +#: backend/db_services/ipchooser/views.py:108 +msgid "" +"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" +"器信息" +msgstr "" +"根据用户手动输入的`IP`/`IPv6`/`主机名`/`host_id`等关键字信息获取真实存在的机" +"器信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:131 -#: backend/db_services/mysql/permission/db_account/serializers.py:134 -msgid "dml" -msgstr "dml" +#: backend/db_services/ipchooser/views.py:126 +msgid "根据主机关键信息获取机器详情信息" +msgstr "根据主机关键信息获取机器详情信息" -#: backend/db_services/mysql/permission/db_account/serializers.py:137 -msgid "glob" -msgstr "glob" +#: backend/db_services/ipchooser/views.py:168 +msgid "获取自定义配置,比如表格列字段及顺序" +msgstr "获取自定义配置,比如表格列字段及顺序" -#: backend/db_services/mysql/permission/db_account/views.py:82 -msgid "校验密码强度" -msgstr "校验密码强度" +#: backend/db_services/ipchooser/views.py:184 +msgid "保存用户自定义配置" +msgstr "保存用户自定义配置" -#: backend/db_services/mysql/permission/db_account/views.py:94 -msgid "添加账号规则" -msgstr "添加账号规则" +#: backend/db_services/ipchooser/views.py:198 +msgid "查询云区域的信息" +msgstr "查询云区域的信息" -#: backend/db_services/mysql/permission/db_account/views.py:101 -msgid "查询账号规则清单" -msgstr "查询账号规则清单" +#: backend/db_services/meta_import/constants.py:13 +msgid "元数据迁移" +msgstr "元数据迁移" + +#: backend/db_services/meta_import/serializers.py:56 +#: backend/db_services/meta_import/serializers.py:87 +#: backend/db_services/meta_import/serializers.py:116 +msgid "元数据json文件" +msgstr "元数据json文件" + +#: backend/db_services/meta_import/serializers.py:60 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:34 +msgid "代理层规格ID" +msgstr "代理层规格ID" + +#: backend/db_services/meta_import/serializers.py:63 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:35 +msgid "存储层规格ID" +msgstr "存储层规格ID" + +#: backend/db_services/meta_import/serializers.py:72 +#: backend/db_services/meta_import/serializers.py:80 +#: backend/db_services/meta_import/serializers.py:104 +#: backend/db_services/meta_import/serializers.py:128 +msgid "域名列表文件" +msgstr "域名列表文件" + +#: backend/db_services/meta_import/serializers.py:91 +msgid "Spider规格ID" +msgstr "Spider规格ID" + +#: backend/db_services/meta_import/serializers.py:94 +msgid "Remote规格ID" +msgstr "Remote规格ID" + +#: backend/db_services/meta_import/serializers.py:102 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:53 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:49 +#: backend/ticket/builders/riak/riak_apply.py:31 +#: backend/ticket/builders/riak/riak_migrate.py:31 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:49 +msgid "云区域" +msgstr "云区域" -#: backend/db_services/mysql/permission/db_account/views.py:113 -msgid "查询账号规则" -msgstr "查询账号规则" +#: backend/db_services/meta_import/serializers.py:105 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:26 +msgid "是否使用mydumper流式备份迁移" +msgstr "是否使用mydumper流式备份迁移" + +#: backend/db_services/meta_import/serializers.py:106 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:27 +msgid "导入到tdbctl前,是否先删除" +msgstr "导入到tdbctl前,是否先删除" + +#: backend/db_services/meta_import/serializers.py:107 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:28 +msgid "mydumper 并发" +msgstr "mydumper 并发" + +#: backend/db_services/meta_import/serializers.py:108 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:29 +msgid "是否使用mydumper,myloader迁移" +msgstr "是否使用mydumper,myloader迁移" + +#: backend/db_services/meta_import/serializers.py:119 +#: backend/ticket/builders/tendbsingle/metadata_import.py:33 +msgid "存储机规格ID" +msgstr "存储机规格ID" + +#: backend/db_services/meta_import/views.py:61 +msgid "TenDB HA 元数据导入" +msgstr "TenDB HA 元数据导入" + +#: backend/db_services/meta_import/views.py:86 +msgid "TenDB HA 标准化接入" +msgstr "TenDB HA 标准化接入" + +#: backend/db_services/meta_import/views.py:116 +#: backend/db_services/meta_import/views.py:186 +#: backend/db_services/meta_import/views.py:233 +#: backend/db_services/meta_import/views.py:302 +msgid "cluster {} not found" +msgstr "cluster {} not found" + +#: backend/db_services/meta_import/views.py:133 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:50 +#: backend/ticket/builders/spider/metadata_import.py:237 +#: backend/ticket/constants.py:244 +msgid "TenDB Cluster 元数据导入" +msgstr "TenDB Cluster 元数据导入" + +#: backend/db_services/meta_import/views.py:156 backend/ticket/constants.py:243 +msgid "TenDB Cluster 集群标准化" +msgstr "TenDB Cluster 集群标准化" + +#: backend/db_services/meta_import/views.py:203 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:76 +#: backend/ticket/constants.py:245 +msgid "TenDB Cluster 追加部署中控" +msgstr "TenDB Cluster 追加部署中控" + +#: backend/db_services/meta_import/views.py:249 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:50 +#: backend/ticket/builders/tendbsingle/metadata_import.py:201 +#: backend/ticket/constants.py:246 +msgid "TenDB Single 元数据导入" +msgstr "TenDB Single 元数据导入" + +#: backend/db_services/meta_import/views.py:272 backend/ticket/constants.py:247 +msgid "TenDB Single 集群标准化" +msgstr "TenDB Single 集群标准化" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:62 +msgid "无法查询用户{}对应的密码" +msgstr "无法查询用户{}对应的密码" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:68 +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:60 +msgid "不存在{}-{}这样的规则模板" +msgstr "不存在{}-{}这样的规则模板" + +#: backend/db_services/mongodb/permission/db_authorize/handlers.py:75 +msgid "存在不合法的集群域名" +msgstr "存在不合法的集群域名" + +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:21 +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:21 +msgid "账号名" +msgstr "账号名" + +#: backend/db_services/mongodb/permission/db_authorize/serializers.py:24 +msgid "mongo账户规则" +msgstr "mongo账户规则" + +#: backend/db_services/mongodb/resources/views.py:96 +msgid "获取实例的角色类型" +msgstr "获取实例的角色类型" + +#: backend/db_services/mongodb/restore/handlers.py:51 +msgid "距离回档时间点7天内没有备份日志" +msgstr "距离回档时间点7天内没有备份日志" + +#: backend/db_services/mongodb/restore/handlers.py:59 +msgid "无法找到时间点{}附近的全备日志记录" +msgstr "无法找到时间点{}附近的全备日志记录" + +#: backend/db_services/mongodb/restore/handlers.py:122 +#: backend/db_services/mongodb/restore/handlers.py:138 +msgid "{}-{}内没有通过单据备份的日志" +msgstr "{}-{}内没有通过单据备份的日志" + +#: backend/db_services/mongodb/restore/serializers.py:26 +msgid "分片集群只支持查询单个" +msgstr "分片集群只支持查询单个" + +#: backend/db_services/mongodb/restore/serializers.py:40 +msgid "过滤ip,多个ip以逗号分割" +msgstr "过滤ip,多个ip以逗号分割" + +#: backend/db_services/mongodb/restore/views.py:39 +msgid "获取集群单据备份记录" +msgstr "获取集群单据备份记录" + +#: backend/db_services/mongodb/restore/views.py:52 +msgid "获取集群备份记录" +msgstr "获取集群备份记录" + +#: backend/db_services/mongodb/restore/views.py:66 +msgid "查询定点构造记录" +msgstr "查询定点构造记录" + +#: backend/db_services/mysql/cluster/serializers.py:36 +msgid "集群过滤条件列表" +msgstr "集群过滤条件列表" -#: backend/db_services/mysql/permission/db_account/views.py:125 -msgid "修改账号规则" -msgstr "修改账号规则" +#: backend/db_services/mysql/cluster/serializers.py:66 +msgid "查询的实例列表" +msgstr "查询的实例列表" -#: backend/db_services/mysql/permission/db_account/views.py:134 -msgid "删除账号规则" -msgstr "删除账号规则" +#: backend/db_services/mysql/cluster/serializers.py:67 +msgid "查询的机器列表" +msgstr "查询的机器列表" -#: backend/db_services/mysql/permission/exceptions.py:41 -msgid "权限模块异常" -msgstr "权限模块异常" +#: backend/db_services/mysql/cluster/serializers.py:81 +msgid "is_stand_by标志(默认获取带有is_stand_by标志的slave)" +msgstr "is_stand_by标志(默认获取带有is_stand_by标志的slave)" -#: backend/db_services/mysql/permission/exceptions.py:45 -msgid "授权EXCEL表校验异常" -msgstr "授权EXCEL表校验异常" +#: backend/db_services/mysql/cluster/views.py:41 +msgid "通过过滤条件批量查询集群" +msgstr "通过过滤条件批量查询集群" -#: backend/db_services/mysql/permission/exceptions.py:49 -msgid "权限克隆EXCEL表校验异常" -msgstr "权限克隆EXCEL表校验异常" +#: backend/db_services/mysql/cluster/views.py:54 +msgid "查询tendbcluster集群的remote_db/remote_dr" +msgstr "查询tendbcluster集群的remote_db/remote_dr" -#: backend/db_services/mysql/permission/exceptions.py:53 -msgid "授权数据已过期" -msgstr "授权数据已过期" +#: backend/db_services/mysql/cluster/views.py:65 +msgid "[tendbcluster]根据实例/机器查询关联对" +msgstr "[tendbcluster]根据实例/机器查询关联对" -#: backend/db_services/mysql/permission/exceptions.py:57 -msgid "权限克隆数据已过期" -msgstr "权限克隆数据已过期" +#: backend/db_services/mysql/cluster/views.py:76 +msgid "获取关联集群从库的交集" +msgstr "获取关联集群从库的交集" -#: backend/db_services/mysql/remote_service/serializers.py:37 -msgid "DB名列表" -msgstr "DB名列表" +#: backend/db_services/mysql/dumper/filters.py:22 +msgid "库名" +msgstr "库名" -#: backend/db_services/mysql/remote_service/serializers.py:37 -msgid "DB名" -msgstr "DB名" +#: backend/db_services/mysql/dumper/filters.py:23 +msgid "表名" +msgstr "表名" -#: backend/db_services/mysql/remote_service/views.py:35 -msgid "查询集群数据库列表" -msgstr "查询集群数据库列表" +#: backend/db_services/mysql/dumper/filters.py:39 +msgid "dumper订阅规则" +msgstr "dumper订阅规则" -#: backend/db_services/mysql/remote_service/views.py:48 -msgid "校验DB是否在集群内" -msgstr "校验DB是否在集群内" +#: backend/db_services/mysql/dumper/filters.py:41 +msgid "实例IP:Port" +msgstr "实例IP:Port" -#: backend/db_services/mysql/resources/spider/query.py:37 -#: backend/db_services/mysql/resources/tendbha/query.py:40 -#: backend/db_services/mysql/resources/tendbsingle/query.py:39 -msgid "主域名" -msgstr "主域名" +#: backend/db_services/mysql/dumper/filters.py:42 +msgid "dumper id" +msgstr "dumper id" -#: backend/db_services/mysql/resources/spider/query.py:38 -#: backend/db_services/mysql/resources/tendbha/query.py:41 -msgid "从域名" -msgstr "从域名" +#: backend/db_services/mysql/dumper/filters.py:44 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:39 +msgid "接收端类型" +msgstr "接收端类型" -#: backend/db_services/mysql/resources/spider/query.py:43 -msgid "运维节点" -msgstr "运维节点" +#: backend/db_services/mysql/dumper/filters.py:45 +msgid "同步方式" +msgstr "同步方式" -#: backend/db_services/mysql/resources/spider/query.py:44 -#: backend/db_services/mysql/resources/tendbha/query.py:45 -#: backend/db_services/mysql/resources/tendbsingle/query.py:41 -msgid "所属db模块" -msgstr "所属db模块" +#: backend/db_services/mysql/dumper/filters.py:46 +msgid "接收端地址" +msgstr "接收端地址" -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:113 -msgid "实例地址列表" -msgstr "实例地址列表" +#: backend/db_services/mysql/dumper/models.py:27 +msgid "订阅配置名" +msgstr "订阅配置名" -#: backend/db_services/mysql/resources/tendbha/yasg_slz.py:141 -msgid "测试业务" -msgstr "测试业务" +#: backend/db_services/mysql/dumper/models.py:28 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:49 +msgid "数据同步方式" +msgstr "数据同步方式" -#: backend/db_services/mysql/sql_import/constants.py:25 -msgid "DEFAULT" -msgstr "DEFAULT" +#: backend/db_services/mysql/dumper/models.py:29 +msgid "订阅库表信息 eg: [{'db_name': 'xx', 'table_names': [....]}, ...]" +msgstr "订阅库表信息 eg: [{'db_name': 'xx', 'table_names': [....]}, ...]" -#: backend/db_services/mysql/sql_import/constants.py:26 -msgid "UTF8" -msgstr "UTF8" +#: backend/db_services/mysql/dumper/models.py:30 +msgid "订阅配置关联的订阅实例列表" +msgstr "订阅配置关联的订阅实例列表" -#: backend/db_services/mysql/sql_import/constants.py:27 -msgid "UTF8MB4" -msgstr "UTF8MB4" +#: backend/db_services/mysql/dumper/models.py:33 +#: backend/db_services/mysql/dumper/models.py:34 +msgid "dumper数据订阅配置" +msgstr "dumper数据订阅配置" -#: backend/db_services/mysql/sql_import/constants.py:28 -msgid "LATIN1" -msgstr "LATIN1" +#: backend/db_services/mysql/dumper/serializers.py:25 +msgid "DB名称" +msgstr "DB名称" -#: backend/db_services/mysql/sql_import/constants.py:29 -msgid "gbk" -msgstr "gbk" +#: backend/db_services/mysql/dumper/serializers.py:26 +msgid "表名列表" +msgstr "表名列表" -#: backend/db_services/mysql/sql_import/constants.py:30 -msgid "gb2312" -msgstr "gb2312" +#: backend/db_services/mysql/dumper/serializers.py:28 +msgid "配置表信息" +msgstr "配置表信息" -#: backend/db_services/mysql/sql_import/constants.py:38 -msgid "手动执行" -msgstr "手动执行" +#: backend/db_services/mysql/dumper/serializers.py:29 +msgid "dumper实例数" +msgstr "dumper实例数" -#: backend/db_services/mysql/sql_import/constants.py:39 -msgid "自动执行" -msgstr "自动执行" +#: backend/db_services/mysql/dumper/serializers.py:30 +msgid "dumper实例列表" +msgstr "dumper实例列表" -#: backend/db_services/mysql/sql_import/constants.py:40 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:184 -msgid "定时执行" -msgstr "定时执行" +#: backend/db_services/mysql/dumper/serializers.py:31 +msgid "正在部署dumper的任务列表" +msgstr "正在部署dumper的任务列表" -#: backend/db_services/mysql/sql_import/constants.py:48 -msgid "文件上传" -msgstr "文件上传" +#: backend/db_services/mysql/dumper/serializers.py:86 +msgid "订阅配置名称" +msgstr "订阅配置名称" -#: backend/db_services/mysql/sql_import/constants.py:49 -msgid "手动输入" -msgstr "手动输入" +#: backend/db_services/mysql/dumper/serializers.py:90 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:52 +msgid "dumper配置ID" +msgstr "dumper配置ID" -#: backend/db_services/mysql/sql_import/mock_data.py:22 -msgid "存在高危命令:drop_table" -msgstr "存在高危命令:drop_table" +#: backend/db_services/mysql/dumper/views/dumper_config.py:72 +msgid "查询数据订阅配置列表" +msgstr "查询数据订阅配置列表" -#: backend/db_services/mysql/sql_import/serializers.py:31 -msgid "sql语句" -msgstr "sql语句" +#: backend/db_services/mysql/dumper/views/dumper_config.py:85 +msgid "数据订阅配置详情" +msgstr "数据订阅配置详情" -#: backend/db_services/mysql/sql_import/serializers.py:33 -msgid "sql文件列表" -msgstr "sql文件列表" +#: backend/db_services/mysql/dumper/views/dumper_config.py:92 +msgid "数据订阅配置删除" +msgstr "数据订阅配置删除" -#: backend/db_services/mysql/sql_import/serializers.py:33 -msgid "sql文件" -msgstr "sql文件" +#: backend/db_services/mysql/dumper/views/dumper_config.py:99 +msgid "数据订阅配置更新" +msgstr "数据订阅配置更新" -#: backend/db_services/mysql/sql_import/serializers.py:41 -msgid "不允许sql_content和sql_file同时为空,请至少填写一项" -msgstr "不允许sql_content和sql_file同时为空,请至少填写一项" +#: backend/db_services/mysql/dumper/views/dumper_config.py:106 +msgid "数据订阅配置部分更新" +msgstr "数据订阅配置部分更新" -#: backend/db_services/mysql/sql_import/serializers.py:47 -msgid "语法错误" -msgstr "语法错误" +#: backend/db_services/mysql/dumper/views/dumper_config.py:113 +msgid "校验订阅配置是否重名" +msgstr "校验订阅配置是否重名" -#: backend/db_services/mysql/sql_import/serializers.py:48 -msgid "高危警告" -msgstr "高危警告" +#: backend/db_services/mysql/dumper/views/dumper_config.py:124 +msgid "查询dumper配置正在运行的任务" +msgstr "查询dumper配置正在运行的任务" -#: backend/db_services/mysql/sql_import/serializers.py:49 -msgid "禁止命令" -msgstr "禁止命令" +#: backend/db_services/mysql/dumper/views/dumper_instance.py:41 +msgid "查询数据订阅实例列表" +msgstr "查询数据订阅实例列表" -#: backend/db_services/mysql/sql_import/serializers.py:53 -msgid "语法检查结果" -msgstr "语法检查结果" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:422 +msgid "查询集群{}的备份日志" +msgstr "查询集群{}的备份日志" -#: backend/db_services/mysql/sql_import/serializers.py:61 -msgid "目标变更DB" -msgstr "目标变更DB" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:463 +msgid "作业【{}】执行失败,job_instance_id: {}" +msgstr "作业【{}】执行失败,job_instance_id: {}" -#: backend/db_services/mysql/sql_import/serializers.py:62 -msgid "忽略DB" -msgstr "忽略DB" +#: backend/db_services/mysql/fixpoint_rollback/handlers.py:523 +msgid "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "无法找到小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" -#: backend/db_services/mysql/sql_import/serializers.py:65 -msgid "单据执行模式" -msgstr "单据执行模式" +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:24 +#: backend/db_services/sqlserver/rollback/serializers.py:27 +msgid "查询时间间隔" +msgstr "查询时间间隔" -#: backend/db_services/mysql/sql_import/serializers.py:66 -msgid "定时任务触发时间" -msgstr "定时任务触发时间" +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:44 +#: backend/db_services/sqlserver/rollback/serializers.py:50 +#: backend/db_services/sqlserver/rollback/serializers.py:78 +#: backend/ticket/builders/mongodb/mongo_restore.py:46 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:54 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:47 +msgid "回档时间" +msgstr "回档时间" -#: backend/db_services/mysql/sql_import/serializers.py:69 -#: backend/ticket/builders/mysql/mysql_add_slave.py:35 -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:30 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:81 -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:31 +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:46 +#: backend/db_services/mysql/sql_import/serializers.py:79 +#: backend/ticket/builders/mysql/mysql_add_slave.py:33 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:36 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:37 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:45 +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:30 #: backend/ticket/builders/mysql/mysql_restore_slave.py:30 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:38 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:42 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:34 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:36 msgid "备份源" msgstr "备份源" -#: backend/db_services/mysql/sql_import/serializers.py:70 -#: backend/ticket/builders/mysql/mysql_checksum.py:33 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:29 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:30 -msgid "匹配DB列表" -msgstr "匹配DB列表" +#: backend/db_services/mysql/fixpoint_rollback/serializers.py:62 +msgid "JOB实例ID" +msgstr "JOB实例ID" -#: backend/db_services/mysql/sql_import/serializers.py:71 -#: backend/ticket/builders/mysql/mysql_checksum.py:35 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:31 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:32 -msgid "匹配Table列表" -msgstr "匹配Table列表" +#: backend/db_services/mysql/fixpoint_rollback/views.py:50 +msgid "通过日志平台获取集群备份记录" +msgstr "通过日志平台获取集群备份记录" -#: backend/db_services/mysql/sql_import/serializers.py:73 -#: backend/ticket/builders/mysql/mysql_checksum.py:34 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:30 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:31 -msgid "忽略DB列表" -msgstr "忽略DB列表" +#: backend/db_services/mysql/fixpoint_rollback/views.py:67 +msgid "查询集群的本地备份记录" +msgstr "查询集群的本地备份记录" -#: backend/db_services/mysql/sql_import/serializers.py:76 -#: backend/ticket/builders/mysql/mysql_checksum.py:36 -#: backend/ticket/builders/mysql/mysql_ha_backup.py:32 -#: backend/ticket/builders/mysql/mysql_ha_clear.py:33 -msgid "忽略Table列表" -msgstr "忽略Table列表" +#: backend/db_services/mysql/fixpoint_rollback/views.py:79 +msgid "查询小于回档时间点最近的备份记录" +msgstr "查询小于回档时间点最近的备份记录" -#: backend/db_services/mysql/sql_import/serializers.py:80 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:58 -#: backend/ticket/builders/mysql/mysql_single_apply.py:64 -#: backend/ticket/builders/spider/tendb_apply.py:45 -msgid "字符集" -msgstr "字符集" +#: backend/db_services/mysql/fixpoint_rollback/views.py:98 +msgid "获取定点构造记录" +msgstr "获取定点构造记录" -#: backend/db_services/mysql/sql_import/serializers.py:82 -msgid "SQL文件路径" -msgstr "SQL文件路径" +#: backend/db_services/mysql/open_area/exceptions.py:19 +msgid "Tendb开区通用异常" +msgstr "Tendb开区通用异常" -#: backend/db_services/mysql/sql_import/serializers.py:84 -msgid "sql执行文件" -msgstr "sql执行文件" +#: backend/db_services/mysql/open_area/filters.py:19 +msgid "模板名称" +msgstr "模板名称" -#: backend/db_services/mysql/sql_import/serializers.py:85 -msgid "sql执行的DB信息" -msgstr "sql执行的DB信息" +#: backend/db_services/mysql/open_area/filters.py:23 +msgid "排序类型" +msgstr "排序类型" -#: backend/db_services/mysql/sql_import/serializers.py:86 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:67 -msgid "高危信息提示" -msgstr "高危信息提示" +#: backend/db_services/mysql/open_area/handlers.py:43 +msgid "源集群不存在库{},请检查或修改开区模板" +msgstr "源集群不存在库{},请检查或修改开区模板" -#: backend/db_services/mysql/sql_import/serializers.py:87 -#: backend/flow/models.py:21 backend/ticket/models/ticket.py:88 -#: backend/ticket/serializers.py:65 -msgid "单据类型" -msgstr "单据类型" +#: backend/db_services/mysql/open_area/handlers.py:67 +msgid "源集群库{}中不存在表{},请检查或修改开区模板\n" +msgstr "源集群库{}中不存在表{},请检查或修改开区模板\n" -#: backend/db_services/mysql/sql_import/serializers.py:89 -#: backend/db_services/mysql/sql_import/serializers.py:185 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:62 -msgid "sql导入模式" -msgstr "sql导入模式" +#: backend/db_services/mysql/open_area/handlers.py:76 +msgid "源集群库{}中不存在表匹配[{}],请检查或修改开区模板" +msgstr "源集群库{}中不存在表匹配[{}],请检查或修改开区模板" -#: backend/db_services/mysql/sql_import/serializers.py:90 -msgid "备份信息" -msgstr "备份信息" +#: backend/db_services/mysql/open_area/handlers.py:126 +msgid "范式{}渲染缺少变量" +msgstr "范式{}渲染缺少变量" -#: backend/db_services/mysql/sql_import/serializers.py:102 -msgid "时间{}格式解析失败: {},请按照{}格式输入时间" -msgstr "时间{}格式解析失败: {},请按照{}格式输入时间" +#: backend/db_services/mysql/open_area/models.py:24 +msgid "开区模板类型[支持tendbha/tendbcluster]" +msgstr "开区模板类型[支持tendbha/tendbcluster]" -#: backend/db_services/mysql/sql_import/serializers.py:108 -#: backend/db_services/mysql/sql_import/serializers.py:116 -#: backend/db_services/mysql/sql_import/serializers.py:142 -#: backend/db_services/mysql/sql_import/serializers.py:161 -#: backend/db_services/mysql/sql_import/serializers.py:177 -msgid "流程id" -msgstr "流程id" +#: backend/db_services/mysql/open_area/models.py:28 +msgid "开区模板名" +msgstr "开区模板名" -#: backend/db_services/mysql/sql_import/serializers.py:109 -msgid "语义测试的node_id" -msgstr "语义测试的node_id" +#: backend/db_services/mysql/open_area/models.py:30 +#: backend/db_services/mysql/open_area/serializers.py:33 +msgid "模板克隆规则列表" +msgstr "模板克隆规则列表" -#: backend/db_services/mysql/sql_import/serializers.py:117 -#: backend/db_services/mysql/sql_import/serializers.py:125 -msgid "是否自动创建单据" -msgstr "是否自动创建单据" +#: backend/db_services/mysql/open_area/models.py:31 +msgid "关联的规则列表(目前用于级联规则的修改删除)" +msgstr "关联的规则列表(目前用于级联规则的修改删除)" -#: backend/db_services/mysql/sql_import/serializers.py:118 -#: backend/db_services/mysql/sql_import/serializers.py:126 -msgid "是否自动跳过确认" -msgstr "是否自动跳过确认" +#: backend/db_services/mysql/open_area/models.py:43 +msgid "开区配置修改记录数据" +msgstr "开区配置修改记录数据" -#: backend/db_services/mysql/sql_import/serializers.py:144 -msgid "执行状态" -msgstr "执行状态" +#: backend/db_services/mysql/open_area/serializers.py:25 +msgid "获取库表结构的源db" +msgstr "获取库表结构的源db" -#: backend/db_services/mysql/sql_import/serializers.py:146 -msgid "语义检查执行信息列表" -msgstr "语义检查执行信息列表" +#: backend/db_services/mysql/open_area/serializers.py:27 +msgid "获取表结构的源tb列表" +msgstr "获取表结构的源tb列表" -#: backend/db_services/mysql/sql_import/serializers.py:154 -msgid "语义执行的root id列表" -msgstr "语义执行的root id列表" +#: backend/db_services/mysql/open_area/serializers.py:28 +msgid "获取表数据的源tb列表" +msgstr "获取表数据的源tb列表" -#: backend/db_services/mysql/sql_import/serializers.py:168 -msgid "是否撤销成功" -msgstr "是否撤销成功" +#: backend/db_services/mysql/open_area/serializers.py:29 +msgid "目标db范式" +msgstr "目标db范式" -#: backend/db_services/mysql/sql_import/serializers.py:169 -msgid "撤销相关信息" -msgstr "撤销相关信息" +#: backend/db_services/mysql/open_area/serializers.py:34 +msgid "授权ID列表" +msgstr "授权ID列表" -#: backend/db_services/mysql/sql_import/serializers.py:170 -msgid "撤销相关数据" -msgstr "撤销相关数据" +#: backend/db_services/mysql/open_area/serializers.py:44 +msgid "源集群不存在,请选择合法集群" +msgstr "源集群不存在,请选择合法集群" -#: backend/db_services/mysql/sql_import/serializers.py:184 -msgid "语义执行数据" -msgstr "语义执行数据" +#: backend/db_services/mysql/open_area/serializers.py:50 +msgid "请保证同一业务下的开区模板命名不重复" +msgstr "请保证同一业务下的开区模板命名不重复" -#: backend/db_services/mysql/sql_import/serializers.py:186 -msgid "sql数据是否成功录入到pipeline" -msgstr "sql数据是否成功录入到pipeline" +#: backend/db_services/mysql/open_area/serializers.py:55 +msgid "请保证校验模板克隆规则的克隆DB不要重复" +msgstr "请保证校验模板克隆规则的克隆DB不要重复" -#: backend/db_services/mysql/sql_import/views.py:77 -msgid "sql语义检查" -msgstr "sql语义检查" +#: backend/db_services/mysql/open_area/serializers.py:67 +msgid "变量表" +msgstr "变量表" -#: backend/db_services/mysql/sql_import/views.py:87 -msgid "改变流程配置" -msgstr "改变流程配置" +#: backend/db_services/mysql/open_area/serializers.py:68 +msgid "授权IP" +msgstr "授权IP" -#: backend/db_services/mysql/sql_import/views.py:98 -msgid "查询流程配置" -msgstr "查询流程配置" +#: backend/db_services/mysql/open_area/serializers.py:70 +msgid "开区模板ID" +msgstr "开区模板ID" -#: backend/db_services/mysql/sql_import/views.py:110 -msgid "获取用户语义检查任务列表" -msgstr "获取用户语义检查任务列表" +#: backend/db_services/mysql/open_area/serializers.py:71 +msgid "开区数据列表" +msgstr "开区数据列表" + +#: backend/db_services/mysql/open_area/serializers.py:81 +msgid "旧变量(delete/update)" +msgstr "旧变量(delete/update)" + +#: backend/db_services/mysql/open_area/serializers.py:82 +msgid "新变量(add/update)" +msgstr "新变量(add/update)" + +#: backend/db_services/mysql/open_area/views.py:65 +#: backend/db_services/mysql/open_area/views.py:67 +msgid "创建开区模板" +msgstr "创建开区模板" + +#: backend/db_services/mysql/open_area/views.py:74 +msgid "开区模板列表" +msgstr "开区模板列表" + +#: backend/db_services/mysql/open_area/views.py:102 +#: backend/db_services/mysql/open_area/views.py:104 +msgid "开区模板详情" +msgstr "开区模板详情" -#: backend/db_services/mysql/sql_import/views.py:122 -msgid "删除用户语义检查任务列表" -msgstr "删除用户语义检查任务列表" +#: backend/db_services/mysql/open_area/views.py:114 +#: backend/db_services/mysql/open_area/views.py:116 +msgid "更新开区模板" +msgstr "更新开区模板" -#: backend/db_services/mysql/sql_import/views.py:133 -msgid "终止语义检查流程" -msgstr "终止语义检查流程" +#: backend/db_services/mysql/open_area/views.py:123 +msgid "删除开区模板" +msgstr "删除开区模板" -#: backend/db_services/mysql/sql_import/views.py:145 -msgid "根据语义执行id查询语义执行的数据" -msgstr "根据语义执行id查询语义执行的数据" +#: backend/db_services/mysql/open_area/views.py:131 +msgid "获取开区结果预览" +msgstr "获取开区结果预览" -#: backend/db_services/partition/exceptions.py:18 -msgid "分区管理创建异常" -msgstr "分区管理创建异常" +#: backend/db_services/mysql/open_area/views.py:144 +msgid "变量表修改" +msgstr "变量表修改" -#: backend/db_services/partition/handlers.py:31 -msgid "分区管理创建失败,创建参数:{}, 错误信息: {}" -msgstr "分区管理创建失败,创建参数:{}, 错误信息: {}" +#: backend/db_services/mysql/permission/authorize/handlers.py:93 +msgid "「接口返回结果异常」{}" +msgstr "「接口返回结果异常」{}" -#: backend/db_services/partition/handlers.py:45 -msgid "创建分区后自动执行的分区单据" -msgstr "创建分区后自动执行的分区单据" +#: backend/db_services/mysql/permission/authorize/handlers.py:96 +#: backend/db_services/mysql/permission/clone/handlers.py:124 +msgid "「接口调用异常」{}" +msgstr "「接口调用异常」{}" -#: backend/db_services/partition/serializers.py:23 -msgid "匹配库" -msgstr "匹配库" +#: backend/db_services/mysql/permission/authorize/handlers.py:152 +msgid "域名解析失败,请输入合法域名" +msgstr "域名解析失败,请输入合法域名" -#: backend/db_services/partition/serializers.py:24 -msgid "匹配表" -msgstr "匹配表" +#: backend/db_services/mysql/permission/authorize/handlers.py:159 +msgid "无法查询app: {}相关信息,请检查app输入是否合法。" +msgstr "无法查询app: {}相关信息,请检查app输入是否合法。" -#: backend/db_services/partition/serializers.py:33 -#: backend/db_services/partition/serializers.py:79 -#: backend/db_services/partition/serializers.py:91 -msgid "分区策略ID" -msgstr "分区策略ID" +#: backend/db_services/mysql/permission/authorize/handlers.py:172 +msgid "授权集群: [{}]。业务信息bk_biz_id为空请检查。" +msgstr "授权集群: [{}]。业务信息bk_biz_id为空请检查。" -#: backend/db_services/partition/serializers.py:42 -msgid "PORT" -msgstr "PORT" +#: backend/db_services/mysql/permission/authorize/handlers.py:174 +msgid "授权域名: [{}]对应多个集群,请检查域名合法性。" +msgstr "授权域名: [{}]对应多个集群,请检查域名合法性。" -#: backend/db_services/partition/serializers.py:45 -msgid "匹配库列表(支持通配)" -msgstr "匹配库列表(支持通配)" +#: backend/db_services/mysql/permission/authorize/handlers.py:179 +msgid "集群{}对应的业务与业务ID: {}不匹配" +msgstr "集群{}对应的业务与业务ID: {}不匹配" -#: backend/db_services/partition/serializers.py:46 -msgid "匹配表列表(不支持通配)" -msgstr "匹配表列表(不支持通配)" +#: backend/db_services/mysql/permission/authorize/handlers.py:201 +msgid "第三方请求授权" +msgstr "第三方请求授权" -#: backend/db_services/partition/serializers.py:47 -msgid "分区字段" -msgstr "分区字段" +#: backend/db_services/mysql/permission/authorize/handlers.py:225 +msgid "gcs授权请保证app不为空" +msgstr "gcs授权请保证app不为空" -#: backend/db_services/partition/serializers.py:48 -msgid "分区字段类型" -msgstr "分区字段类型" +#: backend/db_services/mysql/permission/authorize/handlers.py:268 +msgid "授权状态: {}" +msgstr "授权状态: {}" -#: backend/db_services/partition/serializers.py:49 -msgid "过期时间" -msgstr "过期时间" +#: backend/db_services/mysql/permission/authorize/serializers.py:17 +#: backend/db_services/redis/rollback/views.py:37 +#: backend/ticket/models/ticket_result_relation.py:24 +msgid "单据id" +msgstr "单据id" -#: backend/db_services/partition/serializers.py:50 -msgid "分区间隔" -msgstr "分区间隔" +#: backend/db_services/mysql/permission/authorize/serializers.py:18 +msgid "过滤搜索关键字" +msgstr "过滤搜索关键字" -#: backend/db_services/partition/serializers.py:52 -msgid "更新者" -msgstr "更新者" +#: backend/db_services/mysql/permission/authorize/serializers.py:25 +msgid "客户端主机" +msgstr "客户端主机" -#: backend/db_services/partition/serializers.py:67 -msgid "分区表不支持通配" -msgstr "分区表不支持通配" +#: backend/db_services/mysql/permission/authorize/serializers.py:26 +msgid "客户端版本" +msgstr "客户端版本" -#: backend/db_services/partition/serializers.py:97 -msgid "分区配置ID" -msgstr "分区配置ID" +#: backend/db_services/mysql/permission/authorize/serializers.py:27 +msgid "DB主机(domain#port)" +msgstr "DB主机(domain#port)" -#: backend/db_services/partition/serializers.py:100 -msgid "分区使用的端口" -msgstr "分区使用的端口" +#: backend/db_services/mysql/permission/authorize/serializers.py:28 +msgid "数据库名" +msgstr "数据库名" -#: backend/db_services/partition/views.py:43 -msgid "获取分区策略列表" -msgstr "获取分区策略列表" +#: backend/db_services/mysql/permission/authorize/serializers.py:31 +msgid "权限列表,多个权限以逗号分隔" +msgstr "权限列表,多个权限以逗号分隔" -#: backend/db_services/partition/views.py:52 -msgid "修改分区策略" -msgstr "修改分区策略" +#: backend/db_services/mysql/permission/authorize/views.py:50 +msgid "查询授权主机的信息" +msgstr "查询授权主机的信息" -#: backend/db_services/partition/views.py:61 -msgid "增加分区策略" -msgstr "增加分区策略" +#: backend/db_services/mysql/permission/authorize/views.py:61 +msgid "MySQL集成授权" +msgstr "MySQL集成授权" -#: backend/db_services/partition/views.py:70 -msgid "批量删除分区策略" -msgstr "批量删除分区策略" +#: backend/db_services/mysql/permission/clone/models.py:27 +#: backend/db_services/mysql/permission/clone/serializers.py:35 +#: backend/db_services/mysql/permission/clone/serializers.py:86 +#: backend/db_services/mysql/permission/clone/serializers.py:129 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:43 +msgid "权限克隆类型" +msgstr "权限克隆类型" -#: backend/db_services/partition/views.py:80 -msgid "禁用分区策略" -msgstr "禁用分区策略" +#: backend/db_services/mysql/permission/clone/models.py:29 +#: backend/db_services/mysql/permission/clone/serializers.py:23 +msgid "旧实例/旧客户端IP" +msgstr "旧实例/旧客户端IP" -#: backend/db_services/partition/views.py:90 -msgid "启用分区策略" -msgstr "启用分区策略" +#: backend/db_services/mysql/permission/clone/models.py:30 +msgid "新实例/新客户端IP列表" +msgstr "新实例/新客户端IP列表" -#: backend/db_services/partition/views.py:100 -msgid "查询分区策略日志" -msgstr "查询分区策略日志" +#: backend/db_services/mysql/permission/clone/models.py:32 +msgid "是否克隆成功" +msgstr "是否克隆成功" -#: backend/db_services/partition/views.py:110 -msgid "分区策略前置执行" -msgstr "分区策略前置执行" +#: backend/db_services/mysql/permission/clone/models.py:33 +#: backend/ticket/models/ticket.py:58 +msgid "错误信息" +msgstr "错误信息" -#: backend/db_services/redis/constants.py:18 -msgid "基于正则" -msgstr "基于正则" +#: backend/db_services/mysql/permission/clone/models.py:38 +#: backend/db_services/mysql/permission/clone/models.py:39 +msgid "权限克隆记录" +msgstr "权限克隆记录" -#: backend/db_services/redis/constants.py:19 -msgid "基于文件" -msgstr "基于文件" +#: backend/db_services/mysql/permission/clone/serializers.py:24 +msgid "新实例/新客户端IP" +msgstr "新实例/新客户端IP" -#: backend/db_services/redis_dts/constants.py:19 -msgid "tendis ssd备份任务" -msgstr "tendis ssd备份任务" +#: backend/db_services/mysql/permission/clone/serializers.py:26 +#: backend/db_services/redis/autofix/models.py:26 +msgid "模块名" +msgstr "模块名" -#: backend/db_services/redis_dts/constants.py:20 -msgid "tendis ssd备份拉取任务" -msgstr "tendis ssd备份拉取任务" +#: backend/db_services/mysql/permission/clone/serializers.py:37 +msgid "克隆元素列表" +msgstr "克隆元素列表" -#: backend/db_services/redis_dts/constants.py:21 -msgid "tendis ssd备份解析任务" -msgstr "tendis ssd备份解析任务" +#: backend/db_services/mysql/permission/clone/serializers.py:37 +msgid "克隆元素信息" +msgstr "克隆元素信息" -#: backend/db_services/redis_dts/constants.py:22 -msgid "tendis ssd数据导入任务" -msgstr "tendis ssd数据导入任务" +#: backend/db_services/mysql/permission/clone/serializers.py:51 +msgid "源克隆对象{}与目的克隆对象{}相同" +msgstr "源克隆对象{}与目的克隆对象{}相同" -#: backend/db_services/redis_dts/constants.py:23 -msgid "tendis ssd拉起sync任务" -msgstr "tendis ssd拉起sync任务" +#: backend/db_services/mysql/permission/clone/serializers.py:68 +msgid "实例{}不属于本业务{},请保证所有实例均在本业务下" +msgstr "实例{}不属于本业务{},请保证所有实例均在本业务下" -#: backend/db_services/redis_dts/constants.py:24 -#: backend/db_services/redis_dts/constants.py:28 -msgid "tendis ssd监视sync任务" -msgstr "tendis ssd监视sync任务" +#: backend/db_services/mysql/permission/clone/serializers.py:75 +#: backend/db_services/mysql/permission/clone/serializers.py:120 +msgid "权限克隆前置检查结果" +msgstr "权限克隆前置检查结果" -#: backend/db_services/redis_dts/constants.py:27 -msgid "redis cache拉起redis-shake任务" -msgstr "redis cache拉起redis-shake任务" +#: backend/db_services/mysql/permission/clone/serializers.py:76 +#: backend/db_services/mysql/permission/clone/serializers.py:121 +msgid "权限克隆前置检查信息" +msgstr "权限克隆前置检查信息" -#: backend/db_services/redis_dts/constants.py:31 -msgid "tendisplus拉起reids-sync任务" -msgstr "tendisplus拉起reids-sync任务" +#: backend/db_services/mysql/permission/clone/serializers.py:77 +#: backend/db_services/mysql/permission/clone/serializers.py:122 +msgid "权限克隆数据uid" +msgstr "权限克隆数据uid" -#: backend/db_services/redis_dts/constants.py:33 -msgid "tendisplus全量数据同步" -msgstr "tendisplus全量数据同步" +#: backend/db_services/mysql/permission/clone/serializers.py:78 +msgid "权限克隆数据列表" +msgstr "权限克隆数据列表" -#: backend/db_services/redis_dts/constants.py:34 -msgid "tendisplus增量数据同步" -msgstr "tendisplus增量数据同步" +#: backend/db_services/mysql/permission/clone/serializers.py:85 +msgid "克隆实例/客户端excel文件" +msgstr "克隆实例/客户端excel文件" -#: backend/db_services/redis_dts/constants.py:40 -msgid "停止数据同步todo" -msgstr "停止数据同步todo" +#: backend/db_services/mysql/permission/clone/serializers.py:96 +msgid "excel内容解析失败, 错误信息:{}。" +msgstr "excel内容解析失败, 错误信息:{}。" -#: backend/db_services/redis_dts/constants.py:41 -msgid "停止数据同步失败" -msgstr "停止数据同步失败" +#: backend/db_services/mysql/permission/clone/serializers.py:100 +msgid "excel表头校验不正确!" +msgstr "excel表头校验不正确!" -#: backend/db_services/redis_dts/constants.py:42 -msgid "停止数据同步成功" -msgstr "停止数据同步成功" +#: backend/db_services/mysql/permission/clone/serializers.py:104 +msgid "excel内容为空!" +msgstr "excel内容为空!" -#: backend/db_services/redis_dts/constants.py:44 -msgid "强制暂停任务todo" -msgstr "强制暂停任务todo" +#: backend/db_services/mysql/permission/clone/serializers.py:130 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:42 +msgid "权限克隆数据缓存uid" +msgstr "权限克隆数据缓存uid" -#: backend/db_services/redis_dts/constants.py:45 -msgid "强制暂停任务失败" -msgstr "强制暂停任务失败" +#: backend/db_services/mysql/permission/clone/views.py:66 +msgid "权限克隆前置检查" +msgstr "权限克隆前置检查" -#: backend/db_services/redis_dts/constants.py:46 -msgid "强制暂停任务成功" -msgstr "强制暂停任务成功" +#: backend/db_services/mysql/permission/clone/views.py:76 +msgid "权限克隆excel前置检查" +msgstr "权限克隆excel前置检查" -#: backend/db_services/redis_dts/constants.py:52 -msgid "集群节点数变更" -msgstr "集群节点数变更" +#: backend/db_services/mysql/permission/clone/views.py:86 +msgid "获得权限克隆信息excel文件" +msgstr "获得权限克隆信息excel文件" -#: backend/db_services/redis_dts/constants.py:53 -msgid "集群类型变更" -msgstr "集群类型变更" +#: backend/db_services/mysql/permission/constants.py:27 +msgid "实例克隆" +msgstr "实例克隆" -#: backend/db_services/redis_dts/constants.py:54 -msgid "数据复制" -msgstr "数据复制" +#: backend/db_services/mysql/permission/constants.py:28 +msgid "客户端克隆" +msgstr "客户端克隆" -#: backend/db_services/redis_dts/constants.py:60 -msgid "同一业务不同集群" -msgstr "同一业务不同集群" +#: backend/db_services/mysql/permission/constants.py:35 +msgid "克隆数据缓存UID" +msgstr "克隆数据缓存UID" -#: backend/db_services/redis_dts/constants.py:61 -msgid "不同业务不同集群" -msgstr "不同业务不同集群" +#: backend/db_services/mysql/permission/db_account/handlers.py:47 +msgid "创建授权规则前置检查失败,错误信息: {}" +msgstr "创建授权规则前置检查失败,错误信息: {}" -#: backend/db_services/redis_dts/constants.py:62 -msgid "复制到其他系统" -msgstr "复制到其他系统" +#: backend/db_services/mysql/permission/db_account/handlers.py:66 +msgid "" +"授权规则{}-{}不存在,bk_biz_id[{}] cluster_type[{}], 请检查检查后重新提单" +msgstr "授权规则{}-{}不存在,bk_biz_id[{}] cluster_type[{}], 请检查检查后重新提单" -#: backend/db_services/redis_dts/constants.py:63 -msgid "从回档临时环境复制数据" -msgstr "从回档临时环境复制数据" +#: backend/db_services/mysql/permission/db_account/views.py:24 +msgid "添加账号规则前置检查" +msgstr "添加账号规则前置检查" -#: backend/db_services/redis_dts/constants.py:64 -msgid "用户自建redis迁移到DBM" -msgstr "用户自建redis迁移到DBM" +#: backend/db_services/mysql/permission/exceptions.py:41 +msgid "权限模块异常" +msgstr "权限模块异常" -#: backend/db_services/redis_dts/constants.py:70 -msgid "自动切换" -msgstr "自动切换" +#: backend/db_services/mysql/permission/exceptions.py:45 +msgid "授权EXCEL表校验异常" +msgstr "授权EXCEL表校验异常" -#: backend/db_services/redis_dts/constants.py:71 -msgid "用户确认切换" -msgstr "用户确认切换" +#: backend/db_services/mysql/permission/exceptions.py:49 +msgid "权限克隆EXCEL表校验异常" +msgstr "权限克隆EXCEL表校验异常" -#: backend/db_services/redis_dts/constants.py:77 -#: backend/ticket/builders/common/constants.py:79 -msgid "自动修复" -msgstr "自动修复" +#: backend/db_services/mysql/permission/exceptions.py:53 +msgid "授权数据已过期" +msgstr "授权数据已过期" -#: backend/db_services/redis_dts/constants.py:78 -msgid "用户确认修复" -msgstr "用户确认修复" +#: backend/db_services/mysql/permission/exceptions.py:57 +msgid "权限克隆数据已过期" +msgstr "权限克隆数据已过期" -#: backend/db_services/redis_dts/exceptions.py:18 -msgid "DBDts模块异常" -msgstr "DBDts模块异常" +#: backend/db_services/mysql/push_peripheral_config/constants.py:14 +#: backend/db_services/mysql/push_peripheral_config/views.py:40 +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:39 +msgid "下发周边配置" +msgstr "下发周边配置" + +#: backend/db_services/mysql/remote_service/exceptions.py:19 +msgid "DRS接口请求通用异常" +msgstr "DRS接口请求通用异常" + +#: backend/db_services/mysql/remote_service/handlers.py:51 +#: backend/db_services/mysql/remote_service/handlers.py:98 +#: backend/db_services/mysql/remote_service/handlers.py:138 +#: backend/db_services/sqlserver/handlers.py:59 +#: backend/flow/utils/mysql/mysql_version_parse.py:164 +msgid "DRS调用失败,错误信息: {}" +msgstr "DRS调用失败,错误信息: {}" + +#: backend/db_services/mysql/remote_service/handlers.py:242 +msgid "不存在可用于闪回的库" +msgstr "不存在可用于闪回的库" + +#: backend/db_services/mysql/remote_service/handlers.py:247 +msgid "不存在可用于闪回的表" +msgstr "不存在可用于闪回的表" + +#: backend/db_services/mysql/remote_service/serializers.py:29 +msgid "查询的备份角色" +msgstr "查询的备份角色" + +#: backend/db_services/mysql/remote_service/serializers.py:34 +msgid "集群信息列表" +msgstr "集群信息列表" + +#: backend/db_services/mysql/remote_service/serializers.py:44 +msgid "查询的DB列表" +msgstr "查询的DB列表" + +#: backend/db_services/mysql/remote_service/serializers.py:46 +msgid "集群数据库信息" +msgstr "集群数据库信息" + +#: backend/db_services/mysql/remote_service/serializers.py:62 +msgid "DB名列表" +msgstr "DB名列表" -#: backend/db_services/redis_dts/exceptions.py:23 -msgid "获取DTS任务列表异常" -msgstr "获取DTS任务列表异常" +#: backend/db_services/mysql/remote_service/serializers.py:62 +msgid "DB名" +msgstr "DB名" -#: backend/db_services/redis_dts/exceptions.py:29 -msgid "DTS task操作异常" -msgstr "DTS task操作异常" +#: backend/db_services/mysql/remote_service/serializers.py:64 +msgid "集群校验信息" +msgstr "集群校验信息" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:17 -msgid "锁的唯一标识" -msgstr "锁的唯一标识" +#: backend/db_services/mysql/remote_service/serializers.py:78 +#: backend/db_services/mysql/remote_service/serializers.py:94 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:43 +#: backend/ticket/builders/mysql/mysql_flashback.py:36 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:52 +msgid "目标库列表" +msgstr "目标库列表" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:18 -msgid "锁的持有者" -msgstr "锁的持有者" +#: backend/db_services/mysql/remote_service/serializers.py:79 +#: backend/db_services/mysql/remote_service/serializers.py:95 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:44 +#: backend/ticket/builders/mysql/mysql_flashback.py:37 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:54 +msgid "忽略库列表" +msgstr "忽略库列表" -#: backend/db_services/redis_dts/models/tb_dts_distribute_lock.py:20 -msgid "锁的过期时间" -msgstr "锁的过期时间" +#: backend/db_services/mysql/remote_service/serializers.py:80 +#: backend/ticket/builders/mysql/mysql_dump_data.py:33 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:45 +#: backend/ticket/builders/mysql/mysql_flashback.py:38 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:56 +msgid "目标table列表" +msgstr "目标table列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:17 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:19 -msgid "单据号" -msgstr "单据号" +#: backend/db_services/mysql/remote_service/serializers.py:81 +#: backend/ticket/builders/mysql/mysql_dump_data.py:34 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:46 +#: backend/ticket/builders/mysql/mysql_flashback.py:39 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:57 +msgid "忽略table列表" +msgstr "忽略table列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:18 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:21 -msgid "业务bk_biz_id" -msgstr "业务bk_biz_id" +#: backend/db_services/mysql/remote_service/serializers.py:83 +#: backend/ticket/builders/mysql/mysql_flashback.py:45 +msgid "flashback信息" +msgstr "flashback信息" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:19 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:22 -msgid "云区域id" -msgstr "云区域id" +#: backend/db_services/mysql/remote_service/serializers.py:97 +msgid "正则库信息" +msgstr "正则库信息" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:20 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:20 -msgid "申请人" -msgstr "申请人" +#: backend/db_services/mysql/remote_service/views.py:51 +msgid "查询集群数据库列表" +msgstr "查询集群数据库列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:25 -msgid "DTS单据类型" -msgstr "DTS单据类型" +#: backend/db_services/mysql/remote_service/views.py:67 +msgid "查询集群数据表列表" +msgstr "查询集群数据表列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:32 -msgid "DTS数据复制类型" -msgstr "DTS数据复制类型" +#: backend/db_services/mysql/remote_service/views.py:80 +msgid "校验DB是否在集群内" +msgstr "校验DB是否在集群内" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:36 -msgid "在线切换类型" -msgstr "在线切换类型" +#: backend/db_services/mysql/remote_service/views.py:93 +msgid "校验flashback信息是否合法" +msgstr "校验flashback信息是否合法" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:37 -msgid "是否数据校验" -msgstr "是否数据校验" +#: backend/db_services/mysql/remote_service/views.py:104 +msgid "根据库表正则查询集群库信息" +msgstr "根据库表正则查询集群库信息" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:38 -msgid "是否数据修复" -msgstr "是否数据修复" +#: backend/db_services/mysql/resources/tendbcluster/query.py:47 +msgid "运维节点" +msgstr "运维节点" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:42 -msgid "数据修复模式" -msgstr "数据修复模式" +#: backend/db_services/mysql/resources/tendbcluster/query.py:48 +#: backend/db_services/mysql/resources/tendbha/query.py:40 +#: backend/db_services/mysql/resources/tendbsingle/query.py:35 +#: backend/db_services/sqlserver/resources/sqlserver_ha/query.py:36 +#: backend/db_services/sqlserver/resources/sqlserver_single/query.py:33 +msgid "所属db模块" +msgstr "所属db模块" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:45 -msgid "源集群类型" -msgstr "源集群类型" +#: backend/db_services/mysql/sql_import/constants.py:31 +msgid "DEFAULT" +msgstr "DEFAULT" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:46 -msgid "回滚单据号" -msgstr "回滚单据号" +#: backend/db_services/mysql/sql_import/constants.py:32 +msgid "UTF8" +msgstr "UTF8" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:47 -msgid "回滚临时环境实例" -msgstr "回滚临时环境实例" +#: backend/db_services/mysql/sql_import/constants.py:33 +msgid "UTF8MB4" +msgstr "UTF8MB4" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:48 -msgid "目标业务id" -msgstr "目标业务id" +#: backend/db_services/mysql/sql_import/constants.py:34 +msgid "LATIN1" +msgstr "LATIN1" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:49 -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:49 -msgid "目的集群" -msgstr "目的集群" +#: backend/db_services/mysql/sql_import/constants.py:35 +msgid "gbk" +msgstr "gbk" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:51 -msgid "目标集群类型" -msgstr "目标集群类型" +#: backend/db_services/mysql/sql_import/constants.py:36 +msgid "gb2312" +msgstr "gb2312" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:52 -msgid "key正则(包含key)" -msgstr "key正则(包含key)" +#: backend/db_services/mysql/sql_import/constants.py:44 +msgid "手动执行" +msgstr "手动执行" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:53 -msgid "key正则(排除key)" -msgstr "key正则(排除key)" +#: backend/db_services/mysql/sql_import/constants.py:45 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:56 +msgid "自动执行" +msgstr "自动执行" -#: backend/db_services/redis_dts/models/tb_tendis_dts_job.py:56 -msgid "bill备注" -msgstr "bill备注" +#: backend/db_services/mysql/sql_import/constants.py:46 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:57 +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:96 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:200 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:134 +msgid "定时执行" +msgstr "定时执行" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:23 -msgid "执行迁移任务的dts_server" -msgstr "执行迁移任务的dts_server" +#: backend/db_services/mysql/sql_import/constants.py:54 +#: backend/ticket/builders/common/constants.py:150 +msgid "文件上传" +msgstr "文件上传" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:25 -msgid "源集群优先级,值越大,优先级越高" -msgstr "源集群优先级,值越大,优先级越高" +#: backend/db_services/mysql/sql_import/constants.py:55 +#: backend/ticket/builders/common/constants.py:151 +msgid "手动输入" +msgstr "手动输入" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:26 -msgid "源slave_ip" -msgstr "源slave_ip" +#: backend/db_services/mysql/sql_import/constants.py:63 +msgid "执行失败" +msgstr "执行失败" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:27 -msgid "源slave_port" -msgstr "源slave_port" +#: backend/db_services/mysql/sql_import/constants.py:64 +#: backend/ticket/flow_manager/delivery.py:91 +msgid "执行成功" +msgstr "执行成功" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:28 -msgid "源实例密码base64值" -msgstr "源实例密码base64值" +#: backend/db_services/mysql/sql_import/constants.py:65 +msgid "导入表结构失败" +msgstr "导入表结构失败" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:30 -msgid "源slave db类型" -msgstr "源slave db类型" +#: backend/db_services/mysql/sql_import/exceptions.py:19 +msgid "SQL导入接口请求通用异常" +msgstr "SQL导入接口请求通用异常" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:32 -msgid "源实例数据量大小,单位Byte" -msgstr "源实例数据量大小,单位Byte" +#: backend/db_services/mysql/sql_import/handlers.py:95 +msgid "当前SQL文件过大,暂不提供内容预览..." +msgstr "当前SQL文件过大,暂不提供内容预览..." -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:34 -msgid "源实例所属segment_start" -msgstr "源实例所属segment_start" +#: backend/db_services/mysql/sql_import/handlers.py:197 +msgid "模拟流程构建失败,错误信息: {}" +msgstr "模拟流程构建失败,错误信息: {}" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:35 -msgid "源实例所属segment_end" -msgstr "源实例所属segment_end" +#: backend/db_services/mysql/sql_import/mock_data.py:22 +msgid "存在高危命令:drop_table" +msgstr "存在高危命令:drop_table" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:37 -msgid "源实例权重" -msgstr "源实例权重" +#: backend/db_services/mysql/sql_import/serializers.py:30 +msgid "sql文件名列表" +msgstr "sql文件名列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:39 -msgid "源slave_ip上task并发数控制" -msgstr "源slave_ip上task并发数控制" +#: backend/db_services/mysql/sql_import/serializers.py:32 +#: backend/db_services/sqlserver/sql_import/serializers.py:21 +msgid "sql文件列表" +msgstr "sql文件列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:40 -msgid "源实例所在城市" -msgstr "源实例所在城市" +#: backend/db_services/mysql/sql_import/serializers.py:32 +#: backend/db_services/sqlserver/sql_import/serializers.py:21 +msgid "sql文件" +msgstr "sql文件" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:42 -msgid "源实例slave-keep-log-count的旧值" -msgstr "源实例slave-keep-log-count的旧值" +#: backend/db_services/mysql/sql_import/serializers.py:37 +msgid "版本列表" +msgstr "版本列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:43 -msgid "源实例slave-keep-log-count的新值" -msgstr "源实例slave-keep-log-count的新值" +#: backend/db_services/mysql/sql_import/serializers.py:44 +#: backend/db_services/sqlserver/sql_import/serializers.py:29 +msgid "不允许语法检查的sql的内容为空!" +msgstr "不允许语法检查的sql的内容为空!" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:44 -msgid "源实例slave-keep-log-count是否恢复" -msgstr "源实例slave-keep-log-count是否恢复" +#: backend/db_services/mysql/sql_import/serializers.py:48 +msgid "请保证单个文件{}不超过1G" +msgstr "请保证单个文件{}不超过1G" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:45 -msgid "srcRedis是否包含list类型key" -msgstr "srcRedis是否包含list类型key" +#: backend/db_services/mysql/sql_import/serializers.py:50 +#: backend/db_services/sqlserver/sql_import/serializers.py:33 +msgid "请保证sql文件[{}]的后缀为.sql" +msgstr "请保证sql文件[{}]的后缀为.sql" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:46 -msgid "包含key(正则)" -msgstr "包含key(正则)" +#: backend/db_services/mysql/sql_import/serializers.py:57 +msgid "语法错误" +msgstr "语法错误" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:47 -msgid "排除key(正则)" -msgstr "排除key(正则)" +#: backend/db_services/mysql/sql_import/serializers.py:58 +msgid "高危警告" +msgstr "高危警告" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:50 -msgid "目的密码base64值" -msgstr "目的密码base64值" +#: backend/db_services/mysql/sql_import/serializers.py:59 +msgid "禁止命令" +msgstr "禁止命令" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:53 -msgid "tendisssd slave上bakup文件位置" -msgstr "tendisssd slave上bakup文件位置" +#: backend/db_services/mysql/sql_import/serializers.py:61 +msgid "语法检查结果" +msgstr "语法检查结果" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:54 -msgid "backup文件拉取到dts_server本地位置" -msgstr "backup文件拉取到dts_server本地位置" +#: backend/db_services/mysql/sql_import/serializers.py:69 +#: backend/db_services/mysql/sql_import/serializers.py:119 +msgid "目标变更DB" +msgstr "目标变更DB" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:55 -msgid "tendisdumper得到的sql文件夹" -msgstr "tendisdumper得到的sql文件夹" +#: backend/db_services/mysql/sql_import/serializers.py:70 +#: backend/db_services/mysql/sql_import/serializers.py:120 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:32 +msgid "忽略DB" +msgstr "忽略DB" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:56 -msgid "redis-sync端口" -msgstr "redis-sync端口" +#: backend/db_services/mysql/sql_import/serializers.py:71 +#: backend/db_services/mysql/sql_import/serializers.py:124 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:33 +msgid "sql执行文件" +msgstr "sql执行文件" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:57 -msgid "sync的进程id" -msgstr "sync的进程id" +#: backend/db_services/mysql/sql_import/serializers.py:72 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:34 +msgid "sql导入模式" +msgstr "sql导入模式" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:59 -msgid "task重试次数" -msgstr "task重试次数" +#: backend/db_services/mysql/sql_import/serializers.py:75 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:37 +msgid "单据执行模式" +msgstr "单据执行模式" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:61 -msgid "sync操作" -msgstr "sync操作" +#: backend/db_services/mysql/sql_import/serializers.py:76 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:38 +msgid "定时任务触发时间" +msgstr "定时任务触发时间" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:63 -msgid "杀死syncer" -msgstr "杀死syncer" +#: backend/db_services/mysql/sql_import/serializers.py:80 +#: backend/ticket/builders/mongodb/base.py:35 +#: backend/ticket/builders/mysql/mysql_checksum.py:40 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:28 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:30 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:27 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:51 +msgid "匹配DB列表" +msgstr "匹配DB列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:66 -msgid "信息" -msgstr "信息" +#: backend/db_services/mysql/sql_import/serializers.py:81 +#: backend/ticket/builders/mongodb/base.py:37 +#: backend/ticket/builders/mysql/mysql_checksum.py:42 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:30 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:32 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:29 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:53 +msgid "匹配Table列表" +msgstr "匹配Table列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:68 -msgid "被忽略的错误" -msgstr "被忽略的错误" +#: backend/db_services/mysql/sql_import/serializers.py:83 +#: backend/ticket/builders/mongodb/base.py:36 +#: backend/ticket/builders/mysql/mysql_checksum.py:41 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:29 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:31 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:28 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:52 +msgid "忽略DB列表" +msgstr "忽略DB列表" -#: backend/db_services/redis_dts/models/tb_tendis_dts_task.py:69 -msgid "sync从该时间点重新同步" -msgstr "sync从该时间点重新同步" +#: backend/db_services/mysql/sql_import/serializers.py:86 +#: backend/ticket/builders/mongodb/base.py:38 +#: backend/ticket/builders/mysql/mysql_checksum.py:43 +#: backend/ticket/builders/mysql/mysql_ha_backup.py:31 +#: backend/ticket/builders/mysql/mysql_ha_clear.py:33 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:30 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:54 +msgid "忽略Table列表" +msgstr "忽略Table列表" -#: backend/db_services/taskflow/exceptions.py:18 -msgid "任务流程模块异常" -msgstr "任务流程模块异常" +#: backend/db_services/mysql/sql_import/serializers.py:90 +#: backend/ticket/builders/mysql/mysql_dump_data.py:30 +#: backend/ticket/builders/mysql/mysql_single_apply.py:64 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:44 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:63 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:50 +msgid "字符集" +msgstr "字符集" -#: backend/db_services/taskflow/exceptions.py:23 -msgid "重试节点异常" -msgstr "重试节点异常" +#: backend/db_services/mysql/sql_import/serializers.py:93 +#: backend/db_services/mysql/sql_import/serializers.py:128 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:47 +msgid "sql执行体信息" +msgstr "sql执行体信息" -#: backend/db_services/taskflow/exceptions.py:28 -msgid "回调节点异常" -msgstr "回调节点异常" +#: backend/db_services/mysql/sql_import/serializers.py:96 +#: backend/ticket/builders/mongodb/mongo_backup.py:41 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:50 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:58 +msgid "备份信息" +msgstr "备份信息" -#: backend/db_services/taskflow/exceptions.py:33 -msgid "跳过节点异常" -msgstr "跳过节点异常" +#: backend/db_services/mysql/sql_import/serializers.py:98 +msgid "集群类型,默认为mysql" +msgstr "集群类型,默认为mysql" -#: backend/db_services/taskflow/exceptions.py:38 -msgid "强制失败节点异常" -msgstr "强制失败节点异常" +#: backend/db_services/mysql/sql_import/serializers.py:100 +msgid "模拟执行成功后是否自动提单" +msgstr "模拟执行成功后是否自动提单" -#: backend/db_services/taskflow/exceptions.py:43 -msgid "撤销流程异常" -msgstr "撤销流程异常" +#: backend/db_services/mysql/sql_import/serializers.py:110 +#: backend/db_services/mysql/sql_import/serializers.py:132 +#: backend/db_services/mysql/sql_import/serializers.py:141 +#: backend/db_services/mysql/sql_import/serializers.py:163 +#: backend/db_services/mysql/sql_import/serializers.py:185 +#: backend/db_services/mysql/sql_import/serializers.py:201 +#: backend/db_services/mysql/sql_import/serializers.py:214 +#: backend/db_services/mysql/sql_import/serializers.py:224 +msgid "流程id" +msgstr "流程id" -#: backend/db_services/taskflow/handlers.py:78 -msgid "人工强制失败" -msgstr "人工强制失败" +#: backend/db_services/mysql/sql_import/serializers.py:111 +msgid "语义测试的node_id" +msgstr "语义测试的node_id" -#: backend/db_services/taskflow/handlers.py:125 -msgid "节点尚未运行,请稍后查看" -msgstr "节点尚未运行,请稍后查看" +#: backend/db_services/mysql/sql_import/serializers.py:122 +msgid "sql执行内容" +msgstr "sql执行内容" -#: backend/db_services/taskflow/handlers.py:127 -msgid "节点日志仅保留7天" -msgstr "节点日志仅保留7天" +#: backend/db_services/mysql/sql_import/serializers.py:133 +#: backend/db_services/mysql/sql_import/serializers.py:145 +#: backend/db_services/partition/serializers.py:57 +msgid "是否自动创建单据" +msgstr "是否自动创建单据" -#: backend/db_services/taskflow/handlers.py:152 -msgid "日志上报中,请稍后查看" -msgstr "日志上报中,请稍后查看" +#: backend/db_services/mysql/sql_import/serializers.py:134 +#: backend/db_services/mysql/sql_import/serializers.py:146 +msgid "是否自动跳过确认" +msgstr "是否自动跳过确认" -#: backend/db_services/taskflow/serializers.py:21 -#: backend/ticket/serializers.py:73 -msgid "单据类型名称" -msgstr "单据类型名称" +#: backend/db_services/mysql/sql_import/serializers.py:154 +msgid "集群类型mysql/tendbcluster,为空查询所有任务" +msgstr "集群类型mysql/tendbcluster,为空查询所有任务" -#: backend/db_services/taskflow/serializers.py:22 -#: backend/ticket/serializers.py:75 backend/ticket/serializers.py:113 -#: backend/ticket/serializers.py:166 -msgid "耗时" -msgstr "耗时" +#: backend/db_services/mysql/sql_import/serializers.py:165 +msgid "执行状态" +msgstr "执行状态" -#: backend/db_services/taskflow/serializers.py:48 backend/flow/models.py:39 -msgid "节点ID" -msgstr "节点ID" +#: backend/db_services/mysql/sql_import/serializers.py:167 +msgid "语义检查执行信息列表" +msgstr "语义检查执行信息列表" -#: backend/db_services/taskflow/serializers.py:52 -msgid "回调描述" -msgstr "回调描述" +#: backend/db_services/mysql/sql_import/serializers.py:175 +msgid "语义执行的root id列表" +msgstr "语义执行的root id列表" -#: backend/db_services/taskflow/serializers.py:56 -msgid "版本ID" -msgstr "版本ID" +#: backend/db_services/mysql/sql_import/serializers.py:192 +msgid "是否撤销成功" +msgstr "是否撤销成功" -#: backend/db_services/taskflow/serializers.py:57 -msgid "是否下载日志" -msgstr "是否下载日志" +#: backend/db_services/mysql/sql_import/serializers.py:193 +msgid "撤销相关信息" +msgstr "撤销相关信息" -#: backend/db_services/taskflow/serializers.py:67 -msgid "目标目录列表" -msgstr "目标目录列表" +#: backend/db_services/mysql/sql_import/serializers.py:194 +msgid "撤销相关数据" +msgstr "撤销相关数据" -#: backend/db_services/taskflow/task.py:54 -msgid "存在执行互斥,正在进行重试,当前重试次数为{}" -msgstr "存在执行互斥,正在进行重试,当前重试次数为{}" +#: backend/db_services/mysql/sql_import/serializers.py:215 +msgid "节点id" +msgstr "节点id" -#: backend/db_services/taskflow/task.py:58 -msgid "自动重试次数已超过最大重试次数{}, 请重新手动重试" -msgstr "自动重试次数已超过最大重试次数{}, 请重新手动重试" +#: backend/db_services/mysql/sql_import/views.py:87 +msgid "sql语义检查" +msgstr "sql语义检查" -#: backend/db_services/taskflow/task.py:72 -msgid "执行互斥错误信息: {}" -msgstr "执行互斥错误信息: {}" +#: backend/db_services/mysql/sql_import/views.py:97 +msgid "获取用户语义检查任务列表" +msgstr "获取用户语义检查任务列表" -#: backend/db_services/taskflow/task.py:79 -msgid "存在执行互斥将自动进行重试..." -msgstr "存在执行互斥将自动进行重试..." +#: backend/db_services/mysql/sql_import/views.py:107 +msgid "删除用户语义检查任务列表" +msgstr "删除用户语义检查任务列表" -#: backend/db_services/taskflow/task.py:89 -msgid "重试成功" -msgstr "重试成功" +#: backend/db_services/mysql/sql_import/views.py:116 +msgid "终止语义检查流程" +msgstr "终止语义检查流程" -#: backend/db_services/taskflow/views/flow.py:61 -msgid "任务列表" -msgstr "任务列表" +#: backend/db_services/mysql/sql_import/views.py:126 +msgid "根据语义执行id查询语义执行的数据" +msgstr "根据语义执行id查询语义执行的数据" -#: backend/db_services/taskflow/views/flow.py:68 -msgid "任务详情" -msgstr "任务详情" +#: backend/db_services/mysql/sql_import/views.py:136 +msgid "获取语义执行的结果日志" +msgstr "获取语义执行的结果日志" -#: backend/db_services/taskflow/views/flow.py:78 -msgid "撤销流程" -msgstr "撤销流程" +#: backend/db_services/mysql/sql_import/views.py:146 +msgid "获取语义执行结果" +msgstr "获取语义执行结果" -#: backend/db_services/taskflow/views/flow.py:87 -msgid "重试节点" -msgstr "重试节点" +#: backend/db_services/mysql/sqlparse/exceptions.py:19 +msgid "SQL解析通用异常" +msgstr "SQL解析通用异常" -#: backend/db_services/taskflow/views/flow.py:94 -msgid "非超级用户,暂不允许调用此接口" -msgstr "非超级用户,暂不允许调用此接口" +#: backend/db_services/mysql/sqlparse/handlers.py:135 +msgid "LIMIT限制为空或者超过1000" +msgstr "LIMIT限制为空或者超过1000" -#: backend/db_services/taskflow/views/flow.py:101 -msgid "跳过节点" -msgstr "跳过节点" +#: backend/db_services/mysql/sqlparse/handlers.py:143 +msgid "请保证一次只解析一条select语句" +msgstr "请保证一次只解析一条select语句" -#: backend/db_services/taskflow/views/flow.py:111 -msgid "强制失败节点" -msgstr "强制失败节点" +#: backend/db_services/mysql/sqlparse/handlers.py:152 +msgid "不允许查询以下系统库表:{}" +msgstr "不允许查询以下系统库表:{}" -#: backend/db_services/taskflow/views/flow.py:121 -msgid "节点版本列表" -msgstr "节点版本列表" +#: backend/db_services/mysql/sqlparse/handlers.py:156 +msgid "SQL语句不为查询语句,或者不包含{}命令" +msgstr "SQL语句不为查询语句,或者不包含{}命令" -#: backend/db_services/taskflow/views/flow.py:132 -msgid "节点日志" -msgstr "节点日志" +#: backend/db_services/mysql/toolbox/serializers.py:29 +msgid "源业务ID" +msgstr "源业务ID" -#: backend/db_services/taskflow/views/flow.py:154 -msgid "回调节点" -msgstr "回调节点" +#: backend/db_services/mysql/toolbox/serializers.py:30 +msgid "目标业务ID" +msgstr "目标业务ID" -#: backend/db_services/taskflow/views/redis.py:49 -msgid "结果文件列表" -msgstr "结果文件列表" +#: backend/db_services/mysql/toolbox/serializers.py:53 +msgid "TenDBHa集群迁移到其他业务" +msgstr "TenDBHa集群迁移到其他业务" -#: backend/db_services/taskflow/views/redis.py:94 -msgid "打包下载结果文件列表" -msgstr "打包下载结果文件列表" +#: backend/db_services/mysql/toolbox/views.py:44 +msgid "查询 MySQL 可以用的升级包" +msgstr "查询 MySQL 可以用的升级包" -#: backend/db_services/taskflow/views/redis.py:122 -msgid "指定目录下载(返回下载链接)" -msgstr "指定目录下载(返回下载链接)" +#: backend/db_services/mysql/toolbox/views.py:60 +msgid "TenDBHA 集群转移到其他业务" +msgstr "TenDBHA 集群转移到其他业务" -#: backend/db_services/user/serializers.py:16 -msgid "模糊搜索" -msgstr "模糊搜索" +#: backend/db_services/mysql/toolbox/views.py:75 +msgid "目标业务的db模块不存在" +msgstr "目标业务的db模块不存在" -#: backend/db_services/user/serializers.py:18 -msgid "不分页,即将下架,请不要使用,并尽快迁移" -msgstr "不分页,即将下架,请不要使用,并尽快迁移" +#: backend/db_services/mysql/toolbox/views.py:77 +msgid "目标业务不能是自己" +msgstr "目标业务不能是自己" -#: backend/db_services/version/constants.py:23 -msgid "MySQL-5.6" -msgstr "MySQL-5.6" +#: backend/db_services/mysql/toolbox/views.py:88 +msgid "迁移的集群必须在同一个类型" +msgstr "迁移的集群必须在同一个类型" -#: backend/db_services/version/constants.py:24 -msgid "MySQL-5.7" -msgstr "MySQL-5.7" +#: backend/db_services/mysql/toolbox/views.py:92 +msgid "目前只能转移 TenDBHA 和 TenDBSingle 集群" +msgstr "目前只能转移 TenDBHA 和 TenDBSingle 集群" -#: backend/db_services/version/constants.py:25 -msgid "MySQL-8.0" -msgstr "MySQL-8.0" +#: backend/db_services/mysql/toolbox/views.py:103 +msgid "源模块和目标模块的版本或字符集不一致,请检查一下" +msgstr "源模块和目标模块的版本或字符集不一致,请检查一下" -#: backend/db_services/version/constants.py:31 -msgid "Redis-6" -msgstr "Redis-6" +#: backend/db_services/partition/constants.py:34 +msgid "整型" +msgstr "整型" -#: backend/db_services/version/constants.py:37 -msgid "Tendisplus-2.5" -msgstr "Tendisplus-2.5" +#: backend/db_services/partition/constants.py:35 +msgid "日期类型" +msgstr "日期类型" -#: backend/db_services/version/constants.py:38 -msgid "Tendisplus-2.6" -msgstr "Tendisplus-2.6" +#: backend/db_services/partition/constants.py:36 +msgid "时间戳类型" +msgstr "时间戳类型" -#: backend/db_services/version/constants.py:44 -msgid "TendisSSD-1.2" -msgstr "TendisSSD-1.2" +#: backend/db_services/partition/exceptions.py:18 +msgid "分区管理创建异常" +msgstr "分区管理创建异常" -#: backend/db_services/version/constants.py:45 -msgid "TendisSSD-1.3" -msgstr "TendisSSD-1.3" +#: backend/db_services/partition/exceptions.py:23 +msgid "服务器内部错误" +msgstr "服务器内部错误" -#: backend/db_services/version/constants.py:51 -msgid "TwemproxyLatest" -msgstr "TwemproxyLatest" +#: backend/db_services/partition/exceptions.py:28 +msgid "不合法的分区字段" +msgstr "不合法的分区字段" -#: backend/db_services/version/constants.py:57 -msgid "PredixyLatest" -msgstr "PredixyLatest" +#: backend/db_services/partition/exceptions.py:33 +msgid "分区配置不存在" +msgstr "分区配置不存在" -#: backend/db_services/version/serializers.py:20 -msgid "查询关键字" -msgstr "查询关键字" +#: backend/db_services/partition/exceptions.py:38 +msgid "分区不支持该集群类型" +msgstr "分区不支持该集群类型" -#: backend/db_services/version/views.py:27 -msgid "查询数据库版本列表" -msgstr "查询数据库版本列表" +#: backend/db_services/partition/exceptions.py:43 +msgid "没有需要执行的操作" +msgstr "没有需要执行的操作" -#: backend/dbm_init/management/commands/cloud_component.py:38 -msgid "云区域组件初始化失败,错误信息:{}" -msgstr "云区域组件初始化失败,错误信息:{}" +#: backend/db_services/partition/exceptions.py:48 +msgid "分区名格式错误" +msgstr "分区名格式错误" -#: backend/exceptions.py:48 -msgid "系统异常" -msgstr "系统异常" +#: backend/db_services/partition/handlers.py:79 +msgid "分区管理创建失败,创建参数:{}, 错误信息: {}" +msgstr "分区管理创建失败,创建参数:{}, 错误信息: {}" -#: backend/exceptions.py:103 -msgid "系统错误" -msgstr "系统错误" +#: backend/db_services/partition/handlers.py:144 +msgid "分区单据执行" +msgstr "分区单据执行" -#: backend/exceptions.py:113 -msgid "参数验证失败" -msgstr "参数验证失败" +#: backend/db_services/partition/handlers.py:199 +msgid "字段信息查询错误:{}" +msgstr "字段信息查询错误:{}" -#: backend/exceptions.py:118 -msgid "远程服务请求结果异常" -msgstr "远程服务请求结果异常" +#: backend/db_services/partition/handlers.py:206 +msgid "【{}】【{}】当前库表模式匹配为空,请检查是否是合法库表" +msgstr "【{}】【{}】当前库表模式匹配为空,请检查是否是合法库表" -#: backend/exceptions.py:123 -msgid "组件调用异常" -msgstr "组件调用异常" +#: backend/db_services/partition/handlers.py:225 +msgid "【{}】【{}】分区字段{}不满足属于主键部分或唯一键交集的要求" +msgstr "【{}】【{}】分区字段{}不满足属于主键部分或唯一键交集的要求" -#: backend/exceptions.py:128 -msgid "业务不存在" -msgstr "业务不存在" +#: backend/db_services/partition/handlers.py:238 +msgid "【{}】【{}】分区字段{}与该表对应的字段类型不匹配" +msgstr "【{}】【{}】分区字段{}与该表对应的字段类型不匹配" -#: backend/exceptions.py:133 -msgid "语言不支持" -msgstr "语言不支持" +#: backend/db_services/partition/handlers.py:243 +msgid "" +"表没有主键或者唯一键,将表改造为分区表的过程中会锁表,会阻塞查询、删除、修" +"改、添加、表结构变更等语句" +msgstr "表没有主键或者唯一键,将表改造为分区表的过程中会锁表,会阻塞查询、删除、修改、添加、表结构变更等语句" -#: backend/exceptions.py:138 -msgid "权限不足" -msgstr "权限不足" +#: backend/db_services/partition/serializers.py:28 +msgid "匹配库" +msgstr "匹配库" -#: backend/exceptions.py:165 -msgid "服务不稳定,请检查组件健康状况" -msgstr "服务不稳定,请检查组件健康状况" +#: backend/db_services/partition/serializers.py:29 +msgid "匹配表" +msgstr "匹配表" -#: backend/flow/consts.py:107 -msgid "创建态" -msgstr "创建态" +#: backend/db_services/partition/serializers.py:50 +#: backend/db_services/partition/serializers.py:152 +msgid "匹配库列表(支持通配)" +msgstr "匹配库列表(支持通配)" -#: backend/flow/consts.py:108 -msgid "准备态" -msgstr "准备态" +#: backend/db_services/partition/serializers.py:51 +#: backend/db_services/partition/serializers.py:153 +msgid "匹配表列表(不支持通配)" +msgstr "匹配表列表(不支持通配)" -#: backend/flow/consts.py:109 -msgid "运行态" -msgstr "运行态" +#: backend/db_services/partition/serializers.py:52 +#: backend/db_services/partition/serializers.py:154 +msgid "分区字段" +msgstr "分区字段" -#: backend/flow/consts.py:110 -msgid "暂停态" -msgstr "暂停态" +#: backend/db_services/partition/serializers.py:53 +#: backend/db_services/partition/serializers.py:155 +msgid "分区字段类型" +msgstr "分区字段类型" -#: backend/flow/consts.py:111 -msgid "闭塞态" -msgstr "闭塞态" +#: backend/db_services/partition/serializers.py:54 +msgid "过期时间" +msgstr "过期时间" -#: backend/flow/consts.py:112 -msgid "完成态" -msgstr "完成态" +#: backend/db_services/partition/serializers.py:55 +msgid "分区间隔" +msgstr "分区间隔" -#: backend/flow/consts.py:113 -msgid "失败态" -msgstr "失败态" +#: backend/db_services/partition/serializers.py:56 +msgid "是否需要获取分区执行数据" +msgstr "是否需要获取分区执行数据" -#: backend/flow/consts.py:114 -msgid "取消态" -msgstr "取消态" +#: backend/db_services/partition/serializers.py:62 +msgid "在自动创建单据的条件下,请保证need_dry_run选项为真" +msgstr "在自动创建单据的条件下,请保证need_dry_run选项为真" -#: backend/flow/consts.py:122 -msgid "共用参数" -msgstr "共用参数" +#: backend/db_services/partition/serializers.py:67 +msgid "分区表不支持通配" +msgstr "分区表不支持通配" -#: backend/flow/consts.py:123 -msgid "redis共用参数" -msgstr "redis共用参数" +#: backend/db_services/partition/serializers.py:71 +msgid "过期时间大于等于分区间隔,且为分区间隔的整数倍" +msgstr "过期时间大于等于分区间隔,且为分区间隔的整数倍" -#: backend/flow/consts.py:124 -msgid "TenDBHA" -msgstr "TenDBHA" +#: backend/db_services/partition/serializers.py:100 +#: backend/db_services/partition/serializers.py:116 +msgid "分区策略ID" +msgstr "分区策略ID" -#: backend/flow/consts.py:125 -msgid "RedisCache 主从版" -msgstr "RedisCache 主从版" +#: backend/db_services/partition/serializers.py:130 +msgid "分区配置ID" +msgstr "分区配置ID" -#: backend/flow/consts.py:126 -msgid "twemproxy + RedisInstance架构" -msgstr "twemproxy + RedisInstance架构" +#: backend/db_services/partition/serializers.py:132 +msgid "PORT" +msgstr "PORT" -#: backend/flow/consts.py:127 -msgid "predixy + tendisplus架构" -msgstr "predixy + tendisplus架构" +#: backend/db_services/partition/serializers.py:146 +#: backend/ticket/builders/mysql/mysql_partition.py:50 +msgid "分区执行对象列表" +msgstr "分区执行对象列表" -#: backend/flow/consts.py:128 -msgid "Es" -msgstr "Es" +#: backend/db_services/partition/views.py:65 +msgid "获取分区策略列表" +msgstr "获取分区策略列表" -#: backend/flow/consts.py:129 -msgid "tendb" -msgstr "tendb" +#: backend/db_services/partition/views.py:96 +msgid "修改分区策略" +msgstr "修改分区策略" -#: backend/flow/consts.py:131 -msgid "Hdfs" -msgstr "Hdfs" +#: backend/db_services/partition/views.py:106 +msgid "增加分区策略" +msgstr "增加分区策略" -#: backend/flow/consts.py:133 -msgid "Influxdb" -msgstr "Influxdb" +#: backend/db_services/partition/views.py:116 +msgid "批量删除分区策略" +msgstr "批量删除分区策略" -#: backend/flow/consts.py:138 -msgid "初始化帐户" -msgstr "初始化帐户" +#: backend/db_services/partition/views.py:126 +msgid "禁用分区策略" +msgstr "禁用分区策略" -#: backend/flow/consts.py:139 -msgid "实例和帐户" -msgstr "实例和帐户" +#: backend/db_services/partition/views.py:136 +msgid "启用分区策略" +msgstr "启用分区策略" -#: backend/flow/consts.py:140 -msgid "系统配置" -msgstr "系统配置" +#: backend/db_services/partition/views.py:146 +msgid "查询分区策略日志" +msgstr "查询分区策略日志" -#: backend/flow/consts.py:141 -msgid "实例配置" -msgstr "实例配置" +#: backend/db_services/partition/views.py:159 +msgid "分区策略前置执行" +msgstr "分区策略前置执行" -#: backend/flow/consts.py:142 -msgid "默认配置" -msgstr "默认配置" +#: backend/db_services/partition/views.py:178 +msgid "分区策略执行" +msgstr "分区策略执行" + +#: backend/db_services/partition/views.py:188 +msgid "分区策略字段校验" +msgstr "分区策略字段校验" + +#: backend/db_services/plugin/bf/serializers.py:23 +msgid "登录用户" +msgstr "登录用户" + +#: backend/db_services/plugin/bf/serializers.py:24 +msgid "登录主机信息" +msgstr "登录主机信息" + +#: backend/db_services/plugin/bf/views.py:33 +msgid "是否具有BF机器权限" +msgstr "是否具有BF机器权限" + +#: backend/db_services/plugin/bf/views.py:44 +msgid "主机{}不存在业务{}下" +msgstr "主机{}不存在业务{}下" + +#: backend/db_services/plugin/bf/views.py:55 +msgid "放行BF申请的白名单业务" +msgstr "放行BF申请的白名单业务" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:18 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:28 +msgid "授权账号" +msgstr "授权账号" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:19 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:29 +msgid "准入DB" +msgstr "准入DB" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:20 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:30 +msgid "源IP列表" +msgstr "源IP列表" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:21 +#: backend/ticket/builders/mysql/mysql_clone_rules.py:34 +msgid "目标域名" +msgstr "目标域名" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:24 +msgid "GCS业务缩写,如qxzb" +msgstr "GCS业务缩写,如qxzb" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:25 +msgid "Set名称,多个以逗号分隔" +msgstr "Set名称,多个以逗号分隔" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:26 +msgid "模块主机信息" +msgstr "模块主机信息" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:27 +msgid "模块列表,多个以逗号分隔" +msgstr "模块列表,多个以逗号分隔" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:29 +msgid "调用平台" +msgstr "调用平台" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:33 +msgid "请保证至少输入bk_biz_id或者输入app其中之一" +msgstr "请保证至少输入bk_biz_id或者输入app其中之一" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:44 +#: backend/db_services/plugin/mysql/authorize/serializers.py:52 +msgid "平台" +msgstr "平台" + +#: backend/db_services/plugin/mysql/authorize/serializers.py:57 +msgid "返回信息" +msgstr "返回信息" + +#: backend/db_services/plugin/mysql/authorize/views.py:31 +msgid "第三方权限申请(兼容GCS)" +msgstr "第三方权限申请(兼容GCS)" + +#: backend/db_services/plugin/mysql/authorize/views.py:42 +msgid "查询第三方权限申请结果(兼容GCS)" +msgstr "查询第三方权限申请结果(兼容GCS)" + +#: backend/db_services/quick_search/constants.py:20 +msgid "单号" +msgstr "单号" + +#: backend/db_services/quick_search/constants.py:21 +msgid "任务" +msgstr "任务" + +#: backend/db_services/quick_search/constants.py:23 +msgid "资源池主机" +msgstr "资源池主机" + +#: backend/db_services/quick_search/constants.py:27 +msgid "模糊" +msgstr "模糊" + +#: backend/db_services/quick_search/constants.py:28 +msgid "精确" +msgstr "精确" + +#: backend/db_services/quick_search/serializers.py:22 +msgid "数据库类型列表" +msgstr "数据库类型列表" + +#: backend/db_services/quick_search/serializers.py:27 +#: backend/iam_app/serializers.py:27 +msgid "资源列表" +msgstr "资源列表" -#: backend/flow/consts.py:143 -msgid "proxyconfig" -msgstr "proxyconfig" +#: backend/db_services/quick_search/serializers.py:28 +#: backend/iam_app/serializers.py:23 +msgid "资源类型" +msgstr "资源类型" -#: backend/flow/consts.py:144 -msgid "ES实例配置" -msgstr "ES实例配置" +#: backend/db_services/quick_search/serializers.py:31 +msgid "检索类型" +msgstr "检索类型" -#: backend/flow/consts.py:145 -msgid "act配置" -msgstr "act配置" +#: backend/db_services/quick_search/views.py:23 +msgid "全局搜索" +msgstr "全局搜索" -#: backend/flow/consts.py:146 -msgid "系统配置类型" -msgstr "系统配置类型" +#: backend/db_services/quick_search/views.py:31 +msgid "[quick_search] 快速查询" +msgstr "[quick_search] 快速查询" -#: backend/flow/consts.py:147 -msgid "Kafka实例配置" -msgstr "Kafka实例配置" +#: backend/db_services/redis/autofix/bill.py:106 +msgid "自动发起-自愈任务-{}" +msgstr "自动发起-自愈任务-{}" -#: backend/flow/consts.py:148 -msgid "HDFS集群配置" -msgstr "HDFS集群配置" +#: backend/db_services/redis/autofix/enums.py:20 +msgid "切换中?" +msgstr "切换中?" -#: backend/flow/consts.py:149 -msgid "HDFS实例hdfs-site配置" -msgstr "HDFS实例hdfs-site配置" +#: backend/db_services/redis/autofix/enums.py:21 +msgid "切换失败" +msgstr "切换失败" -#: backend/flow/consts.py:150 -msgid "HDFS实例core-site配置" -msgstr "HDFS实例core-site配置" +#: backend/db_services/redis/autofix/enums.py:22 +msgid "切换成功" +msgstr "切换成功" -#: backend/flow/consts.py:151 -msgid "HDFS实例安装配置" -msgstr "HDFS实例安装配置" +#: backend/db_services/redis/autofix/enums.py:28 +msgid "自愈开关" +msgstr "自愈开关" -#: backend/flow/consts.py:155 -msgid "系统" -msgstr "系统" +#: backend/db_services/redis/autofix/enums.py:29 +msgid "监控到的id" +msgstr "监控到的id" -#: backend/flow/consts.py:156 -msgid "twemproxy config file" -msgstr "twemproxy config file" +#: backend/db_services/redis/autofix/enums.py:30 +msgid "忽略自愈的APP列表" +msgstr "忽略自愈的APP列表" -#: backend/flow/consts.py:157 -msgid "predixy config file" -msgstr "predixy config file" +#: backend/db_services/redis/autofix/enums.py:31 +msgid "忽略自愈的集群列表" +msgstr "忽略自愈的集群列表" -#: backend/flow/consts.py:158 -msgid "redis config file" -msgstr "redis config file" +#: backend/db_services/redis/autofix/enums.py:37 +msgid "初始化" +msgstr "初始化" -#: backend/flow/consts.py:159 -msgid "全备配置" -msgstr "全备配置" +#: backend/db_services/redis/autofix/enums.py:39 +msgid "发起flow流程" +msgstr "发起flow流程" -#: backend/flow/consts.py:160 -msgid "增备配置" -msgstr "增备配置" +#: backend/db_services/redis/autofix/enums.py:40 +msgid "监控流程完成状态" +msgstr "监控流程完成状态" -#: backend/flow/consts.py:161 -msgid "心跳配置" -msgstr "心跳配置" +#: backend/db_services/redis/autofix/enums.py:41 +msgid "不支持自愈" +msgstr "不支持自愈" -#: backend/flow/consts.py:162 -msgid "监控配置" -msgstr "监控配置" +#: backend/db_services/redis/autofix/enums.py:42 +msgid "自愈成功" +msgstr "自愈成功" -#: backend/flow/consts.py:163 -msgid "基本配置" -msgstr "基本配置" +#: backend/db_services/redis/autofix/enums.py:43 +msgid "自愈失败" +msgstr "自愈失败" -#: backend/flow/consts.py:164 -msgid "热key配置" -msgstr "热key配置" +#: backend/db_services/redis/autofix/models.py:27 +msgid "取值范围" +msgstr "取值范围" -#: backend/flow/consts.py:165 -msgid "大key配置" -msgstr "大key配置" +#: backend/db_services/redis/autofix/models.py:38 +msgid "集群主域名" +msgstr "集群主域名" -#: backend/flow/consts.py:169 -msgid "MASTER" -msgstr "MASTER" +#: backend/db_services/redis/autofix/models.py:39 +msgid "故障机器" +msgstr "故障机器" -#: backend/flow/consts.py:170 -msgid "SLAVE" -msgstr "SLAVE" +#: backend/db_services/redis/autofix/models.py:41 +msgid "自愈状态" +msgstr "自愈状态" -#: backend/flow/consts.py:174 backend/flow/consts.py:252 -#: backend/flow/consts.py:750 -msgid "mysql" -msgstr "mysql" +#: backend/db_services/redis/autofix/models.py:42 +msgid "状态版本" +msgstr "状态版本" -#: backend/flow/consts.py:175 -msgid "mysql-proxy" -msgstr "mysql-proxy" +#: backend/db_services/redis/autofix/models.py:57 +msgid "机器ID" +msgstr "机器ID" -#: backend/flow/consts.py:179 -msgid "dbbackup" -msgstr "dbbackup" +#: backend/db_services/redis/autofix/models.py:58 +msgid "机器IP" +msgstr "机器IP" -#: backend/flow/consts.py:180 -msgid "actuator" -msgstr "actuator" +#: backend/db_services/redis/autofix/models.py:59 +msgid "切换端口" +msgstr "切换端口" -#: backend/flow/consts.py:181 -msgid "最新版本" -msgstr "最新版本" +#: backend/db_services/redis/autofix/models.py:60 +msgid "切换最小值" +msgstr "切换最小值" -#: backend/flow/consts.py:184 -msgid "redis_tools" -msgstr "redis_tools" +#: backend/db_services/redis/autofix/models.py:61 +msgid "切换最大值" +msgstr "切换最大值" -#: backend/flow/consts.py:185 backend/flow/consts.py:258 -msgid "es" -msgstr "es" +#: backend/db_services/redis/autofix/models.py:62 +msgid "切换结果" +msgstr "切换结果" -#: backend/flow/consts.py:186 backend/flow/consts.py:259 -msgid "kafka" -msgstr "kafka" +#: backend/db_services/redis/autofix/models.py:63 +msgid "忽略类型" +msgstr "忽略类型" -#: backend/flow/consts.py:187 backend/flow/consts.py:260 -msgid "hdfs" -msgstr "hdfs" +#: backend/db_services/redis/autofix/models.py:71 +#: backend/ticket/constants.py:53 +msgid "待处理" +msgstr "待处理" -#: backend/flow/consts.py:188 backend/flow/consts.py:261 -msgid "pulsar" -msgstr "pulsar" +#: backend/db_services/redis/autofix/models.py:72 +msgid "已取消" +msgstr "已取消" -#: backend/flow/consts.py:190 -msgid "dbmon" -msgstr "dbmon" +#: backend/db_services/redis/autofix/models.py:74 +#: backend/ticket/constants.py:78 backend/ticket/constants.py:89 +msgid "执行中" +msgstr "执行中" -#: backend/flow/consts.py:191 -msgid "mysql-checksum" -msgstr "mysql-checksum" +#: backend/db_services/redis/autofix/models.py:84 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:71 +msgid "信息" +msgstr "信息" -#: backend/flow/consts.py:192 -msgid "Binlog 滚动备份工具" -msgstr "Binlog 滚动备份工具" +#: backend/db_services/redis/autofix/models.py:88 +msgid "上报IP" +msgstr "上报IP" -#: backend/flow/consts.py:193 -msgid "DBA 工具集" -msgstr "DBA 工具集" +#: backend/db_services/redis/autofix/models.py:89 +msgid "上报端口" +msgstr "上报端口" -#: backend/flow/consts.py:194 -msgid "mysql-crond" -msgstr "mysql-crond" +#: backend/db_services/redis/autofix/models.py:90 +msgid "上报的nodes data" +msgstr "上报的nodes data" -#: backend/flow/consts.py:195 -msgid "MySQL 监控" -msgstr "MySQL 监控" +#: backend/db_services/redis/autofix/models.py:91 +msgid "上报时间" +msgstr "上报时间" -#: backend/flow/consts.py:196 -msgid "nginx 服务" -msgstr "nginx 服务" +#: backend/db_services/redis/constants.py:19 +msgid "基于正则" +msgstr "基于正则" -#: backend/flow/consts.py:197 -msgid "dns-bind 服务" -msgstr "dns-bind 服务" +#: backend/db_services/redis/constants.py:20 +msgid "基于文件" +msgstr "基于文件" -#: backend/flow/consts.py:198 -msgid "dns-pull-crond服务" -msgstr "dns-pull-crond服务" +#: backend/db_services/redis/constants.py:26 +msgid "查询当前版本" +msgstr "查询当前版本" -#: backend/flow/consts.py:199 -msgid "cloud-dbha服务" -msgstr "cloud-dbha服务" +#: backend/db_services/redis/constants.py:27 +msgid "查询更新版本" +msgstr "查询更新版本" -#: backend/flow/consts.py:200 -msgid "cloud-drs服务" -msgstr "cloud-drs服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:127 +msgid "bk_biz_id {} in blacklist,skip maxmemory set" +msgstr "bk_biz_id {} in blacklist,skip maxmemory set" -#: backend/flow/consts.py:201 -msgid "cloud-drs-tmysqlparse服务" -msgstr "cloud-drs-tmysqlparse服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:131 +msgid "domain {} in blacklist,skip maxmemory set" +msgstr "domain {} in blacklist,skip maxmemory set" -#: backend/flow/consts.py:202 -msgid "spider节点名称" -msgstr "spider节点名称" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:135 +msgid "cluster {} cluster_type:{} is not redis instance,skip maxmemory set" +msgstr "cluster {} cluster_type:{} is not redis instance,skip maxmemory set" -#: backend/flow/consts.py:203 -msgid "spider中控节点名称" -msgstr "spider中控节点名称" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:141 +msgid "cluster {} is dts task dstCluster,skip maxmemory set" +msgstr "cluster {} is dts task dstCluster,skip maxmemory set" -#: backend/flow/consts.py:208 -msgid "nginx服务" -msgstr "nginx服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:166 +msgid "首次通过外围程序设置maxmemory" +msgstr "首次通过外围程序设置maxmemory" -#: backend/flow/consts.py:209 -msgid "dns服务" -msgstr "dns服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:177 +msgid "集群 master addrs 发生变化" +msgstr "集群 master addrs 发生变化" -#: backend/flow/consts.py:210 -msgid "drs服务" -msgstr "drs服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:187 +msgid "集群master {} 的 used_memory变化了 {}{}" +msgstr "集群master {} 的 used_memory变化了 {}{}" -#: backend/flow/consts.py:211 -msgid "dbha服务" -msgstr "dbha服务" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:192 +msgid "集群master {} 的 used_memory变化了 {}{}%" +msgstr "集群master {} 的 used_memory变化了 {}{}%" -#: backend/flow/consts.py:215 -msgid "pull-crond.conf" -msgstr "pull-crond.conf" +#: backend/db_services/redis/maxmemory_set/maxmemory_set.py:193 +msgid "集群master 的 used_memory没有发生变化" +msgstr "集群master 的 used_memory没有发生变化" -#: backend/flow/consts.py:216 -msgid "ha-gm.conf" -msgstr "ha-gm.conf" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_backends.py:27 +msgid "backends" +msgstr "backends" -#: backend/flow/consts.py:217 -msgid "ha-agent.conf" -msgstr "ha-agent.conf" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:33 +msgid "配置数据" +msgstr "配置数据" -#: backend/flow/consts.py:218 -msgid "drs.env" -msgstr "drs.env" +#: backend/db_services/redis/maxmemory_set/models/tb_tendis_maxmemory_config.py:37 +msgid "redis maxmemory配置" +msgstr "redis maxmemory配置" -#: backend/flow/consts.py:222 -msgid "GM" -msgstr "GM" +#: backend/db_services/redis/redis_dts/constants.py:20 +msgid "tendis ssd备份任务" +msgstr "tendis ssd备份任务" -#: backend/flow/consts.py:223 -msgid "AGENT" -msgstr "AGENT" +#: backend/db_services/redis/redis_dts/constants.py:21 +msgid "tendis ssd备份拉取任务" +msgstr "tendis ssd备份拉取任务" -#: backend/flow/consts.py:224 -msgid "mysql-monitor" -msgstr "mysql-monitor" +#: backend/db_services/redis/redis_dts/constants.py:22 +msgid "tendis ssd备份解析任务" +msgstr "tendis ssd备份解析任务" -#: backend/flow/consts.py:234 -msgid "nginx服务模块" -msgstr "nginx服务模块" +#: backend/db_services/redis/redis_dts/constants.py:23 +msgid "tendis ssd数据导入任务" +msgstr "tendis ssd数据导入任务" -#: backend/flow/consts.py:235 -msgid "dns服务模块" -msgstr "dns服务模块" +#: backend/db_services/redis/redis_dts/constants.py:24 +msgid "tendis ssd拉起sync任务" +msgstr "tendis ssd拉起sync任务" -#: backend/flow/consts.py:236 -msgid "drs服务模块" -msgstr "drs服务模块" +#: backend/db_services/redis/redis_dts/constants.py:25 +#: backend/db_services/redis/redis_dts/constants.py:29 +msgid "tendis ssd监视sync任务" +msgstr "tendis ssd监视sync任务" -#: backend/flow/consts.py:237 -msgid "dbha服务模块" -msgstr "dbha服务模块" +#: backend/db_services/redis/redis_dts/constants.py:28 +msgid "redis cache拉起redis-shake任务" +msgstr "redis cache拉起redis-shake任务" -#: backend/flow/consts.py:242 -msgid "蓝盾制品库" -msgstr "蓝盾制品库" +#: backend/db_services/redis/redis_dts/constants.py:32 +msgid "tendisplus拉起reids-sync任务" +msgstr "tendisplus拉起reids-sync任务" -#: backend/flow/consts.py:247 -msgid "V1" -msgstr "V1" +#: backend/db_services/redis/redis_dts/constants.py:34 +msgid "tendisplus全量数据同步" +msgstr "tendisplus全量数据同步" -#: backend/flow/consts.py:255 -msgid "tendis" -msgstr "tendis" +#: backend/db_services/redis/redis_dts/constants.py:35 +msgid "tendisplus增量数据同步" +msgstr "tendisplus增量数据同步" -#: backend/flow/consts.py:263 -msgid "bkdbmon" -msgstr "bkdbmon" +#: backend/db_services/redis/redis_dts/constants.py:41 +msgid "停止数据同步todo" +msgstr "停止数据同步todo" -#: backend/flow/consts.py:264 -msgid "download" -msgstr "download" +#: backend/db_services/redis/redis_dts/constants.py:42 +msgid "停止数据同步失败" +msgstr "停止数据同步失败" -#: backend/flow/consts.py:266 -msgid "spiderctl" -msgstr "spiderctl" +#: backend/db_services/redis/redis_dts/constants.py:43 +msgid "停止数据同步成功" +msgstr "停止数据同步成功" -#: backend/flow/consts.py:271 backend/flow/consts.py:315 -msgid "sysinit" -msgstr "sysinit" +#: backend/db_services/redis/redis_dts/constants.py:45 +msgid "强制暂停任务todo" +msgstr "强制暂停任务todo" -#: backend/flow/consts.py:272 backend/flow/consts.py:419 -msgid "deploy" -msgstr "deploy" +#: backend/db_services/redis/redis_dts/constants.py:46 +msgid "强制暂停任务失败" +msgstr "强制暂停任务失败" -#: backend/flow/consts.py:273 -msgid "find-local-backup" -msgstr "find-local-backup" +#: backend/db_services/redis/redis_dts/constants.py:47 +msgid "强制暂停任务成功" +msgstr "强制暂停任务成功" -#: backend/flow/consts.py:274 -msgid "restore-dr" -msgstr "restore-dr" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:21 +msgid "集群节点数变更" +msgstr "集群节点数变更" -#: backend/flow/consts.py:275 -msgid "recover-binlog" -msgstr "recover-binlog" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:22 +msgid "集群类型变更" +msgstr "集群类型变更" -#: backend/flow/consts.py:276 -msgid "grant-repl" -msgstr "grant-repl" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:23 +msgid "集群数据复制" +msgstr "集群数据复制" -#: backend/flow/consts.py:277 -msgid "change-master" -msgstr "change-master" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:24 +msgid "集群回档数据回写" +msgstr "集群回档数据回写" -#: backend/flow/consts.py:278 -msgid "set-backend" -msgstr "set-backend" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:32 +msgid "业务内" +msgstr "业务内" -#: backend/flow/consts.py:279 backend/flow/consts.py:427 -msgid "uninstall" -msgstr "uninstall" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:33 +msgid "跨业务" +msgstr "跨业务" -#: backend/flow/consts.py:280 -msgid "deploy-dbbackup" -msgstr "deploy-dbbackup" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:34 +msgid "业务内至第三方" +msgstr "业务内至第三方" -#: backend/flow/consts.py:281 backend/flow/consts.py:424 -msgid "install-monitor" -msgstr "install-monitor" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:35 +msgid "自建集群至业务内" +msgstr "自建集群至业务内" -#: backend/flow/consts.py:282 -msgid "deploy-rotate" -msgstr "deploy-rotate" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:36 +msgid "构造实例至业务内" +msgstr "构造实例至业务内" -#: backend/flow/consts.py:283 backend/flow/consts.py:289 -msgid "semantic-dumpschema" -msgstr "semantic-dumpschema" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:45 +msgid "先删除同名redis key, 再执行写入(如:del $key + hset $key)" +msgstr "先删除同名redis key, 再执行写入(如:del $key + hset $key)" -#: backend/flow/consts.py:284 -msgid "import-sqlfile" -msgstr "import-sqlfile" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:47 +msgid "保留同名redis key,追加写入(如hset $key)" +msgstr "保留同名redis key,追加写入(如hset $key)" -#: backend/flow/consts.py:285 -msgid "clone-client-grant" -msgstr "clone-client-grant" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:48 +msgid "先清空目标集群所有数据,在写入(如flushall + hset $key)" +msgstr "先清空目标集群所有数据,在写入(如flushall + hset $key)" -#: backend/flow/consts.py:286 -msgid "clone-proxy-user" -msgstr "clone-proxy-user" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:63 +msgid "自动切换" +msgstr "自动切换" -#: backend/flow/consts.py:287 backend/flow/consts.py:426 -msgid "clear-crontab" -msgstr "clear-crontab" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:64 +msgid "用户确认切换" +msgstr "用户确认切换" -#: backend/flow/consts.py:288 -msgid "semantic-check" -msgstr "semantic-check" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:72 +msgid "复制完成后自动断开同步关系" +msgstr "复制完成后自动断开同步关系" -#: backend/flow/consts.py:290 -msgid "backup-truncate-database" -msgstr "backup-truncate-database" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:73 +msgid "复制完成后保持同步关系,定时发送断开同步提醒" +msgstr "复制完成后保持同步关系,定时发送断开同步提醒" -#: backend/flow/consts.py:291 -msgid "restart" -msgstr "restart" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:81 +msgid "每天一次" +msgstr "每天一次" -#: backend/flow/consts.py:292 -msgid "clean-mysql" -msgstr "clean-mysql" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:82 +#: backend/db_services/redis/redis_dts/enums/type_enums.py:102 +msgid "每周一次" +msgstr "每周一次" -#: backend/flow/consts.py:293 -msgid "backup-database-table" -msgstr "backup-database-table" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:90 +#: backend/ticket/constants.py:559 +msgid "数据校验并修复" +msgstr "数据校验并修复" -#: backend/flow/consts.py:294 -msgid "set-backend-toward-slave" -msgstr "set-backend-toward-slave" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:91 +#: backend/ticket/constants.py:560 +msgid "仅进行数据校验,不进行修复" +msgstr "仅进行数据校验,不进行修复" -#: backend/flow/consts.py:295 -msgid "pt-table-checksum" -msgstr "pt-table-checksum" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:92 +#: backend/ticket/constants.py:561 +msgid "不校验不修复" +msgstr "不校验不修复" -#: backend/flow/consts.py:296 -msgid "执行分区" -msgstr "执行分区" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:100 +msgid "复制完成后执行一次" +msgstr "复制完成后执行一次" -#: backend/flow/consts.py:297 -msgid "ibs-recover" -msgstr "ibs-recover" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:101 +msgid "每三天一次" +msgstr "每三天一次" -#: backend/flow/consts.py:298 -msgid "数据修复指令" -msgstr "数据修复指令" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:110 +#: backend/ticket/builders/common/constants.py:96 +msgid "自动修复" +msgstr "自动修复" -#: backend/flow/consts.py:299 -msgid "flashback-binlog" -msgstr "flashback-binlog" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:111 +msgid "用户确认" +msgstr "用户确认" -#: backend/flow/consts.py:300 -msgid "full-backup" -msgstr "full-backup" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:119 +msgid "永不超时" +msgstr "永不超时" -#: backend/flow/consts.py:301 -msgid "install-checksum" -msgstr "install-checksum" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:120 +msgid "1小时" +msgstr "1小时" -#: backend/flow/consts.py:302 -msgid "mycnf-change" -msgstr "mycnf-change" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:121 +msgid "3小时" +msgstr "3小时" -#: backend/flow/consts.py:303 -msgid "安装mysql-rotatebinlog程序" -msgstr "安装mysql-rotatebinlog程序" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:122 +msgid "6小时" +msgstr "6小时" -#: backend/flow/consts.py:304 -msgid "安装dba-toolkit程序" -msgstr "安装dba-toolkit程序" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:123 +msgid "1天" +msgstr "1天" -#: backend/flow/consts.py:305 -msgid "deploy-mysql-crond" -msgstr "deploy-mysql-crond" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:124 +msgid "2天" +msgstr "2天" -#: backend/flow/consts.py:306 -msgid "mysql实例的周边配置清理" -msgstr "mysql实例的周边配置清理" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:125 +msgid "1周" +msgstr "1周" -#: backend/flow/consts.py:307 -msgid "初始化spider集群节点关系" -msgstr "初始化spider集群节点关系" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:134 +msgid "增量同步中" +msgstr "增量同步中" -#: backend/flow/consts.py:308 -msgid "添加spider临时节点" -msgstr "添加spider临时节点" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:136 +msgid "增量同步失败" +msgstr "增量同步失败" -#: backend/flow/consts.py:309 -msgid "restart-spider" -msgstr "restart-spider" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:138 +msgid "传输已完成" +msgstr "传输已完成" -#: backend/flow/consts.py:310 -msgid "添加spider-slave集群的相关路由信息" -msgstr "添加spider-slave集群的相关路由信息" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:139 +msgid "传输被终止" +msgstr "传输被终止" -#: backend/flow/consts.py:311 -msgid "mysql备份请求" -msgstr "mysql备份请求" +#: backend/db_services/redis/redis_dts/enums/type_enums.py:140 +msgid "未知状态" +msgstr "未知状态" -#: backend/flow/consts.py:316 -msgid "install" -msgstr "install" +#: backend/db_services/redis/redis_dts/exceptions.py:18 +msgid "DBDts模块异常" +msgstr "DBDts模块异常" -#: backend/flow/consts.py:317 -msgid "replica_batch" -msgstr "replica_batch" +#: backend/db_services/redis/redis_dts/exceptions.py:23 +msgid "获取DTS任务列表异常" +msgstr "获取DTS任务列表异常" -#: backend/flow/consts.py:318 -msgid "replicaof" -msgstr "replicaof" +#: backend/db_services/redis/redis_dts/exceptions.py:29 +msgid "DTS task操作异常" +msgstr "DTS task操作异常" -#: backend/flow/consts.py:319 -msgid "clustermeet_slotsassign" -msgstr "clustermeet_slotsassign" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:54 +msgid "cluster:{} 密码已经正确存储" +msgstr "cluster:{} 密码已经正确存储" -#: backend/flow/consts.py:320 -msgid "keyspattern" -msgstr "keyspattern" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:68 +msgid "cluster:{} 密码已存储port不正确,重新存储" +msgstr "cluster:{} 密码已存储port不正确,重新存储" -#: backend/flow/consts.py:321 -msgid "keysdelete_regex" -msgstr "keysdelete_regex" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:79 +msgid "cluster:{} 密码从dbconfig中迁移到密码服务中" +msgstr "cluster:{} 密码从dbconfig中迁移到密码服务中" -#: backend/flow/consts.py:322 -msgid "keysdelete_files" -msgstr "keysdelete_files" +#: backend/db_services/redis/redis_dts/migrate_cluster_password.py:89 +msgid "cluster:{} 在 dbconfig和密码服务中均不存在" +msgstr "cluster:{} 在 dbconfig和密码服务中均不存在" -#: backend/flow/consts.py:323 -msgid "backup" -msgstr "backup" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:17 +msgid "锁的唯一标识" +msgstr "锁的唯一标识" -#: backend/flow/consts.py:324 -msgid "flush_data" -msgstr "flush_data" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:18 +msgid "锁的持有者" +msgstr "锁的持有者" -#: backend/flow/consts.py:325 -msgid "shutdown" -msgstr "shutdown" +#: backend/db_services/redis/redis_dts/models/tb_dts_distribute_lock.py:20 +msgid "锁的过期时间" +msgstr "锁的过期时间" -#: backend/flow/consts.py:326 -msgid "open" -msgstr "open" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:18 +msgid "DTS_Server IP" +msgstr "DTS_Server IP" -#: backend/flow/consts.py:327 -msgid "close" -msgstr "close" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:19 +msgid "城市ID" +msgstr "城市ID" -#: backend/flow/consts.py:328 -msgid "operate" -msgstr "operate" +#: backend/db_services/redis/redis_dts/models/tb_dts_server.py:22 +msgid "最近心跳时间" +msgstr "最近心跳时间" -#: backend/flow/consts.py:329 -msgid "capturer" -msgstr "capturer" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:28 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:21 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:20 +msgid "单据号" +msgstr "单据号" -#: backend/flow/consts.py:330 -msgid "kill_conn" -msgstr "kill_conn" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:29 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:22 +msgid "业务bk_biz_id" +msgstr "业务bk_biz_id" -#: backend/flow/consts.py:331 -msgid "param_sync" -msgstr "param_sync" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:30 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:23 +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:13 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:13 +msgid "云区域id" +msgstr "云区域id" -#: backend/flow/consts.py:332 -msgid "sync_check" -msgstr "sync_check" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:31 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:21 +msgid "申请人" +msgstr "申请人" -#: backend/flow/consts.py:333 -msgid "dts_datacheck" -msgstr "dts_datacheck" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:33 +msgid "DTS单据类型" +msgstr "DTS单据类型" -#: backend/flow/consts.py:334 -msgid "dts_datarepaire" -msgstr "dts_datarepaire" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:36 +msgid "DTS数据复制类型" +msgstr "DTS数据复制类型" -#: backend/flow/consts.py:338 backend/flow/consts.py:361 -#: backend/flow/consts.py:381 backend/flow/consts.py:400 -#: backend/flow/consts.py:575 -msgid "init" -msgstr "init" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:39 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:26 +msgid "写入模式" +msgstr "写入模式" -#: backend/flow/consts.py:339 backend/flow/consts.py:362 -#: backend/flow/consts.py:382 backend/flow/consts.py:401 -#: backend/flow/consts.py:576 -msgid "decompress_pkg" -msgstr "decompress_pkg" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:45 +msgid "在线切换类型" +msgstr "在线切换类型" -#: backend/flow/consts.py:340 backend/flow/consts.py:363 -#: backend/flow/consts.py:383 backend/flow/consts.py:402 -msgid "install_supervisor" -msgstr "install_supervisor" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:48 +msgid "同步断开类型" +msgstr "同步断开类型" -#: backend/flow/consts.py:341 -msgid "install_master" -msgstr "install_master" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:51 +msgid "同步断开提醒频率" +msgstr "同步断开提醒频率" -#: backend/flow/consts.py:342 -msgid "install_hot" -msgstr "install_hot" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:57 +msgid "数据校验修复类型" +msgstr "数据校验修复类型" -#: backend/flow/consts.py:343 -msgid "install_cold" -msgstr "install_cold" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:63 +msgid "数据校验修复执行频率" +msgstr "数据校验修复执行频率" -#: backend/flow/consts.py:344 -msgid "install_client" -msgstr "install_client" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:66 +msgid "最近一次数据校验与修复 flow id" +msgstr "最近一次数据校验与修复 flow id" -#: backend/flow/consts.py:345 -msgid "init_grant" -msgstr "init_grant" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:68 +msgid "最近一次数据校验与修复 单据执行时间" +msgstr "最近一次数据校验与修复 单据执行时间" -#: backend/flow/consts.py:346 -msgid "install_exporter" -msgstr "install_exporter" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:70 +msgid "在线切换 flow id" +msgstr "在线切换 flow id" -#: backend/flow/consts.py:347 -msgid "install_kibana" -msgstr "install_kibana" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:72 +msgid "目的集群禁用 flow id" +msgstr "目的集群禁用 flow id" -#: backend/flow/consts.py:348 backend/flow/consts.py:385 -msgid "install_telegraf" -msgstr "install_telegraf" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:73 +msgid "目的集群下架 flow id" +msgstr "目的集群下架 flow id" -#: backend/flow/consts.py:349 backend/flow/consts.py:368 -#: backend/flow/consts.py:387 backend/flow/consts.py:409 -msgid "start_process" -msgstr "start_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:76 +msgid "源集群id" +msgstr "源集群id" -#: backend/flow/consts.py:350 backend/flow/consts.py:369 -#: backend/flow/consts.py:388 backend/flow/consts.py:410 -msgid "stop_process" -msgstr "stop_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:78 +msgid "源集群类型" +msgstr "源集群类型" -#: backend/flow/consts.py:351 backend/flow/consts.py:370 -#: backend/flow/consts.py:389 backend/flow/consts.py:411 -msgid "restart_process" -msgstr "restart_process" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:79 +msgid "回滚单据号" +msgstr "回滚单据号" -#: backend/flow/consts.py:352 backend/flow/consts.py:371 -#: backend/flow/consts.py:390 backend/flow/consts.py:412 -msgid "clean_data" -msgstr "clean_data" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:80 +msgid "回滚临时环境实例" +msgstr "回滚临时环境实例" -#: backend/flow/consts.py:353 -msgid "exclude_node" -msgstr "exclude_node" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:81 +msgid "目标业务id" +msgstr "目标业务id" -#: backend/flow/consts.py:354 -msgid "check_shards" -msgstr "check_shards" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:82 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:23 +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:54 +msgid "目的集群" +msgstr "目的集群" -#: backend/flow/consts.py:355 -msgid "check_connections" -msgstr "check_connections" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:83 +msgid "目的集群id" +msgstr "目的集群id" -#: backend/flow/consts.py:356 -msgid "check_nodes" -msgstr "check_nodes" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:85 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:52 +msgid "目标集群类型" +msgstr "目标集群类型" -#: backend/flow/consts.py:357 -msgid "replace_master" -msgstr "replace_master" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:86 +msgid "key正则(包含key)" +msgstr "key正则(包含key)" -#: backend/flow/consts.py:364 backend/flow/consts.py:403 -msgid "install_zookeeper" -msgstr "install_zookeeper" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_job.py:87 +msgid "key正则(排除key)" +msgstr "key正则(排除key)" -#: backend/flow/consts.py:365 -msgid "init_kafkaUser" -msgstr "init_kafkaUser" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:24 +msgid "数据类型" +msgstr "数据类型" -#: backend/flow/consts.py:366 backend/flow/consts.py:406 -msgid "install_broker" -msgstr "install_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_switch_backup.py:25 +msgid "数据" +msgstr "数据" -#: backend/flow/consts.py:367 -msgid "install_manager" -msgstr "install_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:24 +msgid "执行迁移任务的dts_server" +msgstr "执行迁移任务的dts_server" -#: backend/flow/consts.py:372 -msgid "reduce_broker" -msgstr "reduce_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:29 +msgid "源集群优先级,值越大,优先级越高" +msgstr "源集群优先级,值越大,优先级越高" -#: backend/flow/consts.py:373 -msgid "check_reassign" -msgstr "check_reassign" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:30 +msgid "源slave_ip" +msgstr "源slave_ip" -#: backend/flow/consts.py:374 -msgid "reconfig_add" -msgstr "reconfig_add" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:31 +msgid "源slave_port" +msgstr "源slave_port" -#: backend/flow/consts.py:375 -msgid "restart_broker" -msgstr "restart_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:32 +msgid "源实例密码base64值" +msgstr "源实例密码base64值" -#: backend/flow/consts.py:376 -msgid "reconfig_remove" -msgstr "reconfig_remove" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:34 +msgid "源slave db类型" +msgstr "源slave db类型" -#: backend/flow/consts.py:377 -msgid "replace_broker" -msgstr "replace_broker" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:36 +msgid "源实例数据量大小,单位Byte" +msgstr "源实例数据量大小,单位Byte" -#: backend/flow/consts.py:384 -msgid "install_influxdb" -msgstr "install_influxdb" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:38 +msgid "源实例所属segment_start" +msgstr "源实例所属segment_start" -#: backend/flow/consts.py:386 -msgid "init_user" -msgstr "init_user" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:39 +msgid "源实例所属segment_end" +msgstr "源实例所属segment_end" -#: backend/flow/consts.py:394 -msgid "check_broker_config" -msgstr "check_broker_config" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:41 +msgid "源实例权重" +msgstr "源实例权重" -#: backend/flow/consts.py:395 -msgid "check_namespace_config" -msgstr "check_namespace_config" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:43 +msgid "源slave_ip上task并发数控制" +msgstr "源slave_ip上task并发数控制" -#: backend/flow/consts.py:396 -msgid "check_under_replicated" -msgstr "check_under_replicated" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:44 +msgid "源实例所在城市" +msgstr "源实例所在城市" -#: backend/flow/consts.py:397 -msgid "check_ledger_metadata" -msgstr "check_ledger_metadata" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:46 +msgid "源实例slave-keep-log-count的旧值" +msgstr "源实例slave-keep-log-count的旧值" -#: backend/flow/consts.py:398 -msgid "set_bookie_readonly" -msgstr "set_bookie_readonly" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:47 +msgid "源实例slave-keep-log-count的新值" +msgstr "源实例slave-keep-log-count的新值" -#: backend/flow/consts.py:399 -msgid "decommission_bookie" -msgstr "decommission_bookie" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:48 +msgid "源实例slave-keep-log-count是否恢复" +msgstr "源实例slave-keep-log-count是否恢复" -#: backend/flow/consts.py:404 -msgid "init_cluster" -msgstr "init_cluster" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:49 +msgid "srcRedis是否包含list类型key" +msgstr "srcRedis是否包含list类型key" -#: backend/flow/consts.py:405 -msgid "install_bookkeeper" -msgstr "install_bookkeeper" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:50 +msgid "源twemproxy集群是否开启hash_tag" +msgstr "源twemproxy集群是否开启hash_tag" -#: backend/flow/consts.py:407 -msgid "install_pulsar_manager" -msgstr "install_pulsar_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:51 +msgid "包含key(正则)" +msgstr "包含key(正则)" -#: backend/flow/consts.py:408 -msgid "init_pulsar_manager" -msgstr "init_pulsar_manager" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:52 +msgid "排除key(正则)" +msgstr "排除key(正则)" -#: backend/flow/consts.py:413 -msgid "add_hosts" -msgstr "add_hosts" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:55 +msgid "目的密码base64值" +msgstr "目的密码base64值" -#: backend/flow/consts.py:414 -msgid "modify_hosts" -msgstr "modify_hosts" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:58 +msgid "tendisssd slave上bakup文件位置" +msgstr "tendisssd slave上bakup文件位置" -#: backend/flow/consts.py:418 -msgid "sysinit-riak" -msgstr "sysinit-riak" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:59 +msgid "backup文件拉取到dts_server本地位置" +msgstr "backup文件拉取到dts_server本地位置" -#: backend/flow/consts.py:420 -msgid "join-cluster" -msgstr "join-cluster" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:60 +msgid "tendisdumper得到的sql文件夹" +msgstr "tendisdumper得到的sql文件夹" -#: backend/flow/consts.py:421 -msgid "commit-cluster-change" -msgstr "commit-cluster-change" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:61 +msgid "redis-sync端口" +msgstr "redis-sync端口" -#: backend/flow/consts.py:422 -msgid "init-bucket-type" -msgstr "init-bucket-type" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:62 +msgid "sync的进程id" +msgstr "sync的进程id" -#: backend/flow/consts.py:423 -msgid "remove-node" -msgstr "remove-node" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:64 +msgid "task重试次数" +msgstr "task重试次数" -#: backend/flow/consts.py:425 -msgid "deploy-riak-crond" -msgstr "deploy-riak-crond" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:66 +msgid "sync操作" +msgstr "sync操作" -#: backend/flow/consts.py:435 -msgid "聊天历史记录" -msgstr "聊天历史记录" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:68 +msgid "杀死syncer" +msgstr "杀死syncer" -#: backend/flow/consts.py:436 -msgid "用户战绩数据" -msgstr "用户战绩数据" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:73 +msgid "被忽略的错误" +msgstr "被忽略的错误" -#: backend/flow/consts.py:437 -msgid "玩家按键快捷键信息" -msgstr "玩家按键快捷键信息" +#: backend/db_services/redis/redis_dts/models/tb_tendis_dts_task.py:74 +msgid "sync从该时间点重新同步" +msgstr "sync从该时间点重新同步" -#: backend/flow/consts.py:438 -msgid "test" -msgstr "test" +#: backend/db_services/redis/redis_dts/serializers.py:29 +msgid "页码" +msgstr "页码" -#: backend/flow/consts.py:439 -msgid "mixed" -msgstr "mixed" +#: backend/db_services/redis/redis_dts/serializers.py:30 +msgid "每页数量" +msgstr "每页数量" -#: backend/flow/consts.py:443 -msgid "NOT_RUNNING" -msgstr "NOT_RUNNING" +#: backend/db_services/redis/redis_dts/views.py:61 +msgid "获取DTS历史任务以及其对应task cnt" +msgstr "获取DTS历史任务以及其对应task cnt" -#: backend/flow/consts.py:444 backend/flow/consts.py:502 -msgid "RUNNING" -msgstr "RUNNING" +#: backend/db_services/redis/redis_dts/views.py:83 +msgid "dts job断开同步" +msgstr "dts job断开同步" -#: backend/flow/consts.py:445 backend/flow/consts.py:503 -msgid "SUCCESS" -msgstr "SUCCESS" +#: backend/db_services/redis/redis_dts/views.py:94 +msgid "dts job 批量失败重试" +msgstr "dts job 批量失败重试" -#: backend/flow/consts.py:446 backend/flow/consts.py:504 -msgid "FAILED" -msgstr "FAILED" +#: backend/db_services/redis/redis_dts/views.py:105 +msgid "dts 外部redis连接行测试" +msgstr "dts 外部redis连接行测试" -#: backend/flow/consts.py:447 -msgid "SKIPPED" -msgstr "SKIPPED" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:14 +msgid "module名" +msgstr "module名" -#: backend/flow/consts.py:448 -msgid "IGNORED" -msgstr "IGNORED" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:15 +msgid "so文件名" +msgstr "so文件名" -#: backend/flow/consts.py:449 -msgid "WAITING" -msgstr "WAITING" +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:18 +#: backend/db_services/redis/redis_modules/models/redis_module_support.py:19 +msgid "Redis module支持" +msgstr "Redis module支持" -#: backend/flow/consts.py:450 -msgid "NORMAL" -msgstr "NORMAL" +#: backend/db_services/redis/rollback/handlers.py:50 +msgid "无法查找到在时间范围内{}-{},主机{}的全备份日志" +msgstr "无法查找到在时间范围内{}-{},主机{}的全备份日志" -#: backend/flow/consts.py:452 -msgid "步骤强制终止中" -msgstr "步骤强制终止中" +#: backend/db_services/redis/rollback/handlers.py:57 +#: backend/db_services/redis/rollback/handlers.py:148 +msgid "没有找到小于时间点{}附近的备份日志记录,请检查时间点的合法性或稍后重试" +msgstr "没有找到小于时间点{}附近的备份日志记录,请检查时间点的合法性或稍后重试" -#: backend/flow/consts.py:453 -msgid "步骤强制终止成功" -msgstr "步骤强制终止成功" +#: backend/db_services/redis/rollback/handlers.py:140 +msgid "大范围内的查询结果 backup_logs: {}" +msgstr "大范围内的查询结果 backup_logs: {}" -#: backend/flow/consts.py:457 -msgid "准备中" -msgstr "准备中" +#: backend/db_services/redis/rollback/handlers.py:146 +msgid "latest_log:{},start_time:{}" +msgstr "latest_log:{},start_time:{}" -#: backend/flow/consts.py:458 -msgid "运行中" -msgstr "运行中" +#: backend/db_services/redis/rollback/handlers.py:166 +msgid "backup_logs_cluster_same_batch:{}" +msgstr "backup_logs_cluster_same_batch:{}" -#: backend/flow/consts.py:459 -msgid "完成" -msgstr "完成" +#: backend/db_services/redis/rollback/handlers.py:205 +msgid "无法查找到在时间范围内{}-{},主机{}的binlog日志" +msgstr "无法查找到在时间范围内{}-{},主机{}的binlog日志" -#: backend/flow/consts.py:460 -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:94 -#: backend/ticket/constants.py:66 backend/ticket/constants.py:76 -msgid "失败" -msgstr "失败" +#: backend/db_services/redis/rollback/handlers.py:238 +#: backend/db_services/redis/rollback/handlers.py:261 +msgid "binlog全部文件信息:{}" +msgstr "binlog全部文件信息:{}" -#: backend/flow/consts.py:465 -msgid "available" -msgstr "available" +#: backend/db_services/redis/rollback/handlers.py:240 +msgid "节点{}:{}的kvstore:{}的binlog 数少于2,不符合预期,请检查error日志" +msgstr "节点{}:{}的kvstore:{}的binlog 数少于2,不符合预期,请检查error日志" -#: backend/flow/consts.py:467 -msgid "locked" -msgstr "locked" +#: backend/db_services/redis/rollback/handlers.py:262 +msgid "节点{}:{}的binlog 数少于2,不符合预期,请检查error日志" +msgstr "节点{}:{}的binlog 数少于2,不符合预期,请检查error日志" -#: backend/flow/consts.py:471 -msgid "cluster no" -msgstr "cluster no" +#: backend/db_services/redis/rollback/handlers.py:305 +msgid "文件序号重复: {},文件重复: {}" +msgstr "文件序号重复: {},文件重复: {}" -#: backend/flow/consts.py:472 -msgid "cluster yes" -msgstr "cluster yes" +#: backend/db_services/redis/rollback/handlers.py:309 +msgid "缺失时打印当前文件:{}和上一个文件: {}" +msgstr "缺失时打印当前文件:{}和上一个文件: {}" -#: backend/flow/consts.py:476 backend/flow/consts.py:484 -msgid "create" -msgstr "create" +#: backend/db_services/redis/rollback/handlers.py:357 +msgid "" +"无法找到filter:{}小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "无法找到filter:{}小于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" -#: backend/flow/consts.py:477 -msgid "cluster_delete" -msgstr "cluster_delete" +#: backend/db_services/redis/rollback/handlers.py:366 +msgid "" +"无法找到filter:{}大于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" +msgstr "无法找到filter:{}大于时间点{}附近的日志记录,请检查时间点的合法性或稍后重试" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:10 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:10 +msgid "单据号,关联单据" +msgstr "单据号,关联单据" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:11 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:11 +msgid "业务id" +msgstr "业务id" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:16 +msgid "构造源集群类型" +msgstr "构造源集群类型" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:18 +msgid "构造的源集群,线上环境cluster" +msgstr "构造的源集群,线上环境cluster" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:19 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:18 +msgid "集群id,cluster.id" +msgstr "集群id,cluster.id" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:20 +msgid "源构造的实例范围" +msgstr "源构造的实例范围" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:23 +msgid "临时集群类型" +msgstr "临时集群类型" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:25 +msgid "临时集群proxy密码base64值" +msgstr "临时集群proxy密码base64值" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:26 +msgid "临时集群构造实例范围" +msgstr "临时集群构造实例范围" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:27 +msgid "构造产物访问入口ip:port" +msgstr "构造产物访问入口ip:port" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:29 +msgid "构造源实例和临时实例一一对应关系" +msgstr "构造源实例和临时实例一一对应关系" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:40 +msgid "销毁状态" +msgstr "销毁状态" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:42 +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:42 +msgid "规格需求" +msgstr "规格需求" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:43 +msgid "构造的主机数量" +msgstr "构造的主机数量" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:44 +msgid "构造到指定时间" +msgstr "构造到指定时间" + +#: backend/db_services/redis/rollback/models/tb_tendis_data_construction_task.py:45 +msgid "临时集群redis密码base64值" +msgstr "临时集群redis密码base64值" + +#: backend/db_services/redis/rollback/serializers.py:36 +#: backend/db_services/redis/toolbox/serializers.py:178 +#: backend/db_services/redis/toolbox/serializers.py:185 +msgid "集群id" +msgstr "集群id" + +#: backend/db_services/redis/rollback/serializers.py:37 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:36 +msgid "master实例列表" +msgstr "master实例列表" + +#: backend/db_services/redis/rollback/serializers.py:38 +msgid "构造时间" +msgstr "构造时间" + +#: backend/db_services/redis/rollback/views.py:72 +msgid "构造时间合法性检查" +msgstr "构造时间合法性检查" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:22 +msgid "扩缩容前实例主从对" +msgstr "扩缩容前实例主从对" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:23 +msgid "扩缩容后实例主从对" +msgstr "扩缩容后实例主从对" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:25 +msgid "扩容新增实例主从对" +msgstr "扩容新增实例主从对" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:27 +msgid "缩容下架实例主从对" +msgstr "缩容下架实例主从对" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:28 +msgid "扩缩容前的主机数量" +msgstr "扩缩容前的主机数量" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:29 +msgid "扩缩容后的主机数量" +msgstr "扩缩容后的主机数量" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:31 +msgid "扩容时新增的主从主机" +msgstr "扩容时新增的主从主机" + +#: backend/db_services/redis/slots_migrate/models/slots_migration_record.py:34 +msgid "特定slots迁移信息" +msgstr "特定slots迁移信息" + +#: backend/db_services/redis/toolbox/serializers.py:20 +msgid "集群id/name/domain列表" +msgstr "集群id/name/domain列表" + +#: backend/db_services/redis/toolbox/serializers.py:187 +msgid "limit" +msgstr "limit" + +#: backend/db_services/redis/toolbox/serializers.py:188 +msgid "offset" +msgstr "offset" + +#: backend/db_services/redis/toolbox/serializers.py:219 +msgid "集群节点类型" +msgstr "集群节点类型" + +#: backend/db_services/redis/toolbox/serializers.py:220 +msgid "请求版本类型" +msgstr "请求版本类型" + +#: backend/db_services/redis/toolbox/serializers.py:225 +msgid "存储版本" +msgstr "存储版本" + +#: backend/db_services/redis/toolbox/serializers.py:226 +msgid "新规格ID" +msgstr "新规格ID" + +#: backend/db_services/redis/toolbox/serializers.py:227 +msgid "申请机器组数量" +msgstr "申请机器组数量" + +#: backend/db_services/redis/toolbox/serializers.py:228 +msgid "新的分片数量" +msgstr "新的分片数量" + +#: backend/db_services/redis/toolbox/views.py:41 +msgid "根据IP/实例查询关联对" +msgstr "根据IP/实例查询关联对" + +#: backend/db_services/redis/toolbox/views.py:52 +msgid "查询集群下的主机列表" +msgstr "查询集群下的主机列表" + +#: backend/db_services/redis/toolbox/views.py:64 +msgid "根据cluster_id查询主从关系对" +msgstr "根据cluster_id查询主从关系对" + +#: backend/db_services/redis/toolbox/views.py:74 +msgid "查询集群版本信息" +msgstr "查询集群版本信息" + +#: backend/db_services/redis/toolbox/views.py:88 +msgid "获取集群容量变更所需信息" +msgstr "获取集群容量变更所需信息" + +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "构造 DB 名称" +msgstr "构造 DB 名称" -#: backend/flow/consts.py:478 -msgid "recycle_record" -msgstr "recycle_record" +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "构造后 DB 名称" +msgstr "构造后 DB 名称" -#: backend/flow/consts.py:479 backend/flow/consts.py:485 -msgid "update" -msgstr "update" +#: backend/db_services/sqlserver/cluster/handlers.py:60 +msgid "已存在的 DB" +msgstr "已存在的 DB" -#: backend/flow/consts.py:480 -msgid "select" -msgstr "select" +#: backend/db_services/sqlserver/cluster/handlers.py:77 +msgid "导入的源DB不与集群DB匹配,请检查excel数据" +msgstr "导入的源DB不与集群DB匹配,请检查excel数据" -#: backend/flow/consts.py:486 -msgid "delete" -msgstr "delete" +#: backend/db_services/sqlserver/cluster/serializers.py:19 +#: backend/db_services/sqlserver/cluster/serializers.py:47 +msgid "忽略db列表" +msgstr "忽略db列表" + +#: backend/db_services/sqlserver/cluster/serializers.py:29 +#: backend/db_services/sqlserver/rollback/serializers.py:73 +msgid "构造DB的excel文件" +msgstr "构造DB的excel文件" + +#: backend/db_services/sqlserver/cluster/serializers.py:30 +#: backend/db_services/sqlserver/rollback/serializers.py:74 +msgid "db列表(逗号分隔)" +msgstr "db列表(逗号分隔)" -#: backend/flow/consts.py:490 -msgid "kibana" -msgstr "kibana" +#: backend/db_services/sqlserver/cluster/serializers.py:31 +#: backend/db_services/sqlserver/rollback/serializers.py:75 +msgid "忽略db列表(逗号分割)" +msgstr "忽略db列表(逗号分割)" -#: backend/flow/consts.py:491 -msgid "kafka_manager" -msgstr "kafka_manager" +#: backend/db_services/sqlserver/cluster/views.py:39 +msgid "通过库表匹配查询db" +msgstr "通过库表匹配查询db" -#: backend/flow/consts.py:492 -msgid "pulsar_manager" -msgstr "pulsar_manager" +#: backend/db_services/sqlserver/cluster/views.py:50 +msgid "通过库表匹配批量查询db" +msgstr "通过库表匹配批量查询db" -#: backend/flow/consts.py:493 -msgid "ha_proxy" -msgstr "ha_proxy" +#: backend/db_services/sqlserver/cluster/views.py:61 +msgid "判断库名是否在集群存在" +msgstr "判断库名是否在集群存在" -#: backend/flow/consts.py:497 -msgid "KIBANA_PORT" -msgstr "KIBANA_PORT" +#: backend/db_services/sqlserver/cluster/views.py:72 +msgid "导入构造DB数据" +msgstr "导入构造DB数据" -#: backend/flow/consts.py:498 -msgid "KAFKA_MANAGER_PORT" -msgstr "KAFKA_MANAGER_PORT" +#: backend/db_services/sqlserver/data_migrate/serializers.py:27 +msgid "请保证单据类型是[SQLServer 增量迁移]" +msgstr "请保证单据类型是[SQLServer 增量迁移]" -#: backend/flow/consts.py:508 -msgid "proxy默认实例个数" -msgstr "proxy默认实例个数" +#: backend/db_services/sqlserver/data_migrate/serializers.py:29 +msgid "请保证迁移模式是[增量备份迁移]" +msgstr "请保证迁移模式是[增量备份迁移]" -#: backend/flow/consts.py:509 -msgid "redis角色数" -msgstr "redis角色数" +#: backend/db_services/sqlserver/data_migrate/serializers.py:43 +msgid "迁移记录{}不存在" +msgstr "迁移记录{}不存在" -#: backend/flow/consts.py:513 -msgid "DB安装目录" -msgstr "DB安装目录" +#: backend/db_services/sqlserver/data_migrate/views.py:40 +msgid "手动断开同步" +msgstr "手动断开同步" -#: backend/flow/consts.py:517 -msgid "gcs 安装路径" -msgstr "gcs 安装路径" +#: backend/db_services/sqlserver/data_migrate/views.py:52 +msgid "强制终止" +msgstr "强制终止" -#: backend/flow/consts.py:518 -msgid "key生命周期路径" -msgstr "key生命周期路径" +#: backend/db_services/sqlserver/data_migrate/views.py:63 +msgid "获取迁移记录" +msgstr "获取迁移记录" -#: backend/flow/consts.py:522 -msgid "truncate_table" -msgstr "truncate_table" +#: backend/db_services/sqlserver/permission/db_authorize/handlers.py:66 +msgid "不存在集群:{}" +msgstr "不存在集群:{}" -#: backend/flow/consts.py:523 -msgid "drop_database" -msgstr "drop_database" +#: backend/db_services/sqlserver/permission/db_authorize/serializers.py:24 +msgid "sqlserver账户规则" +msgstr "sqlserver账户规则" -#: backend/flow/consts.py:524 -msgid "drop_table" -msgstr "drop_table" +#: backend/db_services/sqlserver/rollback/handlers.py:173 +msgid "集群【{}】最近的{}天里找不到日志备份" +msgstr "集群【{}】最近的{}天里找不到日志备份" -#: backend/flow/consts.py:547 -msgid "TendataModuleDefault" -msgstr "TendataModuleDefault" +#: backend/db_services/sqlserver/rollback/handlers.py:194 +msgid "" +"请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取到无关联的日志备份记录[{}]" +msgstr "请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取到无关联的日志备份记录[{}]" -#: backend/flow/consts.py:551 backend/ticket/builders/common/constants.py:38 -msgid "hot" -msgstr "hot" +#: backend/db_services/sqlserver/rollback/handlers.py:212 +msgid "" +"请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取的日志备份存在不连续的情况:" +"the first_lsn [{}]:[{}]; the last_lsn [{}]:[{}]\n" +msgstr "请联系系统管理员,恢复集群[{}]的数据库[{}]中拉取的日志备份存在不连续的情况:the first_lsn [{}]:[{}]; the last_lsn [{}]:[{}]\n" -#: backend/flow/consts.py:552 backend/ticket/builders/common/constants.py:39 -msgid "cold" -msgstr "cold" +#: backend/db_services/sqlserver/rollback/serializers.py:47 +msgid "库匹配模式" +msgstr "库匹配模式" -#: backend/flow/consts.py:553 backend/ticket/builders/common/constants.py:40 -msgid "client" -msgstr "client" +#: backend/db_services/sqlserver/rollback/serializers.py:48 +msgid "忽略库匹配模式" +msgstr "忽略库匹配模式" -#: backend/flow/consts.py:558 -msgid "redis key删除正则方式" -msgstr "redis key删除正则方式" +#: backend/db_services/sqlserver/rollback/serializers.py:49 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:53 +msgid "备份记录" +msgstr "备份记录" -#: backend/flow/consts.py:559 -msgid "redis key删除文件方式" -msgstr "redis key删除文件方式" +#: backend/db_services/sqlserver/rollback/serializers.py:54 +msgid "请输入备份记录或者备份时间来查询操作库表" +msgstr "请输入备份记录或者备份时间来查询操作库表" -#: backend/flow/consts.py:563 -msgid "get" -msgstr "get" +#: backend/db_services/sqlserver/rollback/serializers.py:60 +msgid "只能选取回滚近15天的时间" +msgstr "只能选取回滚近15天的时间" -#: backend/flow/consts.py:564 -msgid "release" -msgstr "release" +#: backend/db_services/sqlserver/rollback/serializers.py:77 +msgid "备份记录(json转义)" +msgstr "备份记录(json转义)" -#: backend/flow/consts.py:568 -msgid "覆盖写入上下文变量" -msgstr "覆盖写入上下文变量" +#: backend/db_services/sqlserver/rollback/serializers.py:82 +msgid "请保证输入回档信息" +msgstr "请保证输入回档信息" -#: backend/flow/consts.py:569 -msgid "追加写入上下文变量" -msgstr "追加写入上下文变量" +#: backend/db_services/sqlserver/rollback/views.py:43 +msgid "查询集群备份记录" +msgstr "查询集群备份记录" -#: backend/flow/consts.py:573 -msgid "install-supervisor" -msgstr "install-supervisor" +#: backend/db_services/sqlserver/rollback/views.py:57 +msgid "根据回档时间集群最近备份记录" +msgstr "根据回档时间集群最近备份记录" -#: backend/flow/consts.py:574 -msgid "render-config" -msgstr "render-config" +#: backend/db_services/sqlserver/rollback/views.py:73 +msgid "根据备份记录和库匹配模式查询操作库" +msgstr "根据备份记录和库匹配模式查询操作库" -#: backend/flow/consts.py:577 -msgid "install-zookeeper" -msgstr "install-zookeeper" +#: backend/db_services/sqlserver/rollback/views.py:85 +msgid "导入构造DB数据(备份信息校验)" +msgstr "导入构造DB数据(备份信息校验)" -#: backend/flow/consts.py:578 -msgid "install-journalnode" -msgstr "install-journalnode" +#: backend/db_services/sqlserver/sql_import/views.py:34 +msgid "sql文件导入" +msgstr "sql文件导入" -#: backend/flow/consts.py:579 -msgid "install-nn1" -msgstr "install-nn1" +#: backend/db_services/sqlserver/sql_import/views.py:44 +msgid "sqlserver语法检查" +msgstr "sqlserver语法检查" -#: backend/flow/consts.py:580 -msgid "install-nn2" -msgstr "install-nn2" +#: backend/db_services/taskflow/exceptions.py:18 +msgid "任务流程模块异常" +msgstr "任务流程模块异常" -#: backend/flow/consts.py:581 -msgid "install-dn" -msgstr "install-dn" +#: backend/db_services/taskflow/exceptions.py:23 +msgid "重试节点异常" +msgstr "重试节点异常" -#: backend/flow/consts.py:582 -msgid "install-zkfc" -msgstr "install-zkfc" +#: backend/db_services/taskflow/exceptions.py:28 +msgid "回调节点异常" +msgstr "回调节点异常" -#: backend/flow/consts.py:583 -msgid "install-telegraf" -msgstr "install-telegraf" +#: backend/db_services/taskflow/exceptions.py:33 +msgid "跳过节点异常" +msgstr "跳过节点异常" -#: backend/flow/consts.py:584 -msgid "install-haproxy" -msgstr "install-haproxy" +#: backend/db_services/taskflow/exceptions.py:38 +msgid "强制失败节点异常" +msgstr "强制失败节点异常" -#: backend/flow/consts.py:585 -msgid "update-hosts" -msgstr "update-hosts" +#: backend/db_services/taskflow/exceptions.py:43 +msgid "撤销流程异常" +msgstr "撤销流程异常" -#: backend/flow/consts.py:586 -msgid "stop-process" -msgstr "stop-process" +#: backend/db_services/taskflow/handlers.py:58 +msgid "pipeline未创建,仅更新FlowTree" +msgstr "pipeline未创建,仅更新FlowTree" -#: backend/flow/consts.py:587 -msgid "start-component" -msgstr "start-component" +#: backend/db_services/taskflow/handlers.py:101 +msgid "人工强制失败" +msgstr "人工强制失败" -#: backend/flow/consts.py:588 -msgid "clean-data" -msgstr "clean-data" +#: backend/db_services/taskflow/handlers.py:206 +msgid "节点尚未运行,请稍后查看" +msgstr "节点尚未运行,请稍后查看" -#: backend/flow/consts.py:589 -msgid "dfs-host" -msgstr "dfs-host" +#: backend/db_services/taskflow/handlers.py:208 +msgid "节点日志仅保留7天" +msgstr "节点日志仅保留7天" -#: backend/flow/consts.py:600 backend/ticket/builders/common/constants.py:45 -msgid "namenode" -msgstr "namenode" +#: backend/db_services/taskflow/handlers.py:240 +msgid "日志上报中,请稍后查看" +msgstr "日志上报中,请稍后查看" -#: backend/flow/consts.py:601 backend/ticket/builders/common/constants.py:44 -msgid "datanode" -msgstr "datanode" +#: backend/db_services/taskflow/serializers.py:21 +#: backend/ticket/serializers.py:91 +msgid "单据类型名称" +msgstr "单据类型名称" -#: backend/flow/consts.py:602 -msgid "journalnode" -msgstr "journalnode" +#: backend/db_services/taskflow/serializers.py:22 +#: backend/ticket/serializers.py:93 backend/ticket/serializers.py:138 +#: backend/ticket/serializers.py:215 +msgid "耗时" +msgstr "耗时" -#: backend/flow/consts.py:604 -msgid "zkfc" -msgstr "zkfc" +#: backend/db_services/taskflow/serializers.py:48 backend/flow/models.py:43 +msgid "节点ID" +msgstr "节点ID" -#: backend/flow/consts.py:608 backend/ticket/builders/common/constants.py:54 -msgid "bookkeeper" -msgstr "bookkeeper" +#: backend/db_services/taskflow/serializers.py:56 +msgid "回调描述" +msgstr "回调描述" -#: backend/flow/consts.py:615 -msgid "常规备份" -msgstr "常规备份" +#: backend/db_services/taskflow/serializers.py:60 backend/flow/models.py:24 +#: backend/flow/models.py:42 +msgid "流程ID" +msgstr "流程ID" -#: backend/flow/consts.py:616 -msgid "长期备份" -msgstr "长期备份" +#: backend/db_services/taskflow/serializers.py:62 +msgid "是否严格匹配列名" +msgstr "是否严格匹配列名" -#: backend/flow/consts.py:620 -msgid "KAFKA_REPLACE" -msgstr "KAFKA_REPLACE" +#: backend/db_services/taskflow/serializers.py:66 +msgid "版本ID" +msgstr "版本ID" -#: backend/flow/consts.py:621 -msgid "KAFKA_SCALE_UP" -msgstr "KAFKA_SCALE_UP" +#: backend/db_services/taskflow/serializers.py:67 +msgid "是否下载日志" +msgstr "是否下载日志" -#: backend/flow/consts.py:625 -msgid "INFLUXDB_REPLACE" -msgstr "INFLUXDB_REPLACE" +#: backend/db_services/taskflow/task.py:74 +msgid "自动重试次数已超过最大重试次数{}, 请重新手动重试" +msgstr "自动重试次数已超过最大重试次数{}, 请重新手动重试" -#: backend/flow/consts.py:629 -msgid "逻辑备份" -msgstr "逻辑备份" +#: backend/db_services/taskflow/task.py:93 +msgid "存在执行互斥,正在进行重试,当前重试次数为{}" +msgstr "存在执行互斥,正在进行重试,当前重试次数为{}" -#: backend/flow/consts.py:630 -msgid "物理备份" -msgstr "物理备份" +#: backend/db_services/taskflow/task.py:96 +msgid "执行互斥错误信息: {}" +msgstr "执行互斥错误信息: {}" -#: backend/flow/consts.py:634 -msgid "全备-保留25天" -msgstr "全备-保留25天" +#: backend/db_services/taskflow/task.py:103 +msgid "存在执行互斥将自动进行重试..." +msgstr "存在执行互斥将自动进行重试..." -#: backend/flow/consts.py:635 -msgid "长久存储-保留三年" -msgstr "长久存储-保留三年" +#: backend/db_services/taskflow/task.py:113 +msgid "重试成功" +msgstr "重试成功" -#: backend/flow/consts.py:643 -msgid "Mysql的进程名称" -msgstr "Mysql的进程名称" +#: backend/db_services/taskflow/task.py:162 +msgid "未开启bamboo数据清理,跳过..." +msgstr "未开启bamboo数据清理,跳过..." -#: backend/flow/consts.py:644 -msgid "Mysql-proxy进程名称" -msgstr "Mysql-proxy进程名称" +#: backend/db_services/taskflow/task.py:168 +msgid "开始清理时间{}前的bamboo数据" +msgstr "开始清理时间{}前的bamboo数据" -#: backend/flow/consts.py:645 -msgid "ES的进程名称" -msgstr "ES的进程名称" +#: backend/db_services/taskflow/task.py:174 +msgid "没有需要清理的bamboo数据,跳过..." +msgstr "没有需要清理的bamboo数据,跳过..." -#: backend/flow/consts.py:646 -msgid "HDFS-NameNode的进程名称" -msgstr "HDFS-NameNode的进程名称" +#: backend/db_services/taskflow/task.py:180 +msgid "{}数据清理..." +msgstr "{}数据清理..." -#: backend/flow/consts.py:647 -msgid "HDFS-DataNode的进程名称" -msgstr "HDFS-DataNode的进程名称" +#: backend/db_services/taskflow/task.py:185 +msgid "bamboo数据清理成功" +msgstr "bamboo数据清理成功" -#: backend/flow/consts.py:648 -msgid "Pulsar的进程名称" -msgstr "Pulsar的进程名称" +#: backend/db_services/taskflow/task.py:187 +msgid "bamboo数据清理失败,错误原因: {}" +msgstr "bamboo数据清理失败,错误原因: {}" -#: backend/flow/consts.py:656 -msgid "远程备份+时间" -msgstr "远程备份+时间" +#: backend/db_services/taskflow/views/flow.py:77 +msgid "任务列表" +msgstr "任务列表" -#: backend/flow/consts.py:657 -msgid "远程备份+备份ID" -msgstr "远程备份+备份ID" +#: backend/db_services/taskflow/views/flow.py:96 +msgid "任务详情" +msgstr "任务详情" -#: backend/flow/consts.py:658 -msgid "本地备份+时间" -msgstr "本地备份+时间" +#: backend/db_services/taskflow/views/flow.py:126 +msgid "撤销流程" +msgstr "撤销流程" -#: backend/flow/consts.py:659 -msgid "本地备份+备份ID" -msgstr "本地备份+备份ID" +#: backend/db_services/taskflow/views/flow.py:135 +msgid "重试节点" +msgstr "重试节点" -#: backend/flow/consts.py:667 -msgid "手动单据发起" -msgstr "手动单据发起" +#: backend/db_services/taskflow/views/flow.py:149 +msgid "批量重试" +msgstr "批量重试" -#: backend/flow/consts.py:668 -msgid "例行校验单据发起" -msgstr "例行校验单据发起" +#: backend/db_services/taskflow/views/flow.py:159 +msgid "跳过节点" +msgstr "跳过节点" -#: backend/flow/consts.py:674 -msgid "ms" -msgstr "ms" +#: backend/db_services/taskflow/views/flow.py:169 +msgid "强制失败节点" +msgstr "强制失败节点" -#: backend/flow/consts.py:684 -msgid "redis slot分隔符" -msgstr "redis slot分隔符" +#: backend/db_services/taskflow/views/flow.py:179 +msgid "节点版本列表" +msgstr "节点版本列表" -#: backend/flow/consts.py:685 -msgid "redis slot导入分隔符" -msgstr "redis slot导入分隔符" +#: backend/db_services/taskflow/views/flow.py:190 +msgid "节点日志" +msgstr "节点日志" -#: backend/flow/consts.py:686 -msgid "redis slot迁移分隔符" -msgstr "redis slot迁移分隔符" +#: backend/db_services/taskflow/views/flow.py:212 +msgid "回调节点" +msgstr "回调节点" -#: backend/flow/consts.py:694 -msgid "redis min slot" -msgstr "redis min slot" +#: backend/db_services/taskflow/views/flow.py:227 +msgid "流程Excel文件下载" +msgstr "流程Excel文件下载" -#: backend/flow/consts.py:695 -msgid "redis max slot" -msgstr "redis max slot" +#: backend/db_services/taskflow/views/flow.py:237 +msgid "获取root_id缓存数据失败" +msgstr "获取root_id缓存数据失败" -#: backend/flow/consts.py:696 -msgid "redis total slot" -msgstr "redis total slot" +#: backend/db_services/taskflow/views/redis.py:57 +msgid "结果文件列表" +msgstr "结果文件列表" -#: backend/flow/consts.py:704 -msgid "redis PFAIL state" -msgstr "redis PFAIL state" +#: backend/db_services/user/serializers.py:16 +msgid "模糊搜索" +msgstr "模糊搜索" -#: backend/flow/consts.py:705 -msgid "redis fail state" -msgstr "redis fail state" +#: backend/db_services/user/serializers.py:17 +msgid "精确搜索" +msgstr "精确搜索" -#: backend/flow/consts.py:706 -msgid "redis handshake state" -msgstr "redis handshake state" +#: backend/db_services/user/serializers.py:19 +msgid "不分页,即将下架,请不要使用,并尽快迁移" +msgstr "不分页,即将下架,请不要使用,并尽快迁移" -#: backend/flow/consts.py:707 -msgid "redis noaddr state" -msgstr "redis noaddr state" +#: backend/db_services/version/constants.py:24 +msgid "MySQL-5.6" +msgstr "MySQL-5.6" -#: backend/flow/consts.py:708 -msgid "redis noflags state" -msgstr "redis noflags state" +#: backend/db_services/version/constants.py:25 +msgid "MySQL-5.7" +msgstr "MySQL-5.7" -#: backend/flow/consts.py:716 -msgid "redis master role" -msgstr "redis master role" +#: backend/db_services/version/constants.py:26 +msgid "MySQL-8.0" +msgstr "MySQL-8.0" -#: backend/flow/consts.py:717 -msgid "redis slave role" -msgstr "redis slave role" +#: backend/db_services/version/constants.py:32 +msgid "Spider-1" +msgstr "Spider-1" -#: backend/flow/consts.py:718 -msgid "redis unknown role" -msgstr "redis unknown role" +#: backend/db_services/version/constants.py:33 +msgid "Spider-3" +msgstr "Spider-3" -#: backend/flow/consts.py:726 -msgid "redis master link status up" -msgstr "redis master link status up" +#: backend/db_services/version/constants.py:34 +msgid "Spider-3.6" +msgstr "Spider-3.6" -#: backend/flow/consts.py:727 -msgid "redis master link status down" -msgstr "redis master link status down" +#: backend/db_services/version/constants.py:35 +msgid "Spider-3.7" +msgstr "Spider-3.7" -#: backend/flow/consts.py:728 -msgid "redis ssd incrSync state" -msgstr "redis ssd incrSync state" +#: backend/db_services/version/constants.py:36 +msgid "Spider-3.8" +msgstr "Spider-3.8" -#: backend/flow/consts.py:729 -msgid "redis ssd REPL_FOLLOW state" -msgstr "redis ssd REPL_FOLLOW state" +#: backend/db_services/version/constants.py:42 +msgid "Redis-2" +msgstr "Redis-2" -#: backend/flow/consts.py:730 -msgid "redis connected status" -msgstr "redis connected status" +#: backend/db_services/version/constants.py:43 +msgid "Redis-3" +msgstr "Redis-3" -#: backend/flow/consts.py:731 -msgid "redis disconnected status" -msgstr "redis disconnected status" +#: backend/db_services/version/constants.py:44 +msgid "Redis-4" +msgstr "Redis-4" -#: backend/flow/consts.py:739 -msgid "" -"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" -msgstr "" -"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" +#: backend/db_services/version/constants.py:45 +msgid "Redis-4t" +msgstr "Redis-4t" -#: backend/flow/consts.py:740 -msgid "" -"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" -msgstr "" -"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" +#: backend/db_services/version/constants.py:46 +msgid "Redis-4.0.9" +msgstr "Redis-4.0.9" -#: backend/flow/consts.py:749 -msgid "tdbctl" -msgstr "tdbctl" +#: backend/db_services/version/constants.py:47 +msgid "Redis-5" +msgstr "Redis-5" -#: backend/flow/engine/bamboo/engine.py:245 -msgid "获取流程失败" -msgstr "获取流程失败" +#: backend/db_services/version/constants.py:48 +msgid "Redis-6" +msgstr "Redis-6" -#: backend/flow/engine/bamboo/engine.py:248 -msgid "获取流程节点失败" -msgstr "获取流程节点失败" +#: backend/db_services/version/constants.py:49 +msgid "Redis-7" +msgstr "Redis-7" -#: backend/flow/engine/bamboo/engine.py:251 -msgid "获取节点运行版本失败" -msgstr "获取节点运行版本失败" +#: backend/db_services/version/constants.py:50 +msgid "Redis-7.2" +msgstr "Redis-7.2" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:127 -msgid "下发{}可执行文件包" -msgstr "下发{}可执行文件包" +#: backend/db_services/version/constants.py:56 +msgid "Mongodb-4" +msgstr "Mongodb-4" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:136 -msgid "部署{}服务进程" -msgstr "部署{}服务进程" +#: backend/db_services/version/constants.py:62 +msgid "Tendisplus-2.5" +msgstr "Tendisplus-2.5" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:185 -msgid "下发{}配置文件" -msgstr "下发{}配置文件" +#: backend/db_services/version/constants.py:63 +msgid "Tendisplus-2.6" +msgstr "Tendisplus-2.6" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:311 -msgid "存量集群的权限更新" -msgstr "存量集群的权限更新" +#: backend/db_services/version/constants.py:64 +msgid "Tendisplus-2.7" +msgstr "Tendisplus-2.7" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:339 -msgid "更新服务元信息" -msgstr "更新服务元信息" +#: backend/db_services/version/constants.py:70 +msgid "TendisSSD-1.2" +msgstr "TendisSSD-1.2" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:364 -msgid "裁撤{}的服务" -msgstr "裁撤{}的服务" +#: backend/db_services/version/constants.py:71 +msgid "TendisSSD-1.3" +msgstr "TendisSSD-1.3" -#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:387 -msgid "重启nginx服务" -msgstr "重启nginx服务" +#: backend/db_services/version/constants.py:77 +msgid "TwemproxyLatest" +msgstr "TwemproxyLatest" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:40 -msgid "主机{}部署gm服务" -msgstr "主机{}部署gm服务" +#: backend/db_services/version/constants.py:83 +msgid "PredixyLatest" +msgstr "PredixyLatest" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:59 -msgid "主机{}部署agent服务" -msgstr "主机{}部署agent服务" +#: backend/db_services/version/constants.py:91 +msgid "2008企业版" +msgstr "2008企业版" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:76 -msgid "部署dbha-gm服务" -msgstr "部署dbha-gm服务" +#: backend/db_services/version/constants.py:92 +msgid "2012企业版" +msgstr "2012企业版" -#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:82 -msgid "部署dbha-agent服务" -msgstr "部署dbha-agent服务" +#: backend/db_services/version/constants.py:93 +msgid "2014企业版" +msgstr "2014企业版" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:46 -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:75 -msgid "主机{}部署dns服务" -msgstr "主机{}部署dns服务" +#: backend/db_services/version/constants.py:94 +msgid "2016企业版" +msgstr "2016企业版" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:50 -msgid "部署dns服务" -msgstr "部署dns服务" +#: backend/db_services/version/constants.py:95 +msgid "2017企业版" +msgstr "2017企业版" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:65 -msgid "对存量机器的nameserver刷新" -msgstr "对存量机器的nameserver刷新" +#: backend/db_services/version/constants.py:96 +msgid "2019企业版" +msgstr "2019企业版" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:154 -msgid "部署新dns服务流程" -msgstr "部署新dns服务流程" +#: backend/db_services/version/constants.py:97 +msgid "2022企业版" +msgstr "2022企业版" -#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:173 -msgid "裁撤旧dns服务流程" -msgstr "裁撤旧dns服务流程" +#: backend/db_services/version/views.py:29 +msgid "查询所有数据库的版本列表" +msgstr "查询所有数据库的版本列表" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:34 -msgid "部署" -msgstr "部署" +#: backend/db_services/version/views.py:39 +#: backend/db_services/version/views.py:52 +msgid "查询数据库版本列表" +msgstr "查询数据库版本列表" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:43 -msgid "主机{}部署drs服务" -msgstr "主机{}部署drs服务" +#: backend/db_services/version/views.py:65 +msgid "根据sqlserver部署版本查询可支持的系统版本" +msgstr "根据sqlserver部署版本查询可支持的系统版本" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:47 -msgid "{}drs服务" -msgstr "{}drs服务" +#: backend/dbm_init/management/commands/cloud_component.py:37 +msgid "云区域组件初始化失败,错误信息:{}" +msgstr "云区域组件初始化失败,错误信息:{}" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:75 -msgid "重装" -msgstr "重装" +#: backend/dbm_tools/management/commands/fix_process_ip.py:23 +msgid "修改指定模块的服务实例进程绑定的ip" +msgstr "修改指定模块的服务实例进程绑定的ip" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:83 -msgid "安装" -msgstr "安装" +#: backend/dbm_tools/management/commands/fix_process_ip.py:27 +msgid "目标端口" +msgstr "目标端口" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:153 -msgid "部署新drs服务" -msgstr "部署新drs服务" +#: backend/dbm_tools/management/commands/fix_process_ip.py:28 +msgid "目标ip" +msgstr "目标ip" -#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:187 -msgid "裁撤旧drs服务" -msgstr "裁撤旧drs服务" +#: backend/dbm_tools/management/commands/fix_process_ip.py:29 +msgid "替换方式" +msgstr "替换方式" -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:84 -msgid "串行化部署DNS服务" -msgstr "串行化部署DNS服务" +#: backend/dbm_tools/management/commands/fix_resource_pool.py:27 +msgid "清理资源池主机" +msgstr "清理资源池主机" -#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:85 -msgid "部署DBHA服务" -msgstr "部署DBHA服务" +#: backend/dbm_tools/management/commands/fix_resource_pool.py:30 +msgid "资源池模块ID" +msgstr "资源池模块ID" -#: backend/flow/engine/bamboo/scene/common/builder.py:118 -msgid "传入的acts_list参数不合法,请检测" -msgstr "传入的acts_list参数不合法,请检测" +#: backend/exceptions.py:53 +msgid "系统异常" +msgstr "系统异常" -#: backend/flow/engine/bamboo/scene/common/builder.py:185 -msgid "部署bamboo流程任务创建失败,任务结束" -msgstr "部署bamboo流程任务创建失败,任务结束" +#: backend/exceptions.py:108 +msgid "系统错误" +msgstr "系统错误" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:44 -msgid "执行sa空闲检查" -msgstr "执行sa空闲检查" +#: backend/exceptions.py:118 +msgid "参数验证失败" +msgstr "参数验证失败" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:57 -msgid "执行sa初始化" -msgstr "执行sa初始化" +#: backend/exceptions.py:123 +msgid "远程服务请求结果异常" +msgstr "远程服务请求结果异常" -#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:64 -#: backend/ticket/constants.py:240 -msgid "资源池导入" -msgstr "资源池导入" +#: backend/exceptions.py:128 +msgid "组件调用异常" +msgstr "组件调用异常" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:81 -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:59 -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:55 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:55 -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:66 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:65 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:71 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:72 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:69 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:65 +#: backend/exceptions.py:133 +msgid "业务不存在" +msgstr "业务不存在" + +#: backend/exceptions.py:138 +msgid "语言不支持" +msgstr "语言不支持" + +#: backend/exceptions.py:143 +msgid "权限不足" +msgstr "权限不足" + +#: backend/exceptions.py:170 +msgid "服务不稳定,请检查组件健康状况" +msgstr "服务不稳定,请检查组件健康状况" + +#: backend/flow/consts.py:159 +msgid "创建态" +msgstr "创建态" + +#: backend/flow/consts.py:160 +msgid "准备态" +msgstr "准备态" + +#: backend/flow/consts.py:161 +msgid "运行态" +msgstr "运行态" + +#: backend/flow/consts.py:162 +msgid "暂停态" +msgstr "暂停态" + +#: backend/flow/consts.py:163 +msgid "闭塞态" +msgstr "闭塞态" + +#: backend/flow/consts.py:164 +msgid "完成态" +msgstr "完成态" + +#: backend/flow/consts.py:165 +msgid "失败态" +msgstr "失败态" + +#: backend/flow/consts.py:166 +msgid "取消态" +msgstr "取消态" + +#: backend/flow/consts.py:167 +msgid "已过期" +msgstr "已过期" + +#: backend/flow/consts.py:189 +msgid "共用参数" +msgstr "共用参数" + +#: backend/flow/consts.py:190 +msgid "redis共用参数" +msgstr "redis共用参数" + +#: backend/flow/consts.py:191 +msgid "TenDBHA" +msgstr "TenDBHA" + +#: backend/flow/consts.py:192 +msgid "RedisCache 主从版" +msgstr "RedisCache 主从版" + +#: backend/flow/consts.py:193 +msgid "twemproxy + RedisInstance架构" +msgstr "twemproxy + RedisInstance架构" + +#: backend/flow/consts.py:194 +msgid "predixy + tendisplus架构" +msgstr "predixy + tendisplus架构" + +#: backend/flow/consts.py:195 +msgid "Es" +msgstr "Es" + +#: backend/flow/consts.py:196 +msgid "tendb" +msgstr "tendb" + +#: backend/flow/consts.py:198 +msgid "Hdfs" +msgstr "Hdfs" + +#: backend/flow/consts.py:200 +msgid "Influxdb" +msgstr "Influxdb" + +#: backend/flow/consts.py:201 +msgid "tendbcluster" +msgstr "tendbcluster" + +#: backend/flow/consts.py:203 +msgid "mongodbcommon" +msgstr "mongodbcommon" + +#: backend/flow/consts.py:209 +msgid "初始化帐户" +msgstr "初始化帐户" + +#: backend/flow/consts.py:210 +msgid "实例和帐户" +msgstr "实例和帐户" + +#: backend/flow/consts.py:211 +msgid "系统配置" +msgstr "系统配置" + +#: backend/flow/consts.py:212 +msgid "实例配置" +msgstr "实例配置" + +#: backend/flow/consts.py:213 backend/flow/consts.py:239 +msgid "默认配置" +msgstr "默认配置" + +#: backend/flow/consts.py:214 +msgid "proxyconfig" +msgstr "proxyconfig" + +#: backend/flow/consts.py:215 +msgid "ES实例配置" +msgstr "ES实例配置" + +#: backend/flow/consts.py:216 +msgid "act配置" +msgstr "act配置" + +#: backend/flow/consts.py:217 +msgid "系统配置类型" +msgstr "系统配置类型" + +#: backend/flow/consts.py:218 +msgid "Kafka实例配置" +msgstr "Kafka实例配置" + +#: backend/flow/consts.py:219 +msgid "HDFS集群配置" +msgstr "HDFS集群配置" + +#: backend/flow/consts.py:220 +msgid "HDFS实例hdfs-site配置" +msgstr "HDFS实例hdfs-site配置" + +#: backend/flow/consts.py:221 +msgid "HDFS实例core-site配置" +msgstr "HDFS实例core-site配置" + +#: backend/flow/consts.py:222 +msgid "HDFS实例安装配置" +msgstr "HDFS实例安装配置" + +#: backend/flow/consts.py:223 +msgid "mongod配置" +msgstr "mongod配置" + +#: backend/flow/consts.py:224 +msgid "mongos配置" +msgstr "mongos配置" + +#: backend/flow/consts.py:228 +msgid "系统" +msgstr "系统" + +#: backend/flow/consts.py:229 +msgid "twemproxy config file" +msgstr "twemproxy config file" + +#: backend/flow/consts.py:230 +msgid "predixy config file" +msgstr "predixy config file" + +#: backend/flow/consts.py:231 +msgid "redis config file" +msgstr "redis config file" + +#: backend/flow/consts.py:232 +msgid "全备配置" +msgstr "全备配置" + +#: backend/flow/consts.py:233 +msgid "增备配置" +msgstr "增备配置" + +#: backend/flow/consts.py:234 +msgid "心跳配置" +msgstr "心跳配置" + +#: backend/flow/consts.py:235 +msgid "监控配置" +msgstr "监控配置" + +#: backend/flow/consts.py:236 +msgid "基本配置" +msgstr "基本配置" + +#: backend/flow/consts.py:237 +msgid "热key配置" +msgstr "热key配置" + +#: backend/flow/consts.py:238 +msgid "大key配置" +msgstr "大key配置" + +#: backend/flow/consts.py:240 +msgid "os配置" +msgstr "os配置" + +#: backend/flow/consts.py:241 +msgid "maxmemory配置" +msgstr "maxmemory配置" + +#: backend/flow/consts.py:245 +msgid "MASTER" +msgstr "MASTER" + +#: backend/flow/consts.py:246 +msgid "SLAVE" +msgstr "SLAVE" + +#: backend/flow/consts.py:250 backend/flow/consts.py:339 +#: backend/flow/consts.py:1065 backend/flow/consts.py:1136 +msgid "mysql" +msgstr "mysql" + +#: backend/flow/consts.py:251 +msgid "mysql-proxy" +msgstr "mysql-proxy" + +#: backend/flow/consts.py:255 +msgid "dbbackup" +msgstr "dbbackup" + +#: backend/flow/consts.py:256 +msgid "dbbackup-txsql" +msgstr "dbbackup-txsql" + +#: backend/flow/consts.py:257 +msgid "actuator" +msgstr "actuator" + +#: backend/flow/consts.py:258 +msgid "exporter" +msgstr "exporter" + +#: backend/flow/consts.py:259 +msgid "最新版本" +msgstr "最新版本" + +#: backend/flow/consts.py:262 +msgid "redis_tools" +msgstr "redis_tools" + +#: backend/flow/consts.py:263 backend/flow/consts.py:347 +msgid "es" +msgstr "es" + +#: backend/flow/consts.py:264 backend/flow/consts.py:348 +msgid "kafka" +msgstr "kafka" + +#: backend/flow/consts.py:265 backend/flow/consts.py:349 +msgid "hdfs" +msgstr "hdfs" + +#: backend/flow/consts.py:266 backend/flow/consts.py:350 +msgid "pulsar" +msgstr "pulsar" + +#: backend/flow/consts.py:268 +msgid "dbmon" +msgstr "dbmon" + +#: backend/flow/consts.py:269 +msgid "mysql-checksum" +msgstr "mysql-checksum" + +#: backend/flow/consts.py:270 +msgid "Binlog 滚动备份工具" +msgstr "Binlog 滚动备份工具" + +#: backend/flow/consts.py:271 +msgid "DBA 工具集" +msgstr "DBA 工具集" + +#: backend/flow/consts.py:272 +msgid "mysql-crond" +msgstr "mysql-crond" + +#: backend/flow/consts.py:273 +msgid "MySQL 监控" +msgstr "MySQL 监控" + +#: backend/flow/consts.py:274 +msgid "nginx 服务" +msgstr "nginx 服务" + +#: backend/flow/consts.py:275 +msgid "dns-bind 服务" +msgstr "dns-bind 服务" + +#: backend/flow/consts.py:276 +msgid "dns-pull-crond服务" +msgstr "dns-pull-crond服务" + +#: backend/flow/consts.py:277 +msgid "cloud-dbha服务" +msgstr "cloud-dbha服务" + +#: backend/flow/consts.py:278 +msgid "cloud-drs服务" +msgstr "cloud-drs服务" + +#: backend/flow/consts.py:279 +msgid "cloud-drs-tmysqlparse服务" +msgstr "cloud-drs-tmysqlparse服务" + +#: backend/flow/consts.py:280 +msgid "spider节点名称" +msgstr "spider节点名称" + +#: backend/flow/consts.py:281 +msgid "spider中控节点名称" +msgstr "spider中控节点名称" + +#: backend/flow/consts.py:283 +msgid "riak-monitor" +msgstr "riak-monitor" + +#: backend/flow/consts.py:284 +msgid "redis-dts" +msgstr "redis-dts" + +#: backend/flow/consts.py:285 +msgid "redis-modules" +msgstr "redis-modules" + +#: backend/flow/consts.py:286 +msgid "tbinlogdumper实例" +msgstr "tbinlogdumper实例" + +#: backend/flow/consts.py:287 +msgid "sqlserver实例" +msgstr "sqlserver实例" + +#: backend/flow/consts.py:289 backend/flow/consts.py:360 +msgid "doris" +msgstr "doris" + +#: backend/flow/consts.py:290 backend/flow/consts.py:361 +msgid "vm" +msgstr "vm" + +#: backend/flow/consts.py:294 +msgid "nginx服务" +msgstr "nginx服务" + +#: backend/flow/consts.py:295 +msgid "dns服务" +msgstr "dns服务" + +#: backend/flow/consts.py:296 +msgid "drs服务" +msgstr "drs服务" + +#: backend/flow/consts.py:297 +msgid "dbha服务" +msgstr "dbha服务" + +#: backend/flow/consts.py:298 +msgid "redis 数据传输服务" +msgstr "redis 数据传输服务" + +#: backend/flow/consts.py:302 +msgid "pull-crond.conf" +msgstr "pull-crond.conf" + +#: backend/flow/consts.py:303 +msgid "ha-gm.conf" +msgstr "ha-gm.conf" + +#: backend/flow/consts.py:304 +msgid "ha-agent.conf" +msgstr "ha-agent.conf" + +#: backend/flow/consts.py:305 +msgid "drs.env" +msgstr "drs.env" + +#: backend/flow/consts.py:309 +msgid "GM" +msgstr "GM" + +#: backend/flow/consts.py:310 +msgid "AGENT" +msgstr "AGENT" + +#: backend/flow/consts.py:311 +msgid "mysql-monitor" +msgstr "mysql-monitor" + +#: backend/flow/consts.py:320 +msgid "nginx服务模块" +msgstr "nginx服务模块" + +#: backend/flow/consts.py:321 +msgid "dns服务模块" +msgstr "dns服务模块" + +#: backend/flow/consts.py:322 +msgid "drs服务模块" +msgstr "drs服务模块" + +#: backend/flow/consts.py:323 +msgid "dbha服务模块" +msgstr "dbha服务模块" + +#: backend/flow/consts.py:324 +msgid "redis_dts服务模块" +msgstr "redis_dts服务模块" + +#: backend/flow/consts.py:329 +msgid "蓝盾制品库" +msgstr "蓝盾制品库" + +#: backend/flow/consts.py:334 +msgid "V1" +msgstr "V1" + +#: backend/flow/consts.py:342 +msgid "tendis" +msgstr "tendis" + +#: backend/flow/consts.py:352 +msgid "bkdbmon" +msgstr "bkdbmon" + +#: backend/flow/consts.py:353 +msgid "download" +msgstr "download" + +#: backend/flow/consts.py:355 +msgid "spiderctl" +msgstr "spiderctl" + +#: backend/flow/consts.py:358 +msgid "sqlserer" +msgstr "sqlserer" + +#: backend/flow/consts.py:359 +msgid "sqlserer_check" +msgstr "sqlserer_check" + +#: backend/flow/consts.py:365 backend/flow/consts.py:442 +msgid "sysinit" +msgstr "sysinit" + +#: backend/flow/consts.py:366 backend/flow/consts.py:589 +msgid "deploy" +msgstr "deploy" + +#: backend/flow/consts.py:367 +msgid "append-deploy" +msgstr "append-deploy" + +#: backend/flow/consts.py:368 +msgid "import-schema-to-tdbctl" +msgstr "import-schema-to-tdbctl" + +#: backend/flow/consts.py:369 +msgid "icheck-tdbctl-with-spider-schema" +msgstr "icheck-tdbctl-with-spider-schema" + +#: backend/flow/consts.py:370 +msgid "find-local-backup" +msgstr "find-local-backup" + +#: backend/flow/consts.py:371 +msgid "restore-dr" +msgstr "restore-dr" + +#: backend/flow/consts.py:372 +msgid "recover-binlog" +msgstr "recover-binlog" + +#: backend/flow/consts.py:373 +msgid "grant-repl" +msgstr "grant-repl" + +#: backend/flow/consts.py:374 +msgid "change-master" +msgstr "change-master" + +#: backend/flow/consts.py:375 +msgid "set-backend" +msgstr "set-backend" + +#: backend/flow/consts.py:376 backend/flow/consts.py:600 +msgid "uninstall" +msgstr "uninstall" + +#: backend/flow/consts.py:377 +msgid "deploy-dbbackup" +msgstr "deploy-dbbackup" + +#: backend/flow/consts.py:378 backend/flow/consts.py:597 +msgid "install-monitor" +msgstr "install-monitor" + +#: backend/flow/consts.py:379 backend/flow/consts.py:385 +msgid "semantic-dumpschema" +msgstr "semantic-dumpschema" + +#: backend/flow/consts.py:380 +msgid "import-sqlfile" +msgstr "import-sqlfile" + +#: backend/flow/consts.py:381 +msgid "clone-client-grant" +msgstr "clone-client-grant" + +#: backend/flow/consts.py:382 +msgid "clone-proxy-user" +msgstr "clone-proxy-user" + +#: backend/flow/consts.py:383 backend/flow/consts.py:599 +msgid "clear-crontab" +msgstr "clear-crontab" + +#: backend/flow/consts.py:384 +msgid "semantic-check" +msgstr "semantic-check" + +#: backend/flow/consts.py:386 +msgid "dump" +msgstr "dump" + +#: backend/flow/consts.py:388 backend/flow/consts.py:602 +#: backend/flow/utils/doris/consts.py:35 backend/flow/utils/vm/consts.py:31 +msgid "restart" +msgstr "restart" + +#: backend/flow/consts.py:389 +msgid "clean-mysql" +msgstr "clean-mysql" + +#: backend/flow/consts.py:390 +msgid "backup-database-table" +msgstr "backup-database-table" + +#: backend/flow/consts.py:391 +msgid "set-backend-toward-slave" +msgstr "set-backend-toward-slave" + +#: backend/flow/consts.py:392 +msgid "pt-table-checksum" +msgstr "pt-table-checksum" + +#: backend/flow/consts.py:393 +msgid "执行分区" +msgstr "执行分区" + +#: backend/flow/consts.py:394 +msgid "ibs-recover" +msgstr "ibs-recover" + +#: backend/flow/consts.py:395 +msgid "数据修复指令" +msgstr "数据修复指令" + +#: backend/flow/consts.py:396 +msgid "flashback-binlog" +msgstr "flashback-binlog" + +#: backend/flow/consts.py:397 +msgid "full-backup" +msgstr "full-backup" + +#: backend/flow/consts.py:398 +msgid "install-checksum" +msgstr "install-checksum" + +#: backend/flow/consts.py:399 +msgid "mycnf-change" +msgstr "mycnf-change" + +#: backend/flow/consts.py:400 +msgid "安装mysql-rotatebinlog程序" +msgstr "安装mysql-rotatebinlog程序" + +#: backend/flow/consts.py:401 +msgid "安装dba-toolkit程序" +msgstr "安装dba-toolkit程序" + +#: backend/flow/consts.py:402 +msgid "deploy-mysql-crond" +msgstr "deploy-mysql-crond" + +#: backend/flow/consts.py:403 +msgid "mysql实例的周边配置清理" +msgstr "mysql实例的周边配置清理" + +#: backend/flow/consts.py:404 +msgid "初始化spider集群节点关系" +msgstr "初始化spider集群节点关系" + +#: backend/flow/consts.py:405 +msgid "添加spider临时节点" +msgstr "添加spider临时节点" + +#: backend/flow/consts.py:406 +msgid "restart-spider" +msgstr "restart-spider" + +#: backend/flow/consts.py:407 +msgid "添加spider-slave集群的相关路由信息" +msgstr "添加spider-slave集群的相关路由信息" + +#: backend/flow/consts.py:408 +msgid "mysql备份请求" +msgstr "mysql备份请求" + +#: backend/flow/consts.py:409 +msgid "TenDBCluster集群做后端切换" +msgstr "TenDBCluster集群做后端切换" + +#: backend/flow/consts.py:410 +msgid "TenDBCluster集群做后端的成对迁移" +msgstr "TenDBCluster集群做后端的成对迁移" + +#: backend/flow/consts.py:411 +msgid "为TBinlogDumper实例导出导入源表结构" +msgstr "为TBinlogDumper实例导出导入源表结构" + +#: backend/flow/consts.py:412 +msgid "执行os命令" +msgstr "执行os命令" + +#: backend/flow/consts.py:413 +msgid "Mysql开区导出库表结构" +msgstr "Mysql开区导出库表结构" + +#: backend/flow/consts.py:414 +msgid "Mysql开区导入库表结构" +msgstr "Mysql开区导入库表结构" + +#: backend/flow/consts.py:415 +msgid "Mysql开区导出库表数据" +msgstr "Mysql开区导出库表数据" + +#: backend/flow/consts.py:416 +msgid "Mysql开区导入库表数据" +msgstr "Mysql开区导入库表数据" + +#: backend/flow/consts.py:417 +msgid "MySQL实例安装tokudb引擎" +msgstr "MySQL实例安装tokudb引擎" + +#: backend/flow/consts.py:418 +msgid "标准化MySQL实例" +msgstr "标准化MySQL实例" + +#: backend/flow/consts.py:419 +msgid "标准化Proxy实例" +msgstr "标准化Proxy实例" + +#: backend/flow/consts.py:420 +msgid "本地升级" +msgstr "本地升级" + +#: backend/flow/consts.py:421 +msgid "Mysql数据迁移导出库" +msgstr "Mysql数据迁移导出库" + +#: backend/flow/consts.py:422 +msgid "Mysql数据迁移导入库" +msgstr "Mysql数据迁移导入库" + +#: backend/flow/consts.py:423 +msgid "修改MySQL配置" +msgstr "修改MySQL配置" + +#: backend/flow/consts.py:424 +msgid "TenDBCluster 清档在中控建立备份库表" +msgstr "TenDBCluster 清档在中控建立备份库表" + +#: backend/flow/consts.py:425 +msgid "TenDBCluster 清档在remote预清理备份库" +msgstr "TenDBCluster 清档在remote预清理备份库" + +#: backend/flow/consts.py:426 +msgid "MySQL执行清档" +msgstr "MySQL执行清档" + +#: backend/flow/consts.py:427 +msgid "中控执行清档" +msgstr "中控执行清档" + +#: backend/flow/consts.py:428 +msgid "MySQL执行DB重命名" +msgstr "MySQL执行DB重命名" + +#: backend/flow/consts.py:429 +msgid "清档检查库表是否在用" +msgstr "清档检查库表是否在用" + +#: backend/flow/consts.py:430 +msgid "重命名检查库表是否在用" +msgstr "重命名检查库表是否在用" + +#: backend/flow/consts.py:431 +msgid "重命名在中控建立目标库" +msgstr "重命名在中控建立目标库" + +#: backend/flow/consts.py:432 +msgid "TenDBCluster 重命名在remote预清理目标库" +msgstr "TenDBCluster 重命名在remote预清理目标库" + +#: backend/flow/consts.py:433 +msgid "TenDBCluster 重命名在中控删除源库" +msgstr "TenDBCluster 重命名在中控删除源库" + +#: backend/flow/consts.py:434 +msgid "推送mysql-crond配置" +msgstr "推送mysql-crond配置" + +#: backend/flow/consts.py:435 +msgid "推送mysql-monitor配置" +msgstr "推送mysql-monitor配置" + +#: backend/flow/consts.py:436 +msgid "推送mysql-table-checksum配置" +msgstr "推送mysql-table-checksum配置" + +#: backend/flow/consts.py:437 +msgid "推送备份配置" +msgstr "推送备份配置" + +#: backend/flow/consts.py:438 +msgid "推送rotatebinlog配置" +msgstr "推送rotatebinlog配置" + +#: backend/flow/consts.py:443 +msgid "install" +msgstr "install" + +#: backend/flow/consts.py:444 +msgid "replica_batch" +msgstr "replica_batch" + +#: backend/flow/consts.py:445 +msgid "replicaof" +msgstr "replicaof" + +#: backend/flow/consts.py:446 +msgid "clustermeet_slotsassign" +msgstr "clustermeet_slotsassign" + +#: backend/flow/consts.py:447 +msgid "keyspattern" +msgstr "keyspattern" + +#: backend/flow/consts.py:448 +msgid "keysdelete_regex" +msgstr "keysdelete_regex" + +#: backend/flow/consts.py:449 +msgid "keysdelete_files" +msgstr "keysdelete_files" + +#: backend/flow/consts.py:451 +msgid "flush_data" +msgstr "flush_data" + +#: backend/flow/consts.py:452 +msgid "shutdown" +msgstr "shutdown" + +#: backend/flow/consts.py:453 +msgid "open" +msgstr "open" + +#: backend/flow/consts.py:454 +msgid "close" +msgstr "close" + +#: backend/flow/consts.py:455 +msgid "operate" +msgstr "operate" + +#: backend/flow/consts.py:456 +msgid "capturer" +msgstr "capturer" + +#: backend/flow/consts.py:457 +msgid "change_password" +msgstr "change_password" + +#: backend/flow/consts.py:458 +msgid "kill_conn" +msgstr "kill_conn" + +#: backend/flow/consts.py:459 +msgid "param_sync" +msgstr "param_sync" + +#: backend/flow/consts.py:460 +msgid "sync_check" +msgstr "sync_check" + +#: backend/flow/consts.py:461 +msgid "switch" +msgstr "switch" + +#: backend/flow/consts.py:462 +msgid "cluster_forget" +msgstr "cluster_forget" + +#: backend/flow/consts.py:463 +msgid "dr_restore" +msgstr "dr_restore" + +#: backend/flow/consts.py:464 +msgid "check_backends" +msgstr "check_backends" + +#: backend/flow/consts.py:465 +msgid "dts_datacheck" +msgstr "dts_datacheck" + +#: backend/flow/consts.py:466 +msgid "dts_datarepair" +msgstr "dts_datarepair" + +#: backend/flow/consts.py:467 +msgid "dts_online_switch" +msgstr "dts_online_switch" + +#: backend/flow/consts.py:468 +msgid "add_dts_server" +msgstr "add_dts_server" + +#: backend/flow/consts.py:469 +msgid "remove_dts_server" +msgstr "remove_dts_server" + +#: backend/flow/consts.py:470 +msgid "data_structure" +msgstr "data_structure" + +#: backend/flow/consts.py:471 +msgid "clustermeet_checkfinish" +msgstr "clustermeet_checkfinish" + +#: backend/flow/consts.py:472 +msgid "version_update" +msgstr "version_update" + +#: backend/flow/consts.py:473 +msgid "proxy_version_upgrade" +msgstr "proxy_version_upgrade" + +#: backend/flow/consts.py:474 +msgid "cluster_failover" +msgstr "cluster_failover" + +#: backend/flow/consts.py:475 +msgid "migrate_slots" +msgstr "migrate_slots" + +#: backend/flow/consts.py:476 +msgid "reupload_old_backup_records" +msgstr "reupload_old_backup_records" + +#: backend/flow/consts.py:477 +msgid "predixy_config_servers_rewrite" +msgstr "predixy_config_servers_rewrite" + +#: backend/flow/consts.py:478 +msgid "maxmemory_dynamically_set" +msgstr "maxmemory_dynamically_set" + +#: backend/flow/consts.py:479 +msgid "client_conns_kill" +msgstr "client_conns_kill" + +#: backend/flow/consts.py:480 +msgid "config_set" +msgstr "config_set" + +#: backend/flow/consts.py:481 +msgid "load_modules" +msgstr "load_modules" + +#: backend/flow/consts.py:482 +msgid "predixy_add_modules_cmds" +msgstr "predixy_add_modules_cmds" + +#: backend/flow/consts.py:486 +msgid "os_mongo_init" +msgstr "os_mongo_init" + +#: backend/flow/consts.py:487 +msgid "mongod_install" +msgstr "mongod_install" + +#: backend/flow/consts.py:488 +msgid "mongos_install" +msgstr "mongos_install" + +#: backend/flow/consts.py:489 +msgid "init_replicaset" +msgstr "init_replicaset" + +#: backend/flow/consts.py:490 +msgid "add_shard_to_cluster" +msgstr "add_shard_to_cluster" + +#: backend/flow/consts.py:491 +msgid "add_user" +msgstr "add_user" + +#: backend/flow/consts.py:492 +msgid "delete_user" +msgstr "delete_user" + +#: backend/flow/consts.py:493 +msgid "mongo_execute_script" +msgstr "mongo_execute_script" + +#: backend/flow/consts.py:494 +msgid "mongodb_backup" +msgstr "mongodb_backup" + +#: backend/flow/consts.py:495 +msgid "mongodb_remove_ns" +msgstr "mongodb_remove_ns" + +#: backend/flow/consts.py:496 +msgid "mongodb_restore" +msgstr "mongodb_restore" + +#: backend/flow/consts.py:497 +msgid "mongodb_pit_restore" +msgstr "mongodb_pit_restore" + +#: backend/flow/consts.py:498 +msgid "mongo_restart" +msgstr "mongo_restart" + +#: backend/flow/consts.py:499 +msgid "mongod_replace" +msgstr "mongod_replace" + +#: backend/flow/consts.py:500 +msgid "mongo_deinstall" +msgstr "mongo_deinstall" + +#: backend/flow/consts.py:501 +msgid "install_dbmon" +msgstr "install_dbmon" + +#: backend/flow/consts.py:502 +msgid "mongo_start" +msgstr "mongo_start" + +#: backend/flow/consts.py:506 backend/flow/consts.py:531 +#: backend/flow/consts.py:551 backend/flow/consts.py:570 +#: backend/flow/consts.py:637 backend/flow/consts.py:831 +#: backend/flow/consts.py:1486 +msgid "init" +msgstr "init" + +#: backend/flow/consts.py:507 backend/flow/consts.py:532 +#: backend/flow/consts.py:552 backend/flow/consts.py:571 +#: backend/flow/consts.py:638 backend/flow/consts.py:832 +#: backend/flow/consts.py:1487 +msgid "decompress_pkg" +msgstr "decompress_pkg" + +#: backend/flow/consts.py:508 backend/flow/consts.py:533 +#: backend/flow/consts.py:553 backend/flow/consts.py:572 +#: backend/flow/consts.py:639 backend/flow/consts.py:1488 +msgid "install_supervisor" +msgstr "install_supervisor" + +#: backend/flow/consts.py:509 +msgid "install_master" +msgstr "install_master" + +#: backend/flow/consts.py:510 +msgid "install_hot" +msgstr "install_hot" + +#: backend/flow/consts.py:511 +msgid "install_cold" +msgstr "install_cold" + +#: backend/flow/consts.py:512 +msgid "install_client" +msgstr "install_client" + +#: backend/flow/consts.py:513 backend/flow/consts.py:642 +msgid "init_grant" +msgstr "init_grant" + +#: backend/flow/consts.py:514 +msgid "install_exporter" +msgstr "install_exporter" + +#: backend/flow/consts.py:515 +msgid "install_kibana" +msgstr "install_kibana" + +#: backend/flow/consts.py:516 backend/flow/consts.py:555 +msgid "install_telegraf" +msgstr "install_telegraf" + +#: backend/flow/consts.py:517 backend/flow/consts.py:538 +#: backend/flow/consts.py:557 backend/flow/consts.py:579 +#: backend/flow/consts.py:643 backend/flow/consts.py:1493 +msgid "start_process" +msgstr "start_process" + +#: backend/flow/consts.py:518 backend/flow/consts.py:539 +#: backend/flow/consts.py:558 backend/flow/consts.py:580 +#: backend/flow/consts.py:645 backend/flow/consts.py:1494 +msgid "stop_process" +msgstr "stop_process" + +#: backend/flow/consts.py:519 backend/flow/consts.py:540 +#: backend/flow/consts.py:559 backend/flow/consts.py:581 +#: backend/flow/consts.py:646 backend/flow/consts.py:1495 +msgid "restart_process" +msgstr "restart_process" + +#: backend/flow/consts.py:520 backend/flow/consts.py:541 +#: backend/flow/consts.py:560 backend/flow/consts.py:582 +#: backend/flow/consts.py:647 backend/flow/consts.py:1496 +msgid "clean_data" +msgstr "clean_data" + +#: backend/flow/consts.py:521 +msgid "exclude_node" +msgstr "exclude_node" + +#: backend/flow/consts.py:522 +msgid "check_shards" +msgstr "check_shards" + +#: backend/flow/consts.py:523 +msgid "check_connections" +msgstr "check_connections" + +#: backend/flow/consts.py:524 +msgid "check_nodes" +msgstr "check_nodes" + +#: backend/flow/consts.py:525 +msgid "replace_master" +msgstr "replace_master" + +#: backend/flow/consts.py:526 +msgid "gen_certificate" +msgstr "gen_certificate" + +#: backend/flow/consts.py:527 +msgid "pack_certificate" +msgstr "pack_certificate" + +#: backend/flow/consts.py:534 backend/flow/consts.py:573 +msgid "install_zookeeper" +msgstr "install_zookeeper" + +#: backend/flow/consts.py:535 +msgid "init_kafkaUser" +msgstr "init_kafkaUser" + +#: backend/flow/consts.py:536 backend/flow/consts.py:576 +msgid "install_broker" +msgstr "install_broker" + +#: backend/flow/consts.py:537 +msgid "install_manager" +msgstr "install_manager" + +#: backend/flow/consts.py:542 +msgid "reduce_broker" +msgstr "reduce_broker" + +#: backend/flow/consts.py:543 +msgid "check_reassign" +msgstr "check_reassign" + +#: backend/flow/consts.py:544 +msgid "reconfig_add" +msgstr "reconfig_add" + +#: backend/flow/consts.py:545 +msgid "restart_broker" +msgstr "restart_broker" + +#: backend/flow/consts.py:546 +msgid "reconfig_remove" +msgstr "reconfig_remove" + +#: backend/flow/consts.py:547 +msgid "replace_broker" +msgstr "replace_broker" + +#: backend/flow/consts.py:554 +msgid "install_influxdb" +msgstr "install_influxdb" + +#: backend/flow/consts.py:556 +msgid "init_user" +msgstr "init_user" + +#: backend/flow/consts.py:564 +msgid "check_broker_config" +msgstr "check_broker_config" + +#: backend/flow/consts.py:565 +msgid "check_namespace_config" +msgstr "check_namespace_config" + +#: backend/flow/consts.py:566 +msgid "check_under_replicated" +msgstr "check_under_replicated" + +#: backend/flow/consts.py:567 +msgid "check_ledger_metadata" +msgstr "check_ledger_metadata" + +#: backend/flow/consts.py:568 +msgid "set_bookie_readonly" +msgstr "set_bookie_readonly" + +#: backend/flow/consts.py:569 +msgid "decommission_bookie" +msgstr "decommission_bookie" + +#: backend/flow/consts.py:574 +msgid "init_cluster" +msgstr "init_cluster" + +#: backend/flow/consts.py:575 +msgid "install_bookkeeper" +msgstr "install_bookkeeper" + +#: backend/flow/consts.py:577 +msgid "install_pulsar_manager" +msgstr "install_pulsar_manager" + +#: backend/flow/consts.py:578 +msgid "init_pulsar_manager" +msgstr "init_pulsar_manager" + +#: backend/flow/consts.py:583 +msgid "add_hosts" +msgstr "add_hosts" + +#: backend/flow/consts.py:584 +msgid "modify_hosts" +msgstr "modify_hosts" + +#: backend/flow/consts.py:588 +msgid "sysinit-riak" +msgstr "sysinit-riak" + +#: backend/flow/consts.py:590 +msgid "get-config" +msgstr "get-config" + +#: backend/flow/consts.py:591 +msgid "join-cluster" +msgstr "join-cluster" + +#: backend/flow/consts.py:592 +msgid "commit-cluster-change" +msgstr "commit-cluster-change" + +#: backend/flow/consts.py:593 +msgid "init-bucket-type" +msgstr "init-bucket-type" + +#: backend/flow/consts.py:594 +msgid "remove-node" +msgstr "remove-node" + +#: backend/flow/consts.py:595 +msgid "transfer" +msgstr "transfer" + +#: backend/flow/consts.py:596 +msgid "check-connections" +msgstr "check-connections" + +#: backend/flow/consts.py:598 +msgid "deploy-riak-crond" +msgstr "deploy-riak-crond" + +#: backend/flow/consts.py:601 backend/flow/utils/doris/consts.py:33 +#: backend/flow/utils/vm/consts.py:29 +msgid "start" +msgstr "start" + +#: backend/flow/consts.py:603 backend/flow/utils/doris/consts.py:34 +#: backend/flow/utils/vm/consts.py:30 +msgid "stop" +msgstr "stop" + +#: backend/flow/consts.py:604 +msgid "deploy-monitor" +msgstr "deploy-monitor" + +#: backend/flow/consts.py:605 +msgid "start-monitor" +msgstr "start-monitor" + +#: backend/flow/consts.py:606 +msgid "stop-monitor" +msgstr "stop-monitor" + +#: backend/flow/consts.py:610 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:796 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:160 +msgid "机器初始化" +msgstr "机器初始化" + +#: backend/flow/consts.py:611 +msgid "实例安装" +msgstr "实例安装" + +#: backend/flow/consts.py:612 +msgid "SQL文件执行" +msgstr "SQL文件执行" + +#: backend/flow/consts.py:613 backend/flow/consts.py:614 +msgid "备份数据库" +msgstr "备份数据库" + +#: backend/flow/consts.py:615 +msgid "数据库清档" +msgstr "数据库清档" + +#: backend/flow/consts.py:616 +msgid "恢复全量备份文件" +msgstr "恢复全量备份文件" + +#: backend/flow/consts.py:617 +msgid "恢复日志备份文件" +msgstr "恢复日志备份文件" + +#: backend/flow/consts.py:618 +msgid "集群角色互切" +msgstr "集群角色互切" + +#: backend/flow/consts.py:619 +msgid "检查非正常的数据库信息" +msgstr "检查非正常的数据库信息" + +#: backend/flow/consts.py:620 +msgid "检查实例连接情况" +msgstr "检查实例连接情况" + +#: backend/flow/consts.py:621 +msgid "实例间克隆用户" +msgstr "实例间克隆用户" + +#: backend/flow/consts.py:622 +msgid "实例间克隆定时作业" +msgstr "实例间克隆定时作业" + +#: backend/flow/consts.py:623 +msgid "实例间克隆linkservers" +msgstr "实例间克隆linkservers" + +#: backend/flow/consts.py:624 +msgid "建立数据库的镜像库关系" +msgstr "建立数据库的镜像库关系" + +#: backend/flow/consts.py:625 +msgid "为Always-on做别名初始化" +msgstr "为Always-on做别名初始化" + +#: backend/flow/consts.py:626 +msgid "建立Always-on通信" +msgstr "建立Always-on通信" + +#: backend/flow/consts.py:627 +msgid "数据库加入到Always-on可用组" +msgstr "数据库加入到Always-on可用组" + +#: backend/flow/consts.py:628 +msgid "卸载sqlserver实例" +msgstr "卸载sqlserver实例" + +#: backend/flow/consts.py:629 +msgid "判断备份文件是否存在,存在则移动" +msgstr "判断备份文件是否存在,存在则移动" + +#: backend/flow/consts.py:630 +msgid "实例接入dbm系统初始化" +msgstr "实例接入dbm系统初始化" + +#: backend/flow/consts.py:631 +msgid "清理实例周边配置。目前支持清理job、linkserver" +msgstr "清理实例周边配置。目前支持清理job、linkserver" + +#: backend/flow/consts.py:632 +msgid "将一些dr移除可用组" +msgstr "将一些dr移除可用组" + +#: backend/flow/consts.py:633 +msgid "部署后需要初始化实例的步骤" +msgstr "部署后需要初始化实例的步骤" + +#: backend/flow/consts.py:640 +msgid "install_doris" +msgstr "install_doris" + +#: backend/flow/consts.py:641 +msgid "render_config" +msgstr "render_config" + +#: backend/flow/consts.py:644 +msgid "start_fe_by_helper" +msgstr "start_fe_by_helper" + +#: backend/flow/consts.py:648 +msgid "update_metadata" +msgstr "update_metadata" + +#: backend/flow/consts.py:649 +msgid "check_decommission" +msgstr "check_decommission" + +#: backend/flow/consts.py:650 +msgid "check_process_start" +msgstr "check_process_start" + +#: backend/flow/consts.py:658 +msgid "聊天历史记录" +msgstr "聊天历史记录" + +#: backend/flow/consts.py:659 +msgid "用户战绩数据" +msgstr "用户战绩数据" + +#: backend/flow/consts.py:660 +msgid "玩家按键快捷键信息" +msgstr "玩家按键快捷键信息" + +#: backend/flow/consts.py:661 +msgid "test" +msgstr "test" + +#: backend/flow/consts.py:662 +msgid "mixed" +msgstr "mixed" + +#: backend/flow/consts.py:666 +msgid "NOT_RUNNING" +msgstr "NOT_RUNNING" + +#: backend/flow/consts.py:667 backend/flow/consts.py:728 +msgid "RUNNING" +msgstr "RUNNING" + +#: backend/flow/consts.py:668 backend/flow/consts.py:729 +msgid "SUCCESS" +msgstr "SUCCESS" + +#: backend/flow/consts.py:669 backend/flow/consts.py:730 +msgid "FAILED" +msgstr "FAILED" + +#: backend/flow/consts.py:670 +msgid "SKIPPED" +msgstr "SKIPPED" + +#: backend/flow/consts.py:671 +msgid "IGNORED" +msgstr "IGNORED" + +#: backend/flow/consts.py:672 +msgid "WAITING" +msgstr "WAITING" + +#: backend/flow/consts.py:673 +msgid "NORMAL" +msgstr "NORMAL" + +#: backend/flow/consts.py:674 +msgid "ABNORMAL" +msgstr "ABNORMAL" + +#: backend/flow/consts.py:675 +msgid "步骤强制终止中" +msgstr "步骤强制终止中" + +#: backend/flow/consts.py:676 +msgid "步骤强制终止成功" +msgstr "步骤强制终止成功" + +#: backend/flow/consts.py:680 +msgid "准备中" +msgstr "准备中" + +#: backend/flow/consts.py:681 +msgid "运行中" +msgstr "运行中" + +#: backend/flow/consts.py:682 backend/ticket/constants.py:633 +#: backend/ticket/constants.py:638 +msgid "完成" +msgstr "完成" + +#: backend/flow/consts.py:688 +msgid "available" +msgstr "available" + +#: backend/flow/consts.py:690 +msgid "locked" +msgstr "locked" + +#: backend/flow/consts.py:694 +msgid "cluster no" +msgstr "cluster no" + +#: backend/flow/consts.py:695 +msgid "cluster yes" +msgstr "cluster yes" + +#: backend/flow/consts.py:699 backend/flow/consts.py:709 +msgid "create" +msgstr "create" + +#: backend/flow/consts.py:700 +msgid "cluster_delete" +msgstr "cluster_delete" + +#: backend/flow/consts.py:701 +msgid "recycle_record" +msgstr "recycle_record" + +#: backend/flow/consts.py:702 backend/flow/consts.py:710 +msgid "update" +msgstr "update" + +#: backend/flow/consts.py:703 +msgid "select" +msgstr "select" + +#: backend/flow/consts.py:704 +msgid "add_and_delete" +msgstr "add_and_delete" + +#: backend/flow/consts.py:705 +msgid "ip_dns对应记录回收" +msgstr "ip_dns对应记录回收" + +#: backend/flow/consts.py:711 +msgid "delete" +msgstr "delete" + +#: backend/flow/consts.py:715 +msgid "kibana" +msgstr "kibana" + +#: backend/flow/consts.py:716 +msgid "kafka_manager" +msgstr "kafka_manager" + +#: backend/flow/consts.py:717 +msgid "pulsar_manager" +msgstr "pulsar_manager" + +#: backend/flow/consts.py:718 +msgid "ha_proxy" +msgstr "ha_proxy" + +#: backend/flow/consts.py:719 +msgid "doris_web_ui" +msgstr "doris_web_ui" + +#: backend/flow/consts.py:723 +msgid "KIBANA_PORT" +msgstr "KIBANA_PORT" + +#: backend/flow/consts.py:724 +msgid "KAFKA_MANAGER_PORT" +msgstr "KAFKA_MANAGER_PORT" + +#: backend/flow/consts.py:734 +msgid "proxy默认实例个数" +msgstr "proxy默认实例个数" + +#: backend/flow/consts.py:735 +msgid "redis角色数" +msgstr "redis角色数" + +#: backend/flow/consts.py:739 +msgid "DB安装目录" +msgstr "DB安装目录" + +#: backend/flow/consts.py:743 +msgid "gcs 安装路径" +msgstr "gcs 安装路径" + +#: backend/flow/consts.py:744 +msgid "key生命周期路径" +msgstr "key生命周期路径" + +#: backend/flow/consts.py:748 +msgid "truncate_table" +msgstr "truncate_table" + +#: backend/flow/consts.py:749 +msgid "drop_database" +msgstr "drop_database" + +#: backend/flow/consts.py:750 +msgid "drop_table" +msgstr "drop_table" + +#: backend/flow/consts.py:802 +msgid "TendataModuleDefault" +msgstr "TendataModuleDefault" + +#: backend/flow/consts.py:803 +msgid "RiakModuleDefault" +msgstr "RiakModuleDefault" + +#: backend/flow/consts.py:807 backend/flow/consts.py:1098 +#: backend/ticket/builders/common/constants.py:49 +#: backend/ticket/builders/common/constants.py:70 +msgid "hot" +msgstr "hot" + +#: backend/flow/consts.py:808 backend/flow/consts.py:1099 +#: backend/ticket/builders/common/constants.py:50 +#: backend/ticket/builders/common/constants.py:71 +msgid "cold" +msgstr "cold" + +#: backend/flow/consts.py:809 backend/ticket/builders/common/constants.py:51 +msgid "client" +msgstr "client" + +#: backend/flow/consts.py:814 +msgid "redis key删除正则方式" +msgstr "redis key删除正则方式" + +#: backend/flow/consts.py:815 +msgid "redis key删除文件方式" +msgstr "redis key删除文件方式" + +#: backend/flow/consts.py:819 +msgid "get" +msgstr "get" + +#: backend/flow/consts.py:820 +msgid "release" +msgstr "release" + +#: backend/flow/consts.py:824 +msgid "覆盖写入上下文变量" +msgstr "覆盖写入上下文变量" + +#: backend/flow/consts.py:825 +msgid "追加写入上下文变量" +msgstr "追加写入上下文变量" + +#: backend/flow/consts.py:829 +msgid "install-supervisor" +msgstr "install-supervisor" + +#: backend/flow/consts.py:830 +msgid "render-config" +msgstr "render-config" + +#: backend/flow/consts.py:833 +msgid "install-zookeeper" +msgstr "install-zookeeper" + +#: backend/flow/consts.py:834 +msgid "install-journalnode" +msgstr "install-journalnode" + +#: backend/flow/consts.py:835 +msgid "install-nn1" +msgstr "install-nn1" + +#: backend/flow/consts.py:836 +msgid "install-nn2" +msgstr "install-nn2" + +#: backend/flow/consts.py:837 +msgid "install-dn" +msgstr "install-dn" + +#: backend/flow/consts.py:838 +msgid "install-zkfc" +msgstr "install-zkfc" + +#: backend/flow/consts.py:839 +msgid "install-telegraf" +msgstr "install-telegraf" + +#: backend/flow/consts.py:840 +msgid "install-haproxy" +msgstr "install-haproxy" + +#: backend/flow/consts.py:841 +msgid "update-hosts" +msgstr "update-hosts" + +#: backend/flow/consts.py:842 +msgid "stop-process" +msgstr "stop-process" + +#: backend/flow/consts.py:843 +msgid "start-component" +msgstr "start-component" + +#: backend/flow/consts.py:844 +msgid "clean-data" +msgstr "clean-data" + +#: backend/flow/consts.py:845 +msgid "dfs-host" +msgstr "dfs-host" + +#: backend/flow/consts.py:856 backend/ticket/builders/common/constants.py:56 +msgid "namenode" +msgstr "namenode" + +#: backend/flow/consts.py:857 backend/ticket/builders/common/constants.py:55 +msgid "datanode" +msgstr "datanode" + +#: backend/flow/consts.py:858 +msgid "journalnode" +msgstr "journalnode" + +#: backend/flow/consts.py:860 +msgid "zkfc" +msgstr "zkfc" + +#: backend/flow/consts.py:864 backend/ticket/builders/common/constants.py:65 +msgid "bookkeeper" +msgstr "bookkeeper" + +#: backend/flow/consts.py:871 +msgid "常规备份" +msgstr "常规备份" + +#: backend/flow/consts.py:872 +msgid "长期备份" +msgstr "长期备份" + +#: backend/flow/consts.py:876 +msgid "KAFKA_REPLACE" +msgstr "KAFKA_REPLACE" + +#: backend/flow/consts.py:877 +msgid "KAFKA_SCALE_UP" +msgstr "KAFKA_SCALE_UP" + +#: backend/flow/consts.py:881 +msgid "INFLUXDB_REPLACE" +msgstr "INFLUXDB_REPLACE" + +#: backend/flow/consts.py:885 +msgid "逻辑备份" +msgstr "逻辑备份" + +#: backend/flow/consts.py:886 +msgid "物理备份" +msgstr "物理备份" + +#: backend/flow/consts.py:903 +msgid "备份1个月" +msgstr "备份1个月" + +#: backend/flow/consts.py:904 +msgid "备份6个月" +msgstr "备份6个月" + +#: backend/flow/consts.py:905 +msgid "备份1年" +msgstr "备份1年" + +#: backend/flow/consts.py:906 +msgid "备份3年" +msgstr "备份3年" + +#: backend/flow/consts.py:910 +msgid "常规备份(25天)" +msgstr "常规备份(25天)" + +#: backend/flow/consts.py:911 +msgid "长期备份(3年)" +msgstr "长期备份(3年)" + +#: backend/flow/consts.py:919 +msgid "Mysql的进程名称" +msgstr "Mysql的进程名称" + +#: backend/flow/consts.py:920 +msgid "Mysql-proxy进程名称" +msgstr "Mysql-proxy进程名称" + +#: backend/flow/consts.py:921 +msgid "Redis的进程名称" +msgstr "Redis的进程名称" + +#: backend/flow/consts.py:922 +msgid "MONGODB的进程名称" +msgstr "MONGODB的进程名称" + +#: backend/flow/consts.py:923 +msgid "ES的进程名称" +msgstr "ES的进程名称" + +#: backend/flow/consts.py:924 +msgid "KAFKA的进程名称" +msgstr "KAFKA的进程名称" + +#: backend/flow/consts.py:925 +msgid "HDFS-NameNode的进程名称" +msgstr "HDFS-NameNode的进程名称" + +#: backend/flow/consts.py:926 +msgid "HDFS-DataNode的进程名称" +msgstr "HDFS-DataNode的进程名称" + +#: backend/flow/consts.py:927 +msgid "Pulsar的进程名称" +msgstr "Pulsar的进程名称" + +#: backend/flow/consts.py:928 +msgid "InfluxDB 的进程名称" +msgstr "InfluxDB 的进程名称" + +#: backend/flow/consts.py:929 +msgid "Riak的进程名称" +msgstr "Riak的进程名称" + +#: backend/flow/consts.py:937 +msgid "远程备份+时间" +msgstr "远程备份+时间" + +#: backend/flow/consts.py:938 +msgid "远程备份+备份ID" +msgstr "远程备份+备份ID" + +#: backend/flow/consts.py:939 +msgid "本地备份+时间" +msgstr "本地备份+时间" + +#: backend/flow/consts.py:940 +msgid "本地备份+备份ID" +msgstr "本地备份+备份ID" + +#: backend/flow/consts.py:948 +msgid "手动单据发起" +msgstr "手动单据发起" + +#: backend/flow/consts.py:949 +msgid "例行校验单据发起" +msgstr "例行校验单据发起" + +#: backend/flow/consts.py:957 +msgid "msms" +msgstr "msms" + +#: backend/flow/consts.py:974 +msgid "redis slot分隔符" +msgstr "redis slot分隔符" + +#: backend/flow/consts.py:975 +msgid "redis slot导入分隔符" +msgstr "redis slot导入分隔符" + +#: backend/flow/consts.py:976 +msgid "redis slot迁移分隔符" +msgstr "redis slot迁移分隔符" + +#: backend/flow/consts.py:984 +msgid "redis min slot" +msgstr "redis min slot" + +#: backend/flow/consts.py:985 +msgid "redis max slot" +msgstr "redis max slot" + +#: backend/flow/consts.py:986 +msgid "redis total slot" +msgstr "redis total slot" + +#: backend/flow/consts.py:994 +msgid "redis PFAIL state" +msgstr "redis PFAIL state" + +#: backend/flow/consts.py:995 +msgid "redis fail state" +msgstr "redis fail state" + +#: backend/flow/consts.py:996 +msgid "redis handshake state" +msgstr "redis handshake state" + +#: backend/flow/consts.py:997 +msgid "redis noaddr state" +msgstr "redis noaddr state" + +#: backend/flow/consts.py:998 +msgid "redis noflags state" +msgstr "redis noflags state" + +#: backend/flow/consts.py:1006 +msgid "redis master role" +msgstr "redis master role" + +#: backend/flow/consts.py:1007 +msgid "redis slave role" +msgstr "redis slave role" + +#: backend/flow/consts.py:1008 +msgid "redis unknown role" +msgstr "redis unknown role" + +#: backend/flow/consts.py:1016 +msgid "redis master link status up" +msgstr "redis master link status up" + +#: backend/flow/consts.py:1017 +msgid "redis master link status down" +msgstr "redis master link status down" + +#: backend/flow/consts.py:1018 +msgid "redis ssd incrSync state" +msgstr "redis ssd incrSync state" + +#: backend/flow/consts.py:1019 +msgid "redis ssd REPL_FOLLOW state" +msgstr "redis ssd REPL_FOLLOW state" + +#: backend/flow/consts.py:1020 +msgid "redis connected status" +msgstr "redis connected status" + +#: backend/flow/consts.py:1021 +msgid "redis disconnected status" +msgstr "redis disconnected status" + +#: backend/flow/consts.py:1029 +msgid "" +"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" +msgstr "" +"redis cluster state ok,all slots are covered. 通过 cluster info 命令获取" + +#: backend/flow/consts.py:1030 +msgid "" +"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" +msgstr "" +"redis cluster state fail,not all slots are covered.通过 cluster info 命令获取" + +#: backend/flow/consts.py:1039 +msgid "全部机器替换" +msgstr "全部机器替换" + +#: backend/flow/consts.py:1047 +msgid "bk_biz_id黑名单" +msgstr "bk_biz_id黑名单" + +#: backend/flow/consts.py:1048 +msgid "cluster_id黑名单" +msgstr "cluster_id黑名单" + +#: backend/flow/consts.py:1049 +msgid "used_memory变更阈值" +msgstr "used_memory变更阈值" + +#: backend/flow/consts.py:1050 +msgid "used_memory变更百分比" +msgstr "used_memory变更百分比" + +#: backend/flow/consts.py:1069 +msgid "from show master status" +msgstr "from show master status" + +#: backend/flow/consts.py:1070 +msgid "from backup file" +msgstr "from backup file" + +#: backend/flow/consts.py:1084 +msgid "北极星" +msgstr "北极星" + +#: backend/flow/consts.py:1093 +msgid "全量同步" +msgstr "全量同步" + +#: backend/flow/consts.py:1094 +msgid "增量同步" +msgstr "增量同步" + +#: backend/flow/consts.py:1100 backend/ticket/builders/common/constants.py:72 +msgid "follower" +msgstr "follower" + +#: backend/flow/consts.py:1101 backend/ticket/builders/common/constants.py:73 +msgid "observer" +msgstr "observer" + +#: backend/flow/consts.py:1118 +msgid "root实例账号" +msgstr "root实例账号" + +#: backend/flow/consts.py:1119 +msgid "备份实例账号" +msgstr "备份实例账号" + +#: backend/flow/consts.py:1120 backend/flow/consts.py:1121 +msgid "监控实例账号" +msgstr "监控实例账号" + +#: backend/flow/consts.py:1122 +msgid "MYSQL系统账号" +msgstr "MYSQL系统账号" + +#: backend/flow/consts.py:1123 +msgid "MYSQL实例同步账号" +msgstr "MYSQL实例同步账号" + +#: backend/flow/consts.py:1124 +msgid "MYSQL实例只读账号" +msgstr "MYSQL实例只读账号" + +#: backend/flow/consts.py:1125 +msgid "PROXY实例账号" +msgstr "PROXY实例账号" + +#: backend/flow/consts.py:1126 +msgid "REDIS默认账号" +msgstr "REDIS默认账号" + +#: backend/flow/consts.py:1127 +msgid "HDFS默认账号" +msgstr "HDFS默认账号" + +#: backend/flow/consts.py:1128 +msgid "分区实例账号" +msgstr "分区实例账号" + +#: backend/flow/consts.py:1140 +msgid "redis_proxy" +msgstr "redis_proxy" + +#: backend/flow/consts.py:1141 +msgid "redis_proxy_admin" +msgstr "redis_proxy_admin" + +#: backend/flow/consts.py:1142 +msgid "es_user" +msgstr "es_user" + +#: backend/flow/consts.py:1143 +msgid "kafka_user" +msgstr "kafka_user" + +#: backend/flow/consts.py:1144 +msgid "influxdb_user" +msgstr "influxdb_user" + +#: backend/flow/consts.py:1145 +msgid "hdfs_user" +msgstr "hdfs_user" + +#: backend/flow/consts.py:1146 +msgid "pulsar_user" +msgstr "pulsar_user" + +#: backend/flow/consts.py:1147 +msgid "doris_user" +msgstr "doris_user" + +#: backend/flow/consts.py:1148 +msgid "vm_user" +msgstr "vm_user" + +#: backend/flow/consts.py:1156 +msgid "success" +msgstr "success" + +#: backend/flow/consts.py:1164 +msgid "MongoDB密码规则" +msgstr "MongoDB密码规则" + +#: backend/flow/consts.py:1172 backend/flow/consts.py:1444 +msgid "configsvr" +msgstr "configsvr" + +#: backend/flow/consts.py:1173 backend/flow/consts.py:1443 +msgid "shardsvr" +msgstr "shardsvr" + +#: backend/flow/consts.py:1181 backend/flow/consts.py:1470 +msgid "cache_percent" +msgstr "cache_percent" + +#: backend/flow/consts.py:1190 +msgid "m1" +msgstr "m1" + +#: backend/flow/consts.py:1191 +msgid "m2" +msgstr "m2" + +#: backend/flow/consts.py:1192 +msgid "m3" +msgstr "m3" + +#: backend/flow/consts.py:1193 +msgid "m4" +msgstr "m4" + +#: backend/flow/consts.py:1194 +msgid "m5" +msgstr "m5" + +#: backend/flow/consts.py:1195 +msgid "m6" +msgstr "m6" + +#: backend/flow/consts.py:1196 +msgid "m7" +msgstr "m7" + +#: backend/flow/consts.py:1197 +msgid "m8" +msgstr "m8" + +#: backend/flow/consts.py:1198 +msgid "m9" +msgstr "m9" + +#: backend/flow/consts.py:1199 +msgid "m10" +msgstr "m10" + +#: backend/flow/consts.py:1208 backend/ticket/builders/common/constants.py:140 +msgid "KAFKA" +msgstr "KAFKA" + +#: backend/flow/consts.py:1209 backend/ticket/builders/common/constants.py:141 +msgid "L5_AGENT" +msgstr "L5_AGENT" + +#: backend/flow/consts.py:1210 backend/ticket/builders/common/constants.py:142 +msgid "TCP/IP" +msgstr "TCP/IP" + +#: backend/flow/consts.py:1218 +msgid "mssql系统账号" +msgstr "mssql系统账号" + +#: backend/flow/consts.py:1219 +msgid "sqlserver系统账号,进程启动" +msgstr "sqlserver系统账号,进程启动" + +#: backend/flow/consts.py:1220 +msgid "sa实例账号" +msgstr "sa实例账号" + +#: backend/flow/consts.py:1228 +msgid "sqlserver" +msgstr "sqlserver" + +#: backend/flow/consts.py:1236 +msgid "2008服务器版" +msgstr "2008服务器版" + +#: backend/flow/consts.py:1237 +msgid "2012服务器版" +msgstr "2012服务器版" + +#: backend/flow/consts.py:1238 +msgid "2016服务器版" +msgstr "2016服务器版" + +#: backend/flow/consts.py:1239 +msgid "2019服务器版" +msgstr "2019服务器版" + +#: backend/flow/consts.py:1240 +msgid "2022服务器版" +msgstr "2022服务器版" + +#: backend/flow/consts.py:1296 +msgid "Chinese_PRC_CI_AS" +msgstr "Chinese_PRC_CI_AS" + +#: backend/flow/consts.py:1297 +msgid "Latin1_General_100_CI_AS" +msgstr "Latin1_General_100_CI_AS" + +#: backend/flow/consts.py:1298 +msgid "GBK" +msgstr "GBK" + +#: backend/flow/consts.py:1310 +msgid "镜像同步" +msgstr "镜像同步" + +#: backend/flow/consts.py:1311 +msgid "Always_on同步" +msgstr "Always_on同步" + +#: backend/flow/consts.py:1329 +msgid "清理表数据" +msgstr "清理表数据" + +#: backend/flow/consts.py:1331 +msgid "删除库" +msgstr "删除库" + +#: backend/flow/consts.py:1339 +msgid "全量备份" +msgstr "全量备份" + +#: backend/flow/consts.py:1340 +msgid "增量备份" +msgstr "增量备份" + +#: backend/flow/consts.py:1348 backend/flow/consts.py:1366 +msgid "启动" +msgstr "启动" + +#: backend/flow/consts.py:1349 backend/flow/consts.py:1367 +msgid "关闭" +msgstr "关闭" + +#: backend/flow/consts.py:1357 +msgid "选择全量备份恢复" +msgstr "选择全量备份恢复" + +#: backend/flow/consts.py:1358 +msgid "选择日志备份恢复" +msgstr "选择日志备份恢复" + +#: backend/flow/consts.py:1376 +msgid "完整备份迁移(一次性)" +msgstr "完整备份迁移(一次性)" + +#: backend/flow/consts.py:1377 +msgid "增量备份迁移(持续的)" +msgstr "增量备份迁移(持续的)" + +#: backend/flow/consts.py:1392 +msgid "config_port" +msgstr "config_port" + +#: backend/flow/consts.py:1393 +msgid "shard_start_port" +msgstr "shard_start_port" + +#: backend/flow/consts.py:1399 +msgid "dba" +msgstr "dba" + +#: backend/flow/consts.py:1400 +msgid "appdba" +msgstr "appdba" + +#: backend/flow/consts.py:1401 +msgid "monitor" +msgstr "monitor" + +#: backend/flow/consts.py:1402 +msgid "appmonitor" +msgstr "appmonitor" + +#: backend/flow/consts.py:1423 +msgid "mongodb_init_set" +msgstr "mongodb_init_set" + +#: backend/flow/consts.py:1424 +msgid "mongodb_extra_user_create" +msgstr "mongodb_extra_user_create" + +#: backend/flow/consts.py:1430 +msgid "mongod" +msgstr "mongod" + +#: backend/flow/consts.py:1437 +msgid "admin" +msgstr "admin" + +#: backend/flow/consts.py:1452 +msgid "直接删除表" +msgstr "直接删除表" + +#: backend/flow/consts.py:1453 +msgid "将表暂时重命名" +msgstr "将表暂时重命名" + +#: backend/flow/consts.py:1462 +msgid "shard" +msgstr "shard" + +#: backend/flow/consts.py:1474 +msgid "全备-保留1个月" +msgstr "全备-保留1个月" + +#: backend/flow/consts.py:1475 +msgid "全备-保留6个月" +msgstr "全备-保留6个月" + +#: backend/flow/consts.py:1476 +msgid "全备-保留1年" +msgstr "全备-保留1年" + +#: backend/flow/consts.py:1477 +msgid "全备-保留3年" +msgstr "全备-保留3年" + +#: backend/flow/consts.py:1478 +msgid "增量备份-保留15天" +msgstr "增量备份-保留15天" + +#: backend/flow/consts.py:1489 +msgid "install_vmstorage" +msgstr "install_vmstorage" + +#: backend/flow/consts.py:1490 +msgid "install_vminsert" +msgstr "install_vminsert" + +#: backend/flow/consts.py:1491 +msgid "install_vmselect" +msgstr "install_vmselect" + +#: backend/flow/consts.py:1492 +msgid "install_vmauth" +msgstr "install_vmauth" + +#: backend/flow/consts.py:1497 +msgid "reload_vmselect" +msgstr "reload_vmselect" + +#: backend/flow/consts.py:1498 +msgid "reload_vminsert" +msgstr "reload_vminsert" + +#: backend/flow/engine/bamboo/engine.py:278 +msgid "获取流程失败" +msgstr "获取流程失败" + +#: backend/flow/engine/bamboo/engine.py:281 +msgid "获取流程节点失败" +msgstr "获取流程节点失败" + +#: backend/flow/engine/bamboo/engine.py:284 +msgid "获取节点运行版本失败" +msgstr "获取节点运行版本失败" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:124 +msgid "[batch{}]{}" +msgstr "[batch{}]{}" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:162 +msgid "下发{}可执行文件包" +msgstr "下发{}可执行文件包" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:171 +msgid "部署{}服务进程" +msgstr "部署{}服务进程" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:220 +msgid "下发{}配置文件" +msgstr "下发{}配置文件" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:362 +msgid "存量集群的权限更新" +msgstr "存量集群的权限更新" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:390 +msgid "更新服务元信息" +msgstr "更新服务元信息" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:415 +msgid "裁撤{}的服务" +msgstr "裁撤{}的服务" + +#: backend/flow/engine/bamboo/scene/cloud/base_service_flow.py:438 +msgid "重启nginx服务" +msgstr "重启nginx服务" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:45 +msgid "主机{}部署gm服务" +msgstr "主机{}部署gm服务" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:67 +msgid "主机{}部署agent服务" +msgstr "主机{}部署agent服务" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:84 +msgid "部署dbha-gm服务" +msgstr "部署dbha-gm服务" + +#: backend/flow/engine/bamboo/scene/cloud/dbha_service_flow.py:90 +msgid "部署dbha-agent服务" +msgstr "部署dbha-agent服务" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:48 +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:70 +msgid "主机{}部署dns服务" +msgstr "主机{}部署dns服务" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:54 +msgid "部署dns服务" +msgstr "部署dns服务" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:71 +msgid "对存量机器的nameserver刷新" +msgstr "对存量机器的nameserver刷新" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:160 +msgid "部署新dns服务流程" +msgstr "部署新dns服务流程" + +#: backend/flow/engine/bamboo/scene/cloud/dns_service_flow.py:179 +msgid "裁撤旧dns服务流程" +msgstr "裁撤旧dns服务流程" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:34 +msgid "部署" +msgstr "部署" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:43 +msgid "主机{}部署drs服务" +msgstr "主机{}部署drs服务" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:47 +msgid "{}drs服务" +msgstr "{}drs服务" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:74 +msgid "重装" +msgstr "重装" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:82 +msgid "安装" +msgstr "安装" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:154 +msgid "部署新drs服务" +msgstr "部署新drs服务" + +#: backend/flow/engine/bamboo/scene/cloud/drs_service_flow.py:187 +msgid "裁撤旧drs服务" +msgstr "裁撤旧drs服务" + +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:79 +msgid "串行化部署DNS服务" +msgstr "串行化部署DNS服务" + +#: backend/flow/engine/bamboo/scene/cloud/nginx_service_flow.py:80 +msgid "部署DBHA服务" +msgstr "部署DBHA服务" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:37 +msgid "主机{}部署redis dts服务 s" +msgstr "主机{}部署redis dts服务 s" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:41 +msgid "部署redis dts服务" +msgstr "部署redis dts服务" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:122 +msgid "部署新redis dts服务流程" +msgstr "部署新redis dts服务流程" + +#: backend/flow/engine/bamboo/scene/cloud/redis_dts_server_service_flow.py:140 +msgid "裁撤旧redis dts服务流程" +msgstr "裁撤旧redis dts服务流程" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:48 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:65 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:170 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:60 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:54 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:48 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:104 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:57 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:118 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:37 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:119 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:52 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:52 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:64 +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:79 +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:187 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:98 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:70 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:145 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:525 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:746 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:793 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:208 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:643 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:137 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:117 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:210 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:581 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:719 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:135 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:102 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:134 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:234 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:100 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:88 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:107 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:333 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:127 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:158 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:300 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:65 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:343 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:160 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:357 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:164 +msgid "初始化配置" +msgstr "初始化配置" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:61 +msgid "获取/etc/resolv.conf: {}" +msgstr "获取/etc/resolv.conf: {}" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:70 +msgid "检查/etc/resolv.conf: {}" +msgstr "检查/etc/resolv.conf: {}" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:79 +msgid "{}修改DNS配置" +msgstr "{}修改DNS配置" + +#: backend/flow/engine/bamboo/scene/common/atom_jobs/set_dns_sub_job.py:86 +msgid "{}配置DNS子流程" +msgstr "{}配置DNS子流程" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:47 +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:45 +msgid "执行sa空闲检查" +msgstr "执行sa空闲检查" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:67 +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:54 +msgid "执行sa初始化" +msgstr "执行sa初始化" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:89 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:47 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:777 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:110 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:126 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:240 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:682 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:273 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:99 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:96 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:136 +msgid "安装[{}]插件" +msgstr "安装[{}]插件" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:105 +msgid "构建init_machine_sub子流程失败,联系系统管理员, new_ips is null" +msgstr "构建init_machine_sub子流程失败,联系系统管理员, new_ips is null" + +#: backend/flow/engine/bamboo/scene/common/bigdata_common_sub_flow.py:129 +msgid "机器空闲检查及初始化" +msgstr "机器空闲检查及初始化" + +#: backend/flow/engine/bamboo/scene/common/builder.py:157 +msgid "传入的acts_list参数不合法,请检测" +msgstr "传入的acts_list参数不合法,请检测" + +#: backend/flow/engine/bamboo/scene/common/builder.py:199 +msgid "传入的sub_flow_list参数不合法,请检测" +msgstr "传入的sub_flow_list参数不合法,请检测" + +#: backend/flow/engine/bamboo/scene/common/builder.py:238 +msgid "部署bamboo流程任务创建失败,任务结束" +msgstr "部署bamboo流程任务创建失败,任务结束" + +#: backend/flow/engine/bamboo/scene/common/download_dbactor.py:27 +#: backend/flow/engine/bamboo/scene/common/download_dbactor.py:37 +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:156 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:133 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:116 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:118 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:143 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:176 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:260 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:316 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:148 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:167 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:217 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:304 +msgid "下发actuator介质" +msgstr "下发actuator介质" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:43 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:174 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:217 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:147 +msgid "下发文件" +msgstr "下发文件" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:56 +msgid "ip[{}]下载文件" +msgstr "ip[{}]下载文件" + +#: backend/flow/engine/bamboo/scene/common/download_file.py:58 +msgid "构建下载文件流程成功" +msgstr "构建下载文件流程成功" + +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:61 +#: backend/ticket/constants.py:443 +msgid "资源池导入" +msgstr "资源池导入" + +#: backend/flow/engine/bamboo/scene/common/machine_os_init.py:73 +msgid "主机转移至资源池空闲模块" +msgstr "主机转移至资源池空闲模块" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:63 +msgid "迁移的集群必须在同一个云区域" +msgstr "迁移的集群必须在同一个云区域" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:65 +msgid "迁移的集群必须在同一个业务" +msgstr "迁移的集群必须在同一个业务" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:74 +msgid "clone权限规则" +msgstr "clone权限规则" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:80 +msgid "迁移元数据" +msgstr "迁移元数据" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:89 +msgid "请先跑一下集群标准化,完成之后确认" +msgstr "请先跑一下集群标准化,完成之后确认" + +#: backend/flow/engine/bamboo/scene/common/transfer_cluster_to_other_biz.py:92 +msgid "更新dns记录归属业务" +msgstr "更新dns记录归属业务" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:66 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:63 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:63 +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:61 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:97 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:95 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:59 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:55 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:55 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:71 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:66 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:73 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:73 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:69 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:65 #: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:67 #: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:60 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:111 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:204 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:69 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:72 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:86 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:59 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:159 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:87 #: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:71 #: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:61 #: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:61 #: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:60 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:72 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:63 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:73 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:64 #: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:55 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:81 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:60 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:60 +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:69 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:79 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:82 msgid "获取集群部署配置" msgstr "获取集群部署配置" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:86 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:98 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:70 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:77 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:102 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:190 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:106 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:90 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:76 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:68 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:59 -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:79 -msgid "获取机器信息" -msgstr "获取机器信息" +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:134 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:102 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:100 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:93 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:76 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:104 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:78 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:78 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:65 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:76 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:213 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:137 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:91 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:69 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:59 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:80 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:83 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:69 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:76 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:86 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:102 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:84 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:87 +msgid "获取机器信息" +msgstr "获取机器信息" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:138 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:199 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:107 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:106 +msgid "下发DORIS介质" +msgstr "下发DORIS介质" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:124 +msgid "启动Master FE {}" +msgstr "启动Master FE {}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:131 +msgid "检查Master FE {}是否正常启动" +msgstr "检查Master FE {}是否正常启动" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:138 +msgid "账号权限初始化" +msgstr "账号权限初始化" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:149 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:121 +msgid "集群元数据更新" +msgstr "集群元数据更新" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:166 +msgid "插入Doris WebUI实例信息" +msgstr "插入Doris WebUI实例信息" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:173 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:211 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:223 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:100 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:138 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:126 +msgid "回写集群配置信息" +msgstr "回写集群配置信息" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:184 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:177 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:148 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:222 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:198 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:161 +msgid "添加域名" +msgstr "添加域名" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:191 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:166 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:137 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:229 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:202 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:173 +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:159 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:229 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:180 +msgid "添加到DBMeta" +msgstr "添加到DBMeta" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:201 +msgid "DorisFollower主机数不为{},当前选择数量为{}" +msgstr "DorisFollower主机数不为{},当前选择数量为{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:209 +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:168 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:166 +msgid "DorisObserver主机数不能为{}" +msgstr "DorisObserver主机数不能为{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_apply_flow.py:216 +msgid "Doris数据节点(hot+cold)数量不能为{}" +msgstr "Doris数据节点(hot+cold)数量不能为{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:205 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:142 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:162 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:133 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:185 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:232 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:179 +msgid "节点初始化-{}" +msgstr "节点初始化-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:212 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:151 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:171 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:142 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:191 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:238 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:186 +msgid "解压缩介质包-{}" +msgstr "解压缩介质包-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:219 +msgid "渲染集群配置-{}" +msgstr "渲染集群配置-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:227 +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:160 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:180 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:151 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:198 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:245 +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:194 +msgid "安装supervisor-{}" +msgstr "安装supervisor-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:231 +msgid "安装Doris {}-{}子流程" +msgstr "安装Doris {}-{}子流程" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:252 +msgid "启动初始化-{}-{}" +msgstr "启动初始化-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:258 +msgid "启动-{}-{}" +msgstr "启动-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:263 +msgid "安装DorisFE {}-{}子流程" +msgstr "安装DorisFE {}-{}子流程" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:279 +msgid "启动DorisBE-{}-{}" +msgstr "启动DorisBE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:294 +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:330 +msgid "获取集群Payload" +msgstr "获取集群Payload" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:305 +msgid "停止DorisFE-{}-{}" +msgstr "停止DorisFE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:316 +msgid "集群元数据更新-drop-fe" +msgstr "集群元数据更新-drop-fe" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:336 +msgid "集群元数据更新-退役-BE" +msgstr "集群元数据更新-退役-BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:343 +msgid "检查数据节点是否退役" +msgstr "检查数据节点是否退役" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:350 +msgid "集群元数据更新-删除-BE" +msgstr "集群元数据更新-删除-BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_base_flow.py:363 +msgid "停止DorisBE-{}-{}" +msgstr "停止DorisBE-{}-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:72 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:69 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:69 +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:66 +msgid "下发doris actuator" +msgstr "下发doris actuator" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:81 +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:219 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:139 +msgid "Doris集群节点清理-{}" +msgstr "Doris集群节点清理-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:92 +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:97 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:97 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:64 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:88 +msgid "删除域名" +msgstr "删除域名" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:104 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:121 +msgid "删除PULSAR_MANAGER实例信息" +msgstr "删除PULSAR_MANAGER实例信息" + +#: backend/flow/engine/bamboo/scene/doris/doris_destroy_flow.py:110 +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:89 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:79 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:79 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:114 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:90 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:144 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:83 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:84 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:90 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:90 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:127 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:87 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:94 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:84 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:84 +msgid "修改Meta" +msgstr "修改Meta" + +#: backend/flow/engine/bamboo/scene/doris/doris_disable_flow.py:79 +msgid "停止Doris集群进程-{}" +msgstr "停止Doris集群进程-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_enable_flow.py:79 +msgid "启动Doris集群进程-{}" +msgstr "启动Doris集群进程-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_reboot_flow.py:77 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:81 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:69 +#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:72 +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:84 +msgid "重启实例-{}" +msgstr "重启实例-{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:129 +msgid "获取Payload" +msgstr "获取Payload" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:182 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:227 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:204 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:232 +msgid "扩容子流程" +msgstr "扩容子流程" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:192 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:237 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:241 +msgid "获取缩容流程集群部署配置" +msgstr "获取缩容流程集群部署配置" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:205 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:125 +msgid "缩容管理节点FE" +msgstr "缩容管理节点FE" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:210 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:130 +msgid "缩容数据节点BE" +msgstr "缩容数据节点BE" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:228 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:148 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:134 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:267 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:159 +msgid "更新DBMeta" +msgstr "更新DBMeta" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:239 +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:117 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:257 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:203 +msgid "更新域名" +msgstr "更新域名" + +#: backend/flow/engine/bamboo/scene/doris/doris_replace_flow.py:243 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:373 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:256 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:270 +msgid "缩容子流程" +msgstr "缩容子流程" + +#: backend/flow/engine/bamboo/scene/doris/doris_scale_up_flow.py:161 +msgid "DorisFollower不支持扩容,当前选择扩容机器数量为{}" +msgstr "DorisFollower不支持扩容,当前选择扩容机器数量为{}" + +#: backend/flow/engine/bamboo/scene/doris/doris_shrink_flow.py:159 +msgid "DorisFollower不支持缩容,当前选择缩容机器数量为{}" +msgstr "DorisFollower不支持缩容,当前选择缩容机器数量为{}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:18 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:18 +msgid "Flow模块Doris异常" +msgstr "Flow模块Doris异常" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:47 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:29 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:35 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:41 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:47 +msgid "机器数量异常" +msgstr "机器数量异常" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:30 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:30 +msgid "Doris集群角色{doris_role}数量不能为{machine_count}" +msgstr "Doris集群角色{doris_role}数量不能为{machine_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:36 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:36 +msgid "Doris集群角色{doris_role}机器数量必须为{must_count}" +msgstr "Doris集群角色{doris_role}机器数量必须为{must_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:42 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:42 +#, python-brace-format +msgid "Doris集群数据节点(热+冷)机器数量之和不能为{must_count}" +msgstr "Doris集群数据节点(热+冷)机器数量之和不能为{must_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:48 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:48 +#, python-brace-format +msgid "Doris集群Follower不支持扩容, 当前选择扩容机器数量为{machine_count}" +msgstr "Doris集群Follower不支持扩容, 当前选择扩容机器数量为{machine_count}" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:53 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:53 +msgid "Doris替换机器数量不一致" +msgstr "Doris替换机器数量不一致" + +#: backend/flow/engine/bamboo/scene/doris/exceptions.py:54 +#: backend/flow/engine/bamboo/scene/vm/exceptions.py:54 +#, python-brace-format +msgid "" +"Doris集群替换角色{doris_role}数量不一致,已选旧节点个数{old_count},新节点个数" +"{new_count}" +msgstr "Doris集群替换角色{doris_role}数量不一致,已选旧节点个数{old_count},新节点个数{new_count}" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:106 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:117 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:90 +msgid "下发ES介质" +msgstr "下发ES介质" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:114 +msgid "生成证书" +msgstr "生成证书" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:119 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:139 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:110 +msgid "分发证书" +msgstr "分发证书" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:171 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:191 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:162 +msgid "安装ES {}-{}节点" +msgstr "安装ES {}-{}节点" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:176 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:196 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:167 +msgid "安装ES {}-{}子流程" +msgstr "安装ES {}-{}子流程" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:184 +msgid "初始化鉴权插件" +msgstr "初始化鉴权插件" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:192 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:284 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:124 +msgid "安装kibana" +msgstr "安装kibana" + +#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:204 +#: backend/flow/engine/bamboo/scene/es/es_fake_apply_flow.py:91 +msgid "插入kibana实例信息" +msgstr "插入kibana实例信息" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:65 +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:61 +#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:71 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:58 +#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:73 +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:68 +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:66 +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:66 +msgid "下发actuator" +msgstr "下发actuator" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:74 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:341 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:182 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:187 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:85 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:324 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:441 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:196 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:126 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:243 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:99 +msgid "节点清理-{}" +msgstr "节点清理-{}" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:89 +msgid "删除kibana实例信息" +msgstr "删除kibana实例信息" + +#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:103 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:85 +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:114 +msgid "清理Meta" +msgstr "清理Meta" + +#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:70 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:73 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:178 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:80 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:316 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:433 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:179 +msgid "停止进程-{}" +msgstr "停止进程-{}" + +#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:70 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:74 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:80 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:77 +msgid "启动进程-{}" +msgstr "启动进程-{}" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:97 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:95 +msgid "获取扩容流程集群部署配置" +msgstr "获取扩容流程集群部署配置" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:124 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:246 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:83 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:120 +msgid "下发dbactuator" +msgstr "下发dbactuator" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:132 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:105 +msgid "打包证书" +msgstr "打包证书" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:213 +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:265 +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:184 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:102 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:229 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:85 +msgid "更新域名映射" +msgstr "更新域名映射" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:222 +msgid "校验扩容结果" +msgstr "校验扩容结果" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:252 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:89 +msgid "排斥缩容节点" +msgstr "排斥缩容节点" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:298 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:138 +msgid "更新kibana实例信息" +msgstr "更新kibana实例信息" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:306 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:147 +msgid "校验搬迁状态" +msgstr "校验搬迁状态" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:318 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:158 +msgid "校验连接状态" +msgstr "校验连接状态" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:327 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:167 +msgid "停止节点-{}" +msgstr "停止节点-{}" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:332 +msgid "停止ES子流程" +msgstr "停止ES子流程" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:351 +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:190 +msgid "清理DBMeta" +msgstr "清理DBMeta" + +#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:366 +msgid "{}-替换master ip" +msgstr "{}-替换master ip" + +#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:97 +msgid "原有机器下发dbactuator" +msgstr "原有机器下发dbactuator" + +#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:171 +msgid "停止ES-{}子流程" +msgstr "停止ES-{}子流程" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:18 +msgid "Flow模块HDFS异常" +msgstr "Flow模块HDFS异常" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:29 +msgid "手动部署选择机器数量异常" +msgstr "手动部署选择机器数量异常" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:30 +#, python-brace-format +msgid "HDFS集群角色{hdfs_role}数量不能为{machine_count}" +msgstr "HDFS集群角色{hdfs_role}数量不能为{machine_count}" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:35 +msgid "替换旧机器不能为空" +msgstr "替换旧机器不能为空" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:36 +msgid "HDFS集群替换旧机器不能为空" +msgstr "HDFS集群替换旧机器不能为空" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:41 +msgid "HDFS替换新旧机器数量不一致" +msgstr "HDFS替换新旧机器数量不一致" + +#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:42 +#, python-brace-format +msgid "HDFS集群替换角色{hdfs_role}数量不一致" +msgstr "HDFS集群替换角色{hdfs_role}数量不一致" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:94 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:96 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:75 +msgid "下发hdfs介质包" +msgstr "下发hdfs介质包" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:102 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:762 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:257 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:245 +msgid "初始化机器" +msgstr "初始化机器" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:103 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:107 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:83 +msgid "解压缩文件" +msgstr "解压缩文件" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:108 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:112 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:87 +msgid "渲染集群配置" +msgstr "渲染集群配置" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:113 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:117 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:91 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:98 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:113 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:249 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:175 +msgid "安装supervisor" +msgstr "安装supervisor" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:123 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:162 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:269 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:147 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:128 +msgid "安装zookeeper-{}" +msgstr "安装zookeeper-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:133 +msgid "安装JournalNode" +msgstr "安装JournalNode" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:141 +msgid "安装NN1" +msgstr "安装NN1" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:147 +msgid "安装NN2" +msgstr "安装NN2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:153 +msgid "安装ZKFC" +msgstr "安装ZKFC" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:161 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:152 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:124 +msgid "安装DataNode-{}" +msgstr "安装DataNode-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:171 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:162 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:134 +msgid "安装HAProxy" +msgstr "安装HAProxy" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:185 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:80 +msgid "插入haproxy实例信息" +msgstr "插入haproxy实例信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:205 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:151 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:219 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:95 +msgid "添加元数据到DBMeta" +msgstr "添加元数据到DBMeta" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:210 +msgid "回写集群部署配置" +msgstr "回写集群部署配置" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:221 +msgid "NameNode主机数不为2" +msgstr "NameNode主机数不为2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:225 +msgid "ZooKeeper主机数不为3" +msgstr "ZooKeeper主机数不为3" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:229 +msgid "DataNode主机数少于2" +msgstr "DataNode主机数少于2" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:256 +msgid "复用NN主机 {} 作为ZK" +msgstr "复用NN主机 {} 作为ZK" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:65 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:63 +msgid "检查集群状态" +msgstr "检查集群状态" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:71 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:73 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:65 +msgid "下发hdfs actuator" +msgstr "下发hdfs actuator" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:84 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:242 +msgid "HDFS集群节点清理-{}" +msgstr "HDFS集群节点清理-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:99 +msgid "删除haproxy实例信息" +msgstr "删除haproxy实例信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:80 +msgid "停止HDFS集群进程-{}" +msgstr "停止HDFS集群进程-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:83 +msgid "启动HDFS集群ZK-{}" +msgstr "启动HDFS集群ZK-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:97 +msgid "启动HDFS集群JN-{}" +msgstr "启动HDFS集群JN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:112 +msgid "启动HDFS集群NN-{}" +msgstr "启动HDFS集群NN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:121 +msgid "启动HDFS集群ZKFC-{}" +msgstr "启动HDFS集群ZKFC-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:125 +msgid "启动HDFS集群NN服务-{}子流程" +msgstr "启动HDFS集群NN服务-{}子流程" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:135 +msgid "启动HDFS集群DN-{}" +msgstr "启动HDFS集群DN-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:86 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:154 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_fake_apply_flow.py:64 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:196 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:238 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:106 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:449 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:209 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:244 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:284 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:202 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:129 +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:95 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:137 +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:176 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:389 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:622 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:101 +msgid "更新DBMeta元信息" +msgstr "更新DBMeta元信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_fake_apply_flow.py:90 +msgid "回写hdfs集群配置" +msgstr "回写hdfs集群配置" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:76 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:76 +msgid "重启实例-{}-{}" +msgstr "重启实例-{}-{}" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:65 +msgid "集群DN替换-扩容DN" +msgstr "集群DN替换-扩容DN" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:69 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:62 +msgid "集群DN替换-缩容DN" +msgstr "集群DN替换-缩容DN" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:146 +msgid "没有需要替换的角色IP" +msgstr "没有需要替换的角色IP" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:152 +msgid "替换HDFS DataNode角色IP不一致" +msgstr "替换HDFS DataNode角色IP不一致" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:126 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:99 +msgid "更新主机映射" +msgstr "更新主机映射" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:135 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:107 +msgid "include增加数据节点" +msgstr "include增加数据节点" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:143 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:115 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:172 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:195 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:210 +msgid "刷新节点配置" +msgstr "刷新节点配置" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:175 +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:146 +msgid "添加新DN到域名" +msgstr "添加新DN到域名" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:181 +msgid "元数据DBMeta更新及转移主机" +msgstr "元数据DBMeta更新及转移主机" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:63 +msgid "添加DN获取机器信息" +msgstr "添加DN获取机器信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:164 +msgid "添加数据节点到exclude" +msgstr "添加数据节点到exclude" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:178 +msgid "检查节点退役信息" +msgstr "检查节点退役信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:187 +msgid "include剔除数据节点" +msgstr "include剔除数据节点" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:202 +msgid "exclude剔除数据节点" +msgstr "exclude剔除数据节点" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:230 +msgid "更新haproxy实例信息" +msgstr "更新haproxy实例信息" + +#: backend/flow/engine/bamboo/scene/hdfs/hdfs_sub_flow.py:264 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:252 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:108 +msgid "DBMeta删除下架IP" +msgstr "DBMeta删除下架IP" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:74 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:79 +msgid "下发influxdb介质" +msgstr "下发influxdb介质" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:80 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:87 +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:129 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:233 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:159 +msgid "初始化节点" +msgstr "初始化节点" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:103 +msgid "解压influxdb包" +msgstr "解压influxdb包" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:113 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:130 +msgid "安装influxdb-{}" +msgstr "安装influxdb-{}" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:130 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:146 +msgid "{}-初始化User" +msgstr "{}-初始化User" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:146 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:162 +msgid "安装telegraf-{}" +msgstr "安装telegraf-{}" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:158 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_fake_apply_flow.py:68 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:200 +msgid "回写influxdb集群配置" +msgstr "回写influxdb集群配置" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:64 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:63 +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:63 +msgid "下发influxdb actuator" +msgstr "下发influxdb actuator" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:79 +msgid "清理Influxdb {}子流程" +msgstr "清理Influxdb {}子流程" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:77 +msgid "禁用Influxdb {}子流程" +msgstr "禁用Influxdb {}子流程" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:78 +msgid "启用Influxdb {}子流程" +msgstr "启用Influxdb {}子流程" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:167 +msgid "安装Influxdb {}子流程" +msgstr "安装Influxdb {}子流程" + +#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:191 +msgid "下架Influxdb {}子流程" +msgstr "下架Influxdb {}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:123 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:227 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:152 +msgid "下发kafka介质" +msgstr "下发kafka介质" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:137 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:241 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:167 +msgid "解压kafka包" +msgstr "解压kafka包" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:173 +msgid "初始化系统kafkaUser" +msgstr "初始化系统kafkaUser" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:180 +msgid "初始化kafkaUser" +msgstr "初始化kafkaUser" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:194 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:346 +#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:189 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:274 +msgid "安装broker-{}" +msgstr "安装broker-{}" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:207 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:369 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:224 +msgid "安装kafka manager" +msgstr "安装kafka manager" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:220 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:100 +msgid "插入manager实例信息" +msgstr "插入manager实例信息" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:163 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:197 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:123 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:192 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:370 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:376 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:609 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:101 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:203 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:141 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:101 +msgid "添加集群域名" +msgstr "添加集群域名" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:242 +#: backend/flow/engine/bamboo/scene/kafka/kafka_fake_apply_flow.py:110 +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:332 +msgid "回写kafka集群配置" +msgstr "回写kafka集群配置" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:75 +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:70 +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:70 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:129 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:218 +msgid "下发dbacuator" +msgstr "下发dbacuator" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:89 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:200 +msgid "清理Kafka {}子流程" +msgstr "清理Kafka {}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:99 +msgid "删除manager实例信息" +msgstr "删除manager实例信息" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:84 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:183 +msgid "禁用Kafka {}子流程" +msgstr "禁用Kafka {}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:84 +msgid "启用Kafka {}子流程" +msgstr "启用Kafka {}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:280 +msgid "增加zookeeper节点" +msgstr "增加zookeeper节点" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:290 +#, python-brace-format +msgid "滚动重启broker节点-{ip}" +msgstr "滚动重启broker节点-{ip}" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:301 +msgid "移除zookeeper节点" +msgstr "移除zookeeper节点" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:328 +msgid "下架zookeeper-{}子流程" +msgstr "下架zookeeper-{}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:382 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:237 +msgid "更新manager实例信息" +msgstr "更新manager实例信息" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:395 +msgid "更新集群域名" +msgstr "更新集群域名" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:408 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:139 +msgid "Kafka搬迁数据" +msgstr "Kafka搬迁数据" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:418 +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:150 +msgid "Kafka检查搬迁进度" +msgstr "Kafka检查搬迁进度" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:445 +msgid "下架broker-{}子流程" +msgstr "下架broker-{}子流程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:163 +msgid "删除broker的域名记录" +msgstr "删除broker的域名记录" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:170 +msgid "停止进程" +msgstr "停止进程" + +#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:188 +msgid "清理数据" +msgstr "清理数据" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_backup.py:114 +msgid "MongoDB-备份-{}" +msgstr "MongoDB-备份-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_backup.py:119 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_deinstall.py:49 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_enable_disable.py:49 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:85 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:161 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:56 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:48 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:52 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:45 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:52 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:41 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:47 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:51 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:53 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:56 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:43 +msgid "MongoDB-介质下发" +msgstr "MongoDB-介质下发" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_deinstall.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_enable_disable.py:55 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:91 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:62 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:54 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:70 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:58 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:63 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:58 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:47 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:53 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:57 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:59 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:61 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:62 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:49 +msgid "MongoDB-创建原子任务执行目录" +msgstr "MongoDB-创建原子任务执行目录" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_fake_install.py:93 +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:214 +msgid "MongoDB--添加关系到meta" +msgstr "MongoDB--添加关系到meta" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:97 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:68 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:76 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:64 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:65 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:67 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:68 +msgid "MongoDB-机器初始化" +msgstr "MongoDB-机器初始化" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:139 +msgid "MongoDB--添加复制集{}-{}关系到meta" +msgstr "MongoDB--添加复制集{}-{}关系到meta" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:165 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:76 +msgid "MongoDB--获取管理员用户密码" +msgstr "MongoDB--获取管理员用户密码" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:206 +msgid "MongoDB--添加shards到cluster" +msgstr "MongoDB--添加shards到cluster" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install.py:221 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:100 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:121 +msgid "MongoDB--添加domain到dns" +msgstr "MongoDB--添加domain到dns" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install_dbmon.py:97 +msgid "dbmon-{}" +msgstr "dbmon-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_install_dbmon.py:102 +msgid "CpFile: actuator+dbmon+dbtools+toolkit" +msgstr "CpFile: actuator+dbmon+dbtools+toolkit" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_remove_ns.py:93 +msgid "清档-{}" +msgstr "清档-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_remove_ns.py:98 +msgid "MongoDB-介质下发({}个IP)" +msgstr "MongoDB-介质下发({}个IP)" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:128 +msgid "下载备份文件-{}" +msgstr "下载备份文件-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:137 +msgid "执行回档命令-{}" +msgstr "执行回档命令-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/mongodb_restore.py:150 +msgid "MongoDB-预处理" +msgstr "MongoDB-预处理" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/backup.py:60 +msgid "oplog为True时, 不支持partial备份" +msgstr "oplog为True时, 不支持partial备份" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/backup.py:110 +msgid "MongoDB-备份-[{}:{}]" +msgstr "MongoDB-备份-[{}:{}]" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:59 +msgid "MongoDB-{}:{}-mongod开启进程" +msgstr "MongoDB-{}:{}-mongod开启进程" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:72 +msgid "MongoDB-{}:{}-mongos开启进程" +msgstr "MongoDB-{}:{}-mongos开启进程" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:91 +msgid "MongoDB-{}:{}-mongod关闭进程" +msgstr "MongoDB-{}:{}-mongod关闭进程" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:109 +msgid "MongoDB-{}:{}-mongos关闭进程" +msgstr "MongoDB-{}:{}-mongos关闭进程" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:119 +msgid "修改meta" +msgstr "修改meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_enable_disable.py:124 +msgid "MongoDB--cluster-{}" +msgstr "MongoDB--cluster-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_increase_node.py:107 +msgid "MongoDB--{}增加节点" +msgstr "MongoDB--{}增加节点" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_reduce_node.py:82 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_reduce_node.py:73 +msgid "MongoDB--{}减少节点" +msgstr "MongoDB--{}减少节点" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:120 +msgid "MongoDB-{}-mongos修改参数" +msgstr "MongoDB-{}-mongos修改参数" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:144 +msgid "MongoDB-mongos修改meta" +msgstr "MongoDB-mongos修改meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_replace.py:146 +msgid "MongoDB--cluster整机替换" +msgstr "MongoDB--cluster整机替换" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/cluster_scale.py:81 +msgid "MongoDB--cluster:{}容量变更" +msgstr "MongoDB--cluster:{}容量变更" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:39 +msgid "MongoDB-{}-{}卸载" +msgstr "MongoDB-{}-{}卸载" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:114 +msgid "MongoDB-删除域名" +msgstr "MongoDB-删除域名" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:122 +msgid "MongoDB-删除密码" +msgstr "MongoDB-删除密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:131 +msgid "MongoDB-删除db_meta关系" +msgstr "MongoDB-删除db_meta关系" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/deinstall.py:136 +msgid "MongoDB--卸载--cluster_id:{}" +msgstr "MongoDB--卸载--cluster_id:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/download_subtask.py:71 +msgid "下载备份文件 {} {}" +msgstr "下载备份文件 {} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:70 +msgid "MongoDB-cluster_id:{}-执行脚本" +msgstr "MongoDB-cluster_id:{}-执行脚本" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/exec_script.py:76 +msgid "MongoDB--执行脚本--cluster_id:{}-{}" +msgstr "MongoDB--执行脚本--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:94 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:54 +msgid "MongoDB-{}-mongod安装" +msgstr "MongoDB-{}-mongod安装" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:102 +msgid "MongoDB-添加node" +msgstr "MongoDB-添加node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:111 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:148 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:105 +msgid "MongoDB-添加新实例的domain到dns" +msgstr "MongoDB-添加新实例的domain到dns" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:126 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:176 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:133 +msgid "MongoDB-保存新实例的dba用户及额外管理用户密码" +msgstr "MongoDB-保存新实例的dba用户及额外管理用户密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongod.py:132 +msgid "MongoDB--{}增加node{}:{}" +msgstr "MongoDB--{}增加node{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:108 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:88 +msgid "MongoDB--修改meta" +msgstr "MongoDB--修改meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/increase_mongos.py:113 +msgid "MongoDB--{}增加mongos" +msgstr "MongoDB--{}增加mongos" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/install_dbmon_sub.py:105 +msgid "node-{}" +msgstr "node-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/install_dbmon_sub.py:169 +msgid "prepare_instance_info:{} ip" +msgstr "prepare_instance_info:{} ip" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:63 +msgid "MongoDB-cluster_id:{}-ip:{}-port:{}--重启实例" +msgstr "MongoDB-cluster_id:{}-ip:{}-port:{}--重启实例" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/instance_restart.py:71 +msgid "MongoDB--重启实例--ip:{}" +msgstr "MongoDB--重启实例--ip:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:46 +msgid "检查cluster目标端是否存在" +msgstr "检查cluster目标端是否存在" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:51 +msgid "检查目标端机器规格" +msgstr "检查目标端机器规格" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:59 +msgid "保存配置" +msgstr "保存配置" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:63 +msgid "更新dba" +msgstr "更新dba" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:68 +msgid "迁移meta" +msgstr "迁移meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:75 +msgid "保存密码" +msgstr "保存密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:79 +msgid "更新dns的app" +msgstr "更新dns的app" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:95 +msgid "添加clb到meta" +msgstr "添加clb到meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/migrate_meta.py:102 +msgid "MongoDB--{}-meta迁移-{}-{}" +msgstr "MongoDB--{}-meta迁移-{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:130 +msgid "MongoDB-mongod安装-{}:{}" +msgstr "MongoDB-mongod安装-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:138 +msgid "MongoDB-mongod替换" +msgstr "MongoDB-mongod替换" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:155 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:112 +msgid "MongoDB-删除老实例的domain指向" +msgstr "MongoDB-删除老实例的domain指向" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:183 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:140 +msgid "MongoDB-删除老实例的dba用户及额外管理用户密码" +msgstr "MongoDB-删除老实例的dba用户及额外管理用户密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:192 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:109 +msgid "MongoDB-mongod修改meta" +msgstr "MongoDB-mongod修改meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:204 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:153 +msgid "MongoDB-老实例下架-{}:{}" +msgstr "MongoDB-老实例下架-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongod_replace.py:210 +msgid "MongoDB--mongod替换--{}:{}" +msgstr "MongoDB--mongod替换--{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:44 +msgid "MongoDB-{}-mongos安装" +msgstr "MongoDB-{}-mongos安装" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:66 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:102 +msgid "MongoDB--保存dba用户及额外管理用户密码" +msgstr "MongoDB--保存dba用户及额外管理用户密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_install.py:75 +msgid "MongoDB--安装mongos--{}-{}" +msgstr "MongoDB--安装mongos--{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:96 +msgid "MongoDB-mongos安装-{}:{}" +msgstr "MongoDB-mongos安装-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/mongos_replace.py:158 +msgid "MongoDB--mongos替换--{}:{}" +msgstr "MongoDB--mongos替换--{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/multi_replicaset_migrate_meta.py:47 +msgid "MongoDB--复制集迁移元数据" +msgstr "MongoDB--复制集迁移元数据" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:80 +msgid "MongoDB-移除node" +msgstr "MongoDB-移除node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:90 +msgid "MongoDB-{}-mongod下架" +msgstr "MongoDB-{}-mongod下架" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:99 +msgid "MongoDB-删除node的domain指向" +msgstr "MongoDB-删除node的domain指向" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:107 +msgid "MongoDB-删除node的dba用户及额外管理用户密码" +msgstr "MongoDB-删除node的dba用户及额外管理用户密码" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:115 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:81 +msgid "MongoDB-修改meta" +msgstr "MongoDB-修改meta" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongod.py:121 +msgid "MongoDB--{}减少node{}:{}" +msgstr "MongoDB--{}减少node{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/reduce_mongos.py:93 +msgid "MongoDB--{}减少mongos" +msgstr "MongoDB--{}减少mongos" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/remove_ns.py:93 +msgid "清档 {} {}" +msgstr "清档 {} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:64 +msgid "MongoDB-{}-replicaset初始化" +msgstr "MongoDB-{}-replicaset初始化" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:82 +msgid "MongoDB--创建dba用户" +msgstr "MongoDB--创建dba用户" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:88 +msgid "MongoDB--创建额外管理用户" +msgstr "MongoDB--创建额外管理用户" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:112 +msgid "MongoDB-{}-db初始设置" +msgstr "MongoDB-{}-db初始设置" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_install.py:130 +msgid "MongoDB--安装复制集--{}-{}" +msgstr "MongoDB--安装复制集--{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:95 +msgid "MongoDB-mongod修改meta-port:{}" +msgstr "MongoDB-mongod修改meta-port:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_replace.py:112 +msgid "MongoDB--{}整机替换--ip:{}" +msgstr "MongoDB--{}整机替换--ip:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_scale.py:96 +msgid "MongoDB--{}容量变更" +msgstr "MongoDB--{}容量变更" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node.py:87 +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:86 +msgid "MongoDB--{}增加node" +msgstr "MongoDB--{}增加node" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/replicaset_set_increase_node_by_ip.py:70 +msgid "MongoDB-修改meta-{}:{}" +msgstr "MongoDB-修改meta-{}:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/restore_sub.py:92 +msgid "{} {}" +msgstr "{} {}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:55 +msgid "MongoDB-cluster_id:{}-创建用户:{}" +msgstr "MongoDB-cluster_id:{}-创建用户:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:57 +msgid "MongoDB--创建用户--cluster_id:{}-{}" +msgstr "MongoDB--创建用户--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:60 +msgid "MongoDB-cluster_id:{}-删除用户:{}" +msgstr "MongoDB-cluster_id:{}-删除用户:{}" + +#: backend/flow/engine/bamboo/scene/mongodb/sub_task/user.py:62 +msgid "MongoDB--删除用户--cluster_id:{}-{}" +msgstr "MongoDB--删除用户--cluster_id:{}-{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:110 +msgid "执行ip信息为空" +msgstr "执行ip信息为空" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:129 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:125 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:99 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:168 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:98 +msgid "下发MySQL周边程序介质" +msgstr "下发MySQL周边程序介质" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:196 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:157 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:184 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:190 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:161 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:226 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:490 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:200 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:200 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:212 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:642 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:130 +msgid "安装backup-client工具" +msgstr "安装backup-client工具" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:210 +msgid "安装MySql周边程序" +msgstr "安装MySql周边程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:229 +msgid "Master[{}]安装rotate_binlog程序" +msgstr "Master[{}]安装rotate_binlog程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:245 +msgid "Master[{}]安装mysql-monitor" +msgstr "Master[{}]安装mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:262 +msgid "Master[{}]安装备份程序" +msgstr "Master[{}]安装备份程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:281 +msgid "Master[{}]安装校验程序" +msgstr "Master[{}]安装校验程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:298 +msgid "Master[{}]安装DBATools工具箱" +msgstr "Master[{}]安装DBATools工具箱" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:330 +msgid "Slave[{}]安装rotate_binlog程序" +msgstr "Slave[{}]安装rotate_binlog程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:346 +msgid "Slave[{}]安装mysql-monitor" +msgstr "Slave[{}]安装mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:363 +msgid "Slave[{}]安装备份程序" +msgstr "Slave[{}]安装备份程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:382 +msgid "Slave[{}]安装校验程序" +msgstr "Slave[{}]安装校验程序" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:399 +msgid "Slave[{}]安装DBATools工具箱" +msgstr "Slave[{}]安装DBATools工具箱" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:424 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:274 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:320 +msgid "Proxy安装mysql-monitor" +msgstr "Proxy安装mysql-monitor" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:471 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:213 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:524 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:263 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:417 +msgid "新增repl帐户" +msgstr "新增repl帐户" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:491 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:222 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:223 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:539 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:278 +msgid "建立主从关系" +msgstr "建立主从关系" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:503 +msgid "建立主从同步[{}]" +msgstr "建立主从同步[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:570 +msgid "获取旧实例系统参数" +msgstr "获取旧实例系统参数" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:592 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:610 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:132 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:219 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:480 +msgid "下发MySQL介质包" +msgstr "下发MySQL介质包" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:631 +msgid "部署mysql-crond {}" +msgstr "部署mysql-crond {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:648 +msgid "安装MySQL实例 {}" +msgstr "安装MySQL实例 {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:655 +msgid "安装mysql实例flow" +msgstr "安装mysql实例flow" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:679 +msgid "构建子流程失败,联系系统管理员, check_client_conn_inst is null" +msgstr "构建子流程失败,联系系统管理员, check_client_conn_inst is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:681 +msgid "构建子流程失败,联系系统管理员, verify_checksum_tuples is null" +msgstr "构建子流程失败,联系系统管理员, verify_checksum_tuples is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:687 +msgid "检测客户端连接情况" +msgstr "检测客户端连接情况" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:701 +msgid "检测checksum结果" +msgstr "检测checksum结果" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:718 +msgid "[{}]预检测" +msgstr "[{}]预检测" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:742 +msgid "" +"构建init_machine_sub子流程失败,联系系统管理员, sys_init_ips & " +"init_check_ips & yum_install_perl_ips is null" +msgstr "构建init_machine_sub子流程失败,联系系统管理员, sys_init_ips & init_check_ips & yum_install_perl_ips is null" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:752 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:88 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:85 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:120 +msgid "空闲检查[{}]" +msgstr "空闲检查[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:787 +msgid "安装MySQL Perl相关依赖" +msgstr "安装MySQL Perl相关依赖" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:810 +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:832 +msgid "获取机器系统信息" +msgstr "获取机器系统信息" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:822 +msgid "更新主机system info" +msgstr "更新主机system info" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:864 +msgid "修改{}上实例的的my.cnf配置" +msgstr "修改{}上实例的的my.cnf配置" + +#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:877 +msgid "同步修改my.cnf配置" +msgstr "同步修改my.cnf配置" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:17 +msgid "Flow模块TenDB 异常" +msgstr "Flow模块TenDB 异常" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:28 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:28 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:52 +msgid "获取备份失败" +msgstr "获取备份失败" + +#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:34 +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:34 +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:58 +msgid "获取binlog失败" +msgstr "获取binlog失败" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_binlog_backup.py:26 +msgid "备份时间点:{} 大于 回滚时间点:{}" +msgstr "备份时间点:{} 大于 回滚时间点:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_binlog_backup.py:54 +msgid "原备份节点节点{} 的binlog失败" +msgstr "原备份节点节点{} 的binlog失败" + +#: backend/flow/engine/bamboo/scene/mysql/common/get_local_backup.py:109 +msgid "使用的备份信息: {}" +msgstr "使用的备份信息: {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:111 +msgid "给master添加切换临时账号" +msgstr "给master添加切换临时账号" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:119 +msgid "给新slave添加切换临时账号" +msgstr "给新slave添加切换临时账号" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:141 +msgid "新master克隆旧master权限,新slave克隆旧slave权限" +msgstr "新master克隆旧master权限,新slave克隆旧slave权限" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:305 +msgid "执行集群切换" +msgstr "执行集群切换" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:179 +msgid "其余slave节点同步新master数据" +msgstr "其余slave节点同步新master数据" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:189 +msgid "回收旧slave的域名映射" +msgstr "回收旧slave的域名映射" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:207 +msgid "对新slave添加域名映射" +msgstr "对新slave添加域名映射" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:223 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:195 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:340 +msgid "联动TBinlogDumper切换单据" +msgstr "联动TBinlogDumper切换单据" + +#: backend/flow/engine/bamboo/scene/mysql/common/master_and_slave_switch.py:236 +msgid "{}集群执行成对切换" +msgstr "{}集群执行成对切换" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:63 +msgid "获取集群 {} 的本地备份信息失败" +msgstr "获取集群 {} 的本地备份信息失败" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:73 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:187 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:287 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:92 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:154 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:307 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:46 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:150 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:67 +msgid "创建目录 {}" +msgstr "创建目录 {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:98 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:333 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:326 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:297 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:272 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:393 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:100 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:370 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:339 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:377 +msgid "下发db-actor到节点{}" +msgstr "下发db-actor到节点{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:94 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:308 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:194 +msgid "本地备份文件下载" +msgstr "本地备份文件下载" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:118 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:216 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:351 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:136 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:142 +msgid "恢复新从节点数据 {}:{}" +msgstr "恢复新从节点数据 {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:133 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:367 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:395 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:151 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:158 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:186 +msgid "新增repl帐户{}" +msgstr "新增repl帐户{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:146 +msgid "建立主从关系 {}:{}" +msgstr "建立主从关系 {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:150 +msgid "用本地备份恢复数据{}" +msgstr "用本地备份恢复数据{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:177 +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:277 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:72 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:227 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:52 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:139 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:119 +msgid "获取集群 {} 的备份信息失败" +msgstr "获取集群 {} 的备份信息失败" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:197 +msgid "下载备份到{}" +msgstr "下载备份到{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:108 +msgid "下载定点恢复的binlog到{}" +msgstr "下载定点恢复的binlog到{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:251 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:115 +msgid "定点恢复之前滚binlog{}" +msgstr "定点恢复之前滚binlog{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:256 +msgid "用本地备份恢复数据{}:{}" +msgstr "用本地备份恢复数据{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:293 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:296 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:73 +msgid "下发db-actor到节点" +msgstr "下发db-actor到节点" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:334 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:125 +msgid "恢复新主节点数据 {}:{}" +msgstr "恢复新主节点数据 {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:382 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:173 +msgid "建立主从关系:新从库指向新主库 {} {}:" +msgstr "建立主从关系:新从库指向新主库 {} {}:" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:409 +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:165 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:200 +msgid "建立主从关系:新主库指向旧主库 {}:{}" +msgstr "建立主从关系:新主库指向旧主库 {}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/mysql_resotre_data_sub_flow.py:413 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:204 +msgid "RemoteDB主从节点成对迁移子流程{}" +msgstr "RemoteDB主从节点成对迁移子流程{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:78 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:185 +msgid "获取remotedb分片 {} 的备份信息不存在" +msgstr "获取remotedb分片 {} 的备份信息不存在" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:187 +msgid "获取remotedb分片 {} 的备份信息为空" +msgstr "获取remotedb分片 {} 的备份信息为空" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:120 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:97 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:105 +msgid "下载全库备份介质到 {}" +msgstr "下载全库备份介质到 {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/recover_slave_instance.py:170 +msgid "{}:{}从节点重建" +msgstr "{}:{}从节点重建" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:54 +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:59 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:119 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:116 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:136 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:93 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:202 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:219 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:317 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:192 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:207 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:376 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:104 +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:82 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:602 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:777 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:113 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:126 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:124 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:179 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:99 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:158 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:109 +msgid "下发db-actuator介质" +msgstr "下发db-actuator介质" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:86 +msgid "新从库加入checksum记录 {}" +msgstr "新从库加入checksum记录 {}" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:118 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:529 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:495 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:826 +msgid "克隆权限" +msgstr "克隆权限" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:128 +msgid "先添加新从库域名{}:{}" +msgstr "先添加新从库域名{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:144 +msgid "再删除旧从库域名{}" +msgstr "再删除旧从库域名{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/slave_recover_switch.py:154 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:837 +msgid "[{}]成对切换" +msgstr "[{}]成对切换" + +#: backend/flow/engine/bamboo/scene/mysql/common/uninstall_instance.py:40 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:222 +msgid "卸载MySQL实例:{}:{}" +msgstr "卸载MySQL实例:{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/common/uninstall_instance.py:53 +#: backend/flow/engine/bamboo/scene/spider/spider_remote_node_migrate.py:236 +msgid "Remote node {} 卸载整机实例" +msgstr "Remote node {} 卸载整机实例" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:71 +msgid "运行数据导出任务" +msgstr "运行数据导出任务" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:107 +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:246 +msgid "查询不到可执行的实例!!!" +msgstr "查询不到可执行的实例!!!" + +#: backend/flow/engine/bamboo/scene/mysql/dbconsole.py:136 +msgid "DRS查询主从延迟失败:{}" +msgstr "DRS查询主从延迟失败:{}" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:89 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:91 +msgid "下发db-actuator介质[云区域ID:{}]" +msgstr "下发db-actuator介质[云区域ID:{}]" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:102 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:104 +msgid "下发SQL文件[云区域ID:{}]" +msgstr "下发SQL文件[云区域ID:{}]" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:129 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:128 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:152 +msgid "执行SQL导入" +msgstr "执行SQL导入" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:142 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:141 +msgid "[{}]执行SQL变更" +msgstr "[{}]执行SQL变更" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:156 +msgid "查询不到可执行的集群!!!" +msgstr "查询不到可执行的集群!!!" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:181 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:167 +msgid "给模板集群下发db-actuator" +msgstr "给模板集群下发db-actuator" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:193 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:179 +msgid "备份测试库表结构" +msgstr "备份测试库表结构" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:206 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:192 +msgid "对SQL文件进行语义测试" +msgstr "对SQL文件进行语义测试" + +#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:226 +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:210 +msgid "创建SQL执行单据" +msgstr "创建SQL执行单据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_authorize_rules.py:42 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:293 +msgid "添加mysql规则授权" +msgstr "添加mysql规则授权" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:126 +msgid "检查元数据信息是否存在主备关系" +msgstr "检查元数据信息是否存在主备关系" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:131 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:58 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:137 +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:97 +#: backend/ticket/constants.py:475 +msgid "定时" +msgstr "定时" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:149 +msgid "创建临时用户" +msgstr "创建临时用户" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:178 +msgid "actuator执行checksum" +msgstr "actuator执行checksum" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:191 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:200 +msgid "删除临时用户" +msgstr "删除临时用户" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:210 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:219 +msgid "生成校验报告" +msgstr "生成校验报告" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:216 +msgid "master[{}{}{}],slave[{}{}{}]的校验结果" +msgstr "master[{}{}{}],slave[{}{}{}]的校验结果" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:229 +msgid "master[{}{}{}]的校验任务" +msgstr "master[{}{}{}]的校验任务" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:235 +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:251 +msgid "构建checksum流程成功" +msgstr "构建checksum流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_clone_rules.py:41 +msgid "添加mysql权限克隆" +msgstr "添加mysql权限克隆" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:64 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:86 +msgid "集群实例类型不适用于开区" +msgstr "集群实例类型不适用于开区" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:144 +msgid "下发db_actuator介质" +msgstr "下发db_actuator介质" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:157 +msgid "从源实例{}#{}获取库" +msgstr "从源实例{}#{}获取库" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:176 +msgid "下发库表文件到目标实例" +msgstr "下发库表文件到目标实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:194 +msgid "向目标实例:{}#{}导入库" +msgstr "向目标实例:{}#{}导入库" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_data_migrate_flow.py:210 +msgid "数据迁移流程" +msgstr "数据迁移流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:67 +msgid "下发db-actor到集群主从节点{}" +msgstr "下发db-actor到集群主从节点{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:82 +msgid "修改mysql实例配置{}" +msgstr "修改mysql实例配置{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:97 +msgid "开始修改mysql配置" +msgstr "开始修改mysql配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:42 +msgid "串行1" +msgstr "串行1" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:43 +msgid "串行2" +msgstr "串行2" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:44 +msgid "串行3" +msgstr "串行3" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:48 +msgid "并行1" +msgstr "并行1" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:53 +msgid "并行2" +msgstr "并行2" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:58 +msgid "错误并行3" +msgstr "错误并行3" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:65 +msgid "串行结束" +msgstr "串行结束" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:114 +msgid "获取回档库表" +msgstr "获取回档库表" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:87 +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:39 +msgid "检查库表是否在用" +msgstr "检查库表是否在用" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:93 +msgid "下发db-actor到集群主节点{}" +msgstr "下发db-actor到集群主节点{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:110 +msgid "flashback启动恢复数据中{}" +msgstr "flashback启动恢复数据中{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:122 +msgid "flash开始恢复数据" +msgstr "flash开始恢复数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:145 +msgid "下发Proxy介质包" +msgstr "下发Proxy介质包" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:164 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:226 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:291 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:159 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:168 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:145 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:125 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:272 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:253 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:514 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:294 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:213 +msgid "部署mysql-crond" +msgstr "部署mysql-crond" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:178 +msgid "安装proxy实例" +msgstr "安装proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:188 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:152 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:267 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:528 +msgid "安装MySQL实例" +msgstr "安装MySQL实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:233 +msgid "proxy配置后端实例" +msgstr "proxy配置后端实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:98 +msgid "添加主集群域名" +msgstr "添加主集群域名" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:255 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:117 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:119 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:219 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:153 +msgid "添加从集群域名" +msgstr "添加从集群域名" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:270 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:426 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:662 +msgid "{}集群部署" +msgstr "{}集群部署" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:310 +msgid "部署MySQL高可用集群" +msgstr "部署MySQL高可用集群" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:100 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:94 +msgid "{} standby slave 不存在" +msgstr "{} standby slave 不存在" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:121 +msgid "构造mydumper正则" +msgstr "构造mydumper正则" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:170 +msgid "检查正则匹配" +msgstr "检查正则匹配" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:145 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:128 +msgid "执行库表备份" +msgstr "执行库表备份" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:159 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:143 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:127 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:134 +msgid "关联备份id" +msgstr "关联备份id" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:133 +msgid "{} 库表备份" +msgstr "{} 库表备份" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:167 +msgid "构建库表备份流程成功" +msgstr "构建库表备份流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:107 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:364 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:93 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:590 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:114 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:73 +msgid "删除注册CC系统的服务实例" +msgstr "删除注册CC系统的服务实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:137 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:159 +msgid "清理实例周边配置" +msgstr "清理实例周边配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:146 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:398 +msgid "卸载proxy实例" +msgstr "卸载proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:168 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:130 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:183 +msgid "卸载mysql实例" +msgstr "卸载mysql实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:177 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:144 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:656 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:192 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:128 +msgid "清理db_meta元信息" +msgstr "清理db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:191 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:142 +msgid "清理机器级别配置" +msgstr "清理机器级别配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:197 +msgid "下架MySQL高可用集群[{}]" +msgstr "下架MySQL高可用集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:89 +msgid "检测Proxy端连接情况" +msgstr "检测Proxy端连接情况" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:104 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:111 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:102 +msgid "删除集群域名" +msgstr "删除集群域名" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:131 +msgid "重启proxy实例" +msgstr "重启proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:148 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:80 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:156 +msgid "集群变更OFFLINE状态" +msgstr "集群变更OFFLINE状态" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:159 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:166 +msgid "禁用MySQL高可用集群[{}]" +msgstr "禁用MySQL高可用集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:133 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:93 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:135 +msgid "集群变更ONLINE状态" +msgstr "集群变更ONLINE状态" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:144 +msgid "启动MySQL高可用集群[{}]" +msgstr "启动MySQL高可用集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:96 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:124 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:131 +msgid "不支持的备份位置 {}" +msgstr "不支持的备份位置 {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:148 +msgid "{} 全库备份" +msgstr "{} 全库备份" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:151 +msgid "构建全库备份流程成功" +msgstr "构建全库备份流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:44 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:39 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:39 +msgid "写入元数据" +msgstr "写入元数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:49 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:180 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:289 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:103 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:517 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:483 +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:303 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:44 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:93 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:114 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:44 +#: backend/ticket/builders/__init__.py:366 +#: backend/ticket/builders/common/constants.py:97 +#: backend/ticket/builders/mysql/mysql_checksum.py:197 +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +#: backend/ticket/constants.py:469 backend/ticket/constants.py:496 +msgid "人工确认" +msgstr "人工确认" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:52 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:47 +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:47 +msgid "修改集群状态" +msgstr "修改集群状态" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:55 +msgid "TenDBHA 元数据导入" +msgstr "TenDBHA 元数据导入" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_metadata_import.py:57 +msgid "构建TenDBHA元数据导入流程成功" +msgstr "构建TenDBHA元数据导入流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:114 +msgid "构建TenDBHA集群标准化流程成功" +msgstr "构建TenDBHA集群标准化流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:192 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:122 +msgid "安装{}插件" +msgstr "安装{}插件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:212 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:142 +msgid "cloud {} 下发文件" +msgstr "cloud {} 下发文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:151 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:156 +msgid "模块标准化" +msgstr "模块标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:186 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:154 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:159 +msgid "{} CC 模块标准化" +msgstr "{} CC 模块标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:190 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:158 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:163 +msgid "CC标准化" +msgstr "CC标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:199 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:136 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:172 +msgid "实例化配置" +msgstr "实例化配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:201 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:138 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:174 +msgid "实例化 {} 配置" +msgstr "实例化 {} 配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:205 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:142 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:178 +msgid "实例化集群配置" +msgstr "实例化集群配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:213 +msgid "标准化proxy" +msgstr "标准化proxy" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:239 +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:304 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:307 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:226 +msgid "部署监控程序" +msgstr "部署监控程序" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:251 +msgid "{} 部署dba工具" +msgstr "{} 部署dba工具" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:256 +msgid "接入层标准化" +msgstr "接入层标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:272 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:194 +msgid "实例标准化" +msgstr "实例标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:317 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:320 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:239 +msgid "部署备份程序" +msgstr "部署备份程序" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:330 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:333 +msgid "部署rotate binlog" +msgstr "部署rotate binlog" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:343 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:346 +msgid "部署数据校验程序" +msgstr "部署数据校验程序" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:356 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:359 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:252 +msgid "部署DBA工具箱" +msgstr "部署DBA工具箱" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:368 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:243 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:263 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:264 +msgid "{} 标准化" +msgstr "{} 标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py:372 +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:268 +msgid "存储层标准化" +msgstr "存储层标准化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:159 +msgid "执行集群主故障转移" +msgstr "执行集群主故障转移" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:174 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:319 +msgid "salve节点同步新master数据" +msgstr "salve节点同步新master数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:207 +msgid "{}集群执行主故障切换" +msgstr "{}集群执行主故障切换" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:214 +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:359 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:150 +msgid "变更db_meta元信息" +msgstr "变更db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:237 +msgid "主故障切换流程[整机切换]" +msgstr "主故障切换流程[整机切换]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:102 +msgid "the is_stand_by of new-master-instance [{}] is False " +msgstr "the is_stand_by of new-master-instance [{}] is False " + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:144 +msgid "回收新master的域名映射" +msgstr "回收新master的域名映射" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:159 +msgid "对旧master添加域名映射" +msgstr "对旧master添加域名映射" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:269 +msgid "旧master添加切换临时账号" +msgstr "旧master添加切换临时账号" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:284 +msgid "新master克隆旧master权限" +msgstr "新master克隆旧master权限" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:352 +msgid "{}集群执行主从切换" +msgstr "{}集群执行主从切换" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:382 +msgid "主从切换流程[整机切换]" +msgstr "主从切换流程[整机切换]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:173 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:179 +msgid "安装完毕,写入初始化实例的db_meta元信息" +msgstr "安装完毕,写入初始化实例的db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:203 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:209 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:183 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:180 +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:268 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:220 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:187 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:231 +msgid "安装临时备份程序" +msgstr "安装临时备份程序" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:207 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:213 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:139 +msgid "安装实例" +msgstr "安装实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:257 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:251 +msgid "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" +msgstr "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:267 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:261 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:243 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:221 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:298 +msgid "恢复实例数据" +msgstr "恢复实例数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:306 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:300 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:305 +msgid "集群切换完成,写入 {} 的元信息" +msgstr "集群切换完成,写入 {} 的元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:317 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:311 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:317 +msgid "集群 {} 切换" +msgstr "集群 {} 切换" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:345 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:338 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:116 +msgid "清理实例级别周边配置" +msgstr "清理实例级别周边配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:365 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:285 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:261 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:328 +msgid "卸载实例前先删除元数据" +msgstr "卸载实例前先删除元数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:377 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:370 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:329 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:309 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:283 +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:155 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:393 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:351 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:401 +msgid "清理机器配置" +msgstr "清理机器配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:392 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:385 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:330 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:302 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:408 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:366 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:416 +msgid "卸载remote节点{}" +msgstr "卸载remote节点{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:415 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:409 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:353 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:324 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:320 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:240 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:418 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:376 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:425 +msgid "人工确认切换" +msgstr "人工确认切换" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:445 +msgid "更新集群模块" +msgstr "更新集群模块" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:459 +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:454 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:370 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:341 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:424 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:382 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:431 +msgid "人工确认卸载实例" +msgstr "人工确认卸载实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:463 +msgid "集群{}开始成对迁移" +msgstr "集群{}开始成对迁移" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:358 +msgid "实例卸载前删除元数据" +msgstr "实例卸载前删除元数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:440 +msgid "更新集群db模块" +msgstr "更新集群db模块" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py:457 +msgid "集群开始成对迁移" +msgstr "集群开始成对迁移" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:356 +msgid "从源实例:{}#{}获取开区所需库表结构" +msgstr "从源实例:{}#{}获取开区所需库表结构" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:250 +msgid "下发开区库表文件" +msgstr "下发开区库表文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:269 +msgid "向目标实例:{}#{}导入库表结构" +msgstr "向目标实例:{}#{}导入库表结构" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:282 +msgid "目标集群开区导入表结构流程" +msgstr "目标集群开区导入表结构流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:330 +msgid "上传开区参数文件" +msgstr "上传开区参数文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:341 +msgid "下发开区参数文件" +msgstr "下发开区参数文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:374 +msgid "下发开区库表数据文件" +msgstr "下发开区库表数据文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:393 +msgid "向目标实例:{}#{}导入库表数据" +msgstr "向目标实例:{}#{}导入库表数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_open_area_flow.py:408 +msgid "开区数据迁移流程" +msgstr "开区数据迁移流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:93 +msgid "上传sql文件" +msgstr "上传sql文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:104 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:117 +msgid "下发sql文件" +msgstr "下发sql文件" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:131 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:56 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:169 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:59 +msgid "actuator执行partition" +msgstr "actuator执行partition" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:147 +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:71 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:74 +msgid "生成分区执行报告" +msgstr "生成分区执行报告" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:153 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:177 +msgid "cluster[{}]的分区任务" +msgstr "cluster[{}]的分区任务" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:156 +msgid "构建mysql partition流程成功" +msgstr "构建mysql partition流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:75 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:78 +msgid "ip[{}]的分区任务" +msgstr "ip[{}]的分区任务" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_partition_cron.py:77 +msgid "构建mysql partition 定时任务流程成功" +msgstr "构建mysql partition 定时任务流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:146 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:154 +msgid "下发proxy安装介质" +msgstr "下发proxy安装介质" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:166 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:175 +msgid "部署proxy实例" +msgstr "部署proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:206 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:221 +msgid "新的proxy配置后端实例" +msgstr "新的proxy配置后端实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:214 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:231 +msgid "克隆proxy用户白名单" +msgstr "克隆proxy用户白名单" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:227 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:244 +msgid "集群对新的proxy添加权限" +msgstr "集群对新的proxy添加权限" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:239 +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:256 +msgid "增加新proxy域名映射" +msgstr "增加新proxy域名映射" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:254 +msgid "{}集群添加proxy实例" +msgstr "{}集群添加proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:261 +msgid "添加db_meta元信息" +msgstr "添加db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:279 +msgid "添加proxy子流程" +msgstr "添加proxy子流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:271 +msgid "{}集群替换proxy实例" +msgstr "{}集群替换proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:278 +msgid "新proxy记录元数据" +msgstr "新proxy记录元数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:307 +msgid "回收旧proxy机器的元数据信息" +msgstr "回收旧proxy机器的元数据信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:334 +msgid "替换proxy子流程" +msgstr "替换proxy子流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:391 +msgid "清理proxy实例级别周边配置" +msgstr "清理proxy实例级别周边配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:404 +msgid "回收对应proxy集群映射" +msgstr "回收对应proxy集群映射" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:415 +msgid "[{}:{}]下线" +msgstr "[{}:{}]下线" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:75 +msgid "根据cluster ids:{}法找到对应的proxy实例" +msgstr "根据cluster ids:{}法找到对应的proxy实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:89 +msgid "待升级版本大于等于新版本,请确认升级的版本" +msgstr "待升级版本大于等于新版本,请确认升级的版本" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:105 +msgid "本地升级proxy版本" +msgstr "本地升级proxy版本" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:124 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:389 +msgid "下发升级的安装包" +msgstr "下发升级的安装包" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:141 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:416 +msgid "执行本地升级" +msgstr "执行本地升级" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:147 +msgid "更新proxy version meta信息" +msgstr "更新proxy version meta信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_upgrade.py:156 +msgid "{}proxy实例升级" +msgstr "{}proxy实例升级" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:86 +msgid "下发actuator介质 云区域ID: {}" +msgstr "下发actuator介质 云区域ID: {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:114 +msgid "下发mysql-crond配置 {}" +msgstr "下发mysql-crond配置 {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:131 +msgid "下发MySQL rotatebinlog配置" +msgstr "下发MySQL rotatebinlog配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:161 +msgid "配置推送" +msgstr "配置推送" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:162 +msgid "构建配置推送流程完成" +msgstr "构建配置推送流程完成" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:182 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:227 +msgid "{}下发mysql-monitor配置" +msgstr "{}下发mysql-monitor配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:204 +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:269 +msgid "{}下发备份配置" +msgstr "{}下发备份配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:248 +msgid "{}下发mysql-table-checksum配置" +msgstr "{}下发mysql-table-checksum配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_push_peripheral_config.py:294 +msgid "{} 推送周边配置" +msgstr "{} 推送周边配置" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_random_password.py:50 +msgid "mysql密码随机化" +msgstr "mysql密码随机化" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:79 +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:94 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:114 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:97 +msgid "下发actuator介质[云区域ID: {}" +msgstr "下发actuator介质[云区域ID: {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:128 +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:138 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:164 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:149 +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:50 +msgid "{} 检查库表是否在用" +msgstr "{} 检查库表是否在用" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:146 +msgid "{} 执行 rename" +msgstr "{} 执行 rename" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:163 +msgid "{} 重命名数据库" +msgstr "{} 重命名数据库" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:168 +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:271 +msgid "DB重命名" +msgstr "DB重命名" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:169 +msgid "构建重命名数据库流程成功" +msgstr "构建重命名数据库流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:152 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:455 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:556 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:149 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:406 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:524 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:122 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:213 +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:188 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:156 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:153 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:171 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:227 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:248 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:201 +msgid "写入初始化实例的db_meta元信息" +msgstr "写入初始化实例的db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:188 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:185 +msgid "安装从节点" +msgstr "安装从节点" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:232 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:211 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:238 +msgid "同步完毕,写入主从关系,设置节点为running状态" +msgstr "同步完毕,写入主从关系,设置节点为running状态" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:268 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:246 +msgid "slave切换完毕,修改集群 {} 数据" +msgstr "slave切换完毕,修改集群 {} 数据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:278 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:256 +msgid "切换到新从节点" +msgstr "切换到新从节点" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:376 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:346 +msgid "slave重建迁移{}" +msgstr "slave重建迁移{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:424 +msgid "下发db-actor到节点{} {}" +msgstr "下发db-actor到节点{} {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:468 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:434 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:150 +msgid "屏蔽监控 {}" +msgstr "屏蔽监控 {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:480 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:446 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:162 +msgid "从库reset slave {}" +msgstr "从库reset slave {}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:500 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:460 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:176 +msgid "slave重建之清理从库{}" +msgstr "slave重建之清理从库{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:539 +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:506 +msgid "添加从库域名{}:{}" +msgstr "添加从库域名{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:579 +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:259 +msgid "slave原地重建{}" +msgstr "slave原地重建{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py:547 +msgid "{}slave原地重建" +msgstr "{}slave原地重建" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:205 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:358 +msgid "rollback_type不存在" +msgstr "rollback_type不存在" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:207 +msgid "定点恢复" +msgstr "定点恢复" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:259 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:128 +msgid "回档集群 {} 空闲检查不通过,请确认回档集群是否存在非系统数据库" +msgstr "回档集群 {} 空闲检查不通过,请确认回档集群是否存在非系统数据库" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:362 +msgid "定点回档到{}:{}" +msgstr "定点回档到{}:{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:367 +msgid "定点回档到{}" +msgstr "定点回档到{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:75 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:153 +msgid "下载定点恢复的全库备份介质到{}" +msgstr "下载定点恢复的全库备份介质到{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:83 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:161 +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:210 +msgid "定点恢复之恢复数据{}" +msgstr "定点恢复之恢复数据{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:120 +msgid "{}:{}定点回滚数据 REMOTE_AND_TIME " +msgstr "{}:{}定点回滚数据 REMOTE_AND_TIME " + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:168 +msgid "{}:{}定点回滚数据 REMOTE_AND_BACKUPID " +msgstr "{}:{}定点回滚数据 REMOTE_AND_BACKUPID " + +#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_sub_flow.py:217 +msgid "{}:{}定点回滚数据 LOCAL_AND_BACKUPID " +msgstr "{}:{}定点回滚数据 LOCAL_AND_BACKUPID " + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:130 +msgid "下发MySQL介质" +msgstr "下发MySQL介质" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:180 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:146 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:76 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:158 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:175 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:117 +msgid "录入db_meta元信息" +msgstr "录入db_meta元信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:204 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_single_deploy.py:139 +msgid "部署单节点集群" +msgstr "部署单节点集群" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:207 +msgid "部署子流程" +msgstr "部署子流程" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:168 +msgid "下架MySQL单节点集群[{}]" +msgstr "下架MySQL单节点集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:58 +msgid "检测实例连接情况" +msgstr "检测实例连接情况" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:69 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:115 +msgid "回收集群域名" +msgstr "回收集群域名" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:90 +msgid "禁用MySQL单节点集群[{}]" +msgstr "禁用MySQL单节点集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:104 +msgid "启动MySQL单节点集群[{}]" +msgstr "启动MySQL单节点集群[{}]" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:155 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:249 +msgid "{} 执行清档" +msgstr "{} 执行清档" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:173 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:287 +msgid "生成删除备份库sql" +msgstr "生成删除备份库sql" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:297 +msgid "{} 清档" +msgstr "{} 清档" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:188 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:302 +msgid "生成删除备份库变更SQL单据" +msgstr "生成删除备份库变更SQL单据" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:193 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:307 +#: backend/ticket/builders/redis/redis_purge.py:56 +msgid "集群清档" +msgstr "集群清档" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:194 +msgid "构建清档流程成功" +msgstr "构建清档流程成功" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:51 +msgid "不允许跨多个大版本升级" +msgstr "不允许跨多个大版本升级" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:58 +msgid "当前集群MySQL升级版本大于等于新版本,请确认" +msgstr "当前集群MySQL升级版本大于等于新版本,请确认" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:110 +msgid "查询集群{}stanb_by slave实例为None" +msgstr "查询集群{}stanb_by slave实例为None" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:117 +msgid "请先升级{}stanb_by的其他slave实例" +msgstr "请先升级{}stanb_by的其他slave实例" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:120 +msgid "{}升级前后字符集不一致,原字符集:{},新模块的字符集{}" +msgstr "{}升级前后字符集不一致,原字符集:{},新模块的字符集{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:173 +msgid "当前集群,请确认" +msgstr "当前集群,请确认" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:176 +msgid "必须把主机关联的集群都选上,请确认" +msgstr "必须把主机关联的集群都选上,请确认" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:233 +msgid "无法找到对应的从实例记录" +msgstr "无法找到对应的从实例记录" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:242 +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:353 +msgid "集群的master应该同属于一个机器,当前分布在{}" +msgstr "集群的master应该同属于一个机器,当前分布在{}" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:340 +msgid "[TendbHa]本地升级MySQL版本" +msgstr "[TendbHa]本地升级MySQL版本" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:365 +msgid "[TendbSingle]本地升级MySQL版本" +msgstr "[TendbSingle]本地升级MySQL版本" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:367 +msgid "不支持的集群类型" +msgstr "不支持的集群类型" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:405 +msgid "执行本地升级前置检查" +msgstr "执行本地升级前置检查" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:422 +msgid "更新mysql instance version meta信息" +msgstr "更新mysql instance version meta信息" + +#: backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py:431 +msgid "MySQL实例升级" +msgstr "MySQL实例升级" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:94 +msgid "修复单据找不到可修复的存储对" +msgstr "修复单据找不到可修复的存储对" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:122 +msgid "执行数据修复" +msgstr "执行数据修复" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:135 +msgid "{}:{}做数据修复" +msgstr "{}:{}做数据修复" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:140 +msgid "{}数据修复" +msgstr "{}数据修复" + +#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:143 +msgid "修复单据找不到可修复的集群" +msgstr "修复单据找不到可修复的集群" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:51 +msgid "创建clb" +msgstr "创建clb" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:55 +msgid "clb信息写入meta" +msgstr "clb信息写入meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:61 +msgid "clb域名添加到dns,clb域名信息写入meta" +msgstr "clb域名添加到dns,clb域名信息写入meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:80 +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:184 +msgid "主域名解绑clb ip" +msgstr "主域名解绑clb ip" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:86 +msgid "dns删除clb域名,从meta删除clb域名信息" +msgstr "dns删除clb域名,从meta删除clb域名信息" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:92 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:164 +msgid "删除clb" +msgstr "删除clb" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:96 +msgid "从meta删除clb信息" +msgstr "从meta删除clb信息" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:115 +msgid "创建polaris" +msgstr "创建polaris" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:121 +msgid "polaris信息写入meta" +msgstr "polaris信息写入meta" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:140 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:211 +msgid "删除polaris" +msgstr "删除polaris" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:146 +msgid "从meta删除polaris信息" +msgstr "从meta删除polaris信息" + +#: backend/flow/engine/bamboo/scene/name_service/name_service.py:165 +msgid "主域名绑定clb ip" +msgstr "主域名绑定clb ip" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:18 +msgid "Flow模块Pulsar集群异常" +msgstr "Flow模块Pulsar集群异常" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:29 +msgid "Pulsar-Broker异常" +msgstr "Pulsar-Broker异常" + +#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:30 +msgid "Pulsar集群Broker数量不能为0" +msgstr "Pulsar集群Broker数量不能为0" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:105 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:97 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:163 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:82 +msgid "下发pulsar介质" +msgstr "下发pulsar介质" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:121 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:69 +msgid "添加ZK域名" +msgstr "添加ZK域名" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:133 +msgid "仅非DNS环境使用-添加broker hosts" +msgstr "仅非DNS环境使用-添加broker hosts" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:170 +msgid "初始化集群配置-{}" +msgstr "初始化集群配置-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:185 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:184 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:107 +msgid "分发密钥及token" +msgstr "分发密钥及token" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:201 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:307 +msgid "安装pulsar manager" +msgstr "安装pulsar manager" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:214 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:83 +msgid "插入pulsar manager实例信息" +msgstr "插入pulsar manager实例信息" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:230 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:315 +msgid "初始化pulsar manager" +msgstr "初始化pulsar manager" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:205 +msgid "仅非DNS环境使用-添加zookeeper hosts" +msgstr "仅非DNS环境使用-添加zookeeper hosts" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:210 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:249 +msgid "安装Pulsar-{}-common子流程" +msgstr "安装Pulsar-{}-common子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:259 +msgid "安装bookkeeper-{}" +msgstr "安装bookkeeper-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:289 +msgid "缩容Pulsar-Broker-{}" +msgstr "缩容Pulsar-Broker-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:319 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:193 +msgid "检查Broker配置-{}" +msgstr "检查Broker配置-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:330 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:205 +msgid "检查NameSpace配置-{}" +msgstr "检查NameSpace配置-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:337 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:216 +msgid "检查未复制ledger-{}" +msgstr "检查未复制ledger-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:344 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:274 +msgid "停止BookKeeper服务-{}" +msgstr "停止BookKeeper服务-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:350 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:280 +msgid "退役BookKeeper-{}" +msgstr "退役BookKeeper-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:355 +msgid "缩容Pulsar-BookKeeper-{}-子流程" +msgstr "缩容Pulsar-BookKeeper-{}-子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:77 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:67 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:67 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:65 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:66 +msgid "下发pulsar actuator" +msgstr "下发pulsar actuator" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:86 +msgid "Pulsar集群节点清理-{}" +msgstr "Pulsar集群节点清理-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:110 +msgid "删除ZK域名" +msgstr "删除ZK域名" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:78 +msgid "停止Pulsar集群进程-{}-{}" +msgstr "停止Pulsar集群进程-{}-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_fake_apply_flow.py:90 +msgid "写入token" +msgstr "写入token" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:116 +msgid "替换pulsar manager子流程" +msgstr "替换pulsar manager子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:143 +msgid "替换ZooKeeper子流程" +msgstr "替换ZooKeeper子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:216 +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:73 +msgid "缩容BookKeeper子流程" +msgstr "缩容BookKeeper子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:283 +msgid "更新pulsar_manager实例信息" +msgstr "更新pulsar_manager实例信息" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:296 +msgid "仅非DNS环境使用-添加broker域名" +msgstr "仅非DNS环境使用-添加broker域名" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:86 +msgid "停止ZooKeeper服务-{}" +msgstr "停止ZooKeeper服务-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:100 +msgid "更新ZK域名" +msgstr "更新ZK域名" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:117 +msgid "仅非DNS环境使用-更新ZK映射" +msgstr "仅非DNS环境使用-更新ZK映射" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:133 +msgid "替换Pulsar-ZooKeeper-{}-子流程" +msgstr "替换Pulsar-ZooKeeper-{}-子流程" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:230 +msgid "检查Ledger Metadata-{}" +msgstr "检查Ledger Metadata-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:243 +msgid "修改Bookie参数为ReadOnly-{}" +msgstr "修改Bookie参数为ReadOnly-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:257 +msgid "滚动重启BookKeeper-{}" +msgstr "滚动重启BookKeeper-{}" + +#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:264 +msgid "等待数据过期" +msgstr "等待数据过期" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:44 +msgid "添加域名映射" +msgstr "添加域名映射" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:69 +msgid "域名变更子流程" +msgstr "域名变更子流程" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:96 +msgid "add_ips 和 del_ips 不能同时为空" +msgstr "add_ips 和 del_ips 不能同时为空" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:107 +msgid "添加记录{}" +msgstr "添加记录{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:118 +msgid "删除记录{}" +msgstr "删除记录{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:122 +msgid "更新域名{}" +msgstr "更新域名{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:139 +msgid "clb添加rs" +msgstr "clb添加rs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:153 +msgid "clb剔除rs" +msgstr "clb剔除rs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:169 +msgid "CLB变更子流程" +msgstr "CLB变更子流程" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:186 +msgid "polaris添加rs" +msgstr "polaris添加rs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:200 +msgid "polaris剔除rs" +msgstr "polaris剔除rs" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:216 +msgid "北极星变更子流程" +msgstr "北极星变更子流程" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py:284 +msgid "{}-{}-dns/clb 接入层子任务" +msgstr "{}-{}-dns/clb 接入层子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:71 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:69 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:63 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:57 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:113 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:66 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:127 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:61 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:55 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:219 +msgid "{}-下发介质包" +msgstr "{}-下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:86 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:72 +msgid "请求检查-{}" +msgstr "请求检查-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:100 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:197 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:87 +msgid "卸载监控-{}" +msgstr "卸载监控-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:114 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:129 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:415 +msgid "干掉非活跃链接-{}" +msgstr "干掉非活跃链接-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:126 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:141 +msgid "下架实例-{}" +msgstr "下架实例-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:138 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:99 +msgid "清理元数据-{}" +msgstr "清理元数据-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:143 +msgid "Redis-{}-下架原子任务" +msgstr "Redis-{}-下架原子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:183 +msgid "Proxy-{}-下发介质包" +msgstr "Proxy-{}-下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:211 +msgid "Proxy-{}-卸载实例" +msgstr "Proxy-{}-卸载实例" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:222 +msgid "Proxy-{}-删除元数据" +msgstr "Proxy-{}-删除元数据" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/dirty_machine_clear.py:227 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:126 +msgid "Proxy-{}-卸载原子任务" +msgstr "Proxy-{}-卸载原子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:88 +msgid "{}-rewrite配置servers" +msgstr "{}-rewrite配置servers" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/predixy_config_servers_rewrite.py:95 +msgid "{}-predixy rewrite配置servers" +msgstr "{}-predixy rewrite配置servers" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:80 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:73 +msgid "Proxy-001-{}-下发介质包" +msgstr "Proxy-001-{}-下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:87 +msgid "Proxy-002-{}-初始化机器" +msgstr "Proxy-002-{}-初始化机器" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:96 +msgid "Proxy-002-{}-安装backup-client工具" +msgstr "Proxy-002-{}-安装backup-client工具" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:158 +msgid "Proxy-003-{}-安装实例" +msgstr "Proxy-003-{}-安装实例" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:169 +msgid "Proxy-004-{}-写入元数据" +msgstr "Proxy-004-{}-写入元数据" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:192 +msgid "Proxy-005-{}-安装监控" +msgstr "Proxy-005-{}-安装监控" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:197 +msgid "Proxy-{}-安装原子任务" +msgstr "Proxy-{}-安装原子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:95 +msgid "Proxy-002-{}-卸载监控" +msgstr "Proxy-002-{}-卸载监控" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:108 +msgid "Proxy-003-{}-卸载实例" +msgstr "Proxy-003-{}-卸载实例" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_uninstall.py:121 +msgid "Proxy-004-{}-删除元数据" +msgstr "Proxy-004-{}-删除元数据" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:83 +msgid "{}-proxy版本升级" +msgstr "{}-proxy版本升级" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_upgrade.py:90 +msgid "{}-集群proxy版本升级" +msgstr "{}-集群proxy版本升级" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:58 +msgid "修改{}配置中心密码" +msgstr "修改{}配置中心密码" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:74 +msgid "修改实例密码: {}:{}" +msgstr "修改实例密码: {}:{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_change_password.py:80 +msgid "redis集群修改密码子任务" +msgstr "redis集群修改密码子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:75 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:131 +msgid "{}-kill客户端连接" +msgstr "{}-kill客户端连接" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:82 +msgid "{}-集群机器kill客户端连接" +msgstr "{}-集群机器kill客户端连接" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_client_conns_kill.py:138 +msgid "{}-集群kill客户端连接" +msgstr "{}-集群kill客户端连接" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:209 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:219 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:205 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:515 +msgid "{}-刷新监控" +msgstr "{}-刷新监控" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:245 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:386 +msgid "主从替换-{}" +msgstr "主从替换-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py:340 +msgid "元数据角色互换-{}" +msgstr "元数据角色互换-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:177 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:472 +msgid "Redis-新节点加入集群" +msgstr "Redis-新节点加入集群" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:189 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:170 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:192 +msgid "刷新域名-{}" +msgstr "刷新域名-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:217 +msgid "Redis-更新sbind_entry元数据" +msgstr "Redis-更新sbind_entry元数据" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:241 +msgid "Redis-初始化nodes域名" +msgstr "Redis-初始化nodes域名" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:279 +msgid "-e \"s/{}{}{}/{}{}{}/\"" +msgstr "-e \"s/{}{}{}/{}{}{}/\"" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:299 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:501 +msgid "刷新Predixy本地配置" +msgstr "刷新Predixy本地配置" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_slave_rep.py:320 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:544 +msgid "Slave替换-{}" +msgstr "Slave替换-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:85 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:146 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:359 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:800 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:812 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:494 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:319 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:346 +msgid "{}-安装bkdbmon" +msgstr "{}-安装bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:92 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:153 +msgid "{}-集群机器安装bkdbmon" +msgstr "{}-集群机器安装bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:59 +msgid "{}磁盘信息 " +msgstr "{}磁盘信息 " + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:67 +msgid "redis dts前置检查,{}->{}" +msgstr "redis dts前置检查,{}->{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:74 +msgid "redis dts发起任务并等待至增量同步阶段" +msgstr "redis dts发起任务并等待至增量同步阶段" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:78 +msgid "redis dts任务发起并等待同步完成" +msgstr "redis dts任务发起并等待同步完成" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:121 +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:83 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:103 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:217 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:122 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:107 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:140 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:105 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:94 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:338 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:69 +msgid "下发介质包" +msgstr "下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:129 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:145 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:133 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:173 +msgid "redis备份: {}" +msgstr "redis备份: {}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:144 +msgid "redis 清档: {}" +msgstr "redis 清档: {}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dts.py:155 +msgid "redis 备份后清档" +msgstr "redis 备份后清档" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:88 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:65 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:248 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:92 +msgid "下发介质" +msgstr "下发介质" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:93 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:113 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:651 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:242 +msgid "Redis-{}-下发介质包" +msgstr "Redis-{}-下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:101 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:660 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:251 +msgid "Redis-{}-初始化机器" +msgstr "Redis-{}-初始化机器" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:108 +msgid "|安装插件" +msgstr "|安装插件" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:112 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:668 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:259 +msgid "Redis-{}-安装backup-client工具" +msgstr "Redis-{}-安装backup-client工具" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:155 +msgid "{}-{}-安装实例" +msgstr "{}-{}-安装实例" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:173 +msgid "{}-{}-写入元数据" +msgstr "{}-{}-写入元数据" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:199 +msgid "Redis-{}-安装监控" +msgstr "Redis-{}-安装监控" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:204 +msgid "Redis-{}-{}" +msgstr "Redis-{}-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:83 +msgid "master:{}-加载module" +msgstr "master:{}-加载module" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:99 +msgid "slave:{}-加载module" +msgstr "slave:{}-加载module" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:122 +msgid "predixy:{}-加载module命令" +msgstr "predixy:{}-加载module命令" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:134 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:171 +msgid "更新集群dbconfig配置" +msgstr "更新集群dbconfig配置" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_load_module.py:140 +msgid "{}-集群加载modules" +msgstr "{}-集群加载modules" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:63 +msgid "下发介质包-{}" +msgstr "下发介质包-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:84 +msgid "卸载dbmon-{}" +msgstr "卸载dbmon-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:132 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:147 +msgid "拉起dbmon-{}" +msgstr "拉起dbmon-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:152 +msgid "Redis-{}-创建同步关系原子任务" +msgstr "Redis-{}-创建同步关系原子任务" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:177 +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:197 +msgid "建立主从关系-{}" +msgstr "建立主从关系-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:259 +msgid "发起备份-{}" +msgstr "发起备份-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:270 +msgid "发送备份文件-{}==>>{}" +msgstr "发送备份文件-{}==>>{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:282 +msgid "恢复备份-{}" +msgstr "恢复备份-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:312 +msgid "加入集群-{}" +msgstr "加入集群-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:330 +msgid "同步数据-{}" +msgstr "同步数据-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:80 +msgid "{}-设置maxmemory" +msgstr "{}-设置maxmemory" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_maxmemory_set.py:87 +msgid "{}-集群设置maxmemory" +msgstr "{}-集群设置maxmemory" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:47 +msgid "Redis-301-{}-下发介质包" +msgstr "Redis-301-{}-下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:62 +msgid "Redis-302-{}-检查同步状态" +msgstr "Redis-302-{}-检查同步状态" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:116 +msgid "踢掉旧节点-{}" +msgstr "踢掉旧节点-{}" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:146 +msgid "Redis-{}-下架" +msgstr "Redis-{}-下架" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:148 +msgid "Redis-{}-{}-下架" +msgstr "Redis-{}-{}-下架" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:104 +msgid "Redis-元数据加入集群" +msgstr "Redis-元数据加入集群" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:123 +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:556 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:573 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:645 +msgid "Redis-人工确认" +msgstr "Redis-人工确认" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:146 +msgid "Redis-{}-实例切换" +msgstr "Redis-{}-实例切换" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:158 +msgid "{}-检查切换状态" +msgstr "{}-检查切换状态" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:226 +msgid "元数据切换" +msgstr "元数据切换" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:241 +msgid "刷新-{}-dbmon" +msgstr "刷新-{}-dbmon" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:249 +msgid "{}-实例切换" +msgstr "{}-实例切换" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:71 +msgid "{}下发介质包" +msgstr "{}下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:84 +msgid "{}-gcs备份记录获取并保存到本地文件" +msgstr "{}-gcs备份记录获取并保存到本地文件" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:105 +msgid "{}-备份记录上报到bklog" +msgstr "{}-备份记录上报到bklog" + +#: backend/flow/engine/bamboo/scene/redis/atom_jobs/reupload_old_backup_records.py:109 +msgid "{}-重新上报备份记录" +msgstr "{}-重新上报备份记录" + +#: backend/flow/engine/bamboo/scene/redis/common/exceptions.py:17 +msgid "Flow模块Tendis 异常" +msgstr "Flow模块Tendis 异常" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:73 +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:59 +msgid "DTS_Server-{}-下发介质" +msgstr "DTS_Server-{}-下发介质" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:88 +msgid "DTS_Server-{}-部署" +msgstr "DTS_Server-{}-部署" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:94 +msgid "DTS_Server-{}-写入dbmeta" +msgstr "DTS_Server-{}-写入dbmeta" + +#: backend/flow/engine/bamboo/scene/redis/redis_add_dts_server.py:99 +msgid "ADD DTS_SERVER" +msgstr "ADD DTS_SERVER" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:425 +msgid "Redis集群扩缩容" +msgstr "Redis集群扩缩容" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:517 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:405 +msgid "更新storageinstance_bind_entry元数据" +msgstr "更新storageinstance_bind_entry元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:551 +msgid "初始化新增nodes域名" +msgstr "初始化新增nodes域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:597 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:520 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:827 +msgid "{}-重装bkdbmon" +msgstr "{}-重装bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:609 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:528 +msgid "Redis-更新dbconfig中集群版本" +msgstr "Redis-更新dbconfig中集群版本" + +#: backend/flow/engine/bamboo/scene/redis/redis_backend_scale.py:626 +msgid "{}backend扩缩容" +msgstr "{}backend扩缩容" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:286 +msgid "slave:{}:{} 实例安装" +msgstr "slave:{}:{} 实例安装" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:301 +msgid "new_slave 写入元数据" +msgstr "new_slave 写入元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:371 +msgid "同步关系 {}:{} -> {}:{}" +msgstr "同步关系 {}:{} -> {}:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:420 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:116 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:211 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:160 +msgid "初始化配置-{}" +msgstr "初始化配置-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:467 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:468 +msgid "元数据更新" +msgstr "元数据更新" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_add_slave.py:538 +msgid "Redis-{}-新建从库" +msgstr "Redis-{}-新建从库" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:119 +msgid "集群[{}]备份" +msgstr "集群[{}]备份" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:85 +msgid "下发介质包,ips:{}" +msgstr "下发介质包,ips:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:97 +msgid "redis dts数据校验: {}" +msgstr "redis dts数据校验: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:107 +msgid "数据修复人工确认" +msgstr "数据修复人工确认" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:116 +msgid "redis dts数据修复: {}" +msgstr "redis dts数据修复: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_check_repair.py:125 +msgid "数据校验与修复,源集群:{} 目的集群:{}" +msgstr "数据校验与修复,源集群:{} 目的集群:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:186 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:877 +msgid "断开同步关系" +msgstr "断开同步关系" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:203 +msgid "数据复制:{}->{}" +msgstr "数据复制:{}->{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:232 +msgid "bk_cloud_id:{} 未找到DNS nameserver" +msgstr "bk_cloud_id:{} 未找到DNS nameserver" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:235 +msgid "bk_cloud_id:{} DNS nameserver ip 为空" +msgstr "bk_cloud_id:{} DNS nameserver ip 为空" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:247 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:378 +msgid "源集群{}重复了" +msgstr "源集群{}重复了" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:268 +msgid "目标集群 {} 不存在" +msgstr "目标集群 {} 不存在" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:285 +msgid "" +"回档任务(src_cluster:{} recovery_time_point:" +"{} destroyed_status:0) 不存在?" +msgstr "回档任务(src_cluster:{} recovery_time_point:{} destroyed_status:0) 不存在?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:304 +msgid "回档临时环境如何(temp_cluster_proxy:{}) ping 失败, {}" +msgstr "回档临时环境如何(temp_cluster_proxy:{}) ping 失败, {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:318 +msgid "数据构造临时集群存在 redis 访问失败的情况,临时集群 redis:{}, {}" +msgstr "数据构造临时集群存在 redis 访问失败的情况,临时集群 redis:{}, {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:390 +msgid "集群当前分片数:{} 等于 目标分片数:{}" +msgstr "集群当前分片数:{} 等于 目标分片数:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:397 +msgid "集群:{} 当前running_master个数:{} 等于 目标分片数:{}" +msgstr "集群:{} 当前running_master个数:{} 等于 目标分片数:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:404 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:426 +msgid "集群:{} 目标版本:{} 不在 集群类型:{} 版本列表:{}中" +msgstr "集群:{} 目标版本:{} 不在 集群类型:{} 版本列表:{}中" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:414 +msgid "当前集群类型:{} == 目标集群类型:{}" +msgstr "当前集群类型:{} == 目标集群类型:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:418 +msgid "目标集群类型:{} == 集群:{} 当前类型:{}" +msgstr "目标集群类型:{} == 集群:{} 当前类型:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:423 +msgid "集群:{} 目标版本为空" +msgstr "集群:{} 目标版本为空" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:534 +msgid "集群:{}安装任务并检测任务状态" +msgstr "集群:{}安装任务并检测任务状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:544 +msgid "集群:{}清档任务并检测任务状态" +msgstr "集群:{}清档任务并检测任务状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:576 +msgid "在线切换任务并检测任务状态" +msgstr "在线切换任务并检测任务状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:581 +msgid "集群:{}禁用任务并检测任务状态" +msgstr "集群:{}禁用任务并检测任务状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:586 +msgid "集群:{}下架任务并检测任务状态" +msgstr "集群:{}下架任务并检测任务状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:763 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:783 +msgid "{} 前置检查" +msgstr "{} 前置检查" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:804 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:814 +msgid "{} proxys下发介质" +msgstr "{} proxys下发介质" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:825 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:835 +msgid "{} backend下发介质" +msgstr "{} backend下发介质" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:864 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:904 +msgid "{} 执行在线切换" +msgstr "{} 执行在线切换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:918 +msgid "交换源集群、目标集群的storageinstance 元数据" +msgstr "交换源集群、目标集群的storageinstance 元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:930 +msgid "更新源集群、目标集群的nodes域名" +msgstr "更新源集群、目标集群的nodes域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:952 +msgid "交换源集群、目标集群的 redis 配置" +msgstr "交换源集群、目标集群的 redis 配置" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:974 +msgid "交换源集群、目标集群的 proxy 版本信息" +msgstr "交换源集群、目标集群的 proxy 版本信息" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1031 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1048 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1088 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_data_copy.py:1105 +msgid "{} 重装 dbmon" +msgstr "{} 重装 dbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:104 +msgid "REDIS-实例下架" +msgstr "REDIS-实例下架" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_instance_shutdown.py:162 +msgid "实例下架-{}" +msgstr "实例下架-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_load_modules.py:62 +msgid "cluster:{} major_version:{} redis module {}" +msgstr "cluster:{} major_version:{} redis module {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:147 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:629 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:372 +msgid "{}-更新redis状态" +msgstr "{}-更新redis状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:159 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:146 +msgid "{}-更新proxy状态" +msgstr "{}-更新proxy状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:199 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:635 +msgid "{}更新状态子任务" +msgstr "{}更新状态子任务" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:274 +msgid "Proxy写入元数据" +msgstr "Proxy写入元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:296 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:702 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:371 +msgid "Redis-{}-写入元数据" +msgstr "Redis-{}-写入元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:310 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:725 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:393 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:200 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:236 +msgid "redis建立主从 元数据" +msgstr "redis建立主从 元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:347 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:240 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:275 +msgid "建立集群 元数据" +msgstr "建立集群 元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:372 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:761 +msgid "更新业务NOSQL DBA" +msgstr "更新业务NOSQL DBA" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:383 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:850 +msgid "clb元数据写入" +msgstr "clb元数据写入" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:393 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:860 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:251 +msgid "polairs元数据写入" +msgstr "polairs元数据写入" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:447 +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:254 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:296 +msgid "回写集群配置[Redis]" +msgstr "回写集群配置[Redis]" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:465 +msgid "回写集群proxy配置" +msgstr "回写集群proxy配置" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:496 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:865 +msgid "{}迁移子任务" +msgstr "{}迁移子任务" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:748 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:414 +msgid "{}-主从实例集群元数据" +msgstr "{}-主从实例集群元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py:784 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:444 +msgid "{}-回写集群配置[Redis]" +msgstr "{}-回写集群配置[Redis]" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:52 +msgid "redis集群 {} 目标版本文件为空?" +msgstr "redis集群 {} 目标版本文件为空?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:68 +msgid "redis集群:{} cluster_type:{} 不认识" +msgstr "redis集群:{} cluster_type:{} 不认识" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_proxy_version_upgrade.py:73 +msgid "redis集群:{} 目标版本文件:{} 与'版本文件'中文件名称:{} 不同" +msgstr "redis集群:{} 目标版本文件:{} 与'版本文件'中文件名称:{} 不同" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:115 +msgid "cluster_id:{} 当前域名已经是{},无需重命名" +msgstr "cluster_id:{} 当前域名已经是{},无需重命名" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:158 +msgid "更新元数据和cc模块" +msgstr "更新元数据和cc模块" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:189 +msgid "删除旧域名记录{}" +msgstr "删除旧域名记录{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:206 +msgid "删除旧nodes域名记录{}" +msgstr "删除旧nodes域名记录{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:218 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:232 +msgid "添加新域名记录{}" +msgstr "添加新域名记录{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_rename_domain.py:264 +msgid "集群:{}重命名域名为{}" +msgstr "集群:{}重命名域名为{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:199 +msgid "REDIS-故障自愈" +msgstr "REDIS-故障自愈" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:252 +msgid "故障自愈-{}" +msgstr "故障自愈-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:301 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:341 +msgid "Proxy-加入集群-{}" +msgstr "Proxy-加入集群-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:338 +msgid "提交Proxy下架单-{}" +msgstr "提交Proxy下架单-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:358 +msgid "Proxy自愈-{}" +msgstr "Proxy自愈-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py:523 +msgid "提交Redis下架单-{}" +msgstr "提交Redis下架单-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:212 +msgid "REDIS-整机替换" +msgstr "REDIS-整机替换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:240 +msgid "初始化-{}" +msgstr "初始化-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:292 +msgid "整机替换-{}" +msgstr "整机替换-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_cmr.py:376 +msgid "旧Proxy下架-等待确认" +msgstr "旧Proxy下架-等待确认" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:145 +msgid "REDIS-主从切换" +msgstr "REDIS-主从切换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:247 +msgid "Redis-{}-角色互换" +msgstr "Redis-{}-角色互换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:283 +msgid "Redis-{}-刷新监控" +msgstr "Redis-{}-刷新监控" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_mss.py:292 +msgid "Redis-{}-主从切换" +msgstr "Redis-{}-主从切换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:131 +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:118 +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:152 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:121 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:349 +msgid "redis请求检查: {}" +msgstr "redis请求检查: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:189 +msgid "{}卸载bkdbmon" +msgstr "{}卸载bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:208 +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:191 +msgid "{}下架proxy实例" +msgstr "{}下架proxy实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:220 +msgid "{}下架redis实例" +msgstr "{}下架redis实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:235 +msgid "删除集群元数据" +msgstr "删除集群元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:103 +msgid "redis集群 {} 目标版本为空?" +msgstr "redis集群 {} 目标版本为空?" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:115 +msgid "redis集群 {},节点类型:{},目标版本 {} 不合法,合法的版本:{}" +msgstr "redis集群 {},节点类型:{},目标版本 {} 不合法,合法的版本:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:127 +msgid "集群{} proxy当前版本{} == 目标版本:{},无需升级" +msgstr "集群{} proxy当前版本{} == 目标版本:{},无需升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:133 +msgid "集群{} storage当前版本{} == 目标版本:{},无需升级" +msgstr "集群{} storage当前版本{} == 目标版本:{},无需升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:137 +msgid "集群{} storage当前版本{} > 目标版本:{},不支持降级" +msgstr "集群{} storage当前版本{} > 目标版本:{},不支持降级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:222 +msgid "主从所有IP 下发介质包" +msgstr "主从所有IP 下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:255 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:624 +msgid "old_slave:{} 版本升级" +msgstr "old_slave:{} 版本升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:273 +msgid "{} 集群:{}执行 cluster failover" +msgstr "{} 集群:{}执行 cluster failover" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:295 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:383 +msgid "new slave:{} 版本升级" +msgstr "new slave:{} 版本升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:319 +msgid "集群:{} 主从切换" +msgstr "集群:{} 主从切换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:329 +msgid "Redis-{}-检查切换状态" +msgstr "Redis-{}-检查切换状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:347 +msgid "old_master:{} 删除slaveof配置" +msgstr "old_master:{} 删除slaveof配置" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:359 +msgid "old_slave:{} 删除slaveof配置" +msgstr "old_slave:{} 删除slaveof配置" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:406 +msgid "old_master:{} 清档" +msgstr "old_master:{} 清档" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:486 +msgid "Redis-元数据切换" +msgstr "Redis-元数据切换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:498 +msgid "master:{}-slave:{}-主从交换" +msgstr "master:{}-slave:{}-主从交换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:513 +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:793 +msgid "Redis-元数据更新集群版本" +msgstr "Redis-元数据更新集群版本" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:548 +msgid "集群{}版本在线升级" +msgstr "集群{}版本在线升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:578 +msgid "master ip:{} 包含了两种角色{}" +msgstr "master ip:{} 包含了两种角色{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:594 +msgid "主从IP 下发介质包" +msgstr "主从IP 下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:607 +msgid "{}-暂停bkdbmon" +msgstr "{}-暂停bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:639 +msgid "old_slave:{} slave-read-only设置为yes" +msgstr "old_slave:{} slave-read-only设置为yes" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:656 +msgid "cluster:{} 域名指向修改" +msgstr "cluster:{} 域名指向修改" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:689 +msgid "{}-slave提升为master" +msgstr "{}-slave提升为master" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:706 +msgid "new_slave:{} 版本升级" +msgstr "new_slave:{} 版本升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:717 +msgid "cluster:{} 元数据master和slave互换" +msgstr "cluster:{} 元数据master和slave互换" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:741 +msgid "old master:{} ports:{} 清档" +msgstr "old master:{} ports:{} 清档" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:812 +msgid "{}-dbconfig更新版本" +msgstr "{}-dbconfig更新版本" + +#: backend/flow/engine/bamboo/scene/redis/redis_cluster_version_update_online.py:833 +msgid "{}-主从集群版本升级" +msgstr "{}-主从集群版本升级" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:122 +msgid "REDIS_DATA_STRUCTURE" +msgstr "REDIS_DATA_STRUCTURE" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:144 +msgid "是否是集群维度:is_cluster_all:{}" +msgstr "是否是集群维度:is_cluster_all:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:149 +msgid "" +"tendisplus 需要按集群维度进行数据构造,请检查传入的节点:cluster_type is :{}," +"传入节点:master_instances is:{},redis_master_set is :{}" +msgstr "tendisplus 需要按集群维度进行数据构造,请检查传入的节点:cluster_type is :{},传入节点:master_instances is:{},redis_master_set is :{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:165 +msgid "redis_data_structure_flow 从db_meta 查询的备份节点信息" +msgstr "redis_data_structure_flow 从db_meta 查询的备份节点信息" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:171 +msgid "redis_data_structure_flow 从bklog查询的备份节点信息" +msgstr "redis_data_structure_flow 从bklog查询的备份节点信息" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:174 +msgid "这个值和部署proxy有关系 redis_instance_set: {}" +msgstr "这个值和部署proxy有关系 redis_instance_set: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:219 +msgid "" +"redis_data_structure_flow 源集群和临时集群的节点一一对应关系node_pairs: {}" +msgstr "redis_data_structure_flow 源集群和临时集群的节点一一对应关系node_pairs: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:229 +msgid "Redis-{}-下发actuator包" +msgstr "Redis-{}-下发actuator包" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:260 +msgid "Redis-安装backup-client工具-{}" +msgstr "Redis-安装backup-client工具-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:291 +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:139 +msgid "获取磁盘使用情况: {}" +msgstr "获取磁盘使用情况: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:307 +msgid "redis_data_structure_flow acts_list_push_json: {}" +msgstr "redis_data_structure_flow acts_list_push_json: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:351 +msgid "Redis-临时节点加入源集群cc模块" +msgstr "Redis-临时节点加入源集群cc模块" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:365 +msgid "建立meet关系" +msgstr "建立meet关系" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:391 +msgid "{}proxy下发介质包" +msgstr "{}proxy下发介质包" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:409 +msgid "{}安装proxy实例" +msgstr "{}安装proxy实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:426 +msgid "meet建立集群关系并检查集群状态" +msgstr "meet建立集群关系并检查集群状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:454 +msgid "写入构造记录元数据" +msgstr "写入构造记录元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:458 +msgid "集群[{}]数据构造" +msgstr "集群[{}]数据构造" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:474 +msgid "generate_acts_list_disk_check_data_params: {}" +msgstr "generate_acts_list_disk_check_data_params: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:478 +msgid "generate_acts_list_disk_check full: {}" +msgstr "generate_acts_list_disk_check full: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:486 +msgid "generate_acts_list_disk_check binlog: {}" +msgstr "generate_acts_list_disk_check binlog: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:495 +msgid "redis 数据构造前置磁盘检查" +msgstr "redis 数据构造前置磁盘检查" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:545 +msgid "len(master_instances):{} != len(all_master_instances):{}" +msgstr "len(master_instances):{} != len(all_master_instances):{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:566 +msgid "" +"cluster_type:{}、master_instances_set:{}、all_master_instances_set:{}-> " +"diff:{}" +msgstr "cluster_type:{}、master_instances_set:{}、all_master_instances_set:{}-> diff:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:580 +msgid "获取的同一批次备份信息_instance_backup: {}" +msgstr "获取的同一批次备份信息_instance_backup: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:594 +msgid "" +"备份文件中没有上报shard_value,集群维度的场景需要校验shard_value信息,请检查" +"备份情况!备份文件:{}" +msgstr "备份文件中没有上报shard_value,集群维度的场景需要校验shard_value信息,请检查备份情况!备份文件:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:602 +msgid "实例 segment 对应关系,instance_shard_dict: {}" +msgstr "实例 segment 对应关系,instance_shard_dict: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:604 +msgid "重复的instance值,duplicate_instances: {}" +msgstr "重复的instance值,duplicate_instances: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:606 +msgid "没有重复的instance值,cluster_id: {}" +msgstr "没有重复的instance值,cluster_id: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:622 +msgid "" +"cluster_id:{},缺失的shard_value值missing_ranges:{},可以从instance_shard_dict" +"中看出:{}" +msgstr "cluster_id:{},缺失的shard_value值missing_ranges:{},可以从instance_shard_dict中看出:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:628 +msgid "没有缺失的shard_value值,cluster_id: {}" +msgstr "没有缺失的shard_value值,cluster_id: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:634 +msgid "cluster_id: {},所有的instance:{}" +msgstr "cluster_id: {},所有的instance:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:635 +msgid "cluster_id: {},所有的redis_instance_set:{}" +msgstr "cluster_id: {},所有的redis_instance_set:{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:701 +msgid "__init_builder_cluster_info: {}" +msgstr "__init_builder_cluster_info: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:834 +msgid "get_prod_temp_instance_pairs rollback_time: {}" +msgstr "get_prod_temp_instance_pairs rollback_time: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:853 +msgid "new_temp_node_pairs: {}" +msgstr "new_temp_node_pairs: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:856 +msgid "len(source_ip_map) > 1, source_ip_map: {}" +msgstr "len(source_ip_map) > 1, source_ip_map: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:869 +msgid "source_ip_map_source_ports: {}" +msgstr "source_ip_map_source_ports: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:890 +msgid "get_prod_temp_instance_pairs len(source_ip_map) = 1" +msgstr "get_prod_temp_instance_pairs len(source_ip_map) = 1" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:913 +msgid "redis_data_structure_flow_full_backupinfo: {}" +msgstr "redis_data_structure_flow_full_backupinfo: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:914 +msgid "redis_data_structure_flow_binlog_backupinfo: {}" +msgstr "redis_data_structure_flow_binlog_backupinfo: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:974 +msgid "源{}构造到临时机{}" +msgstr "源{}构造到临时机{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure.py:976 +msgid "源{}payload json下发到临时机{}" +msgstr "源{}payload json下发到临时机{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:55 +msgid "下载{}全备文件到{}" +msgstr "下载{}全备文件到{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:65 +msgid "集群类型为:{},但是下载的binlog备份信息为0,不符合预期,最少有2个binlog" +msgstr "集群类型为:{},但是下载的binlog备份信息为0,不符合预期,最少有2个binlog" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:80 +msgid "下载{}binlog文件到{}" +msgstr "下载{}binlog文件到{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_sub.py:85 +msgid "下载备份文件到{}" +msgstr "下载备份文件到{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:131 +msgid "更新构造记录为销毁中" +msgstr "更新构造记录为销毁中" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:157 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:72 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:203 +msgid "Redis-{}-下发工具包" +msgstr "Redis-{}-下发工具包" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:206 +msgid "更新构造记录为已销毁" +msgstr "更新构造记录为已销毁" + +#: backend/flow/engine/bamboo/scene/redis/redis_data_structure_task_delete.py:210 +msgid "集群[{}]数据构造销毁" +msgstr "集群[{}]数据构造销毁" + +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:146 +msgid "redis清档: {}" +msgstr "redis清档: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:154 +msgid "集群[{}]清档" +msgstr "集群[{}]清档" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:90 +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:286 +msgid "存在不同的cluster_type。 {} and {}" +msgstr "存在不同的cluster_type。 {} and {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:207 +msgid "删除集群{}元数据" +msgstr "删除集群{}元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:221 +msgid "{}下架redis实例{}" +msgstr "{}下架redis实例{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_ins_shutdown.py:237 +msgid "{}-卸载bkdbmon" +msgstr "{}-卸载bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:302 +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:312 +msgid "Redis-{}:{}-安装实例" +msgstr "Redis-{}:{}-安装实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:381 +msgid "建立主从关系-{}-{}" +msgstr "建立主从关系-{}-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:462 +msgid "主注册域名" +msgstr "主注册域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:479 +msgid "从注册域名" +msgstr "从注册域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_instance_apply_flow.py:501 +msgid "Redis主从安装-{}" +msgstr "Redis主从安装-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:115 +msgid "按正则删除key: {}" +msgstr "按正则删除key: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:123 +msgid "集群[{}]按正则删除keys" +msgstr "集群[{}]按正则删除keys" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:148 +msgid "获取磁盘空闲最大机器" +msgstr "获取磁盘空闲最大机器" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:158 +msgid "按文件删除key" +msgstr "按文件删除key" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:163 +msgid "集群[{}]按文件删除keys" +msgstr "集群[{}]按文件删除keys" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:103 +msgid "提取key: {}" +msgstr "提取key: {}" + +#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:110 +msgid "集群[{}提取keys" +msgstr "集群[{}提取keys" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:179 +msgid "[{}]卸载bkdbmon" +msgstr "[{}]卸载bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:181 +msgid "[{}]安装bkdbmon" +msgstr "[{}]安装bkdbmon" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:201 +msgid "集群[{}]启停" +msgstr "集群[{}]启停" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:210 +msgid "更新集群状态" +msgstr "更新集群状态" + +#: backend/flow/engine/bamboo/scene/redis/redis_open_close.py:431 +msgid "更新集群状态-{}" +msgstr "更新集群状态-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:183 +msgid "建立集群meet关系" +msgstr "建立集群meet关系" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:274 +msgid "回写集群配置[predixy]" +msgstr "回写集群配置[predixy]" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:290 +msgid "nodes注册域名" +msgstr "nodes注册域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_predixy_cluster_apply_flow.py:304 +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:331 +msgid "proxy注册域名" +msgstr "proxy注册域名" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:195 +msgid "proxy加入集群元数据" +msgstr "proxy加入集群元数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:210 +msgid "{}新增proxy实例" +msgstr "{}新增proxy实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:322 +msgid "{}卸载proxy实例" +msgstr "{}卸载proxy实例" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:74 +msgid "DTS_Server-{}-删除" +msgstr "DTS_Server-{}-删除" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:80 +msgid "DTS_Server-{}-清理dbmeta" +msgstr "DTS_Server-{}-清理dbmeta" + +#: backend/flow/engine/bamboo/scene/redis/redis_remove_dts_server.py:85 +msgid "REMOVE DTS_SERVER" +msgstr "REMOVE DTS_SERVER" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:120 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:181 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:226 +msgid "REDIS_SLOTS_MIGRATE" +msgstr "REDIS_SLOTS_MIGRATE" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:136 +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:235 +msgid "{}slots 迁移" +msgstr "{}slots 迁移" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate.py:191 +msgid "{}slots迁移扩容" +msgstr "{}slots迁移扩容" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:91 +msgid "迁移特定slots子任务-{}" +msgstr "迁移特定slots子任务-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:111 +msgid "写入slots 迁移记录数据" +msgstr "写入slots 迁移记录数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:117 +msgid "迁移slots{}" +msgstr "迁移slots{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:171 +msgid "缩容组数: {}小于1 ,pelase check!" +msgstr "缩容组数: {}小于1 ,pelase check!" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:179 +msgid "+===+++++===缩容节点 contraction_instance: {} +++++===++++ " +msgstr "+===+++++===缩容节点 contraction_instance: {} +++++===++++ " + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:186 +msgid "+===+++++===下架实例shutdown_ip_ports: {} +++++===++++ " +msgstr "+===+++++===下架实例shutdown_ip_ports: {} +++++===++++ " + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:223 +msgid "集群迁移slots缩容-{}" +msgstr "集群迁移slots缩容-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:250 +msgid "集群关系清理" +msgstr "集群关系清理" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:297 +msgid "写入slots 迁移缩容记录数据" +msgstr "写入slots 迁移缩容记录数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:303 +msgid "迁移slots缩容{}" +msgstr "迁移slots缩容{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:408 +msgid "+===+++++===新部署节点new_ins_pair_map: {} +++++===++++ " +msgstr "+===+++++===新部署节点new_ins_pair_map: {} +++++===++++ " + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:414 +msgid "新节点加入源集群和做主从-{}" +msgstr "新节点加入源集群和做主从-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:440 +msgid "集群reblance扩容-{}" +msgstr "集群reblance扩容-{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:503 +msgid "写入slots 迁移扩容记录数据" +msgstr "写入slots 迁移扩容记录数据" + +#: backend/flow/engine/bamboo/scene/redis/redis_slots_migrate_sub.py:508 +msgid "迁移slots扩容{}" +msgstr "迁移slots扩容{}" + +#: backend/flow/engine/bamboo/scene/redis/redis_twemproxy_cluster_apply_flow.py:316 +msgid "回写集群配置[Twemproxy]" +msgstr "回写集群配置[Twemproxy]" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:109 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:64 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:99 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:60 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:106 +msgid "下发actuator以及riak介质" +msgstr "下发actuator以及riak介质" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:121 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:132 +msgid "actuator_riak系统配置初始化" +msgstr "actuator_riak系统配置初始化" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:135 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:145 +msgid "actuator_riak部署节点" +msgstr "actuator_riak部署节点" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:149 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:158 +msgid "actuator_riak节点加入集群" +msgstr "actuator_riak节点加入集群" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:163 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:124 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:171 +msgid "actuator_集群变更生效" +msgstr "actuator_集群变更生效" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:176 +msgid "actuator_初始化bucket_type" +msgstr "actuator_初始化bucket_type" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:190 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:102 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:115 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:113 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:163 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:197 +msgid "riak修改元数据" +msgstr "riak修改元数据" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:209 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:132 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:216 +msgid "actuator_{}部署定时任务和riak监控" +msgstr "actuator_{}部署定时任务和riak监控" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:215 +msgid "部署Riak集群" +msgstr "部署Riak集群" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:62 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:61 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:70 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:77 +msgid "获取集群中的节点" +msgstr "获取集群中的节点" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:76 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:76 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:85 +msgid "actuator_连接检查" +msgstr "actuator_连接检查" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:150 +msgid "actuator_下架" +msgstr "actuator_下架" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_destroy_flow.py:112 +msgid "Riak集群下架" +msgstr "Riak集群下架" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:89 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:98 +msgid "actuator_关闭riak监控" +msgstr "actuator_关闭riak监控" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:102 +msgid "actuator_关闭riak实例" +msgstr "actuator_关闭riak实例" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_disable_flow.py:125 +msgid "Riak集群禁用" +msgstr "Riak集群禁用" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:76 +msgid "actuator_开启riak实例" +msgstr "actuator_开启riak实例" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:100 +msgid "actuator_开启riak监控" +msgstr "actuator_开启riak监控" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_enable_flow.py:112 +msgid "Riak集群启用" +msgstr "Riak集群启用" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:137 +msgid "集群[{}]的迁移任务" +msgstr "集群[{}]的迁移任务" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_migrate_flow.py:139 +msgid "构建riak集群迁移流程成功" +msgstr "构建riak集群迁移流程成功" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:72 +msgid "actuator_重启riak实例" +msgstr "actuator_重启riak实例" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_reboot_flow.py:84 +msgid "Riak重启实例" +msgstr "Riak重启实例" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:111 +msgid "actuator_riak集群剔除节点" +msgstr "actuator_riak集群剔除节点" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:137 +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:184 +msgid "actuator_检查数据搬迁进度" +msgstr "actuator_检查数据搬迁进度" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_in_flow.py:173 +msgid "Riak集群缩容" +msgstr "Riak集群缩容" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:118 +msgid "actuator_riak获取集群配置" +msgstr "actuator_riak获取集群配置" + +#: backend/flow/engine/bamboo/scene/riak/riak_cluster_scale_out_flow.py:222 +msgid "Riak集群扩容" +msgstr "Riak集群扩容" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:162 +msgid "DRS查询集群系统密码失败:{}" +msgstr "DRS查询集群系统密码失败:{}" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:165 +msgid "查询原系统账户存在多个或者不存在,暂时与dbm系统不兼容" +msgstr "查询原系统账户存在多个或者不存在,暂时与dbm系统不兼容" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:183 +msgid "DRS查询字符集失败:{}" +msgstr "DRS查询字符集失败:{}" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:187 +msgid "获取字符集为空..." +msgstr "获取字符集为空..." + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:188 +msgid "获取字符集为空" +msgstr "获取字符集为空" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:216 +msgid "至少需要2个以上的spider节点" +msgstr "至少需要2个以上的spider节点" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:223 +msgid "沒有发现remote节点" +msgstr "沒有发现remote节点" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:255 +msgid "下发tdbCtl介质包" +msgstr "下发tdbCtl介质包" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:293 +msgid "安装Tdbctl集群中控实例" +msgstr "安装Tdbctl集群中控实例" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:312 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:357 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:588 +msgid "集群内部节点间授权" +msgstr "集群内部节点间授权" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:330 +msgid "初始化中控tdbctl节点间关系" +msgstr "初始化中控tdbctl节点间关系" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:349 +msgid "从本地spider复制表结构到Master中控节点" +msgstr "从本地spider复制表结构到Master中控节点" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:358 +msgid "校验spider和tdbctl节点表的数量" +msgstr "校验spider和tdbctl节点表的数量" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:369 +msgid "初始化中控节与spider,remote点间关系" +msgstr "初始化中控节与spider,remote点间关系" + +#: backend/flow/engine/bamboo/scene/spider/append_deploy_ctl_flow.py:375 +msgid "[{}]追加部署tdbctl&迁移表结构" +msgstr "[{}]追加部署tdbctl&迁移表结构" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:108 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:255 +msgid "下发spider安装介质" +msgstr "下发spider安装介质" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:141 +msgid "安装Spider_slave实例" +msgstr "安装Spider_slave实例" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:157 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:320 +msgid "克隆权限到spider节点[{}]" +msgstr "克隆权限到spider节点[{}]" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:177 +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:344 +msgid "添加对应路由关系" +msgstr "添加对应路由关系" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:204 +msgid "集群[{}]添加spider slave节点" +msgstr "集群[{}]添加spider slave节点" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:288 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:302 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:563 +msgid "安装Spider实例" +msgstr "安装Spider实例" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:304 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:318 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:579 +msgid "安装Spider集群中控实例" +msgstr "安装Spider集群中控实例" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:383 +msgid "集群[{}]添加spider {}节点" +msgstr "集群[{}]添加spider {}节点" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:411 +msgid "下发Spider周边程序介质" +msgstr "下发Spider周边程序介质" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:438 +msgid "spider[{}]安装DBATools工具箱" +msgstr "spider[{}]安装DBATools工具箱" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:454 +msgid "spider[{}]安装mysql-monitor" +msgstr "spider[{}]安装mysql-monitor" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:474 +msgid "spider[{}]安装备份程序" +msgstr "spider[{}]安装备份程序" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:503 +msgid "安装Spider周边程序" +msgstr "安装Spider周边程序" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:553 +msgid "建立spider-ctl数据同步" +msgstr "建立spider-ctl数据同步" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:621 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:155 +msgid "卸载spider实例" +msgstr "卸载spider实例" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:647 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:169 +msgid "卸载中控实例" +msgstr "卸载中控实例" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:669 +msgid "清理机器周边配置" +msgstr "清理机器周边配置" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:674 +msgid "下架spider节点" +msgstr "下架spider节点" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:704 +msgid "切换ctl中控集群" +msgstr "切换ctl中控集群" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:719 +msgid "卸载中控实例路由[{}]" +msgstr "卸载中控实例路由[{}]" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:732 +msgid "删除中控的路由节点" +msgstr "删除中控的路由节点" + +#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:832 +msgid "执行成对切换" +msgstr "执行成对切换" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:17 +msgid "Flow模块TenDB Cluster异常" +msgstr "Flow模块TenDB Cluster异常" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:28 +msgid "添加spider-master节点是分配incr初始值失败" +msgstr "添加spider-master节点是分配incr初始值失败" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:34 +msgid "添加spider节点路由失败" +msgstr "添加spider节点路由失败" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:40 +msgid "中控集群切换失败" +msgstr "中控集群切换失败" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:46 +msgid "删除spider节点路由失败" +msgstr "删除spider节点路由失败" + +#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:64 +msgid "获取集群信息失败" +msgstr "获取集群信息失败" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:248 +msgid "查询remotedb version 失败" +msgstr "查询remotedb version 失败" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:254 +msgid "backend remote 存在多个版本:{}" +msgstr "backend remote 存在多个版本:{}" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:264 +msgid "查询spider version 失败" +msgstr "查询spider version 失败" + +#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:273 +msgid "spider中存在多个大版本不一致的情况:{},请找DBA处理下" +msgstr "spider中存在多个大版本不一致的情况:{},请找DBA处理下" + +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:225 +msgid "{} shard {} 原地重建" +msgstr "{} shard {} 原地重建" + +#: backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py:242 +msgid "切换回原slave节点" +msgstr "切换回原slave节点" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:224 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:235 +msgid "安装remote主从节点" +msgstr "安装remote主从节点" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:255 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:264 +msgid "获取集群分片 {} shard {} 的备份信息失败" +msgstr "获取集群分片 {} shard {} 的备份信息失败" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:279 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:288 +msgid "同步完毕,写入数据节点的主从关系" +msgstr "同步完毕,写入数据节点的主从关系" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:290 +msgid "恢复分片{}数据" +msgstr "恢复分片{}数据" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:319 +msgid "remote机器切换完毕后修改元数据指向" +msgstr "remote机器切换完毕后修改元数据指向" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:329 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:332 +msgid "切换remote node 节点" +msgstr "切换remote node 节点" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:347 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:306 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:352 +msgid "新机器安装周边组件" +msgstr "新机器安装周边组件" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:362 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:320 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:368 +msgid "切换后重新安装周边组件" +msgstr "切换后重新安装周边组件" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:382 +msgid "整机卸载成功前删除元数据" +msgstr "整机卸载成功前删除元数据" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_migrate.py:428 +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:386 +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:435 +msgid "集群迁移{}" +msgstr "集群迁移{}" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:138 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:173 +msgid "执行切换" +msgstr "执行切换" + +#: backend/flow/engine/bamboo/scene/spider/remote_master_slave_swtich.py:173 +msgid "[{}]集群后端切换" +msgstr "[{}]集群后端切换" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:191 +msgid "安装remote从节点" +msgstr "安装remote从节点" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:250 +msgid "{}:{}恢复实例数据" +msgstr "{}:{}恢复实例数据" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:273 +msgid "切换到新SLAVE机器" +msgstr "切换到新SLAVE机器" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:279 +msgid "SLAVE切换完毕后修改元数据指向" +msgstr "SLAVE切换完毕后修改元数据指向" + +#: backend/flow/engine/bamboo/scene/spider/remote_slave_recover.py:289 +msgid "切换SLAVE节点" +msgstr "切换SLAVE节点" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_mnt.py:111 +msgid "{}添加spider_mnt节点流程" +msgstr "{}添加spider_mnt节点流程" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:100 +msgid "[{}]The cluster has not added a slave cluster, skip" +msgstr "[{}]The cluster has not added a slave cluster, skip" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:106 +msgid "[{}]This type of role addition is not supported" +msgstr "[{}]This type of role addition is not supported" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:109 +msgid "build spider-add-nodes-pipeline failed" +msgstr "build spider-add-nodes-pipeline failed" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:153 +msgid "[{}]添加spider-master节点流程" +msgstr "[{}]添加spider-master节点流程" + +#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:192 +msgid "[{}]添加spider-slave节点流程" +msgstr "[{}]添加spider-slave节点流程" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:171 +msgid "分片{}:创建临时用户" +msgstr "分片{}:创建临时用户" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:225 +msgid "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" +msgstr "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:240 +msgid "分片{}:master[{}{}{}]的校验任务" +msgstr "分片{}:master[{}{}{}]的校验任务" + +#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:248 +msgid "集群[{}]的校验任务" +msgstr "集群[{}]的校验任务" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:137 +msgid "构造库表备份流程成功" +msgstr "构造库表备份流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:164 +msgid "构造 spider/ctl mydumper正则" +msgstr "构造 spider/ctl mydumper正则" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:188 +msgid "spider 执行库表备份" +msgstr "spider 执行库表备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:200 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:191 +msgid "spider/ctl备份库表结构" +msgstr "spider/ctl备份库表结构" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:254 +msgid "构造remote mydumper正则" +msgstr "构造remote mydumper正则" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:272 +msgid "remote 执行库表备份" +msgstr "remote 执行库表备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:284 +msgid "remote 备份库表" +msgstr "remote 备份库表" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:310 +msgid "构造运维节点正则" +msgstr "构造运维节点正则" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:328 +msgid "运维节点执行库表备份" +msgstr "运维节点执行库表备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:339 +msgid "spider_mnt库表备份" +msgstr "spider_mnt库表备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:93 +msgid "" +"传入参数有异常,请检查!len(remote_group)*remote_shard_num != " +"cluster_shard_num" +msgstr "传入参数有异常,请检查!len(remote_group)*remote_shard_num != cluster_shard_num" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:232 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:493 +msgid "下发Spider/tdbCtl介质包" +msgstr "下发Spider/tdbCtl介质包" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:283 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:544 +msgid "安装tokudb引擎" +msgstr "安装tokudb引擎" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:369 +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:602 +msgid "初始化集群节点间关系" +msgstr "初始化集群节点间关系" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:203 +msgid "下架TenDB-Cluster集群[{}]" +msgstr "下架TenDB-Cluster集群[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:97 +msgid "检测Spider端连接情况" +msgstr "检测Spider端连接情况" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:140 +msgid "重启spider实例" +msgstr "重启spider实例" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:146 +msgid "启用spider集群[{}]" +msgstr "启用spider集群[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:173 +msgid "端口 {} 执行闪回" +msgstr "端口 {} 执行闪回" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:189 +msgid "{} 闪回" +msgstr "{} 闪回" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:193 +msgid "{} flashback" +msgstr "{} flashback" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_flashback.py:197 +msgid "构造flashback流程成功" +msgstr "构造flashback流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:139 +msgid "{} 全备" +msgstr "{} 全备" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:142 +msgid "构造全库备份流程成功" +msgstr "构造全库备份流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:179 +msgid "spider 执行全库备份" +msgstr "spider 执行全库备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:229 +msgid "remote 执行全库备份" +msgstr "remote 执行全库备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:242 +msgid "remote 全库备份" +msgstr "remote 全库备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:316 +msgid "运维节点执行全库备份" +msgstr "运维节点执行全库备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:328 +msgid "spider_mnt全库备份" +msgstr "spider_mnt全库备份" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_metadata_import_flow.py:52 +msgid "构建TenDB Cluster元数据导入流程成功" +msgstr "构建TenDB Cluster元数据导入流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:101 +#: backend/flow/plugins/components/collections/mysql/mysql_rollback_data_download_binlog.py:55 +msgid "获取实例 {} 的备份信息失败" +msgstr "获取实例 {} 的备份信息失败" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:108 +msgid "下发actuator工具 {}" +msgstr "下发actuator工具 {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:122 +msgid "获取spider节点备份信息不存在" +msgstr "获取spider节点备份信息不存在" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:124 +msgid "获取spider节点备份信息为空" +msgstr "获取spider节点备份信息为空" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:182 +msgid "恢复spider节点数据" +msgstr "恢复spider节点数据" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:258 +msgid "恢复remote节点数据" +msgstr "恢复remote节点数据" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_rollback_flow.py:262 +msgid "集群回档: src:{} desc:{}" +msgstr "集群回档: src:{} desc:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:126 +msgid "构建TenDBCluster集群标准化流程成功" +msgstr "构建TenDBCluster集群标准化流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:220 +msgid "spider master 标准化" +msgstr "spider master 标准化" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:223 +msgid "spider slave 标准化" +msgstr "spider slave 标准化" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:226 +msgid "spider mnt 标准化" +msgstr "spider mnt 标准化" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:247 +msgid "remote 标准化" +msgstr "remote 标准化" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py:275 +msgid "系统库表权限标准化" +msgstr "系统库表权限标准化" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:183 +msgid "在中控建立备份库表" +msgstr "在中控建立备份库表" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:221 +msgid "{} 预清理备份库" +msgstr "{} 预清理备份库" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:273 +msgid "在中控执行清档" +msgstr "在中控执行清档" + +#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:308 +msgid "构造清档流程成功" +msgstr "构造清档流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:104 +msgid "partition_sql_file_{}_{}.json" +msgstr "partition_sql_file_{}_{}.json" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:106 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:117 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:132 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:149 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:169 +msgid "{}: {}" +msgstr "{}: {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:132 +msgid "下发dbactor文件" +msgstr "下发dbactor文件" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:183 +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:187 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:82 +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:86 +msgid "录入分区日志" +msgstr "录入分区日志" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:188 +msgid "构建spider partition流程成功" +msgstr "构建spider partition流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_partition_cron.py:87 +msgid "构建spider partition 定时任务流程成功" +msgstr "构建spider partition 定时任务流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:67 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:165 +msgid "下载定点恢复的全库备份介质到{}:{}" +msgstr "下载定点恢复的全库备份介质到{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:75 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:173 +msgid "定点恢复之恢复数据{}:{}" +msgstr "定点恢复之恢复数据{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:101 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:199 +msgid "下载定点恢复的binlog到{}:{}" +msgstr "下载定点恢复的binlog到{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:109 +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:206 +msgid "定点恢复之前滚binlog{}:{}" +msgstr "定点恢复之前滚binlog{}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:114 +msgid "spider恢复:{}" +msgstr "spider恢复:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:211 +msgid "定点恢复 {}:{}" +msgstr "定点恢复 {}:{}" + +#: backend/flow/engine/bamboo/scene/spider/spider_recover.py:216 +msgid "Remote node {} 恢复: 主 {} 从 {} " +msgstr "Remote node {} 恢复: 主 {} 从 {} " + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:68 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:144 +msgid "删除spider的路由关系" +msgstr "删除spider的路由关系" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:81 +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:157 +msgid "回收对应spider集群映射" +msgstr "回收对应spider集群映射" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_mnt.py:105 +msgid "[{}]下架spider运维节点流程" +msgstr "[{}]下架spider运维节点流程" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:74 +msgid "集群最后不能少于{}个spider_master实例,或者不能大于集群存量[{}]" +msgstr "集群最后不能少于{}个spider_master实例,或者不能大于集群存量[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:84 +msgid "集群最后不能少于{}个spider_slave实例,或者不能大于集群存量[{}]" +msgstr "集群最后不能少于{}个spider_slave实例,或者不能大于集群存量[{}]" + +#: backend/flow/engine/bamboo/scene/spider/spider_reduce_nodes.py:182 +msgid "[{}]减少spider节点流程" +msgstr "[{}]减少spider节点流程" + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:135 +msgid "{}集群分片计算错误 remote_shard_num:{} x remote_group:{} != {}" +msgstr "{}集群分片计算错误 remote_shard_num:{} x remote_group:{} != {}" + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:322 +msgid "整集群切换完毕后修改元数据指向" +msgstr "整集群切换完毕后修改元数据指向" + +#: backend/flow/engine/bamboo/scene/spider/spider_remotedb_rebalance_flow.py:389 +msgid "整机卸载前删除元数据" +msgstr "整机卸载前删除元数据" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:169 +msgid "在中控建立目标库表" +msgstr "在中控建立目标库表" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:204 +msgid "{} 预清理目标库" +msgstr "{} 预清理目标库" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:232 +msgid "{} 执行重命名" +msgstr "{} 执行重命名" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:253 +msgid "在中控执行重命名" +msgstr "在中控执行重命名" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:266 +msgid "{} 库表重命名" +msgstr "{} 库表重命名" + +#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:272 +msgid "构造数据库重命名流程成功" +msgstr "构造数据库重命名流程成功" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:117 +msgid "[{}]添加slave集群" +msgstr "[{}]添加slave集群" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:89 +msgid "删除spider路由关系" +msgstr "删除spider路由关系" + +#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_destroy.py:138 +msgid "只读接入层[{}]下架" +msgstr "只读接入层[{}]下架" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:61 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:145 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:78 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:79 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:111 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:176 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:110 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:322 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:137 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:122 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:330 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:140 +msgid "create job user" +msgstr "create job user" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:93 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:191 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:130 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:139 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:157 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:260 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:287 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:259 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:426 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:196 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:139 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:256 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:454 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:165 +msgid "drop job user" +msgstr "drop job user" + +#: backend/flow/engine/bamboo/scene/sqlserver/build_database_sync.py:98 +msgid "{}集群建立数据库同步" +msgstr "{}集群建立数据库同步" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:97 +msgid "流程中安装机器【{}】没有存入bk_host_id,请联系系统管理员\n" +msgstr "流程中安装机器【{}】没有存入bk_host_id,请联系系统管理员\n" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:149 +msgid "下发安装包介质" +msgstr "下发安装包介质" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:173 +msgid "安装Sqlserver实例:{}" +msgstr "安装Sqlserver实例:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:189 +msgid "初始化Sqlserver实例:{}" +msgstr "初始化Sqlserver实例:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:200 +msgid "安装sqlserver实例" +msgstr "安装sqlserver实例" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:230 +msgid "[{}]替换主域名映射" +msgstr "[{}]替换主域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:247 +msgid "[{}]替换从域名映射" +msgstr "[{}]替换从域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:261 +msgid "变更集群[{}]域名映射" +msgstr "变更集群[{}]域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:296 +msgid "检查实例{}:{}是否存在没有同步的数据库" +msgstr "检查实例{}:{}是否存在没有同步的数据库" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:305 +msgid "检查实例{}:{}是否有异常状态DB" +msgstr "检查实例{}:{}是否有异常状态DB" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:319 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:102 +msgid "检查实例{}:{}是否有业务链接" +msgstr "检查实例{}:{}是否有业务链接" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:330 +msgid "预检测" +msgstr "预检测" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:343 +msgid "克隆实例周边配置" +msgstr "克隆实例周边配置" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:375 +msgid "克隆Users" +msgstr "克隆Users" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:389 +msgid "克隆LinkServer" +msgstr "克隆LinkServer" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:403 +msgid "克隆Jobs" +msgstr "克隆Jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:424 +msgid "建立数据库同步子流程" +msgstr "建立数据库同步子流程" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:466 +msgid "禁用backup jobs" +msgstr "禁用backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:474 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:100 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:115 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:85 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:91 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:123 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:78 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:131 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:334 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:82 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:115 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:134 +msgid "下发执行器" +msgstr "下发执行器" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:485 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:112 +msgid "执行数据库备份" +msgstr "执行数据库备份" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:502 +msgid "执行数据库日志备份" +msgstr "执行数据库日志备份" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:519 +msgid "传送文件到目标机器" +msgstr "传送文件到目标机器" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:535 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:244 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:198 +msgid "恢复全量备份数据[{}]" +msgstr "恢复全量备份数据[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:556 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:221 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:388 +msgid "恢复增量备份数据[{}]" +msgstr "恢复增量备份数据[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:582 +msgid "在master建立数据同步[{}]" +msgstr "在master建立数据同步[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:594 +msgid "启动backup jobs" +msgstr "启动backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:661 +msgid "集群[{}]初始化app_setting表" +msgstr "集群[{}]初始化app_setting表" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:678 +msgid "install_surrounding_apps_sub_flow的子流程列表为空" +msgstr "install_surrounding_apps_sub_flow的子流程列表为空" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:681 +msgid "部署sqlserver周边程序" +msgstr "部署sqlserver周边程序" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:726 +msgid "[{}]为alwaysOn做别名初始化" +msgstr "[{}]为alwaysOn做别名初始化" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:747 +msgid "[{}]集群配置可用组" +msgstr "[{}]集群配置可用组" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:764 +msgid "集群[{}]建立AlwaysOn可用组" +msgstr "集群[{}]建立AlwaysOn可用组" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:774 +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:801 +msgid "下载备份文件" +msgstr "下载备份文件" + +#: backend/flow/engine/bamboo/scene/sqlserver/common_sub_flow.py:787 +msgid "判断备份文件存在本地机器" +msgstr "判断备份文件存在本地机器" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:202 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:465 +msgid "[{}]集群与新slave建立关系" +msgstr "[{}]集群与新slave建立关系" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:209 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:208 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:472 +msgid "变更元信息" +msgstr "变更元信息" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_add_slave.py:232 +msgid "添加slave[{}]" +msgstr "添加slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_authorize_rules.py:40 +msgid "添加sqlserver规则授权" +msgstr "添加sqlserver规则授权" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:89 +msgid "检查需要备份的库是否存在" +msgstr "检查需要备份的库是否存在" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_backup_dbs.py:135 +msgid "{}执行备份" +msgstr "{}执行备份" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:104 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:104 +msgid "检查需要清理的库是否存在" +msgstr "检查需要清理的库是否存在" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:127 +msgid "执行数据库清档" +msgstr "执行数据库清档" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_clean_dbs.py:144 +msgid "{}集群执行清档" +msgstr "{}集群执行清档" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:100 +msgid "卸载实例[{}:{}]" +msgstr "卸载实例[{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:127 +msgid "清理元信息" +msgstr "清理元信息" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_destroy.py:136 +msgid "{}集群下架" +msgstr "{}集群下架" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:118 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:664 +msgid "[{}]禁用业务账号" +msgstr "[{}]禁用业务账号" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:133 +msgid "主动在实例{}:{}kill业务链接" +msgstr "主动在实例{}:{}kill业务链接" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_disable.py:162 +msgid "{}集群禁用" +msgstr "{}集群禁用" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:61 +msgid "[{}]启动业务账号" +msgstr "[{}]启动业务账号" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_enable.py:85 +msgid "{}集群启动" +msgstr "{}集群启动" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:141 +msgid "[{}]清理Job/LinkServer" +msgstr "[{}]清理Job/LinkServer" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:163 +msgid "[{}]清理业务账号" +msgstr "[{}]清理业务账号" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:179 +msgid "清理数据库" +msgstr "清理数据库" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:191 +msgid "回收集群的旧域名" +msgstr "回收集群的旧域名" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:235 +msgid "重置集群元信息" +msgstr "重置集群元信息" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_reset.py:265 +msgid "{}集群重置" +msgstr "{}集群重置" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:102 +msgid "实例接入标准化[{}:{}]" +msgstr "实例接入标准化[{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:120 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:135 +msgid "添加域名{}" +msgstr "添加域名{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:151 +msgid "集群标准化[{}]" +msgstr "集群标准化[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_cluster_standardization.py:177 +msgid "集群标准化" +msgstr "集群标准化" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:188 +msgid "下发执行器到目标集群master[{}]" +msgstr "下发执行器到目标集群master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:209 +msgid "下载全量备份文件到目标集群master[{}]" +msgstr "下载全量备份文件到目标集群master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:233 +msgid "下载日志备份文件到目标集群master[{}]" +msgstr "下载日志备份文件到目标集群master[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:264 +msgid "恢复日志备份数据[{}]" +msgstr "恢复日志备份数据[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_db_construct.py:294 +msgid "[{}]->[{}]数据构造流程" +msgstr "[{}]->[{}]数据构造流程" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:122 +msgid "禁用源master[{}]的backup jobs" +msgstr "禁用源master[{}]的backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:146 +msgid "在源集群[{}]执行数据库备份" +msgstr "在源集群[{}]执行数据库备份" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:164 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:349 +msgid "在源集群[{}]执行数据库日志备份" +msgstr "在源集群[{}]执行数据库日志备份" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:182 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:367 +msgid "传送文件到目标机器[{}]" +msgstr "传送文件到目标机器[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:240 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:407 +msgid "启动源master[{}]的backup jobs" +msgstr "启动源master[{}]的backup jobs" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:248 +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:415 +msgid "更新任务状态" +msgstr "更新任务状态" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:266 +msgid "[{}]->[{}]全量数据迁移流程" +msgstr "[{}]->[{}]全量数据迁移流程" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:433 +msgid "[{}]->[{}]增量数据迁移流程" +msgstr "[{}]->[{}]增量数据迁移流程" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_dts.py:454 +msgid "启动backup jobs cluster:{}" +msgstr "启动backup jobs cluster:{}" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:167 +msgid "部署HA集群[{}]" +msgstr "部署HA集群[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_ha_deploy.py:197 +msgid "部署主从集群" +msgstr "部署主从集群" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:201 +msgid "{}集群互切" +msgstr "{}集群互切" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_master_slave_switch.py:231 +msgid "切换子流程" +msgstr "切换子流程" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:127 +msgid "执行数据库重命名" +msgstr "执行数据库重命名" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_rename_dbs.py:144 +msgid "{}集群执行重命名" +msgstr "{}集群执行重命名" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:147 +msgid "[{}]重建可用组" +msgstr "[{}]重建可用组" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:173 +msgid "清理slave实例数据库" +msgstr "清理slave实例数据库" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:231 +msgid "实例设置running状态" +msgstr "实例设置running状态" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:263 +msgid "{}集群slave[{}:{}]原地重建" +msgstr "{}集群slave[{}:{}]原地重建" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:496 +msgid "人工确认[{}]" +msgstr "人工确认[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:507 +msgid "删除注册CC系统的服务实例[{}:{}]" +msgstr "删除注册CC系统的服务实例[{}:{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:522 +msgid "下发执行器在旧slave[{}]" +msgstr "下发执行器在旧slave[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:534 +msgid "卸载实例[{}]" +msgstr "卸载实例[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:547 +msgid "回收旧slave的元信息" +msgstr "回收旧slave的元信息" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:558 +msgid "{}->{}新机重建" +msgstr "{}->{}新机重建" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:587 +msgid "回收master[{}]的域名映射" +msgstr "回收master[{}]的域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:602 +msgid "回收slave[{}]的域名映射" +msgstr "回收slave[{}]的域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:620 +msgid "添加slave[{}]的域名映射" +msgstr "添加slave[{}]的域名映射" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:641 +msgid "处理[{}]的域名关系" +msgstr "处理[{}]的域名关系" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:679 +msgid "移除可用组" +msgstr "移除可用组" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_slave_rebuild.py:692 +msgid "移除可用组[{}]" +msgstr "移除可用组[{}]" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:109 +msgid "下发SQL文件" +msgstr "下发SQL文件" + +#: backend/flow/engine/bamboo/scene/sqlserver/sqlserver_sql_execute.py:170 +msgid "{}SQL文件导入" +msgstr "{}SQL文件导入" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:112 +msgid "非法上架特性,请联系系统管理员:add_type:{}" +msgstr "非法上架特性,请联系系统管理员:add_type:{}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:117 +msgid "写入实例元信息" +msgstr "写入实例元信息" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:127 +msgid "[{}]集群添加TBinlogDumper实例" +msgstr "[{}]集群添加TBinlogDumper实例" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/add_nodes.py:131 +msgid "计算不到需要上架的实例,拼装TBinlogDumper上架流程失败" +msgstr "计算不到需要上架的实例,拼装TBinlogDumper上架流程失败" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:97 +msgid "下发TBinlogDumper介质包" +msgstr "下发TBinlogDumper介质包" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:110 +msgid "安装TBinlogDumper实例" +msgstr "安装TBinlogDumper实例" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:122 +msgid "安装TBinlogDumper实例flow" +msgstr "安装TBinlogDumper实例flow" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:154 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:48 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:49 +msgid "传入的TBinlogDumper进程信息已不存在[{}],请联系系统管理员" +msgstr "传入的TBinlogDumper进程信息已不存在[{}],请联系系统管理员" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:174 +msgid "卸载TBinlogDumper实例[{}:{}]" +msgstr "卸载TBinlogDumper实例[{}:{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:189 +msgid "云区域[{}]卸载TBinlogDumper实例flow" +msgstr "云区域[{}]卸载TBinlogDumper实例flow" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:235 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:338 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:403 +msgid "导入相关表结构" +msgstr "导入相关表结构" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:249 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:64 +msgid "中断同步" +msgstr "中断同步" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:297 +msgid "切换到新实例[{}:{}]" +msgstr "切换到新实例[{}:{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:303 +msgid "集群[{}]切换TBinlogDumper" +msgstr "集群[{}]切换TBinlogDumper" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:365 +msgid "实例TBinlogDumper[{}:{}]做增量同步" +msgstr "实例TBinlogDumper[{}:{}]做增量同步" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:433 +msgid "在slave[{}:{}]备份数据" +msgstr "在slave[{}:{}]备份数据" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:449 +msgid "传输备份文件到TBinlogDumper[{}]" +msgstr "传输备份文件到TBinlogDumper[{}]" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:465 +msgid "导入备份数据" +msgstr "导入备份数据" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:479 +msgid "实例TBinlogDumper[{}:{}]做全量同步" +msgstr "实例TBinlogDumper[{}:{}]做全量同步" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:506 +msgid "安装L5agent" +msgstr "安装L5agent" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/common_sub_flow.py:530 +msgid "初始化tbinlogdumper机器" +msgstr "初始化tbinlogdumper机器" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/exceptions.py:17 +msgid "Flow模块TBinlogDumper异常" +msgstr "Flow模块TBinlogDumper异常" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:52 +msgid "获取预安装端口失败, 期望生成端口数:{},实际生成端口数:{}" +msgstr "获取预安装端口失败, 期望生成端口数:{},实际生成端口数:{}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:72 +msgid "get charset failed: {}" +msgstr "get charset failed: {}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:88 +msgid "非TenDB-HA架构不支持添加TBinlogDumper实例" +msgstr "非TenDB-HA架构不支持添加TBinlogDumper实例" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/common/util.py:107 +msgid "get server_id failed: {}" +msgstr "get server_id failed: {}" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:76 +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:78 +msgid "变更实例状态" +msgstr "变更实例状态" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/disable_nodes.py:86 +msgid "[{}:{}]实例禁用" +msgstr "[{}:{}]实例禁用" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:66 +msgid "启动同步" +msgstr "启动同步" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/enable_nodes.py:88 +msgid "[{}:{}]实例启动同步" +msgstr "[{}:{}]实例启动同步" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:70 +msgid "删除实例元信息" +msgstr "删除实例元信息" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:80 +msgid "云区域[{}]下架TBinlogDumper实例" +msgstr "云区域[{}]下架TBinlogDumper实例" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/reduce_node.py:84 +msgid "找不到需要下架的实例,拼装TBinlogDumper下架流程失败" +msgstr "找不到需要下架的实例,拼装TBinlogDumper下架流程失败" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:202 +msgid "变更实例元信息" +msgstr "变更实例元信息" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:213 +msgid "[{}]集群迁移TBinlogDumper实例" +msgstr "[{}]集群迁移TBinlogDumper实例" + +#: backend/flow/engine/bamboo/scene/tbinlogdumper/switch_nodes.py:217 +msgid "没检测到需要迁移的实例,拼装TBinlogDumper迁移部署流程失败" +msgstr "没检测到需要迁移的实例,拼装TBinlogDumper迁移部署流程失败" + +#: backend/flow/engine/bamboo/scene/tendbsingle/metadata_import.py:52 +msgid "构建 TenDB Single 元数据导入流程成功" +msgstr "构建 TenDB Single 元数据导入流程成功" + +#: backend/flow/engine/bamboo/scene/tendbsingle/standardize.py:87 +msgid "构建TenDBSingle集群标准化流程成功" +msgstr "构建TenDBSingle集群标准化流程成功" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:91 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:108 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:89 +msgid "下发vm介质和dbactuator" +msgstr "下发vm介质和dbactuator" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:138 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:180 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:158 +msgid "添加vminsert域名" +msgstr "添加vminsert域名" + +#: backend/flow/engine/bamboo/scene/vm/vm_apply_flow.py:152 +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:209 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:173 +msgid "添加vmselect域名" +msgstr "添加vmselect域名" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:198 +msgid "安装Vm {}-{}子流程" +msgstr "安装Vm {}-{}子流程" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:211 +msgid "安装vmstorage-{}" +msgstr "安装vmstorage-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:228 +msgid "安装vminsert-{}" +msgstr "安装vminsert-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_base_flow.py:248 +#, python-brace-format +msgid "PreInstall {role}-{vm_ip}" +msgstr "PreInstall {role}-{vm_ip}" + +#: backend/flow/engine/bamboo/scene/vm/vm_destroy_flow.py:77 +msgid "vm集群节点清理-{}" +msgstr "vm集群节点清理-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_disable_flow.py:75 +msgid "停止vm集群进程-{}" +msgstr "停止vm集群进程-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_enable_flow.py:75 +msgid "启动vm集群进程-{}" +msgstr "启动vm集群进程-{}" + +#: backend/flow/engine/bamboo/scene/vm/vm_reboot_flow.py:74 +msgid "下发 actuator" +msgstr "下发 actuator" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:155 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:135 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:131 +msgid "Reload vmselect" +msgstr "Reload vmselect" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:164 +#: backend/flow/engine/bamboo/scene/vm/vm_scale_up_flow.py:143 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:139 +msgid "Reload vminsert" +msgstr "Reload vminsert" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:193 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:105 +msgid "回收vminsert实例域名记录" +msgstr "回收vminsert实例域名记录" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:222 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:120 +msgid "回收vmselect实例域名记录" +msgstr "回收vmselect实例域名记录" + +#: backend/flow/engine/bamboo/scene/vm/vm_replace_flow.py:258 +#: backend/flow/engine/bamboo/scene/vm/vm_shrink_flow.py:151 +msgid "Vm集群节点清理-{}" +msgstr "Vm集群节点清理-{}" + +#: backend/flow/engine/exceptions.py:28 +msgid "组件服务未部署" +msgstr "组件服务未部署" + +#: backend/flow/engine/exceptions.py:32 +msgid "MySQL备份位置异常" +msgstr "MySQL备份位置异常" + +#: backend/flow/engine/exceptions.py:37 +msgid "MySQL备份方式和位置不兼容" +msgstr "MySQL备份方式和位置不兼容" + +#: backend/flow/engine/exceptions.py:38 +#, python-brace-format +msgid "MySQL备份方式{backup_type}和位置{backup_local}不兼容" +msgstr "MySQL备份方式{backup_type}和位置{backup_local}不兼容" + +#: backend/flow/models.py:22 +msgid "组件类型" +msgstr "组件类型" + +#: backend/flow/models.py:25 +msgid "流程树" +msgstr "流程树" + +#: backend/flow/models.py:27 backend/ticket/serializers.py:133 +msgid "流程状态" +msgstr "流程状态" + +#: backend/flow/models.py:29 +msgid "流程创建人" +msgstr "流程创建人" + +#: backend/flow/models.py:30 +msgid "启动时间" +msgstr "启动时间" + +#: backend/flow/models.py:31 +msgid "流程结束时间" +msgstr "流程结束时间" + +#: backend/flow/models.py:32 backend/flow/models.py:52 +msgid "是否已经过期" +msgstr "是否已经过期" + +#: backend/flow/models.py:32 backend/flow/models.py:52 +msgid "运行时被定期清理即为过期" +msgstr "运行时被定期清理即为过期" + +#: backend/flow/models.py:44 +msgid "当前版本ID" +msgstr "当前版本ID" + +#: backend/flow/models.py:46 +msgid "节点状态" +msgstr "节点状态" + +#: backend/flow/models.py:48 +msgid "节点运行时IP" +msgstr "节点运行时IP" + +#: backend/flow/models.py:50 +msgid "开始执行时间" +msgstr "开始执行时间" + +#: backend/flow/plugins/components/collections/cloud/exec_service_script.py:57 +msgid "该节点{}获取到执行ip信息为空,请联系系统管理员" +msgstr "该节点{}获取到执行ip信息为空,请联系系统管理员" + +#: backend/flow/plugins/components/collections/cloud/push_config_file.py:55 +#: backend/flow/plugins/components/collections/cloud/trans_files.py:59 +#: backend/flow/plugins/components/collections/doris/trans_files.py:63 +#: backend/flow/plugins/components/collections/es/trans_files.py:63 +#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:70 +#: backend/flow/plugins/components/collections/mongodb/send_media.py:58 +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:106 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:85 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:126 +#: backend/flow/plugins/components/collections/redis/redis_trans_files.py:69 +#: backend/flow/plugins/components/collections/redis/trans_flies.py:78 +#: backend/flow/plugins/components/collections/riak/trans_files.py:99 +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:80 +#: backend/flow/plugins/components/collections/vm/trans_files.py:63 +msgid "[{}] 下发介质包参数:{}" +msgstr "[{}] 下发介质包参数:{}" + +#: backend/flow/plugins/components/collections/cloud/trans_files.py:44 +msgid "该节点{}获取到执行ip信息为空,请联系系统管理员{}" +msgstr "该节点{}获取到执行ip信息为空,请联系系统管理员{}" + +#: backend/flow/plugins/components/collections/common/L5_agent_install.py:41 +msgid "安装L5 agent" +msgstr "安装L5 agent" + +#: backend/flow/plugins/components/collections/common/L5_agent_install.py:70 +msgid "L5agent安装" +msgstr "L5agent安装" + +#: backend/flow/plugins/components/collections/common/base_service.py:132 +msgid "该数据{}:{}无法被序列化,跳过此次缓存" +msgstr "该数据{}:{}无法被序列化,跳过此次缓存" + +#: backend/flow/plugins/components/collections/common/base_service.py:156 +msgid "下载excel文件失败,未获取到{}相关的数据" +msgstr "下载excel文件失败,未获取到{}相关的数据" + +#: backend/flow/plugins/components/collections/common/base_service.py:166 +msgid "下载excel文件失败,获取数据格式错误" +msgstr "下载excel文件失败,获取数据格式错误" + +#: backend/flow/plugins/components/collections/common/base_service.py:185 +msgid "[{}] 运行成功" +msgstr "[{}] 运行成功" + +#: backend/flow/plugins/components/collections/common/base_service.py:189 +msgid "[{}] 失败: {}" +msgstr "[{}] 失败: {}" + +#: backend/flow/plugins/components/collections/common/base_service.py:316 +msgid "[写入上下文结果失败] failed: {}" +msgstr "[写入上下文结果失败] failed: {}" + +#: backend/flow/plugins/components/collections/common/base_service.py:352 +msgid "[{}] 任务正在执行🤔" +msgstr "[{}] 任务正在执行🤔" + +#: backend/flow/plugins/components/collections/common/base_service.py:376 +msgid "[{}] 任务调度失败😱" +msgstr "[{}] 任务调度失败😱" + +#: backend/flow/plugins/components/collections/common/base_service.py:388 +msgid "[{}]任务调度成功🥳︎" +msgstr "[{}]任务调度成功🥳︎" + +#: backend/flow/plugins/components/collections/common/base_service.py:397 +msgid "[{}]该节点需要获取执行后日志,赋值到流程上下文" +msgstr "[{}]该节点需要获取执行后日志,赋值到流程上下文" + +#: backend/flow/plugins/components/collections/common/base_service.py:410 +msgid "[{}] 获取执行后写入流程上下文失败,ip:[{}]" +msgstr "[{}] 获取执行后写入流程上下文失败,ip:[{}]" + +#: backend/flow/plugins/components/collections/common/base_service.py:442 +msgid "任务失败" +msgstr "任务失败" + +#: backend/flow/plugins/components/collections/common/base_service.py:444 +msgid "任务状态异常{}" +msgstr "任务状态异常{}" + +#: backend/flow/plugins/components/collections/common/base_service.py:446 +msgid "查询日志失败" +msgstr "查询日志失败" + +#: backend/flow/plugins/components/collections/common/bigdata_manager_service.py:120 +msgid "无法找到Manager处理类型,请联系系统管理员:{}" +msgstr "无法找到Manager处理类型,请联系系统管理员:{}" + +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:42 +#: backend/flow/plugins/components/collections/common/clb_manage.py:43 +#: backend/flow/plugins/components/collections/common/clb_manage.py:59 +#: backend/flow/plugins/components/collections/common/clb_manage.py:68 +#: backend/flow/plugins/components/collections/common/dns_server.py:88 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:43 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:67 +#: backend/flow/plugins/components/collections/doris/doris_dns_manage.py:62 +#: backend/flow/plugins/components/collections/es/es_dns_manage.py:61 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:37 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:48 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:75 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:57 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:69 +#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:29 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:43 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:87 +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:46 +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:282 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:57 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:69 +msgid "该节点获取到执行ip信息为空,请联系系统管理员" +msgstr "该节点获取到执行ip信息为空,请联系系统管理员" + +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:100 +#: backend/flow/plugins/components/collections/common/check_resolv_conf.py:102 +msgid "/etc/resolv.conf 不为空 {}" +msgstr "/etc/resolv.conf 不为空 {}" + +#: backend/flow/plugins/components/collections/common/clb_manage.py:77 +#: backend/flow/plugins/components/collections/common/polaris_manage.py:76 +#: backend/flow/plugins/components/collections/doris/doris_dns_manage.py:146 +#: backend/flow/plugins/components/collections/es/es_dns_manage.py:146 +#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:71 +#: backend/flow/plugins/components/collections/kafka/dns_manage.py:93 +#: backend/flow/plugins/components/collections/mysql/dns_manage.py:96 +#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:61 +#: backend/flow/plugins/components/collections/pulsar/pulsar_zk_dns_manage.py:51 +#: backend/flow/plugins/components/collections/redis/dns_manage.py:93 +#: backend/flow/plugins/components/collections/vm/vm_dns_manage.py:89 +msgid "无法适配到传入的域名处理类型,请联系系统管理员:{}" +msgstr "无法适配到传入的域名处理类型,请联系系统管理员:{}" + +#: backend/flow/plugins/components/collections/common/clone_priv_rules_to_other_biz.py:32 +msgid "从{}复制权限规则到业务{}成功" +msgstr "从{}复制权限规则到业务{}成功" + +#: backend/flow/plugins/components/collections/common/clone_priv_rules_to_other_biz.py:34 +msgid "复制权限规则异常,相关信息: {}" +msgstr "复制权限规则异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:49 +msgid "在[{}]创建添加账号成功" +msgstr "在[{}]创建添加账号成功" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:51 +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:215 +#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:24 +msgid "[{}]添加用户接口异常,相关信息: {}" +msgstr "[{}]添加用户接口异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/common/create_random_job_user.py:129 +msgid "不支持改实例的主机类型授权[{}]: machine_type: {}" +msgstr "不支持改实例的主机类型授权[{}]: machine_type: {}" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:38 +msgid "未在输入参数或者上下文参数中找到提单数据" +msgstr "未在输入参数或者上下文参数中找到提单数据" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:48 +msgid "未知单据类型, {}不存在于已知单据类型中" +msgstr "未知单据类型, {}不存在于已知单据类型中" + +#: backend/flow/plugins/components/collections/common/create_ticket.py:53 +msgid "不允许自动创建单据,单据创建流程结束" +msgstr "不允许自动创建单据,单据创建流程结束" + +#: backend/flow/plugins/components/collections/common/external_service.py:39 +msgid "第三方接口: {} 请求成功! 返回参数为: {}" +msgstr "第三方接口: {} 请求成功! 返回参数为: {}" + +#: backend/flow/plugins/components/collections/common/external_service.py:41 +msgid "第三方接口:{} 调用失败!错误信息为: {}" +msgstr "第三方接口:{} 调用失败!错误信息为: {}" + +#: backend/flow/plugins/components/collections/common/external_service.py:44 +msgid "请求遇到未知错误!错误信息为: {}" +msgstr "请求遇到未知错误!错误信息为: {}" + +#: backend/flow/plugins/components/collections/common/pause.py:44 +msgid "【{}】流程待确认,是否继续?" +msgstr "【{}】流程待确认,是否继续?" + +#: backend/flow/plugins/components/collections/common/pause.py:78 +msgid "回调数据" +msgstr "回调数据" + +#: backend/flow/plugins/components/collections/common/pause.py:87 +msgid "暂停" +msgstr "暂停" + +#: backend/flow/plugins/components/collections/common/sa_idle_check.py:59 +msgid "空闲检查FOR_DBM" +msgstr "空闲检查FOR_DBM" + +#: backend/flow/plugins/components/collections/common/sa_idle_check.py:80 +msgid "sa空闲检查" +msgstr "sa空闲检查" + +#: backend/flow/plugins/components/collections/common/sa_init.py:28 +msgid "SA初始化" +msgstr "SA初始化" + +#: backend/flow/plugins/components/collections/common/sa_init.py:47 +msgid "sa初始化" +msgstr "sa初始化" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:34 +msgid "定时时间" +msgstr "定时时间" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:37 +#, python-format +msgid "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" +msgstr "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:40 +msgid "是否强制晚于当前时间" +msgstr "是否强制晚于当前时间" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:43 +msgid "" +"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" +msgstr "" +"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" + +#: backend/flow/plugins/components/collections/common/sleep_time_service.py:65 +msgid "定时时间需晚于当前时间" +msgstr "定时时间需晚于当前时间" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:53 +msgid "迁移集群元数据" +msgstr "迁移集群元数据" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:75 +msgid "更新dns记录成功" +msgstr "更新dns记录成功" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:77 +msgid "更新dns记录异常,相关信息: {}" +msgstr "更新dns记录异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/common/transfer_cluster_meta_to_other_biz.py:84 +msgid "更新dns记录" +msgstr "更新dns记录" + +#: backend/flow/plugins/components/collections/common/transfer_host_service.py:39 +msgid "主机{}转移目标模块{}失败, {}" +msgstr "主机{}转移目标模块{}失败, {}" + +#: backend/flow/plugins/components/collections/doris/exec_doris_actuator_script.py:65 +#: backend/flow/plugins/components/collections/doris/trans_files.py:47 +#: backend/flow/plugins/components/collections/es/exec_es_actuator_script.py:65 +#: backend/flow/plugins/components/collections/es/trans_files.py:47 +#: backend/flow/plugins/components/collections/hdfs/exec_actuator_script.py:69 +#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:53 +#: backend/flow/plugins/components/collections/influxdb/exec_actuator_script.py:62 +#: backend/flow/plugins/components/collections/kafka/exec_actuator_script.py:62 +#: backend/flow/plugins/components/collections/mongodb/exec_actuator_job.py:147 +#: backend/flow/plugins/components/collections/mongodb/exec_actuator_job2.py:74 +#: backend/flow/plugins/components/collections/mongodb/fast_exec_script.py:73 +#: backend/flow/plugins/components/collections/mysql/exec_actuator_script.py:82 +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:60 +#: backend/flow/plugins/components/collections/pulsar/exec_actuator_script.py:66 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:46 +#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:80 +#: backend/flow/plugins/components/collections/redis/exec_data_structure_actuator_script.py:87 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:85 +#: backend/flow/plugins/components/collections/redis/trans_flies.py:60 +#: backend/flow/plugins/components/collections/riak/exec_actuator_script.py:80 +#: backend/flow/plugins/components/collections/riak/trans_files.py:60 +#: backend/flow/plugins/components/collections/sqlserver/exec_actuator_script.py:66 +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:41 +#: backend/flow/plugins/components/collections/vm/exec_vm_actuator_script.py:64 +#: backend/flow/plugins/components/collections/vm/trans_files.py:47 +msgid "该节点获取到执行ip信息为空,请联系系统管理员{}" +msgstr "该节点获取到执行ip信息为空,请联系系统管理员{}" + +#: backend/flow/plugins/components/collections/doris/get_doris_resource.py:56 +#: backend/flow/plugins/components/collections/es/get_es_resource.py:55 +#: backend/flow/plugins/components/collections/kafka/get_kafka_resource.py:50 +#: backend/flow/plugins/components/collections/vm/get_vm_resource.py:56 +msgid "获取机器资源成功成功。 {}" +msgstr "获取机器资源成功成功。 {}" + +#: backend/flow/plugins/components/collections/hdfs/get_hdfs_resource.py:57 +#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:51 +msgid "获取机器资源成功。 {}" +msgstr "获取机器资源成功。 {}" + +#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:48 +msgid "获取DNS操作IP为空" +msgstr "获取DNS操作IP为空" + +#: backend/flow/plugins/components/collections/hdfs/update_hdfs_resource.py:67 +msgid "更新机器资源成功成功。 {}" +msgstr "更新机器资源成功成功。 {}" + +#: backend/flow/plugins/components/collections/influxdb/trans_flies.py:52 +#: backend/flow/plugins/components/collections/kafka/trans_flies.py:52 +msgid " 下发介质包参数:{}" +msgstr " 下发介质包参数:{}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:64 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:46 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:56 +msgid "调起下载 {}" +msgstr "调起下载 {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:86 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:57 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:65 +msgid "下载单据ID {}" +msgstr "下载单据ID {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:88 +msgid "下载单据ID {} resp: {}" +msgstr "下载单据ID {} resp: {}" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:93 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:68 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:70 +msgid "{} 下载成功" +msgstr "{} 下载成功" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:97 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:72 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:74 +msgid "{} 下载失败" +msgstr "{} 下载失败" + +#: backend/flow/plugins/components/collections/mongodb/mongo_download_backup_files.py:102 +#: backend/flow/plugins/components/collections/mysql/mysql_download_backupfile.py:77 +#: backend/flow/plugins/components/collections/redis/redis_download_backup_files.py:79 +msgid "{} 下载中: todo {}" +msgstr "{} 下载中: todo {}" + +#: backend/flow/plugins/components/collections/mongodb/send_media.py:64 +msgid "下发介质包失败,resp:{}" +msgstr "下发介质包失败,resp:{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:44 +msgid "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" +msgstr "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:76 +msgid "" +"授权规则明细:\n" +"{}\n" +msgstr "" +"授权规则明细:\n" +"{}\n" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:91 +msgid "「授权接口调用异常」{}" +msgstr "「授权接口调用异常」{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:92 +msgid "授权异常,相关信息: {}\n" +msgstr "授权异常,相关信息: {}\n" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:99 +msgid "授权整体结果{}" +msgstr "授权整体结果{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:103 +msgid "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" +msgstr "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" + +#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:114 +msgid "" +"授权结果详情请下载excel: excel 下载" +msgstr "授权结果详情请下载excel: excel 下载" + +#: backend/flow/plugins/components/collections/mysql/build_database_table_filter_regex.py:46 +msgid "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" +msgstr "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" + +#: backend/flow/plugins/components/collections/mysql/check_client_connections.py:61 +msgid "" +"检测结果详情请下载excel:excel 下载" +msgstr "检测结果详情请下载excel:excel 下载" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:46 +msgid "机器还在系统中注册,暂不用清理[{}]" +msgstr "机器还在系统中注册,暂不用清理[{}]" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:51 +msgid "本次操作没有机器可以清理,提前结束活动节点" +msgstr "本次操作没有机器可以清理,提前结束活动节点" + +#: backend/flow/plugins/components/collections/mysql/clear_machine.py:91 +msgid "输入了不是 tendbcluster 的 ip: {} {}" +msgstr "输入了不是 tendbcluster 的 ip: {} {}" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:95 +msgid "「权限克隆异常」{}" +msgstr "「权限克隆异常」{}" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:97 +msgid "权限克隆失败,错误信息: {}\n" +msgstr "权限克隆失败,错误信息: {}\n" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:104 +msgid "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" +msgstr "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" + +#: backend/flow/plugins/components/collections/mysql/clone_rules.py:110 +msgid "" +"详情请下载excel: excel 下载" +msgstr "" +"详情请下载excel: excel 下载" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:71 +msgid "「权限克隆返回结果异常」{}" +msgstr "「权限克隆返回结果异常」{}" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:73 +msgid "「权限克隆调用异常」{}" +msgstr "「权限克隆调用异常」{}" + +#: backend/flow/plugins/components/collections/mysql/clone_user.py:74 +msgid "执行克隆失败!" +msgstr "执行克隆失败!" + +#: backend/flow/plugins/components/collections/mysql/cluster_standardize_trans_module.py:33 +msgid "[{}] CC 模块标准化完成" +msgstr "[{}] CC 模块标准化完成" + +#: backend/flow/plugins/components/collections/mysql/create_user.py:48 +msgid "在「{}」创建临时用户「{}@{}」成功" +msgstr "在「{}」创建临时用户「{}@{}」成功" + +#: backend/flow/plugins/components/collections/mysql/create_user.py:50 +msgid "创建用户接口异常,相关信息: {}" +msgstr "创建用户接口异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:38 +msgid "在「{}」执行sql失败,相关信息: {}" +msgstr "在「{}」执行sql失败,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:42 +msgid "在「{}」执行sql{}失败,相关信息: {}" +msgstr "在「{}」执行sql{}失败,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:49 +msgid "删除用户接口异常,相关信息: {}" +msgstr "删除用户接口异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/drop_user.py:52 +msgid "在「{}」删除临时用户「{}@{}」成功" +msgstr "在「{}」删除临时用户「{}@{}」成功" + +#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:44 +msgid "这是一个fake的模拟执行" +msgstr "这是一个fake的模拟执行" + +#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:54 +msgid "语义检查执行成功" +msgstr "语义检查执行成功" + +#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:95 +msgid "[{}] 过滤所得库表: {}" +msgstr "[{}] 过滤所得库表: {}" + +#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:98 +msgid "[{}] 未匹配到任何库" +msgstr "[{}] 未匹配到任何库" + +#: backend/flow/plugins/components/collections/mysql/generate_drop_stage_db_sql.py:79 +msgid "" +"清档自动发起的变更SQL单据\n" +"关联单据:{}" +msgstr "清档自动发起的变更SQL单据\n关联单据:{}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:57 +msgid "在{}执行sql失败,相关信息: {}" +msgstr "在{}执行sql失败,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:62 +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:69 +msgid "在{}执行sql{}失败,相关信息: {}" +msgstr "在{}执行sql{}失败,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:88 +msgid "查询数据库接口异常,相关信息: {}" +msgstr "查询数据库接口异常,相关信息: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:91 +msgid "uid:{}" +msgstr "uid:{}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:123 +msgid "ERROR 数据不一致的表的数量: {}" +msgstr "ERROR 数据不一致的表的数量: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:124 +msgid "WARNING 被跳过校验的表的数量: {}" +msgstr "WARNING 被跳过校验的表的数量: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:125 +msgid "SUCCESS 数据一致的表的数量: {}" +msgstr "SUCCESS 数据一致的表的数量: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:130 +msgid "ERROR 校验失败,数据不一致的表:" +msgstr "ERROR 校验失败,数据不一致的表:" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:136 +msgid "WARNING 校验程序没有校验的表:" +msgstr "WARNING 校验程序没有校验的表:" + +#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:142 +msgid "SUCCESS 校验成功,数据一致的表:" +msgstr "SUCCESS 校验成功,数据一致的表:" + +#: backend/flow/plugins/components/collections/mysql/mysql_cluster_instantiate_config.py:43 +msgid "[{}] 实例化 {} 配置成功: {}" +msgstr "[{}] 实例化 {} 配置成功: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_crond_control.py:41 +msgid "执行ip信息为空,请联系系统管理员" +msgstr "执行ip信息为空,请联系系统管理员" + +#: backend/flow/plugins/components/collections/mysql/mysql_db_meta.py:41 +#: backend/flow/plugins/components/collections/redis/get_redis_payload.py:45 +#: backend/flow/plugins/components/collections/redis/redis_db_meta.py:45 +#: backend/flow/plugins/components/collections/spider/spider_db_meta.py:40 +msgid "集群元信息:{}" +msgstr "集群元信息:{}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:101 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:93 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:190 +msgid "[{}] get trans_data: {}" +msgstr "[{}] get trans_data: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:146 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:140 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:220 +msgid "[{}] cluster ids = {}" +msgstr "[{}] cluster ids = {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_import_metadata.py:150 +#: backend/flow/plugins/components/collections/spider/import_metadata.py:144 +#: backend/flow/plugins/components/collections/tendbsingle/metadata_import.py:224 +msgid "[{}] 元数据写入完成" +msgstr "[{}] 元数据写入完成" + +#: backend/flow/plugins/components/collections/mysql/mysql_ha_modify_cluster_phase.py:34 +msgid "[{}] 修改集群状态完成" +msgstr "[{}] 修改集群状态完成" + +#: backend/flow/plugins/components/collections/mysql/mysql_link_backup_id_bill_id.py:26 +msgid "[{}] 备份 id: {}" +msgstr "[{}] 备份 id: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_master_slave_relationship_check.py:72 +msgid "主备关系校验成功" +msgstr "主备关系校验成功" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:62 +#: backend/flow/plugins/components/collections/spider/spider_partition_callback.py:58 +msgid "不支持的状态类型: [{}]" +msgstr "不支持的状态类型: [{}]" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:78 +#: backend/flow/plugins/components/collections/spider/spider_partition_callback.py:68 +msgid "callback分区create_log接口异常: {}" +msgstr "callback分区create_log接口异常: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:95 +msgid "不支持的单据类型: [{}]" +msgstr "不支持的单据类型: [{}]" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:107 +msgid "ERROR 执行失败的分区规则的数量: {}" +msgstr "ERROR 执行失败的分区规则的数量: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:108 +msgid "SUCCESS 执行成功的分区规则的数量: {}" +msgstr "SUCCESS 执行成功的分区规则的数量: {}" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:113 +msgid "ERROR 执行失败的分区规则:" +msgstr "ERROR 执行失败的分区规则:" + +#: backend/flow/plugins/components/collections/mysql/mysql_partition_report.py:119 +msgid "SUCCESS 执行成功的分区规则:" +msgstr "SUCCESS 执行成功的分区规则:" + +#: backend/flow/plugins/components/collections/mysql/mysql_rds_execute.py:30 +msgid "传入参数:{}" +msgstr "传入参数:{}" + +#: backend/flow/plugins/components/collections/mysql/rename_database_confirm_empty_from.py:69 +#: backend/flow/plugins/components/collections/mysql/truncate_data_confirm_empty.py:64 +msgid "确认源数据库已空完成" +msgstr "确认源数据库已空完成" + +#: backend/flow/plugins/components/collections/mysql/rename_database_drop_from.py:51 +msgid "删除源数据库完成" +msgstr "删除源数据库完成" + +#: backend/flow/plugins/components/collections/mysql/rename_database_prepare_param.py:27 +msgid "[{}] 构造 old_new_map 完成: {}" +msgstr "[{}] 构造 old_new_map 完成: {}" + +#: backend/flow/plugins/components/collections/mysql/rollback_trans_flies.py:52 +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:66 +msgid "没有符合的备份文件提供定点恢复" +msgstr "没有符合的备份文件提供定点恢复" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:50 +msgid "创建模拟执行任务resp{}" +msgstr "创建模拟执行任务resp{}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:54 +msgid "创建模拟任务失败:{}" +msgstr "创建模拟任务失败:{}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:56 +msgid "创建模拟任务成功" +msgstr "创建模拟任务成功" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:60 +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:62 +msgid "「执行语义分析任务异常」{}" +msgstr "「执行语义分析任务异常」{}" + +#: backend/flow/plugins/components/collections/mysql/semantic_check.py:63 +msgid "创建模拟任务失败!" +msgstr "创建模拟任务失败!" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:42 +msgid "仅在主库查找备份源" +msgstr "仅在主库查找备份源" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:46 +msgid "在主、从库查找备份源" +msgstr "在主、从库查找备份源" + +#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:53 +msgid "从备份源中筛选符合的备份" +msgstr "从备份源中筛选符合的备份" + +#: backend/flow/plugins/components/collections/mysql/trans_flies.py:66 +#: backend/flow/plugins/components/collections/pulsar/trans_files.py:52 +#: backend/flow/plugins/components/collections/riak/trans_files.py:66 +msgid "" +"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" +"{}" +msgstr "" +"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" +"{}" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_create_stage_database.py:54 +msgid "建立备份库完成" +msgstr "建立备份库完成" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_drop.py:47 +msgid "删除据库完成" +msgstr "删除据库完成" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_drop_stage_database.py:48 +msgid "删除备份库完成" +msgstr "删除备份库完成" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_generate_stage_database_name.py:31 +msgid "生成备份库名完成" +msgstr "生成备份库名完成" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_recreate_table.py:61 +msgid "重建表成功" +msgstr "重建表成功" + +#: backend/flow/plugins/components/collections/mysql/truncate_data_rename_table.py:68 +msgid "[{}] 备份清档表完成" +msgstr "[{}] 备份清档表完成" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:38 +msgid "分区sql为空无需上传" +msgstr "分区sql为空无需上传" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:43 +msgid "单据id{}" +msgstr "单据id{}" + +#: backend/flow/plugins/components/collections/mysql/upload_file.py:44 +msgid "分区sql文件上传成功" +msgstr "分区sql文件上传成功" + +#: backend/flow/plugins/components/collections/pulsar/blank_schedule_service.py:66 +msgid "successfully enter blank schedule, interval times: {}" +msgstr "successfully enter blank schedule, interval times: {}" + +#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:98 +#: backend/flow/plugins/components/collections/redis/exec_data_structure_actuator_script.py:105 +#: backend/flow/plugins/components/collections/redis/psuh_data_structure_json_script.py:103 +msgid "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" +msgstr "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:115 +msgid "无符合要求机器" +msgstr "无符合要求机器" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:119 +msgid "获取最大磁盘空闲机器失败:{}" +msgstr "获取最大磁盘空闲机器失败:{}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:191 +msgid "源Redis服务器:{} {} 磁盘使用率:{}% > 85%" +msgstr "源Redis服务器:{} {} 磁盘使用率:{}% > 85%" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:201 +msgid "源Redis服务器:{} 磁盘使用情况:{}+Redis数据大小:{} 将会 >=90%" +msgstr "源Redis服务器:{} 磁盘使用情况:{}+Redis数据大小:{} 将会 >=90%" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:216 +msgid "所有临时Redis服务器的备份目录都相同:{}" +msgstr "所有临时Redis服务器的备份目录都相同:{}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:218 +msgid "备份目录的值不一致:{}" +msgstr "备份目录的值不一致:{}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:223 +msgid "检查源Redis服务器磁盘使用情况:{}" +msgstr "检查源Redis服务器磁盘使用情况:{}" + +#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:241 +msgid "redis 临时机器:{} 磁盘空间检查通过" +msgstr "redis 临时机器:{} 磁盘空间检查通过" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:132 +msgid "包含key正则:{} 不合法" +msgstr "包含key正则:{} 不合法" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:136 +msgid "排除key正则:{} 不合法" +msgstr "排除key正则:{} 不合法" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:143 +msgid "包含key正则:{} 不合法,err:{}" +msgstr "包含key正则:{} 不合法,err:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:150 +msgid "排除key正则:{} 不合法,err:{}" +msgstr "排除key正则:{} 不合法,err:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:163 +msgid "源redis集群{}存在{}个非running状态的slave" +msgstr "源redis集群{}存在{}个非running状态的slave" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:223 +msgid "所有源redis slave机器:{} 磁盘空间检查通过" +msgstr "所有源redis slave机器:{} 磁盘空间检查通过" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:234 +msgid "src_cluster:{} type:{} 无需检查cluster nodes是否ok" +msgstr "src_cluster:{} type:{} 无需检查cluster nodes是否ok" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:311 +msgid "src_cluster:{} 类型是:{} 无需检查cluster state" +msgstr "src_cluster:{} 类型是:{} 无需检查cluster state" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:546 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了同步task" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了同步task" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:557 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:567 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:575 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 开始新的校验修复" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 开始新的校验修复" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:587 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复正在进行中...,flow_id:{}" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复正在进行中...,flow_id:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:599 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复失败,flow_id:{},请处理该" +"失败信息而后再到当前页面重试" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复失败,flow_id:{},请处理该失败信息而后再到当前页面重试" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:611 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复已完成,flow_id:{}" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 上次校验修复已完成,flow_id:{}" + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:623 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,后续将断开同步关系..." +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,后续将断开同步关系..." + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:637 +msgid "" +"bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,校验修复已完成,将继续" +"执行等待切换步骤..." +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 数据同步已 ok,校验修复已完成,将继续执行等待切换步骤..." + +#: backend/flow/plugins/components/collections/redis/redis_dts.py:648 +msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks开始断开同步关系" +msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks开始断开同步关系" + +#: backend/flow/plugins/components/collections/redis/redis_ticket.py:43 +msgid "自愈发起-实例下架-{}" +msgstr "自愈发起-实例下架-{}" + +#: backend/flow/plugins/components/collections/redis/trans_flies.py:86 +msgid "下发介质包失败: [{}/{}] resp:{}" +msgstr "下发介质包失败: [{}/{}] resp:{}" + +#: backend/flow/plugins/components/collections/riak/get_riak_cluster_node.py:47 +msgid "获取集群所有节点成功。{}" +msgstr "获取集群所有节点成功。{}" + +#: backend/flow/plugins/components/collections/riak/get_riak_cluster_node.py:76 +msgid "获取集群中running节点成功。{}" +msgstr "获取集群中running节点成功。{}" + +#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:48 +msgid "获取机器资源失败,新建集群至少选择3台机器,扩容或缩容至少选择1台机器" +msgstr "获取机器资源失败,新建集群至少选择3台机器,扩容或缩容至少选择1台机器" + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:113 +#: backend/flow/plugins/components/collections/spider/ctl_drop_routing.py:48 +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:151 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:66 +msgid "select mysql.servers failed: {}" +msgstr "select mysql.servers failed: {}" + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:204 +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:212 +#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:22 +msgid "在[{}]创建添加内置账号成功" +msgstr "在[{}]创建添加内置账号成功" + +#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:262 +msgid "This spider-role is not supported,check" +msgstr "This spider-role is not supported,check" + +#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:45 +msgid "{} {} 检查库表是否在用" +msgstr "{} {} 检查库表是否在用" + +#: backend/flow/plugins/components/collections/spider/clear_database_on_remote_service.py:55 +msgid "remote drop 新库完成" +msgstr "remote drop 新库完成" + +#: backend/flow/plugins/components/collections/spider/create_database_like_via_ctl.py:118 +msgid "建立集群备份库表完成" +msgstr "建立集群备份库表完成" + +#: backend/flow/plugins/components/collections/spider/ctl_drop_routing.py:68 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:86 +msgid "exec TDBCTL-DROP-NODE failed: {}" +msgstr "exec TDBCTL-DROP-NODE failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:50 +#: backend/flow/plugins/components/collections/spider/drop_spider_ronting.py:29 +msgid "select processlist failed: {}" +msgstr "select processlist failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:85 +msgid "" +"After two detections, there are still non-sleep state threads in the instance" +msgstr "After two detections, there are still non-sleep state threads in the instance" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:103 +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:172 +msgid "exec TDBCTL-DISABLE-PRIMARY failed: {}" +msgstr "exec TDBCTL-DISABLE-PRIMARY failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:123 +msgid "exec [{ctl.ip_port}] stop slave failed: {res[0]['error_msg']}" +msgstr "exec [{ctl.ip_port}] stop slave failed: {res[0]['error_msg']}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:163 +msgid "exec reset-slave-all failed: {}" +msgstr "exec reset-slave-all failed: {}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:209 +msgid "在[{}]创建添加同步账号成功" +msgstr "在[{}]创建添加同步账号成功" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:231 +msgid "exec change master failed: {res[0]['error_msg']}" +msgstr "exec change master failed: {res[0]['error_msg']}" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:250 +msgid "预检测成功" +msgstr "预检测成功" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:258 +msgid "关闭所有从节点的主从同步成功" +msgstr "关闭所有从节点的主从同步成功" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:265 +msgid "在其余节点同步新的primary节点[{}]成功" +msgstr "在其余节点同步新的primary节点[{}]成功" + +#: backend/flow/plugins/components/collections/spider/ctl_switch_to_slave.py:269 +msgid "节点[{}]提升自己为primary成功" +msgstr "节点[{}]提升自己为primary成功" + +#: backend/flow/plugins/components/collections/spider/drop_spider_table_via_ctl.py:49 +msgid "删除老数据库完成" +msgstr "删除老数据库完成" + +#: backend/flow/plugins/components/collections/spider/truncate_database_drop_stage_db_via_ctl.py:47 +msgid "清理备份库完成" +msgstr "清理备份库完成" + +#: backend/flow/plugins/components/collections/spider/truncate_database_on_spider_via_ctl.py:145 +msgid "处理集群表完成" +msgstr "处理集群表完成" + +#: backend/flow/plugins/components/collections/sqlserver/exec_sqlserver_login.py:33 +msgid "集群[{}]没有对应填入的ip[{}]的实例,请联系系统管理员" +msgstr "集群[{}]没有对应填入的ip[{}]的实例,请联系系统管理员" + +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:48 +msgid "" +"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理" +"员: source_hosts:{}" +msgstr "选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员: source_hosts:{}" + +#: backend/flow/plugins/components/collections/sqlserver/trans_files.py:53 +msgid "" +"选择服务器之间文件传输模式,目标路径不能为空,请联系系统管理员: " +"file_target_path:{}" +msgstr "选择服务器之间文件传输模式,目标路径不能为空,请联系系统管理员: file_target_path:{}" + +#: backend/flow/signal/handlers.py:34 +msgid "【状态信号捕获】{} root_id={}, node_id={}, status:{}" +msgstr "【状态信号捕获】{} root_id={}, node_id={}, status:{}" + +#: backend/flow/signal/handlers.py:45 +msgid "【状态信号捕获】未查找到FlowTree root_id={}" +msgstr "【状态信号捕获】未查找到FlowTree root_id={}" + +#: backend/flow/signal/handlers.py:74 +msgid "【状态信号捕获】污点池处理/回调单据 发生错误,错误信息{}" +msgstr "【状态信号捕获】污点池处理/回调单据 发生错误,错误信息{}" + +#: backend/flow/utils/cloud/cloud_act_payload.py:52 +msgid "单据中不包含DRS的部署信息" +msgstr "单据中不包含DRS的部署信息" + +#: backend/flow/utils/cloud/cloud_act_payload.py:60 +msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" +msgstr "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" + +#: backend/flow/utils/cloud/cloud_act_payload.py:68 +msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" +msgstr "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" + +#: backend/flow/utils/cloud/cloud_act_payload.py:192 +msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" +msgstr "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" + +#: backend/flow/utils/cloud/cloud_act_payload.py:199 +msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" +msgstr "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" + +#: backend/flow/utils/cloud/cloud_db_proxy.py:53 +msgid "找不到单据类型需要变更的proxy函数,服务信息入库失败" +msgstr "找不到单据类型需要变更的proxy函数,服务信息入库失败" + +#: backend/flow/utils/cloud/cloud_module_operate.py:73 +msgid "主机{}转移{}失败,转移参数:{}, 错误信息:{}" +msgstr "主机{}转移{}失败,转移参数:{}, 错误信息:{}" + +#: backend/flow/utils/cloud/cloud_module_operate.py:134 +msgid "主机{}转移待回收失败,错误信息:{}" +msgstr "主机{}转移待回收失败,错误信息:{}" + +#: backend/flow/utils/doris/consts.py:17 +msgid "fe http端口" +msgstr "fe http端口" + +#: backend/flow/utils/doris/consts.py:18 +msgid "fe query 端口" +msgstr "fe query 端口" + +#: backend/flow/utils/doris/consts.py:19 +msgid "fe" +msgstr "fe" + +#: backend/flow/utils/doris/consts.py:20 +msgid "be" +msgstr "be" + +#: backend/flow/utils/doris/consts.py:21 +msgid "访问Doris 管理员账户名" +msgstr "访问Doris 管理员账户名" + +#: backend/flow/utils/doris/consts.py:22 +msgid "访问Doris 管理员密码" +msgstr "访问Doris 管理员密码" + +#: backend/flow/utils/doris/consts.py:26 backend/flow/utils/vm/consts.py:22 +msgid "ADD" +msgstr "ADD" + +#: backend/flow/utils/doris/consts.py:27 backend/flow/utils/vm/consts.py:23 +msgid "DROP" +msgstr "DROP" + +#: backend/flow/utils/doris/consts.py:28 backend/flow/utils/vm/consts.py:24 +msgid "DECOMMISSION" +msgstr "DECOMMISSION" + +#: backend/flow/utils/doris/consts.py:29 backend/flow/utils/vm/consts.py:25 +msgid "DROPP" +msgstr "DROPP" + +#: backend/flow/utils/doris/doris_db_meta.py:105 +#: backend/flow/utils/es/es_db_meta.py:101 +#: backend/flow/utils/vm/vm_db_meta.py:106 +msgid "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" +msgstr "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" + +#: backend/flow/utils/hdfs/hdfs_db_meta.py:58 +#: backend/flow/utils/influxdb/influxdb_db_meta.py:126 +#: backend/flow/utils/kafka/kafka_db_meta.py:180 +#: backend/flow/utils/redis/redis_db_meta.py:89 +msgid "找不到单据类型需要变更的cmdb函数,请联系系统管理员" +msgstr "找不到单据类型需要变更的cmdb函数,请联系系统管理员" + +#: backend/flow/utils/mongodb/db_table_filter.py:41 +#: backend/flow/utils/mysql/db_table_filter/filter.py:42 +msgid "include patterns 不能为空" +msgstr "include patterns 不能为空" + +#: backend/flow/utils/mongodb/db_table_filter.py:48 +msgid "exclude patterns 要么同时为空, 要么都不为空" +msgstr "exclude patterns 要么同时为空, 要么都不为空" + +#: backend/flow/utils/mongodb/db_table_filter.py:65 +msgid "{}校验不成功! 只能包含字母、数字或通配*且不超过最大长度" +msgstr "{}校验不成功! 只能包含字母、数字或通配*且不超过最大长度" + +#: backend/flow/utils/mongodb/migrate_meta.py:40 +msgid "找不到单据类型,请联系系统管理员" +msgstr "找不到单据类型,请联系系统管理员" + +#: backend/flow/utils/mysql/db_resource.py:106 +msgid " 获取资源失败: {}" +msgstr " 获取资源失败: {}" + +#: backend/flow/utils/mysql/db_table_filter/exception.py:18 +msgid "库表过滤异常" +msgstr "库表过滤异常" + +#: backend/flow/utils/mysql/db_table_filter/exception.py:23 +msgid "输入校验异常" +msgstr "输入校验异常" + +#: backend/flow/utils/mysql/db_table_filter/filter.py:50 +msgid "exclude patterns 不能包含 *" +msgstr "exclude patterns 不能包含 *" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:30 +msgid "使用通配符时, 只能有一个模式: {}" +msgstr "使用通配符时, 只能有一个模式: {}" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:33 +msgid "% ? 不能独立使用" +msgstr "% ? 不能独立使用" + +#: backend/flow/utils/mysql/db_table_filter/tools.py:36 +msgid "* 只能独立使用" +msgstr "* 只能独立使用" + +#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:27 +msgid "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" +msgstr "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" + +#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:29 +msgid "exec_ip变量和get_trans_data_ip_var变量不能同时为None" +msgstr "exec_ip变量和get_trans_data_ip_var变量不能同时为None" + +#: backend/flow/utils/mysql/mysql_act_playload.py:187 +msgid "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" +msgstr "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" + +#: backend/flow/utils/mysql/mysql_act_playload.py:241 +msgid "传入的安装spider端口列表为空或者非法值,请联系系统管理员" +msgstr "传入的安装spider端口列表为空或者非法值,请联系系统管理员" + +#: backend/flow/utils/mysql/mysql_act_playload.py:600 +#: backend/flow/utils/mysql/mysql_act_playload.py:679 +#: backend/flow/utils/mysql/mysql_act_playload.py:2093 +msgid "不支持的机器类型: {}" +msgstr "不支持的机器类型: {}" + +#: backend/flow/utils/mysql/mysql_act_playload.py:2043 +msgid "start binlog {} not exist" +msgstr "start binlog {} not exist" + +#: backend/flow/utils/mysql/mysql_commom_query.py:34 +msgid "DRS{}:{}查询变量失败,返回为空值" +msgstr "DRS{}:{}查询变量失败,返回为空值" + +#: backend/flow/utils/mysql/mysql_commom_query.py:37 +msgid "DRS查询字符集失败:{}" +msgstr "DRS查询字符集失败:{}" + +#: backend/flow/utils/pulsar/consts.py:21 +msgid "broker默认分区数" +msgstr "broker默认分区数" + +#: backend/flow/utils/pulsar/consts.py:22 +msgid "broker认证配置" +msgstr "broker认证配置" + +#: backend/flow/utils/pulsar/consts.py:23 +msgid "默认bookie池大小" +msgstr "默认bookie池大小" + +#: backend/flow/utils/pulsar/consts.py:24 +msgid "写入副本数" +msgstr "写入副本数" + +#: backend/flow/utils/pulsar/consts.py:25 +msgid "确认写入副本数" +msgstr "确认写入副本数" + +#: backend/flow/utils/pulsar/consts.py:26 +msgid "数据保留时间,单位为分钟" +msgstr "数据保留时间,单位为分钟" + +#: backend/flow/utils/pulsar/consts.py:27 +#: backend/flow/utils/pulsar/consts.py:30 +msgid "broker服务端口" +msgstr "broker服务端口" + +#: backend/flow/utils/pulsar/consts.py:28 +msgid "访问Pulsar Manager账户名" +msgstr "访问Pulsar Manager账户名" + +#: backend/flow/utils/pulsar/consts.py:29 +msgid "访问Pulsar Manager密码" +msgstr "访问Pulsar Manager密码" + +#: backend/flow/utils/redis/redis_act_playload.py:327 +msgid "开始交换源集群和目标集群的redis配置" +msgstr "开始交换源集群和目标集群的redis配置" + +#: backend/flow/utils/redis/redis_act_playload.py:335 +msgid "获取源集群:{} redis配置" +msgstr "获取源集群:{} redis配置" + +#: backend/flow/utils/redis/redis_act_playload.py:359 +msgid "获取目标集群:{} redis配置" +msgstr "获取目标集群:{} redis配置" + +#: backend/flow/utils/redis/redis_act_playload.py:405 +msgid "删除源集群:{} redis配置,upsert_param:{}" +msgstr "删除源集群:{} redis配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:413 +msgid "删除目标集群:{} redis配置,upsert_param:{}" +msgstr "删除目标集群:{} redis配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:421 +msgid "更新源集群redis配置 为 目标集群的配置,upsert_param:{}" +msgstr "更新源集群redis配置 为 目标集群的配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:428 +msgid "更新目标集群redis配置 为 源集群的配置,upsert_param:{}" +msgstr "更新目标集群redis配置 为 源集群的配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:550 +msgid "交换源集群和目标集群 dbconfig 中的proxy版本信息" +msgstr "交换源集群和目标集群 dbconfig 中的proxy版本信息" + +#: backend/flow/utils/redis/redis_act_playload.py:558 +msgid "获取源集群:{} proxy配置" +msgstr "获取源集群:{} proxy配置" + +#: backend/flow/utils/redis/redis_act_playload.py:571 +msgid "获取目标集群:{} proxy配置" +msgstr "获取目标集群:{} proxy配置" + +#: backend/flow/utils/redis/redis_act_playload.py:617 +msgid "src_conf_upsert_items==>{}" +msgstr "src_conf_upsert_items==>{}" + +#: backend/flow/utils/redis/redis_act_playload.py:618 +msgid "dst_conf_upsert_items==>{}" +msgstr "dst_conf_upsert_items==>{}" + +#: backend/flow/utils/redis/redis_act_playload.py:647 +msgid "删除源集群:{} proxy配置,src_remove_param:{}" +msgstr "删除源集群:{} proxy配置,src_remove_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:661 +msgid "删除目标集群:{} proxy配置,dst_remove_param:{}" +msgstr "删除目标集群:{} proxy配置,dst_remove_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:672 +msgid "更新源集群:{} dbconfig 中proxy版本等信息,src_upsert_param:{}" +msgstr "更新源集群:{} dbconfig 中proxy版本等信息,src_upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:685 +msgid "更新目标集群:{} dbconfig 中proxy版本等信息,dst_upsert_param:{}" +msgstr "更新目标集群:{} dbconfig 中proxy版本等信息,dst_upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:1209 +msgid "集群{}中没有找到{}相关实例" +msgstr "集群{}中没有找到{}相关实例" + +#: backend/flow/utils/redis/redis_act_playload.py:2054 +msgid "删除集群:{} redis配置,upsert_param:{}" +msgstr "删除集群:{} redis配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_act_playload.py:2062 +msgid "更新集群:{} redis配置 为 目标集群的配置,upsert_param:{}" +msgstr "更新集群:{} redis配置 为 目标集群的配置,upsert_param:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:97 +msgid "找不到单据类型需要查询的cmdb函数,请联系系统管理员" +msgstr "找不到单据类型需要查询的cmdb函数,请联系系统管理员" + +#: backend/flow/utils/redis/redis_db_meta.py:1420 +#, python-format +msgid "redis集群:%s cluster_type:%s 新增 %s cluster_entry" +msgstr "redis集群:%s cluster_type:%s 新增 %s cluster_entry" + +#: backend/flow/utils/redis/redis_db_meta.py:1430 +#, python-format +msgid "redis集群:%s cluster_type:%s 更新 cluster_entry:%s" +msgstr "redis集群:%s cluster_type:%s 更新 cluster_entry:%s" + +#: backend/flow/utils/redis/redis_db_meta.py:1440 +#, python-format +msgid "redis集群:%s cluster_type:%s 删除 cluster_entry:%s" +msgstr "redis集群:%s cluster_type:%s 删除 cluster_entry:%s" + +#: backend/flow/utils/redis/redis_db_meta.py:1466 +msgid "" +"dts_online_switch_swap_two_cluster_storage 1111 first get src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 1111 first get src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1471 +msgid "" +"dts_online_switch_swap_two_cluster_storage 1111 first get src dst_inst_list:" +"{}" +msgstr "dts_online_switch_swap_two_cluster_storage 1111 first get src dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1493 +msgid "dts 交换两个集群的 cluster_type 等信息" +msgstr "dts 交换两个集群的 cluster_type 等信息" + +#: backend/flow/utils/redis/redis_db_meta.py:1505 +msgid "dts 交换两个集群的 storageinstances" +msgstr "dts 交换两个集群的 storageinstances" + +#: backend/flow/utils/redis/redis_db_meta.py:1515 +msgid "" +"dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance" +"完成 src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance完成 src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1520 +msgid "" +"dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance" +"完成 dst_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 2222 交换两个集群strorageinstance完成 dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1526 +msgid "dts 交换两个集群的 nosqlstoragesetdtl" +msgstr "dts 交换两个集群的 nosqlstoragesetdtl" + +#: backend/flow/utils/redis/redis_db_meta.py:1536 +msgid "dts 交换两个集群 proxy 的 storageinstances" +msgstr "dts 交换两个集群 proxy 的 storageinstances" + +#: backend/flow/utils/redis/redis_db_meta.py:1564 +msgid "dts 交换两个集群的 cc module" +msgstr "dts 交换两个集群的 cc module" + +#: backend/flow/utils/redis/redis_db_meta.py:1567 +msgid "" +"dts_online_switch_swap_two_cluster_storage 3333 转移目标机器模块到源集群下," +"src_cluster:{} dst_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 3333 转移目标机器模块到源集群下,src_cluster:{} dst_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1573 +msgid "" +"dts_online_switch_swap_two_cluster_storage 3333 转移源机器模块到目标集群下," +"dst_cluster:{} src_inst_list:{}" +msgstr "dts_online_switch_swap_two_cluster_storage 3333 转移源机器模块到目标集群下,dst_cluster:{} src_inst_list:{}" + +#: backend/flow/utils/redis/redis_db_meta.py:1804 +msgid "redis集群:{} cluster_type:{} 新增 {} cluster_entry" +msgstr "redis集群:{} cluster_type:{} 新增 {} cluster_entry" + +#: backend/flow/utils/redis/redis_db_meta.py:1814 +msgid "redis集群:{} cluster_type:{} 更新 cluster_entry:{}" +msgstr "redis集群:{} cluster_type:{} 更新 cluster_entry:{}" + +#: backend/flow/utils/redis/redis_proxy_util.py:382 +#: backend/flow/utils/redis/redis_proxy_util.py:410 +#: backend/flow/utils/redis/redis_proxy_util.py:490 +msgid "集群类型:{} 不是一个 redis 集群类型?" +msgstr "集群类型:{} 不是一个 redis 集群类型?" + +#: backend/flow/utils/redis/redis_proxy_util.py:637 +msgid "redis集群 {} 没有running_master??" +msgstr "redis集群 {} 没有running_master??" + +#: backend/flow/utils/redis/redis_proxy_util.py:720 +msgid "分片数 不能被 机器组数 整除" +msgstr "分片数 不能被 机器组数 整除" + +#: backend/flow/utils/redis/redis_proxy_util.py:729 +msgid "集群机器规格、分片数、机器组数都没变,只是版本变了.请使用 版本升级 单据" +msgstr "集群机器规格、分片数、机器组数都没变,只是版本变了.请使用 版本升级 单据" + +#: backend/flow/utils/redis/redis_proxy_util.py:750 +msgid "集群版本变更时,分片数不能变,请先使用 版本升级 单据" +msgstr "集群版本变更时,分片数不能变,请先使用 版本升级 单据" + +#: backend/flow/utils/redis/redis_proxy_util.py:758 +msgid "当前集群规格、版本、分片数、机器组数均已满足,无需变更" +msgstr "当前集群规格、版本、分片数、机器组数均已满足,无需变更" + +#: backend/flow/utils/redis/redis_proxy_util.py:765 +msgid "redis 集群协议类型,机器组数不能小于3" +msgstr "redis 集群协议类型,机器组数不能小于3" + +#: backend/flow/utils/redis/redis_proxy_util.py:791 +msgid "" +"tendisplus集群 分片数变多,不允许机器数不变 or 变少。如果有需要,请使用 集群分" +"片数变更 单据" +msgstr "tendisplus集群 分片数变多,不允许机器数不变 or 变少。如果有需要,请使用 集群分片数变更 单据" + +#: backend/flow/utils/redis/redis_proxy_util.py:804 +msgid "" +"tendisplus集群 分片数变少,不允许机器数 变多。如果有需要,请使用 集群分片数变" +"更 单据" +msgstr "tendisplus集群 分片数变少,不允许机器数 变多。如果有需要,请使用 集群分片数变更 单据" + +#: backend/flow/utils/redis/redis_proxy_util.py:1027 +msgid "集群{}不存在DRS可访问的实例" +msgstr "集群{}不存在DRS可访问的实例" + +#: backend/flow/utils/redis/redis_proxy_util.py:1036 +msgid "redis集群 {} 不存在" +msgstr "redis集群 {} 不存在" + +#: backend/flow/utils/redis/redis_proxy_util.py:1041 +msgid "redis集群 {} 存在 {} 个状态非 running 的 proxy" +msgstr "redis集群 {} 存在 {} 个状态非 running 的 proxy" + +#: backend/flow/utils/redis/redis_proxy_util.py:1047 +msgid "redis集群 {} 存在 {} 个状态非 running 的 redis" +msgstr "redis集群 {} 存在 {} 个状态非 running 的 redis" + +#: backend/flow/utils/redis/redis_proxy_util.py:1063 +msgid "redis集群:{} proxy:{} ping失败" +msgstr "redis集群:{} proxy:{} ping失败" + +#: backend/flow/utils/redis/redis_proxy_util.py:1077 +msgid "redis集群:{} redis:{} ping失败" +msgstr "redis集群:{} redis:{} ping失败" + +#: backend/flow/utils/redis/redis_proxy_util.py:1080 +msgid "redis集群 {} 没有master??" +msgstr "redis集群 {} 没有master??" + +#: backend/flow/utils/redis/redis_proxy_util.py:1084 +msgid "redis集群{} master {} 没有 slave" +msgstr "redis集群{} master {} 没有 slave" + +#: backend/flow/utils/spider/get_spider_incr.py:42 +msgid "select spider_auto_increment failed: {}" +msgstr "select spider_auto_increment failed: {}" + +#: backend/flow/utils/spider/get_spider_incr.py:46 +msgid "select spider_auto_increment is null, check " +msgstr "select spider_auto_increment is null, check " + +#: backend/flow/utils/spider/get_spider_incr.py:55 +msgid "there are several different self incrementing steps" +msgstr "there are several different self incrementing steps" + +#: backend/flow/utils/spider/get_spider_incr.py:69 +msgid "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" +msgstr "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" + +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:56 +msgid "找不到对应版本的install key" +msgstr "找不到对应版本的install key" + +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:72 +#: backend/flow/utils/sqlserver/sqlserver_act_payload.py:106 +msgid "" +"传入的安装sqlserver端口列表为空或者非法值,请联系系统管理员: install_ports {}" +msgstr "传入的安装sqlserver端口列表为空或者非法值,请联系系统管理员: install_ports {}" + +#: backend/flow/utils/tbinlogdumper/tbinlogdumper_act_payload.py:111 +msgid "非法协议,请联系系统管理员:protocol_type:{}" +msgstr "非法协议,请联系系统管理员:protocol_type:{}" + +#: backend/flow/utils/vm/consts.py:17 +msgid "数据过期时间" +msgstr "数据过期时间" + +#: backend/flow/utils/vm/consts.py:18 +msgid "数据副本数" +msgstr "数据副本数" + +#: backend/flow/views/append_deploy_ctl.py:30 +msgid "开始执行迁移后置操作,部署tdbctl中控" +msgstr "开始执行迁移后置操作,部署tdbctl中控" + +#: backend/flow/views/base.py:39 backend/flow/views/base.py:51 +msgid "权限不足,无法访问!" +msgstr "权限不足,无法访问!" + +#: backend/flow/views/cloud_dbha_apply.py:39 +#: backend/flow/views/cloud_dns_bind_apply.py:39 +msgid "开始部署dns-bind服务场景" +msgstr "开始部署dns-bind服务场景" + +#: backend/flow/views/cloud_drs_apply.py:44 +msgid "开始部署drs服务场景" +msgstr "开始部署drs服务场景" + +#: backend/flow/views/cloud_nginx_apply.py:44 +msgid "开始部署nginx服务场景" +msgstr "开始部署nginx服务场景" + +#: backend/flow/views/cloud_nginx_apply.py:54 +msgid "开始替换nginx服务场景" +msgstr "开始替换nginx服务场景" + +#: backend/flow/views/cloud_redis_dts_server_apply.py:43 +msgid "开始部署redis dts服务场景" +msgstr "开始部署redis dts服务场景" + +#: backend/flow/views/cloud_redis_dts_server_apply.py:69 +msgid "删除redis dts服务场景" +msgstr "删除redis dts服务场景" + +#: backend/flow/views/doris_apply.py:64 +msgid "开始部署Doris场景" +msgstr "开始部署Doris场景" + +#: backend/flow/views/doris_destroy.py:39 +msgid "开始删除Doris集群场景" +msgstr "开始删除Doris集群场景" + +#: backend/flow/views/doris_disable.py:39 +msgid "开始禁用Doris集群场景" +msgstr "开始禁用Doris集群场景" + +#: backend/flow/views/doris_enable.py:39 +msgid "开始启用Doris集群场景" +msgstr "开始启用Doris集群场景" + +#: backend/flow/views/doris_reboot.py:46 +msgid "开始重启Doris节点场景" +msgstr "开始重启Doris节点场景" + +#: backend/flow/views/doris_replace.py:69 +msgid "开始替换Doris集群场景" +msgstr "开始替换Doris集群场景" + +#: backend/flow/views/doris_scale_up.py:52 +msgid "开始扩容Doris场景" +msgstr "开始扩容Doris场景" + +#: backend/flow/views/doris_shrink.py:52 +msgid "开始缩容Doris集群场景" +msgstr "开始缩容Doris集群场景" + +#: backend/flow/views/es_apply.py:63 +#: backend/flow/views/migrate_views/es_fake_apply.py:66 +msgid "开始部署ES场景" +msgstr "开始部署ES场景" + +#: backend/flow/views/es_destroy.py:39 +msgid "开始下架ES场景" +msgstr "开始下架ES场景" + +#: backend/flow/views/es_disable.py:39 +msgid "开始禁用ES场景" +msgstr "开始禁用ES场景" + +#: backend/flow/views/es_enable.py:39 +msgid "开始启用ES场景" +msgstr "开始启用ES场景" + +#: backend/flow/views/es_reboot.py:47 +msgid "开始重启ES节点场景" +msgstr "开始重启ES节点场景" + +#: backend/flow/views/es_replace.py:63 backend/flow/views/es_scale_up.py:52 +msgid "开始扩容ES场景" +msgstr "开始扩容ES场景" + +#: backend/flow/views/es_shrink.py:52 +msgid "开始缩容ES场景" +msgstr "开始缩容ES场景" + +#: backend/flow/views/hdfs_apply.py:61 +msgid "开始部署HDFS场景" +msgstr "开始部署HDFS场景" + +#: backend/flow/views/hdfs_destroy.py:39 +msgid "开始HDFS集群销毁场景" +msgstr "开始HDFS集群销毁场景" + +#: backend/flow/views/hdfs_disable.py:39 +msgid "开始HDFS集群禁用场景" +msgstr "开始HDFS集群禁用场景" + +#: backend/flow/views/hdfs_enable.py:39 +msgid "开始HDFS集群启用场景" +msgstr "开始HDFS集群启用场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:91 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:103 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:202 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:75 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:83 -msgid "下发ES介质" -msgstr "下发ES介质" +#: backend/flow/views/hdfs_reboot.py:55 +msgid "开始重启HDFS场景" +msgstr "开始重启HDFS场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:104 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:116 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:88 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:167 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:214 -msgid "节点初始化-{}" -msgstr "节点初始化-{}" +#: backend/flow/views/hdfs_replace.py:65 +msgid "开始替换HDFS场景" +msgstr "开始替换HDFS场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:113 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:125 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:97 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:173 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:220 -msgid "解压缩介质包-{}" -msgstr "解压缩介质包-{}" +#: backend/flow/views/hdfs_scale_up.py:42 +msgid "开始扩容HDFS场景" +msgstr "开始扩容HDFS场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:122 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:134 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:106 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:180 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:227 -msgid "安装supervisor-{}" -msgstr "安装supervisor-{}" +#: backend/flow/views/hdfs_shrink.py:42 +msgid "开始HDFS集群缩容场景" +msgstr "开始HDFS集群缩容场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:133 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:145 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:117 -msgid "安装ES {}-{}节点" -msgstr "安装ES {}-{}节点" +#: backend/flow/views/influxdb_apply.py:57 +#: backend/flow/views/migrate_views/influxdb_fake_apply.py:60 +msgid "开始部署influxdb场景" +msgstr "开始部署influxdb场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:138 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:150 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:122 -msgid "安装ES {}-{}子流程" -msgstr "安装ES {}-{}子流程" +#: backend/flow/views/influxdb_destroy.py:39 +msgid "开始下架Influxdb场景" +msgstr "开始下架Influxdb场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:146 -msgid "初始化鉴权插件" -msgstr "初始化鉴权插件" +#: backend/flow/views/influxdb_disable.py:39 +msgid "开始禁用Influxdb场景" +msgstr "开始禁用Influxdb场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:154 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:239 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:120 -msgid "安装kibana" -msgstr "安装kibana" +#: backend/flow/views/influxdb_enable.py:39 +msgid "开始启用Influxdb场景" +msgstr "开始启用Influxdb场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:166 -msgid "插入kibana实例信息" -msgstr "插入kibana实例信息" +#: backend/flow/views/influxdb_reboot.py:47 +msgid "开始重启Influxdb节点场景" +msgstr "开始重启Influxdb节点场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:173 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:214 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:127 -msgid "回写集群配置信息" -msgstr "回写集群配置信息" +#: backend/flow/views/influxdb_replace.py:49 +msgid "开始替换influxdb场景" +msgstr "开始替换influxdb场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:184 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:187 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:77 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:152 -msgid "添加域名" -msgstr "添加域名" +#: backend/flow/views/kafka_apply.py:70 +#: backend/flow/views/migrate_views/kafka_fake_apply.py:73 +msgid "开始部署kafka场景" +msgstr "开始部署kafka场景" -#: backend/flow/engine/bamboo/scene/es/es_apply_flow.py:191 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:156 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:128 -msgid "添加到DBMeta" -msgstr "添加到DBMeta" +#: backend/flow/views/kafka_destroy.py:39 +msgid "开始下架Kafka场景" +msgstr "开始下架Kafka场景" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:65 -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:61 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:61 -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:71 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:58 -#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:61 -msgid "下发actuator" -msgstr "下发actuator" +#: backend/flow/views/kafka_disable.py:39 +msgid "开始禁用Kafka场景" +msgstr "开始禁用Kafka场景" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:295 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:177 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:64 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:187 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:293 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:410 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:170 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:115 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:222 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:99 -msgid "节点清理-{}" -msgstr "节点清理-{}" +#: backend/flow/views/kafka_enable.py:39 +msgid "开始启用Kafka场景" +msgstr "开始启用Kafka场景" + +#: backend/flow/views/kafka_reboot.py:47 +msgid "开始重启Kafka节点场景" +msgstr "开始重启Kafka节点场景" + +#: backend/flow/views/kafka_replace.py:51 +msgid "开始替换kafka场景" +msgstr "开始替换kafka场景" + +#: backend/flow/views/kafka_scale_up.py:49 +msgid "开始扩容kafka场景" +msgstr "开始扩容kafka场景" + +#: backend/flow/views/kafka_shrink.py:44 +msgid "开始缩容kafka场景" +msgstr "开始缩容kafka场景" + +#: backend/flow/views/migrate_views/hdfs_fake_apply.py:66 +msgid "开始部署hdfs场景" +msgstr "开始部署hdfs场景" + +#: backend/flow/views/migrate_views/riak_migrate.py:65 +msgid "开始迁移RIAK场景" +msgstr "开始迁移RIAK场景" + +#: backend/flow/views/mysql_add_slave.py:44 +#: backend/flow/views/mysql_add_slave_remote.py:44 +msgid "开始添加slave" +msgstr "开始添加slave" + +#: backend/flow/views/mysql_edit_config.py:60 +msgid "开始下发修改的参数" +msgstr "开始下发修改的参数" + +#: backend/flow/views/mysql_flashback.py:49 +msgid "开始flashback" +msgstr "开始flashback" + +#: backend/flow/views/mysql_ha_db_table_backup.py:32 +msgid "开始库表备份场景" +msgstr "开始库表备份场景" + +#: backend/flow/views/mysql_ha_destroy.py:31 +msgid "开始回收mysql主从版场景" +msgstr "开始回收mysql主从版场景" + +#: backend/flow/views/mysql_ha_destroy.py:49 +msgid "开始禁用mysql主从版场景" +msgstr "开始禁用mysql主从版场景" + +#: backend/flow/views/mysql_ha_destroy.py:65 +msgid "开始启动mysql主从版场景" +msgstr "开始启动mysql主从版场景" + +#: backend/flow/views/mysql_ha_full_backup.py:32 +msgid "开始全库备份场景" +msgstr "开始全库备份场景" + +#: backend/flow/views/mysql_ha_master_fail_over.py:30 +msgid "开始执行主故障切换[整机切换]的任务" +msgstr "开始执行主故障切换[整机切换]的任务" + +#: backend/flow/views/mysql_ha_rename_database.py:30 +#: backend/flow/views/mysql_ha_truncate_data.py:30 +msgid "开始TenDBHA清档场景" +msgstr "开始TenDBHA清档场景" + +#: backend/flow/views/mysql_ha_switch.py:30 +msgid "开始执行主从切换[整机切换]的任务" +msgstr "开始执行主从切换[整机切换]的任务" + +#: backend/flow/views/mysql_migrate_cluster.py:46 +#: backend/flow/views/mysql_migrate_cluster_remote.py:46 +#: backend/flow/views/mysql_restore_slave.py:49 +#: backend/flow/views/mysql_restore_slave_remote.py:49 +msgid "开始重建slave" +msgstr "开始重建slave" + +#: backend/flow/views/mysql_proxy_add.py:30 +msgid "开始添加mysql_proxy实例场景" +msgstr "开始添加mysql_proxy实例场景" + +#: backend/flow/views/mysql_proxy_reduce.py:30 +msgid "开始回收mysql_proxy实例场景" +msgstr "开始回收mysql_proxy实例场景" + +#: backend/flow/views/mysql_proxy_switch.py:30 +msgid "开始替换mysql_proxy实例场景" +msgstr "开始替换mysql_proxy实例场景" + +#: backend/flow/views/mysql_proxy_upgrade.py:30 +msgid "开始测试本地升级mysql_proxy实例场景" +msgstr "开始测试本地升级mysql_proxy实例场景" + +#: backend/flow/views/mysql_pt_table_sync.py:30 +msgid "开始执行数据修复" +msgstr "开始执行数据修复" + +#: backend/flow/views/mysql_push_peripheral_config.py:25 +msgid "开始下发周边配置场景" +msgstr "开始下发周边配置场景" + +#: backend/flow/views/mysql_restore_local_remote.py:44 +#: backend/flow/views/mysql_restore_local_slave.py:44 +msgid "开始原地重建slave" +msgstr "开始原地重建slave" + +#: backend/flow/views/mysql_rollback_data.py:48 +msgid "开始重建定点回档数据" +msgstr "开始重建定点回档数据" + +#: backend/flow/views/mysql_rollback_to_cluster.py:49 +msgid "定点回档到指定集群" +msgstr "定点回档到指定集群" + +#: backend/flow/views/mysql_single_apply.py:57 +msgid "开始部署mysql单实例场景" +msgstr "开始部署mysql单实例场景" + +#: backend/flow/views/mysql_single_destroy.py:30 +msgid "开始回收mysql单节点版场景" +msgstr "开始回收mysql单节点版场景" + +#: backend/flow/views/mysql_single_destroy.py:46 +msgid "开始禁用mysql单节点版场景" +msgstr "开始禁用mysql单节点版场景" + +#: backend/flow/views/mysql_single_destroy.py:62 +msgid "开始启动mysql单节点版场景" +msgstr "开始启动mysql单节点版场景" + +#: backend/flow/views/mysql_single_rename_database.py:30 +#: backend/flow/views/mysql_single_truncate_data.py:30 +msgid "开始TenDBSingle清档场景" +msgstr "开始TenDBSingle清档场景" + +#: backend/flow/views/mysql_upgrade.py:30 +msgid "开始测试本地升级mysql实例场景" +msgstr "开始测试本地升级mysql实例场景" + +#: backend/flow/views/mysql_upgrade.py:46 +msgid "开始测试迁移升级mysql实例场景" +msgstr "开始测试迁移升级mysql实例场景" + +#: backend/flow/views/pulsar_destroy.py:39 +msgid "开始pulsar集群销毁场景" +msgstr "开始pulsar集群销毁场景" + +#: backend/flow/views/pulsar_disable.py:39 +msgid "开始PULSAR集群禁用场景" +msgstr "开始PULSAR集群禁用场景" + +#: backend/flow/views/pulsar_enable.py:39 +msgid "开始PULSAR集群启用场景" +msgstr "开始PULSAR集群启用场景" + +#: backend/flow/views/pulsar_reboot.py:55 +msgid "开始重启PULSAR场景" +msgstr "开始重启PULSAR场景" + +#: backend/flow/views/pulsar_replace.py:24 +msgid "开始PULSAR集群替换场景" +msgstr "开始PULSAR集群替换场景" + +#: backend/flow/views/pulsar_shrink.py:28 +msgid "开始PULSAR集群缩容场景" +msgstr "开始PULSAR集群缩容场景" + +#: backend/flow/views/spider_cluster_database_table_backup.py:30 +msgid "开始TenDBCluster库表备份场景" +msgstr "开始TenDBCluster库表备份场景" + +#: backend/flow/views/spider_cluster_destroy.py:34 +msgid "开始禁用spider集群场景" +msgstr "开始禁用spider集群场景" + +#: backend/flow/views/spider_cluster_destroy.py:53 +msgid "开始启用spider集群场景" +msgstr "开始启用spider集群场景" + +#: backend/flow/views/spider_cluster_flashback.py:26 +msgid "开始TenDBCluster Flashback场景" +msgstr "开始TenDBCluster Flashback场景" + +#: backend/flow/views/spider_cluster_full_backup.py:30 +msgid "开始TenDBCluster全库备份场景" +msgstr "开始TenDBCluster全库备份场景" + +#: backend/flow/views/spider_cluster_rename_database.py:30 +msgid "开始TenDBCluster数据库重命名场景" +msgstr "开始TenDBCluster数据库重命名场景" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:89 -msgid "删除kibana实例信息" -msgstr "删除kibana实例信息" +#: backend/flow/views/spider_cluster_standardize.py:30 +msgid "开始TenDBCluster标准化" +msgstr "开始TenDBCluster标准化" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:97 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:107 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:96 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:97 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:157 -msgid "删除域名" -msgstr "删除域名" +#: backend/flow/views/spider_cluster_truncate_database.py:30 +msgid "开始TenDBCluster清档场景" +msgstr "开始TenDBCluster清档场景" -#: backend/flow/engine/bamboo/scene/es/es_destroy_flow.py:103 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:103 -msgid "清理Meta" -msgstr "清理Meta" +#: backend/flow/views/tendb_ha_standardize.py:30 +msgid "开始TenDBHA标准化" +msgstr "开始TenDBHA标准化" -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:70 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:64 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:178 -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:68 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:285 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:402 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:153 -msgid "停止进程-{}" -msgstr "停止进程-{}" +#: backend/flow/views/vm_apply.py:65 +msgid "开始部署Vm场景" +msgstr "开始部署Vm场景" -#: backend/flow/engine/bamboo/scene/es/es_disable_flow.py:79 -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:79 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:114 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:90 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:144 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:74 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:74 -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:78 -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:78 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:127 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:89 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:87 -msgid "修改Meta" -msgstr "修改Meta" +#: backend/flow/views/vm_destroy.py:39 +msgid "开始下架vm场景" +msgstr "开始下架vm场景" -#: backend/flow/engine/bamboo/scene/es/es_enable_flow.py:70 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:64 -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:68 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:77 -msgid "启动进程-{}" -msgstr "启动进程-{}" +#: backend/flow/views/vm_disable.py:39 +msgid "开始禁用VM场景" +msgstr "开始禁用VM场景" -#: backend/flow/engine/bamboo/scene/es/es_reboot_flow.py:81 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_reboot_flow.py:69 -#: backend/flow/engine/bamboo/scene/kafka/kafka_reboot_flow.py:72 -msgid "重启实例-{}" -msgstr "重启实例-{}" +#: backend/flow/views/vm_enable.py:39 +msgid "开始启用VM场景" +msgstr "开始启用VM场景" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:91 -msgid "获取扩容流程集群部署配置" -msgstr "获取扩容流程集群部署配置" +#: backend/flow/views/vm_reboot.py:45 +msgid "开始重启VM节点场景" +msgstr "开始重启VM节点场景" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:167 -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:221 -#: backend/flow/engine/bamboo/scene/es/es_scale_up_flow.py:139 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:102 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:208 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:85 -msgid "更新域名映射" -msgstr "更新域名映射" +#: backend/flow/views/vm_replace.py:68 +msgid "开始替换VM场景" +msgstr "开始替换VM场景" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:176 -msgid "校验扩容结果" -msgstr "校验扩容结果" +#: backend/flow/views/vm_scale_up.py:55 +msgid "开始扩容VM场景" +msgstr "开始扩容VM场景" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:181 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:183 -msgid "扩容子流程" -msgstr "扩容子流程" +#: backend/flow/views/vm_shrink.py:54 +msgid "开始缩容VM场景" +msgstr "开始缩容VM场景" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:191 -msgid "获取缩容流程集群部署配置" -msgstr "获取缩容流程集群部署配置" +#: backend/iam_app/constans.py:20 +msgid "业务只读" +msgstr "业务只读" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:208 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:89 -msgid "排斥缩容节点" -msgstr "排斥缩容节点" +#: backend/iam_app/constans.py:21 +msgid "业务运维" +msgstr "业务运维" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:253 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:134 -msgid "更新kibana实例信息" -msgstr "更新kibana实例信息" +#: backend/iam_app/constans.py:22 +msgid "外部开发商专用" +msgstr "外部开发商专用" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:261 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:142 -msgid "校验搬迁状态" -msgstr "校验搬迁状态" +#: backend/iam_app/constans.py:24 +msgid "MySQL SQL变更" +msgstr "MySQL SQL变更" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:272 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:153 -msgid "校验连接状态" -msgstr "校验连接状态" +#: backend/iam_app/constans.py:25 +msgid "MySQL DB授权" +msgstr "MySQL DB授权" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:281 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:162 -msgid "停止节点-{}" -msgstr "停止节点-{}" +#: backend/iam_app/constans.py:27 +msgid "TendbCluster SQL变更" +msgstr "TendbCluster SQL变更" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:286 -msgid "停止ES子流程" -msgstr "停止ES子流程" +#: backend/iam_app/constans.py:28 +msgid "TendbCluster DB授权" +msgstr "TendbCluster DB授权" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:305 -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:185 -msgid "清理DBMeta" -msgstr "清理DBMeta" +#: backend/iam_app/constans.py:30 +msgid "Kafka获取访问方式" +msgstr "Kafka获取访问方式" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:320 -msgid "{}-替换master ip" -msgstr "{}-替换master ip" +#: backend/iam_app/constans.py:31 +msgid "ES获取访问方式" +msgstr "ES获取访问方式" -#: backend/flow/engine/bamboo/scene/es/es_replace_flow.py:327 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:235 -msgid "缩容子流程" -msgstr "缩容子流程" +#: backend/iam_app/constans.py:32 +msgid "HDFS获取访问方式" +msgstr "HDFS获取访问方式" -#: backend/flow/engine/bamboo/scene/es/es_shrink_flow.py:166 -msgid "停止ES-{}子流程" -msgstr "停止ES-{}子流程" +#: backend/iam_app/dataclass/__init__.py:67 +#: backend/iam_app/dataclass/resources.py:607 +#: backend/iam_app/dataclass/resources.py:661 +msgid "{} 列表" +msgstr "{} 列表" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:18 -msgid "Flow模块HDFS异常" -msgstr "Flow模块HDFS异常" +#: backend/iam_app/dataclass/actions.py:48 +msgid "动作ID{}长度超过{},无法注册iam,请重新命名" +msgstr "动作ID{}长度超过{},无法注册iam,请重新命名" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:29 -msgid "手动部署选择机器数量异常" -msgstr "手动部署选择机器数量异常" +#: backend/iam_app/dataclass/actions.py:111 +msgid "业务访问" +msgstr "业务访问" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:30 -#, python-brace-format -msgid "HDFS集群角色{hdfs_role}数量不能为{machine_count}" -msgstr "HDFS集群角色{hdfs_role}数量不能为{machine_count}" +#: backend/iam_app/dataclass/actions.py:133 +msgid "全局设置访问" +msgstr "全局设置访问" + +#: backend/iam_app/dataclass/actions.py:138 +#: backend/iam_app/dataclass/actions.py:162 +#: backend/iam_app/dataclass/actions.py:231 +#: backend/iam_app/dataclass/actions.py:243 +#: backend/iam_app/dataclass/actions.py:255 +#: backend/iam_app/dataclass/actions.py:1609 +#: backend/iam_app/dataclass/actions.py:1633 +#: backend/iam_app/dataclass/actions.py:1657 +#: backend/iam_app/dataclass/actions.py:1693 +#: backend/iam_app/dataclass/actions.py:1717 +#: backend/iam_app/dataclass/actions.py:1740 +#: backend/iam_app/dataclass/actions.py:1752 +#: backend/iam_app/dataclass/actions.py:1764 +#: backend/iam_app/dataclass/actions.py:1776 +#: backend/iam_app/dataclass/actions.py:1824 +#: backend/iam_app/dataclass/actions.py:1836 +#: backend/iam_app/dataclass/actions.py:1848 +#: backend/iam_app/dataclass/actions.py:1860 +#: backend/iam_app/dataclass/actions.py:1884 +#: backend/iam_app/dataclass/actions.py:1896 +msgid "全局设置" +msgstr "全局设置" + +#: backend/iam_app/dataclass/actions.py:145 +msgid "单据查看" +msgstr "单据查看" + +#: backend/iam_app/dataclass/actions.py:151 +#: backend/iam_app/dataclass/actions.py:196 +#: backend/iam_app/dataclass/resources.py:271 +msgid "单据" +msgstr "单据" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:35 -msgid "替换旧机器不能为空" -msgstr "替换旧机器不能为空" +#: backend/iam_app/dataclass/actions.py:157 +msgid "全局单据流程设置" +msgstr "全局单据流程设置" + +#: backend/iam_app/dataclass/actions.py:168 +msgid "业务单据流程设置" +msgstr "业务单据流程设置" + +#: backend/iam_app/dataclass/actions.py:173 +#: backend/iam_app/dataclass/actions.py:207 +#: backend/iam_app/dataclass/actions.py:219 +#: backend/iam_app/dataclass/actions.py:1561 +#: backend/iam_app/dataclass/actions.py:1573 +#: backend/iam_app/dataclass/actions.py:1585 +#: backend/iam_app/dataclass/actions.py:1597 +#: backend/iam_app/dataclass/actions.py:1621 +#: backend/iam_app/dataclass/actions.py:1645 +#: backend/iam_app/dataclass/actions.py:1669 +#: backend/iam_app/dataclass/actions.py:1681 +#: backend/iam_app/dataclass/actions.py:1705 +#: backend/iam_app/dataclass/actions.py:1729 +#: backend/iam_app/dataclass/actions.py:1872 +msgid "业务配置" +msgstr "业务配置" + +#: backend/iam_app/dataclass/actions.py:178 +msgid "资源管理访问" +msgstr "资源管理访问" + +#: backend/iam_app/dataclass/actions.py:183 +#: backend/iam_app/dataclass/actions.py:1503 +#: backend/iam_app/dataclass/actions.py:1515 +#: backend/iam_app/dataclass/actions.py:1527 +#: backend/iam_app/dataclass/actions.py:1788 +#: backend/iam_app/dataclass/actions.py:1800 +#: backend/iam_app/dataclass/actions.py:1812 +msgid "资源管理" +msgstr "资源管理" + +#: backend/iam_app/dataclass/actions.py:190 +msgid "任务流程管理" +msgstr "任务流程管理" + +#: backend/iam_app/dataclass/actions.py:202 +msgid "数据库配置查看" +msgstr "数据库配置查看" + +#: backend/iam_app/dataclass/actions.py:214 +msgid "数据库配置编辑" +msgstr "数据库配置编辑" + +#: backend/iam_app/dataclass/actions.py:226 +msgid "全局数据库配置编辑" +msgstr "全局数据库配置编辑" + +#: backend/iam_app/dataclass/actions.py:238 +msgid "全局数据库配置新增" +msgstr "全局数据库配置新增" + +#: backend/iam_app/dataclass/actions.py:250 +msgid "全局数据库配置删除" +msgstr "全局数据库配置删除" + +#: backend/iam_app/dataclass/actions.py:262 +msgid "MySQL 部署" +msgstr "MySQL 部署" + +#: backend/iam_app/dataclass/actions.py:268 +#: backend/iam_app/dataclass/actions.py:280 +#: backend/iam_app/dataclass/actions.py:320 +#: backend/iam_app/dataclass/actions.py:336 +#: backend/iam_app/dataclass/actions.py:347 +#: backend/iam_app/dataclass/actions.py:371 +#: backend/iam_app/dataclass/actions.py:631 +#: backend/iam_app/dataclass/actions.py:663 +#: backend/iam_app/dataclass/actions.py:679 +#: backend/iam_app/dataclass/actions.py:874 +#: backend/iam_app/dataclass/actions.py:887 +#: backend/iam_app/dataclass/actions.py:912 +#: backend/iam_app/dataclass/actions.py:928 +#: backend/iam_app/dataclass/actions.py:944 +#: backend/iam_app/dataclass/actions.py:952 +#: backend/iam_app/dataclass/actions.py:965 +#: backend/iam_app/dataclass/actions.py:1013 +#: backend/iam_app/dataclass/actions.py:1025 +#: backend/iam_app/dataclass/actions.py:1037 +#: backend/iam_app/dataclass/actions.py:1049 +#: backend/iam_app/dataclass/actions.py:1056 +#: backend/iam_app/dataclass/actions.py:1069 +#: backend/iam_app/dataclass/actions.py:1081 +#: backend/iam_app/dataclass/actions.py:1093 +#: backend/iam_app/dataclass/actions.py:1105 +#: backend/iam_app/dataclass/actions.py:1117 +#: backend/iam_app/dataclass/actions.py:1124 +#: backend/iam_app/dataclass/actions.py:1137 +#: backend/iam_app/dataclass/actions.py:1144 +#: backend/iam_app/dataclass/actions.py:1157 +#: backend/iam_app/dataclass/actions.py:1169 +#: backend/iam_app/dataclass/actions.py:1181 +#: backend/iam_app/dataclass/actions.py:1188 +#: backend/iam_app/dataclass/actions.py:1201 +#: backend/iam_app/dataclass/actions.py:1213 +#: backend/iam_app/dataclass/actions.py:1225 +#: backend/iam_app/dataclass/actions.py:1233 +#: backend/iam_app/dataclass/actions.py:1246 +#: backend/iam_app/dataclass/actions.py:1258 +#: backend/iam_app/dataclass/actions.py:1270 +#: backend/iam_app/dataclass/actions.py:1282 +#: backend/iam_app/dataclass/actions.py:1294 +#: backend/iam_app/dataclass/actions.py:1306 +#: backend/iam_app/dataclass/actions.py:1387 +#: backend/iam_app/dataclass/actions.py:1399 +#: backend/iam_app/dataclass/actions.py:1410 +#: backend/iam_app/dataclass/actions.py:1492 backend/ticket/constants.py:233 +#: backend/ticket/constants.py:234 backend/ticket/constants.py:263 +#: backend/ticket/constants.py:281 backend/ticket/constants.py:282 +#: backend/ticket/constants.py:283 backend/ticket/constants.py:284 +#: backend/ticket/constants.py:285 backend/ticket/constants.py:286 +#: backend/ticket/constants.py:289 backend/ticket/constants.py:290 +#: backend/ticket/constants.py:291 backend/ticket/constants.py:292 +#: backend/ticket/constants.py:297 backend/ticket/constants.py:298 +#: backend/ticket/constants.py:299 backend/ticket/constants.py:333 +#: backend/ticket/constants.py:334 backend/ticket/constants.py:335 +#: backend/ticket/constants.py:336 backend/ticket/constants.py:339 +#: backend/ticket/constants.py:342 backend/ticket/constants.py:343 +#: backend/ticket/constants.py:344 backend/ticket/constants.py:345 +#: backend/ticket/constants.py:348 backend/ticket/constants.py:351 +#: backend/ticket/constants.py:352 backend/ticket/constants.py:353 +#: backend/ticket/constants.py:354 backend/ticket/constants.py:357 +#: backend/ticket/constants.py:360 backend/ticket/constants.py:361 +#: backend/ticket/constants.py:362 backend/ticket/constants.py:363 +#: backend/ticket/constants.py:366 backend/ticket/constants.py:377 +#: backend/ticket/constants.py:378 backend/ticket/constants.py:379 +#: backend/ticket/constants.py:380 backend/ticket/constants.py:383 +#: backend/ticket/constants.py:387 backend/ticket/constants.py:388 +#: backend/ticket/constants.py:389 backend/ticket/constants.py:392 +#: backend/ticket/constants.py:393 backend/ticket/constants.py:397 +#: backend/ticket/constants.py:408 backend/ticket/constants.py:410 +#: backend/ticket/constants.py:448 backend/ticket/constants.py:449 +#: backend/ticket/constants.py:450 backend/ticket/constants.py:451 +#: backend/ticket/constants.py:454 +msgid "集群管理" +msgstr "集群管理" + +#: backend/iam_app/dataclass/actions.py:274 +msgid "MySQL 集群详情查看" +msgstr "MySQL 集群详情查看" + +#: backend/iam_app/dataclass/actions.py:291 +#: backend/iam_app/dataclass/actions.py:642 backend/ticket/constants.py:169 +#: backend/ticket/constants.py:170 backend/ticket/constants.py:214 +#: backend/ticket/constants.py:218 backend/ticket/constants.py:219 +msgid "SQL 任务" +msgstr "SQL 任务" + +#: backend/iam_app/dataclass/actions.py:299 +#: backend/iam_app/dataclass/actions.py:359 +#: backend/iam_app/dataclass/actions.py:383 +#: backend/iam_app/dataclass/actions.py:395 +#: backend/iam_app/dataclass/actions.py:407 +#: backend/iam_app/dataclass/actions.py:419 +#: backend/iam_app/dataclass/actions.py:431 +#: backend/iam_app/dataclass/actions.py:438 +#: backend/iam_app/dataclass/actions.py:690 +#: backend/iam_app/dataclass/actions.py:702 +#: backend/iam_app/dataclass/actions.py:714 +#: backend/iam_app/dataclass/actions.py:726 +#: backend/iam_app/dataclass/actions.py:738 +#: backend/iam_app/dataclass/actions.py:748 +#: backend/iam_app/dataclass/actions.py:758 +#: backend/iam_app/dataclass/actions.py:770 +#: backend/iam_app/dataclass/actions.py:1317 +#: backend/iam_app/dataclass/actions.py:1328 +#: backend/iam_app/dataclass/actions.py:1340 +#: backend/iam_app/dataclass/actions.py:1352 +#: backend/iam_app/dataclass/actions.py:1364 +#: backend/iam_app/dataclass/actions.py:1376 +#: backend/iam_app/dataclass/actions.py:1421 +#: backend/iam_app/dataclass/actions.py:1432 +#: backend/iam_app/dataclass/actions.py:1444 +#: backend/iam_app/dataclass/actions.py:1456 +#: backend/iam_app/dataclass/actions.py:1468 +#: backend/iam_app/dataclass/actions.py:1480 backend/ticket/constants.py:180 +#: backend/ticket/constants.py:181 backend/ticket/constants.py:183 +#: backend/ticket/constants.py:239 backend/ticket/constants.py:240 +#: backend/ticket/constants.py:241 backend/ticket/constants.py:242 +#: backend/ticket/constants.py:276 backend/ticket/constants.py:277 +#: backend/ticket/constants.py:412 backend/ticket/constants.py:413 +msgid "权限管理" +msgstr "权限管理" + +#: backend/iam_app/dataclass/actions.py:307 +#: backend/iam_app/dataclass/actions.py:650 backend/ticket/constants.py:185 +#: backend/ticket/constants.py:187 backend/ticket/constants.py:194 +#: backend/ticket/constants.py:199 backend/ticket/constants.py:200 +#: backend/ticket/constants.py:209 backend/ticket/constants.py:215 +#: backend/ticket/constants.py:248 backend/ticket/constants.py:249 +#: backend/ticket/constants.py:262 backend/ticket/constants.py:273 +#: backend/ticket/constants.py:274 backend/ticket/constants.py:275 +#: backend/ticket/constants.py:399 +msgid "数据处理" +msgstr "数据处理" + +#: backend/iam_app/dataclass/actions.py:314 +msgid "MySQL Webconsole执行" +msgstr "MySQL Webconsole执行" + +#: backend/iam_app/dataclass/actions.py:330 +msgid "MySQL 临时密码修改" +msgstr "MySQL 临时密码修改" + +#: backend/iam_app/dataclass/actions.py:341 +msgid "MySQL 集群禁用和启用" +msgstr "MySQL 集群禁用和启用" + +#: backend/iam_app/dataclass/actions.py:353 backend/ticket/constants.py:182 +msgid "MySQL 客户端权限克隆" +msgstr "MySQL 客户端权限克隆" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:36 -msgid "HDFS集群替换旧机器不能为空" -msgstr "HDFS集群替换旧机器不能为空" +#: backend/iam_app/dataclass/actions.py:365 +msgid "MySQL 集群删除" +msgstr "MySQL 集群删除" + +#: backend/iam_app/dataclass/actions.py:377 +msgid "MySQL 账号创建" +msgstr "MySQL 账号创建" + +#: backend/iam_app/dataclass/actions.py:389 +msgid "MySQL 账号删除" +msgstr "MySQL 账号删除" + +#: backend/iam_app/dataclass/actions.py:401 +msgid "MySQL账号规则创建" +msgstr "MySQL账号规则创建" + +#: backend/iam_app/dataclass/actions.py:413 +msgid "MySQL 账号规则查看" +msgstr "MySQL 账号规则查看" + +#: backend/iam_app/dataclass/actions.py:425 +msgid "MySQL授权" +msgstr "MySQL授权" + +#: backend/iam_app/dataclass/actions.py:445 +msgid "MySQL 分区策略创建" +msgstr "MySQL 分区策略创建" + +#: backend/iam_app/dataclass/actions.py:457 +msgid "MySQL 分区策略更新" +msgstr "MySQL 分区策略更新" + +#: backend/iam_app/dataclass/actions.py:469 +msgid "MySQL 分区策略删除" +msgstr "MySQL 分区策略删除" + +#: backend/iam_app/dataclass/actions.py:481 +msgid "MySQL 分区策略禁用启用" +msgstr "MySQL 分区策略禁用启用" + +#: backend/iam_app/dataclass/actions.py:493 +#: backend/ticket/builders/mysql/mysql_openarea.py:73 +msgid "MySQL 开区执行" +msgstr "MySQL 开区执行" + +#: backend/iam_app/dataclass/actions.py:499 +#: backend/iam_app/dataclass/actions.py:511 +#: backend/iam_app/dataclass/actions.py:523 +#: backend/iam_app/dataclass/actions.py:535 +#: backend/iam_app/dataclass/actions.py:782 +#: backend/iam_app/dataclass/actions.py:794 +#: backend/iam_app/dataclass/actions.py:806 +#: backend/iam_app/dataclass/actions.py:818 backend/ticket/constants.py:198 +#: backend/ticket/constants.py:208 +msgid "克隆开区" +msgstr "克隆开区" + +#: backend/iam_app/dataclass/actions.py:505 +msgid "MySQL 开区模板创建" +msgstr "MySQL 开区模板创建" + +#: backend/iam_app/dataclass/actions.py:517 +msgid "MySQL 开区模板编辑" +msgstr "MySQL 开区模板编辑" + +#: backend/iam_app/dataclass/actions.py:529 +msgid "MySQL 开区模板删除" +msgstr "MySQL 开区模板删除" + +#: backend/iam_app/dataclass/actions.py:541 +msgid "Dumper 订阅规则详情查看" +msgstr "Dumper 订阅规则详情查看" + +#: backend/iam_app/dataclass/actions.py:547 +#: backend/iam_app/dataclass/actions.py:559 +#: backend/iam_app/dataclass/actions.py:571 +#: backend/iam_app/dataclass/actions.py:583 +#: backend/iam_app/dataclass/actions.py:595 +#: backend/iam_app/dataclass/actions.py:607 +#: backend/iam_app/dataclass/actions.py:619 +msgid "Dumper管理" +msgstr "Dumper管理" + +#: backend/iam_app/dataclass/actions.py:553 +msgid "Dumper 订阅规则编辑" +msgstr "Dumper 订阅规则编辑" + +#: backend/iam_app/dataclass/actions.py:565 +msgid "Dumper 订阅规则删除" +msgstr "Dumper 订阅规则删除" + +#: backend/iam_app/dataclass/actions.py:577 +msgid "Dumper 实例创建" +msgstr "Dumper 实例创建" + +#: backend/iam_app/dataclass/actions.py:589 +msgid "Dumper 实例禁用与启用" +msgstr "Dumper 实例禁用与启用" + +#: backend/iam_app/dataclass/actions.py:601 +msgid "Dumper 实例迁移" +msgstr "Dumper 实例迁移" + +#: backend/iam_app/dataclass/actions.py:613 +msgid "Dumper 实例删除" +msgstr "Dumper 实例删除" + +#: backend/iam_app/dataclass/actions.py:625 +msgid "TenDB Cluster 集群详情查看" +msgstr "TenDB Cluster 集群详情查看" + +#: backend/iam_app/dataclass/actions.py:657 +msgid "TendbCluster Webconsole执行" +msgstr "TendbCluster Webconsole执行" + +#: backend/iam_app/dataclass/actions.py:673 +msgid "TenDB Cluster 临时密码修改" +msgstr "TenDB Cluster 临时密码修改" + +#: backend/iam_app/dataclass/actions.py:684 +msgid "TenDB Cluster 账号创建" +msgstr "TenDB Cluster 账号创建" + +#: backend/iam_app/dataclass/actions.py:696 +msgid "TenDB Cluster 账号删除" +msgstr "TenDB Cluster 账号删除" + +#: backend/iam_app/dataclass/actions.py:708 +msgid "TenDB Cluster 账号规则创建" +msgstr "TenDB Cluster 账号规则创建" + +#: backend/iam_app/dataclass/actions.py:720 +msgid "TenDB Cluster 账号规则查看" +msgstr "TenDB Cluster 账号规则查看" + +#: backend/iam_app/dataclass/actions.py:732 backend/ticket/constants.py:241 +msgid "TenDB Cluster 授权" +msgstr "TenDB Cluster 授权" + +#: backend/iam_app/dataclass/actions.py:744 +msgid "TenDB Cluster Excel授权" +msgstr "TenDB Cluster Excel授权" + +#: backend/iam_app/dataclass/actions.py:754 backend/ticket/constants.py:239 +msgid "TenDB Cluster 客户端权限克隆" +msgstr "TenDB Cluster 客户端权限克隆" + +#: backend/iam_app/dataclass/actions.py:764 backend/ticket/constants.py:240 +msgid "TenDB Cluster DB实例权限克隆" +msgstr "TenDB Cluster DB实例权限克隆" + +#: backend/iam_app/dataclass/actions.py:776 +msgid "TenDB Cluster 开区执行" +msgstr "TenDB Cluster 开区执行" + +#: backend/iam_app/dataclass/actions.py:788 +msgid "TenDB Cluster 开区模板创建" +msgstr "TenDB Cluster 开区模板创建" + +#: backend/iam_app/dataclass/actions.py:800 +msgid "TenDB Cluster 开区模板编辑" +msgstr "TenDB Cluster 开区模板编辑" + +#: backend/iam_app/dataclass/actions.py:812 +msgid "TenDB Cluster 开区模板删除" +msgstr "TenDB Cluster 开区模板删除" + +#: backend/iam_app/dataclass/actions.py:824 +msgid "TenDB Cluster 分区管理创建" +msgstr "TenDB Cluster 分区管理创建" + +#: backend/iam_app/dataclass/actions.py:836 +msgid "TenDB Cluster 分区管理更新" +msgstr "TenDB Cluster 分区管理更新" + +#: backend/iam_app/dataclass/actions.py:848 +msgid "TenDB Cluster 分区管理删除" +msgstr "TenDB Cluster 分区管理删除" + +#: backend/iam_app/dataclass/actions.py:860 +msgid "TenDB Cluster 分区管理禁用启用" +msgstr "TenDB Cluster 分区管理禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:41 -msgid "HDFS替换新旧机器数量不一致" -msgstr "HDFS替换新旧机器数量不一致" +#: backend/iam_app/dataclass/actions.py:881 +msgid "TenDB Cluster 集群禁用启用" +msgstr "TenDB Cluster 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/exceptions.py:42 -#, python-brace-format -msgid "HDFS集群替换角色{hdfs_role}数量不一致" -msgstr "HDFS集群替换角色{hdfs_role}数量不一致" +#: backend/iam_app/dataclass/actions.py:894 +msgid "TenDB Cluster 下架只读接入层" +msgstr "TenDB Cluster 下架只读接入层" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:83 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:119 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:82 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:76 -msgid "下发hdfs介质包" -msgstr "下发hdfs介质包" +#: backend/iam_app/dataclass/actions.py:906 +msgid "Redis 集群详情查看" +msgstr "Redis 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:87 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:123 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:88 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:159 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:139 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:145 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:343 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:120 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:140 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:89 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:227 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:99 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:223 -msgid "初始化机器" -msgstr "初始化机器" +#: backend/iam_app/dataclass/actions.py:922 +msgid "Redis Webconsole执行" +msgstr "Redis Webconsole执行" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:92 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:127 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:93 -msgid "解压缩文件" -msgstr "解压缩文件" +#: backend/iam_app/dataclass/actions.py:938 +msgid "Redis 获取访问方式" +msgstr "Redis 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:97 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:131 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:98 -msgid "渲染集群配置" -msgstr "渲染集群配置" +#: backend/iam_app/dataclass/actions.py:959 +msgid "Redis 集群禁用启用" +msgstr "Redis 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:102 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:135 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:103 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:98 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:113 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:130 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:218 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:135 -msgid "安装supervisor" -msgstr "安装supervisor" +#: backend/iam_app/dataclass/actions.py:1007 backend/ticket/constants.py:350 +msgid "ES 集群部署" +msgstr "ES 集群部署" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:112 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:147 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:238 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:138 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:128 -msgid "安装zookeeper-{}" -msgstr "安装zookeeper-{}" +#: backend/iam_app/dataclass/actions.py:1012 +#: backend/iam_app/dataclass/actions.py:1024 +#: backend/iam_app/dataclass/actions.py:1036 +#: backend/iam_app/dataclass/actions.py:1048 +msgid "ES" +msgstr "ES" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:122 -msgid "安装JournalNode" -msgstr "安装JournalNode" +#: backend/iam_app/dataclass/actions.py:1019 +msgid "ES 集群详情查看" +msgstr "ES 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:130 -msgid "安装NN1" -msgstr "安装NN1" +#: backend/iam_app/dataclass/actions.py:1031 +msgid "ES 获取访问方式" +msgstr "ES 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:136 -msgid "安装NN2" -msgstr "安装NN2" +#: backend/iam_app/dataclass/actions.py:1043 +msgid "ES 集群禁用启用" +msgstr "ES 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:142 -msgid "安装ZKFC" -msgstr "安装ZKFC" +#: backend/iam_app/dataclass/actions.py:1063 +msgid "Doris 集群详情查看" +msgstr "Doris 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:150 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:168 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:138 -msgid "安装DataNode-{}" -msgstr "安装DataNode-{}" +#: backend/iam_app/dataclass/actions.py:1075 +msgid "Doris 获取访问方式" +msgstr "Doris 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:160 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:178 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:148 -msgid "安装HAProxy" -msgstr "安装HAProxy" +#: backend/iam_app/dataclass/actions.py:1087 +msgid "Doris 集群禁用启用" +msgstr "Doris 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:174 -msgid "插入haproxy实例信息" -msgstr "插入haproxy实例信息" +#: backend/iam_app/dataclass/actions.py:1099 +msgid "Kafka 集群详情查看" +msgstr "Kafka 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:194 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:195 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:210 -msgid "添加元数据到DBMeta" -msgstr "添加元数据到DBMeta" +#: backend/iam_app/dataclass/actions.py:1111 +msgid "Kafka 获取访问方式" +msgstr "Kafka 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:199 -msgid "回写集群部署配置" -msgstr "回写集群部署配置" +#: backend/iam_app/dataclass/actions.py:1131 +msgid "Kafka 集群禁用启用" +msgstr "Kafka 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:210 -msgid "NameNode主机数不为2" -msgstr "NameNode主机数不为2" +#: backend/iam_app/dataclass/actions.py:1151 +msgid "HDFS 集群详情查看" +msgstr "HDFS 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:214 -msgid "ZooKeeper主机数不为3" -msgstr "ZooKeeper主机数不为3" +#: backend/iam_app/dataclass/actions.py:1163 +msgid "HDFS 获取访问方式" +msgstr "HDFS 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:218 -msgid "DataNode主机数少于2" -msgstr "DataNode主机数少于2" +#: backend/iam_app/dataclass/actions.py:1175 +msgid "HDFS 集群禁用启用" +msgstr "HDFS 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_apply_flow.py:245 -msgid "复用NN主机 {} 作为ZK" -msgstr "复用NN主机 {} 作为ZK" +#: backend/iam_app/dataclass/actions.py:1195 +msgid "Pulsar 集群详情查看" +msgstr "Pulsar 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:65 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:61 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:63 -msgid "检查集群状态" -msgstr "检查集群状态" +#: backend/iam_app/dataclass/actions.py:1207 +msgid "Pulsar 获取访问方式" +msgstr "Pulsar 获取访问方式" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:75 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:71 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:73 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:65 -msgid "下发hdfs actuator" -msgstr "下发hdfs actuator" +#: backend/iam_app/dataclass/actions.py:1219 +msgid "Pulsar 集群禁用启用" +msgstr "Pulsar 集群禁用启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:84 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:261 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:156 -msgid "HDFS集群节点清理-{}" -msgstr "HDFS集群节点清理-{}" +#: backend/iam_app/dataclass/actions.py:1240 +msgid "Riak 集群详情查看" +msgstr "Riak 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_destroy_flow.py:99 -msgid "删除haproxy实例信息" -msgstr "删除haproxy实例信息" +#: backend/iam_app/dataclass/actions.py:1252 +msgid "Riak 获取访问方式" +msgstr "Riak 获取访问方式" + +#: backend/iam_app/dataclass/actions.py:1264 +msgid "Riak 集群禁用启用" +msgstr "Riak 集群禁用启用" + +#: backend/iam_app/dataclass/actions.py:1276 +msgid "Mongodb 集群详情查看" +msgstr "Mongodb 集群详情查看" + +#: backend/iam_app/dataclass/actions.py:1288 +msgid "MongoDB 部署" +msgstr "MongoDB 部署" + +#: backend/iam_app/dataclass/actions.py:1300 +msgid "MongoDB 集群禁用启用" +msgstr "MongoDB 集群禁用启用" + +#: backend/iam_app/dataclass/actions.py:1312 +msgid "MongoDB 账号创建" +msgstr "MongoDB 账号创建" + +#: backend/iam_app/dataclass/actions.py:1323 +msgid "MongoDB 删除账号" +msgstr "MongoDB 删除账号" + +#: backend/iam_app/dataclass/actions.py:1334 +msgid "MongoDB 账号规则创建" +msgstr "MongoDB 账号规则创建" + +#: backend/iam_app/dataclass/actions.py:1346 +msgid "MongoDB 账号规则查看" +msgstr "MongoDB 账号规则查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_disable_flow.py:80 -msgid "停止HDFS集群进程-{}" -msgstr "停止HDFS集群进程-{}" +#: backend/iam_app/dataclass/actions.py:1358 +msgid "MongoDB 集群授权" +msgstr "MongoDB 集群授权" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:83 -msgid "启动HDFS集群ZK-{}" -msgstr "启动HDFS集群ZK-{}" +#: backend/iam_app/dataclass/actions.py:1370 +msgid "MongoDB Excel集群授权" +msgstr "MongoDB Excel集群授权" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:97 -msgid "启动HDFS集群JN-{}" -msgstr "启动HDFS集群JN-{}" +#: backend/iam_app/dataclass/actions.py:1382 +msgid "SQLServer 集群详情查看" +msgstr "SQLServer 集群详情查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:112 -msgid "启动HDFS集群NN-{}" -msgstr "启动HDFS集群NN-{}" +#: backend/iam_app/dataclass/actions.py:1393 +msgid "SQLServer 临时密码修改" +msgstr "SQLServer 临时密码修改" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:121 -msgid "启动HDFS集群ZKFC-{}" -msgstr "启动HDFS集群ZKFC-{}" +#: backend/iam_app/dataclass/actions.py:1404 +msgid "SQLServer 部署" +msgstr "SQLServer 部署" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:125 -msgid "启动HDFS集群NN服务-{}子流程" -msgstr "启动HDFS集群NN服务-{}子流程" +#: backend/iam_app/dataclass/actions.py:1416 +msgid "SQLServer 账号创建" +msgstr "SQLServer 账号创建" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_enable_flow.py:135 -msgid "启动HDFS集群DN-{}" -msgstr "启动HDFS集群DN-{}" +#: backend/iam_app/dataclass/actions.py:1427 +msgid "SQLServer 删除账号" +msgstr "SQLServer 删除账号" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_reboot_flow.py:76 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:76 -msgid "重启实例-{}-{}" -msgstr "重启实例-{}-{}" +#: backend/iam_app/dataclass/actions.py:1438 +msgid "SQLServer 账号规则创建" +msgstr "SQLServer 账号规则创建" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:77 -msgid "集群DN替换-扩容DN" -msgstr "集群DN替换-扩容DN" +#: backend/iam_app/dataclass/actions.py:1450 +msgid "SQLServer 账号规则查看" +msgstr "SQLServer 账号规则查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:80 -msgid "集群DN替换-缩容DN" -msgstr "集群DN替换-缩容DN" +#: backend/iam_app/dataclass/actions.py:1462 backend/ticket/constants.py:276 +msgid "SQLServer 集群授权" +msgstr "SQLServer 集群授权" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:99 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:145 -msgid "更新haproxy实例信息" -msgstr "更新haproxy实例信息" +#: backend/iam_app/dataclass/actions.py:1474 +msgid "SQLServer Excel授权" +msgstr "SQLServer Excel授权" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:115 -msgid "添加DN获取机器信息" -msgstr "添加DN获取机器信息" +#: backend/iam_app/dataclass/actions.py:1486 +msgid "SQLServer 集群禁用和启用" +msgstr "SQLServer 集群禁用和启用" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:143 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:112 -msgid "更新主机映射" -msgstr "更新主机映射" +#: backend/iam_app/dataclass/actions.py:1498 +msgid "资源池管理" +msgstr "资源池管理" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:151 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:121 -msgid "include增加数据节点" -msgstr "include增加数据节点" +#: backend/iam_app/dataclass/actions.py:1510 +msgid "资源池操作记录查看" +msgstr "资源池操作记录查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:159 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:217 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:239 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:252 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:129 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:90 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:112 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:125 -msgid "刷新节点配置" -msgstr "刷新节点配置" +#: backend/iam_app/dataclass/actions.py:1522 +msgid "污点池管理" +msgstr "污点池管理" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:190 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:161 -msgid "添加新DN到域名" -msgstr "添加新DN到域名" +#: backend/iam_app/dataclass/actions.py:1534 +msgid "健康报告查看" +msgstr "健康报告查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:209 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:82 -msgid "添加数据节点到exclude" -msgstr "添加数据节点到exclude" +#: backend/iam_app/dataclass/actions.py:1539 +#: backend/iam_app/dataclass/actions.py:1550 +msgid "可观测" +msgstr "可观测" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:223 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:96 -msgid "检查节点退役信息" -msgstr "检查节点退役信息" +#: backend/iam_app/dataclass/actions.py:1545 +msgid "DBHA切换事件查看" +msgstr "DBHA切换事件查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:231 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:104 -msgid "include剔除数据节点" -msgstr "include剔除数据节点" +#: backend/iam_app/dataclass/actions.py:1556 +msgid "告警组查看" +msgstr "告警组查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:244 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:117 -msgid "exclude剔除数据节点" -msgstr "exclude剔除数据节点" +#: backend/iam_app/dataclass/actions.py:1568 +msgid "告警组新建" +msgstr "告警组新建" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:276 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:172 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:163 -msgid "更新域名" -msgstr "更新域名" +#: backend/iam_app/dataclass/actions.py:1580 +msgid "告警组编辑" +msgstr "告警组编辑" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:283 -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_shrink_flow.py:179 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:231 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:108 -msgid "DBMeta删除下架IP" -msgstr "DBMeta删除下架IP" +#: backend/iam_app/dataclass/actions.py:1592 +msgid "告警组删除" +msgstr "告警组删除" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:349 -msgid "没有需要替换的角色IP" -msgstr "没有需要替换的角色IP" +#: backend/iam_app/dataclass/actions.py:1604 +msgid "全局告警组编辑" +msgstr "全局告警组编辑" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_replace_flow.py:355 -msgid "替换HDFS DataNode角色IP不一致" -msgstr "替换HDFS DataNode角色IP不一致" +#: backend/iam_app/dataclass/actions.py:1616 +msgid "监控策略查看" +msgstr "监控策略查看" -#: backend/flow/engine/bamboo/scene/hdfs/hdfs_scale_up_flow.py:167 -msgid "元数据DBMeta更新及转移主机" -msgstr "元数据DBMeta更新及转移主机" +#: backend/iam_app/dataclass/actions.py:1628 +msgid "全局监控策略查看" +msgstr "全局监控策略查看" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:74 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:79 -msgid "下发influxdb介质" -msgstr "下发influxdb介质" +#: backend/iam_app/dataclass/actions.py:1640 +msgid "监控策略编辑" +msgstr "监控策略编辑" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:80 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:87 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:114 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:202 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:119 -msgid "初始化节点" -msgstr "初始化节点" +#: backend/iam_app/dataclass/actions.py:1652 +msgid "全局监控策略编辑" +msgstr "全局监控策略编辑" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:88 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:103 -msgid "解压influxdb包" -msgstr "解压influxdb包" +#: backend/iam_app/dataclass/actions.py:1664 +msgid "监控策略删除" +msgstr "监控策略删除" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:113 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:130 -msgid "安装influxdb-{}" -msgstr "安装influxdb-{}" +#: backend/iam_app/dataclass/actions.py:1676 +msgid "监控策略启停" +msgstr "监控策略启停" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:130 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:146 -msgid "{}-初始化User" -msgstr "{}-初始化User" +#: backend/iam_app/dataclass/actions.py:1688 +msgid "全局监控策略启停" +msgstr "全局监控策略启停" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:146 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:162 -msgid "安装telegraf-{}" -msgstr "安装telegraf-{}" +#: backend/iam_app/dataclass/actions.py:1700 +msgid "监控策略克隆" +msgstr "监控策略克隆" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:154 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:196 -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:223 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:418 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:169 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:214 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:290 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:181 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:120 -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:125 -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:162 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:348 -#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:91 -msgid "更新DBMeta元信息" -msgstr "更新DBMeta元信息" +#: backend/iam_app/dataclass/actions.py:1712 +msgid "全局数据库配置查看" +msgstr "全局数据库配置查看" + +#: backend/iam_app/dataclass/actions.py:1724 +msgid "DBA人员设置" +msgstr "DBA人员设置" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_apply_flow.py:158 -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:200 -msgid "回写influxdb集群配置" -msgstr "回写influxdb集群配置" +#: backend/iam_app/dataclass/actions.py:1735 +msgid "全局DBA人员设置" +msgstr "全局DBA人员设置" + +#: backend/iam_app/dataclass/actions.py:1747 +msgid "版本文件查看" +msgstr "版本文件查看" + +#: backend/iam_app/dataclass/actions.py:1753 +#: backend/iam_app/dataclass/actions.py:1765 +msgid "版本文件" +msgstr "版本文件" + +#: backend/iam_app/dataclass/actions.py:1759 +msgid "版本文件管理" +msgstr "版本文件管理" + +#: backend/iam_app/dataclass/actions.py:1771 +msgid "密码安全规则设置" +msgstr "密码安全规则设置" + +#: backend/iam_app/dataclass/actions.py:1783 +msgid "资源规格新建" +msgstr "资源规格新建" + +#: backend/iam_app/dataclass/actions.py:1789 +#: backend/iam_app/dataclass/actions.py:1801 +#: backend/iam_app/dataclass/actions.py:1813 +#: backend/ticket/builders/influxdb/influxdb_apply.py:42 +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:33 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:38 +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:37 +#: backend/ticket/builders/mysql/mysql_add_slave.py:29 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:29 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:36 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:28 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:37 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:37 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:34 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:30 +msgid "资源规格" +msgstr "资源规格" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_destroy_flow.py:68 -msgid "清理Influxdb {}子流程" -msgstr "清理Influxdb {}子流程" +#: backend/iam_app/dataclass/actions.py:1795 +msgid "资源规格编辑" +msgstr "资源规格编辑" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_disable_flow.py:68 -msgid "禁用Influxdb {}子流程" -msgstr "禁用Influxdb {}子流程" +#: backend/iam_app/dataclass/actions.py:1807 +msgid "资源规格删除" +msgstr "资源规格删除" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_enable_flow.py:68 -msgid "启用Influxdb {}子流程" -msgstr "启用Influxdb {}子流程" +#: backend/iam_app/dataclass/actions.py:1819 +msgid "轮值策略查看" +msgstr "轮值策略查看" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:167 -msgid "安装Influxdb {}子流程" -msgstr "安装Influxdb {}子流程" +#: backend/iam_app/dataclass/actions.py:1825 +#: backend/iam_app/dataclass/actions.py:1837 +#: backend/iam_app/dataclass/actions.py:1849 +#: backend/iam_app/dataclass/actions.py:1861 +#: backend/iam_app/dataclass/actions.py:1897 +msgid "轮值策略" +msgstr "轮值策略" -#: backend/flow/engine/bamboo/scene/influxdb/influxdb_replace_flow.py:191 -msgid "下架Influxdb {}子流程" -msgstr "下架Influxdb {}子流程" +#: backend/iam_app/dataclass/actions.py:1831 +msgid "轮值策略新增" +msgstr "轮值策略新增" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:108 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:196 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:112 -msgid "下发kafka介质" -msgstr "下发kafka介质" +#: backend/iam_app/dataclass/actions.py:1843 +msgid "轮值策略编辑" +msgstr "轮值策略编辑" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:122 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:210 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:127 -msgid "解压kafka包" -msgstr "解压kafka包" +#: backend/iam_app/dataclass/actions.py:1855 +msgid "轮值策略删除" +msgstr "轮值策略删除" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:158 -msgid "初始化系统kafkaUser" -msgstr "初始化系统kafkaUser" +#: backend/iam_app/dataclass/actions.py:1867 +msgid "授权白名单管理" +msgstr "授权白名单管理" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:165 -msgid "初始化kafkaUser" -msgstr "初始化kafkaUser" +#: backend/iam_app/dataclass/actions.py:1879 +msgid "全局授权白名单管理" +msgstr "全局授权白名单管理" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:179 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:315 -#: backend/flow/engine/bamboo/scene/kafka/kafka_scale_up_flow.py:149 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:256 -msgid "安装broker-{}" -msgstr "安装broker-{}" +#: backend/iam_app/dataclass/actions.py:1903 +msgid "集群入口配置修改" +msgstr "集群入口配置修改" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:192 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:338 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:194 -msgid "安装kafka manager" -msgstr "安装kafka manager" +#: backend/iam_app/dataclass/actions.py:1913 +msgid "临时密码生效实例查看" +msgstr "临时密码生效实例查看" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:205 -msgid "插入manager实例信息" -msgstr "插入manager实例信息" +#: backend/iam_app/dataclass/actions.py:1926 +msgid "动作ID不存在: {}" +msgstr "动作ID不存在: {}" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:217 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:145 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:176 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:114 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:164 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:332 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:335 -msgid "添加集群域名" -msgstr "添加集群域名" +#: backend/iam_app/dataclass/resources.py:208 +msgid "单据分类" +msgstr "单据分类" -#: backend/flow/engine/bamboo/scene/kafka/kafka_apply_flow.py:227 -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:301 -msgid "回写kafka集群配置" -msgstr "回写kafka集群配置" +#: backend/iam_app/dataclass/resources.py:215 +#: backend/iam_app/views/ticket_group_provider.py:29 +#: backend/iam_app/views/ticket_group_provider.py:34 +msgid "其他" +msgstr "其他" -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:78 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:174 -msgid "清理Kafka {}子流程" -msgstr "清理Kafka {}子流程" +#: backend/iam_app/dataclass/resources.py:225 +msgid "任务流程" +msgstr "任务流程" -#: backend/flow/engine/bamboo/scene/kafka/kafka_destroy_flow.py:88 -msgid "删除manager实例信息" -msgstr "删除manager实例信息" +#: backend/iam_app/dataclass/resources.py:346 +msgid "MySQL集群" +msgstr "MySQL集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_disable_flow.py:72 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:157 -msgid "禁用Kafka {}子流程" -msgstr "禁用Kafka {}子流程" +#: backend/iam_app/dataclass/resources.py:362 +msgid "Redis集群" +msgstr "Redis集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_enable_flow.py:72 -msgid "启用Kafka {}子流程" -msgstr "启用Kafka {}子流程" +#: backend/iam_app/dataclass/resources.py:378 +msgid "DORIS集群" +msgstr "DORIS集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:249 -msgid "增加zookeeper节点" -msgstr "增加zookeeper节点" +#: backend/iam_app/dataclass/resources.py:394 +msgid "HDFS集群" +msgstr "HDFS集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:259 -#, python-brace-format -msgid "滚动重启broker节点-{ip}" -msgstr "滚动重启broker节点-{ip}" +#: backend/iam_app/dataclass/resources.py:418 +msgid "Mongodb集群" +msgstr "Mongodb集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:270 -msgid "移除zookeeper节点" -msgstr "移除zookeeper节点" +#: backend/iam_app/dataclass/resources.py:426 +msgid "SQLServer集群" +msgstr "SQLServer集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:297 -msgid "下架zookeeper-{}子流程" -msgstr "下架zookeeper-{}子流程" +#: backend/iam_app/dataclass/resources.py:458 +msgid "InfluxDB实例" +msgstr "InfluxDB实例" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:351 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:207 -msgid "更新manager实例信息" -msgstr "更新manager实例信息" +#: backend/iam_app/dataclass/resources.py:510 +msgid "MySQL 账号" +msgstr "MySQL 账号" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:364 -msgid "更新集群域名" -msgstr "更新集群域名" +#: backend/iam_app/dataclass/resources.py:518 +msgid "SQLServer 账号" +msgstr "SQLServer 账号" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:377 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:114 -msgid "Kafka搬迁数据" -msgstr "Kafka搬迁数据" +#: backend/iam_app/dataclass/resources.py:526 +msgid "MongoDB 账号" +msgstr "MongoDB 账号" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:387 -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:124 -msgid "Kafka检查搬迁进度" -msgstr "Kafka检查搬迁进度" +#: backend/iam_app/dataclass/resources.py:534 +msgid "TendbCluster 账号" +msgstr "TendbCluster 账号" -#: backend/flow/engine/bamboo/scene/kafka/kafka_replace_flow.py:414 -msgid "下架broker-{}子流程" -msgstr "下架broker-{}子流程" +#: backend/iam_app/dataclass/resources.py:542 +msgid "VM集群" +msgstr "VM集群" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:104 -msgid "下发dbacuator" -msgstr "下发dbacuator" +#: backend/iam_app/dataclass/resources.py:601 +msgid "全局监控策略" +msgstr "全局监控策略" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:137 -msgid "删除broker的域名记录" -msgstr "删除broker的域名记录" +#: backend/iam_app/dataclass/resources.py:655 +msgid "全局告警组" +msgstr "全局告警组" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:144 -msgid "停止进程" -msgstr "停止进程" +#: backend/iam_app/dataclass/resources.py:676 +msgid "开区模板" +msgstr "开区模板" -#: backend/flow/engine/bamboo/scene/kafka/kafka_shrink_flow.py:162 -msgid "清理数据" -msgstr "清理数据" +#: backend/iam_app/dataclass/resources.py:699 +msgid "数据订阅规则" +msgstr "数据订阅规则" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:61 -msgid "执行ip信息为空" -msgstr "执行ip信息为空" +#: backend/iam_app/dataclass/resources.py:755 +msgid "资源类型ID不存在: {}" +msgstr "资源类型ID不存在: {}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:69 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:366 -msgid "下发MySQL周边程序介质" -msgstr "下发MySQL周边程序介质" +#: backend/iam_app/exceptions.py:51 +#, python-brace-format +msgid "当前用户无 [{action_name}] 权限" +msgstr "当前用户无 [{action_name}] 权限" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:86 -msgid "Master[{}]安装备份程序" -msgstr "Master[{}]安装备份程序" +#: backend/iam_app/handlers/drf_perm/account.py:41 +msgid "账号动作:{} 不存在/未实现" +msgstr "账号动作:{} 不存在/未实现" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:99 -msgid "Master[{}]安装rotate_binlog程序" -msgstr "Master[{}]安装rotate_binlog程序" +#: backend/iam_app/handlers/drf_perm/monitor.py:49 +msgid "不合法的告警组任务ID:{}" +msgstr "不合法的告警组任务ID:{}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:112 -msgid "Master[{}]安装mysql-monitor" -msgstr "Master[{}]安装mysql-monitor" +#: backend/iam_app/handlers/drf_perm/monitor.py:71 +msgid "未找到策略ID,无法决定告警组相关动作鉴权。请保证参数包含策略ID" +msgstr "未找到策略ID,无法决定告警组相关动作鉴权。请保证参数包含策略ID" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:131 -msgid "Master[{}]安装校验程序" -msgstr "Master[{}]安装校验程序" +#: backend/iam_app/handlers/drf_perm/openarea.py:49 +msgid "{}没有找到相关动作鉴权" +msgstr "{}没有找到相关动作鉴权" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:148 -msgid "Master[{}]安装DBATools工具箱" -msgstr "Master[{}]安装DBATools工具箱" +#: backend/iam_app/handlers/drf_perm/proxypass.py:39 +msgid "db_cloud_token:{}解密失败,请检查token是否合法" +msgstr "db_cloud_token:{}解密失败,请检查token是否合法" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:167 -msgid "Slave[{}]安装备份程序" -msgstr "Slave[{}]安装备份程序" +#: backend/iam_app/handlers/drf_perm/proxypass.py:44 +msgid "解析的云区域(ID:{})与请求参数的云区域(ID:{})不相同,请检查token是否合法" +msgstr "解析的云区域(ID:{})与请求参数的云区域(ID:{})不相同,请检查token是否合法" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:180 -msgid "Slave[{}]安装rotate_binlog程序" -msgstr "Slave[{}]安装rotate_binlog程序" +#: backend/iam_app/handlers/drf_perm/storage.py:47 +msgid "不允许同时操作业务临时文件和介质文件" +msgstr "不允许同时操作业务临时文件和介质文件" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:193 -msgid "Slave[{}]安装mysql-monitor" -msgstr "Slave[{}]安装mysql-monitor" +#: backend/iam_app/handlers/drf_perm/storage.py:62 +msgid "文件操作路径{}不合法,请联系管理员" +msgstr "文件操作路径{}不合法,请联系管理员" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:212 -msgid "Slave[{}]安装校验程序" -msgstr "Slave[{}]安装校验程序" +#: backend/iam_app/handlers/drf_perm/ticket.py:147 +msgid "单据动作ID:{} 不存在" +msgstr "单据动作ID:{} 不存在" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:229 -msgid "Slave[{}]安装DBATools工具箱" -msgstr "Slave[{}]安装DBATools工具箱" +#: backend/iam_app/handlers/drf_perm/ticket.py:172 +msgid "{}不在处理人:{}中, 无权进行审批操作" +msgstr "{}不在处理人:{}中, 无权进行审批操作" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:247 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:260 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:291 -msgid "Proxy安装mysql-monitor" -msgstr "Proxy安装mysql-monitor" +#: backend/iam_app/handlers/permission.py:82 +#, python-brace-format +msgid "获取系统信息错误:{message}" +msgstr "获取系统信息错误:{message}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:262 -msgid "安装MySql周边程序" -msgstr "安装MySql周边程序" +#: backend/iam_app/handlers/permission.py:663 +msgid "填充权限字段失败:{}" +msgstr "填充权限字段失败:{}" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:297 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:219 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:450 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:400 -msgid "新增repl帐户" -msgstr "新增repl帐户" +#: backend/iam_app/serializers.py:24 backend/iam_app/serializers.py:33 +msgid "资源ID" +msgstr "资源ID" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:312 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:228 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:149 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:465 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:415 -msgid "建立主从关系" -msgstr "建立主从关系" +#: backend/iam_app/serializers.py:26 +msgid "动作ID列表" +msgstr "动作ID列表" -#: backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py:324 -msgid "建立主从同步[{}]" -msgstr "建立主从同步[{}]" +#: backend/iam_app/serializers.py:32 +msgid "动作ID" +msgstr "动作ID" -#: backend/flow/engine/bamboo/scene/mysql/common/exceptions.py:17 -msgid "Flow模块TenDB 异常" -msgstr "Flow模块TenDB 异常" +#: backend/iam_app/serializers.py:34 +msgid "是否抛出异常" +msgstr "是否抛出异常" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:77 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:110 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:97 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:73 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:180 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:178 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:191 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:334 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:96 -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:88 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:79 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:117 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:88 -msgid "下发db-actuator介质" -msgstr "下发db-actuator介质" +#: backend/iam_app/serializers.py:41 +msgid "仅支持业务下一个动作关联一种类型的资源" +msgstr "仅支持业务下一个动作关联一种类型的资源" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:90 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:92 -msgid "下发SQL文件" -msgstr "下发SQL文件" +#: backend/iam_app/views/cluster_provider.py:95 +#: backend/iam_app/views/cluster_provider.py:148 +msgid "单节点" +msgstr "单节点" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:108 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:110 -msgid "执行SQL导入" -msgstr "执行SQL导入" +#: backend/iam_app/views/cluster_provider.py:95 +#: backend/iam_app/views/cluster_provider.py:148 +msgid "高可用" +msgstr "高可用" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:119 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:121 -msgid "[{}]执行SQL变更" -msgstr "[{}]执行SQL变更" +#: backend/iam_app/views/cluster_provider.py:139 +msgid "副本集" +msgstr "副本集" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:143 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:139 -msgid "给模板集群下发db-actuator" -msgstr "给模板集群下发db-actuator" +#: backend/iam_app/views/cluster_provider.py:139 +msgid "分片集" +msgstr "分片集" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:155 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:151 -msgid "备份测试库表结构" -msgstr "备份测试库表结构" +#: backend/iam_app/views/views.py:35 +msgid "获取系统权限中心信息" +msgstr "获取系统权限中心信息" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:168 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:164 -msgid "对SQL文件进行语义测试" -msgstr "对SQL文件进行语义测试" +#: backend/iam_app/views/views.py:42 +msgid "检查当前用户对该动作是否有权限" +msgstr "检查当前用户对该动作是否有权限" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:186 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:182 -msgid "创建SQL执行单据" -msgstr "创建SQL执行单据" +#: backend/iam_app/views/views.py:62 +msgid "" +"检查当前用户对该动作是否有权限(仅适用于鉴权业务下一个动作对应一种资源类型,如" +"果是多种动作对应多种资源类型,请切换为check_allowed接口)" +msgstr "检查当前用户对该动作是否有权限(仅适用于鉴权业务下一个动作对应一种资源类型,如果是多种动作对应多种资源类型,请切换为check_allowed接口)" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:198 -msgid "查询不到可执行的实例!!!" -msgstr "查询不到可执行的实例!!!" +#: backend/iam_app/views/views.py:74 +msgid "获取权限申请数据" +msgstr "获取权限申请数据" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:251 -msgid "获取字符集为空..." -msgstr "获取字符集为空..." +#: backend/iam_app/views/views.py:89 +msgid "" +"单个获取权限申请数据(仅适用于鉴权业务下一个动作对应一种资源类型,如果是多种动" +"作对应多种资源类型,请切换为get_apply_data接口)" +msgstr "单个获取权限申请数据(仅适用于鉴权业务下一个动作对应一种资源类型,如果是多种动作对应多种资源类型,请切换为get_apply_data接口)" -#: backend/flow/engine/bamboo/scene/mysql/import_sqlfile_flow.py:252 -msgid "获取字符集为空" -msgstr "获取字符集为空" +#: backend/ticket/builders/__init__.py:145 +#, python-brace-format +msgid "{creator}提交了{title}的单据,请查看详情后进行审批" +msgstr "{creator}提交了{title}的单据,请查看详情后进行审批" -#: backend/flow/engine/bamboo/scene/mysql/mysql_authorize_rules.py:42 -msgid "添加mysql规则授权" -msgstr "添加mysql规则授权" +#: backend/ticket/builders/__init__.py:150 +msgid "单据链接" +msgstr "单据链接" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:119 -msgid "检查元数据信息是否存在主备关系" -msgstr "检查元数据信息是否存在主备关系" +#: backend/ticket/builders/__init__.py:155 +msgid "需求信息" +msgstr "需求信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:133 -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:140 -#: backend/ticket/constants.py:321 -msgid "定时" -msgstr "定时" +#: backend/ticket/builders/__init__.py:355 +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:88 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:192 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:126 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +#: backend/ticket/constants.py:461 backend/ticket/constants.py:498 +msgid "单据审批" +msgstr "单据审批" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:142 -msgid "创建临时用户" -msgstr "创建临时用户" +#: backend/ticket/builders/cloud/dbha_add.py:28 +msgid "新DBHA-GM机器的部署信息" +msgstr "新DBHA-GM机器的部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:149 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:102 -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:119 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:173 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:171 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:139 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:172 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:262 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:317 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:155 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:226 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:273 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:258 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:90 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:270 -msgid "下发actuator介质" -msgstr "下发actuator介质" +#: backend/ticket/builders/cloud/dbha_add.py:29 +msgid "新DBHA-AGENT机器的部署信息" +msgstr "新DBHA-AGENT机器的部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:161 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:174 -msgid "actuator执行checksum" -msgstr "actuator执行checksum" +#: backend/ticket/builders/cloud/dbha_add.py:45 +msgid "DBHA 服务新增" +msgstr "DBHA 服务新增" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:183 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:196 -msgid "删除临时用户" -msgstr "删除临时用户" +#: backend/ticket/builders/cloud/dbha_reduce.py:31 +msgid "裁撤的DBHA-GM列表" +msgstr "裁撤的DBHA-GM列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:202 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:215 -msgid "生成校验报告" -msgstr "生成校验报告" +#: backend/ticket/builders/cloud/dbha_reduce.py:34 +msgid "裁撤的DBHA-AGENT列表" +msgstr "裁撤的DBHA-AGENT列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:208 -msgid "master[{}{}{}],slave[{}{}{}]的校验结果" -msgstr "master[{}{}{}],slave[{}{}{}]的校验结果" +#: backend/ticket/builders/cloud/dbha_reduce.py:43 +msgid "请至少保证一个agent/gm存活" +msgstr "请至少保证一个agent/gm存活" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:221 -msgid "master[{}{}{}]的校验任务" -msgstr "master[{}{}{}]的校验任务" +#: backend/ticket/builders/cloud/dbha_reduce.py:60 +msgid "DBHA 服务裁撤" +msgstr "DBHA 服务裁撤" -#: backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py:227 -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:247 -msgid "构建checksum流程成功" -msgstr "构建checksum流程成功" +#: backend/ticket/builders/cloud/dbha_reload.py:28 +msgid "重装的GM ID列表" +msgstr "重装的GM ID列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_clone_rules.py:42 -msgid "添加mysql权限克隆" -msgstr "添加mysql权限克隆" +#: backend/ticket/builders/cloud/dbha_reload.py:29 +msgid "重装的AGENT ID列表" +msgstr "重装的AGENT ID列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:58 -msgid "下发db-actor到集群主从节点{}" -msgstr "下发db-actor到集群主从节点{}" +#: backend/ticket/builders/cloud/dbha_reload.py:45 +msgid "DBHA 服务重装" +msgstr "DBHA 服务重装" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:72 -msgid "修改mysql实例配置{}" -msgstr "修改mysql实例配置{}" +#: backend/ticket/builders/cloud/dbha_replace.py:29 +msgid "被替换旧DBHA-GM服务ID" +msgstr "被替换旧DBHA-GM服务ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_edit_config_flow.py:87 -msgid "开始修改mysql配置" -msgstr "开始修改mysql配置" +#: backend/ticket/builders/cloud/dbha_replace.py:30 +msgid "替换后的新的DBHA-GM服务信息" +msgstr "替换后的新的DBHA-GM服务信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:42 -msgid "串行1" -msgstr "串行1" +#: backend/ticket/builders/cloud/dbha_replace.py:32 +msgid "被替换旧DBHA-AGENT服务ID" +msgstr "被替换旧DBHA-AGENT服务ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:43 -msgid "串行2" -msgstr "串行2" +#: backend/ticket/builders/cloud/dbha_replace.py:33 +msgid "替换后的新的DBHA-AGENT服务信息" +msgstr "替换后的新的DBHA-AGENT服务信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:44 -msgid "串行3" -msgstr "串行3" +#: backend/ticket/builders/cloud/dbha_replace.py:37 +msgid "不允许同时对agent和gm进行替换" +msgstr "不允许同时对agent和gm进行替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:48 -msgid "并行1" -msgstr "并行1" +#: backend/ticket/builders/cloud/dbha_replace.py:61 +msgid "DBHA 服务替换" +msgstr "DBHA 服务替换" + +#: backend/ticket/builders/cloud/dns_add.py:28 +msgid "新DNS机器的部署信息" +msgstr "新DNS机器的部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:53 -msgid "并行2" -msgstr "并行2" +#: backend/ticket/builders/cloud/dns_add.py:42 +#: backend/ticket/builders/cloud/drs_add.py:42 +msgid "DNS 服务新增" +msgstr "DNS 服务新增" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:58 -msgid "错误并行3" -msgstr "错误并行3" +#: backend/ticket/builders/cloud/dns_reduce.py:29 +msgid "裁撤的DNS列表" +msgstr "裁撤的DNS列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_fake_sql_semantic_check.py:65 -msgid "串行结束" -msgstr "串行结束" +#: backend/ticket/builders/cloud/dns_reduce.py:35 +msgid "请至少保证一个dns服务存活" +msgstr "请至少保证一个dns服务存活" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:58 -msgid "下发db-actor到集群主节点{}" -msgstr "下发db-actor到集群主节点{}" +#: backend/ticket/builders/cloud/dns_reduce.py:51 +msgid "DNS 服务裁撤" +msgstr "DNS 服务裁撤" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:70 -msgid "flashback启动恢复数据中{}" -msgstr "flashback启动恢复数据中{}" +#: backend/ticket/builders/cloud/dns_reload.py:28 +msgid "重装的DNSID列表" +msgstr "重装的DNSID列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_flashback_flow.py:81 -msgid "flash开始恢复数据" -msgstr "flash开始恢复数据" +#: backend/ticket/builders/cloud/dns_reload.py:42 +msgid "DNS 服务重装" +msgstr "DNS 服务重装" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:118 -msgid "空闲检查" -msgstr "空闲检查" +#: backend/ticket/builders/cloud/dns_replace.py:28 +msgid "被替换旧DNS服务ID" +msgstr "被替换旧DNS服务ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:129 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:189 -msgid "下发MySQL介质包" -msgstr "下发MySQL介质包" +#: backend/ticket/builders/cloud/dns_replace.py:29 +msgid "替换后的新的DNS服务信息" +msgstr "替换后的新的DNS服务信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:142 -msgid "下发Proxy介质包" -msgstr "下发Proxy介质包" +#: backend/ticket/builders/cloud/dns_replace.py:43 +msgid "DNS 服务替换" +msgstr "DNS 服务替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:170 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:141 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:145 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:152 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:597 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:350 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:127 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:98 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:236 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:110 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:234 -msgid "部署mysql-crond" -msgstr "部署mysql-crond" +#: backend/ticket/builders/cloud/drs_add.py:28 +msgid "新drs机器的部署信息" +msgstr "新drs机器的部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:184 -msgid "安装proxy实例" -msgstr "安装proxy实例" +#: backend/ticket/builders/cloud/drs_reduce.py:29 +msgid "裁撤的drs列表" +msgstr "裁撤的drs列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:194 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:357 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:134 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:248 -msgid "安装MySQL实例" -msgstr "安装MySQL实例" +#: backend/ticket/builders/cloud/drs_reduce.py:35 +msgid "请至少保证一个drs服务存活" +msgstr "请至少保证一个drs服务存活" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:239 -msgid "proxy配置后端实例" -msgstr "proxy配置后端实例" +#: backend/ticket/builders/cloud/drs_reduce.py:51 +msgid "DRS 服务裁撤" +msgstr "DRS 服务裁撤" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:249 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:98 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:93 -msgid "添加主集群域名" -msgstr "添加主集群域名" +#: backend/ticket/builders/cloud/drs_reload.py:28 +msgid "重装的drsID列表" +msgstr "重装的drsID列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:261 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:117 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:112 -msgid "添加从集群域名" -msgstr "添加从集群域名" +#: backend/ticket/builders/cloud/drs_reload.py:42 +msgid "DRS 服务重装" +msgstr "DRS 服务重装" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:276 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:383 -msgid "{}集群部署" -msgstr "{}集群部署" +#: backend/ticket/builders/cloud/drs_replace.py:28 +msgid "被替换旧DRS服务ID" +msgstr "被替换旧DRS服务ID" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_apply_flow.py:315 -msgid "部署MySQL高可用集群" -msgstr "部署MySQL高可用集群" +#: backend/ticket/builders/cloud/drs_replace.py:29 +msgid "替换后的新的DRS服务信息" +msgstr "替换后的新的DRS服务信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:97 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:83 -msgid "{} standby slave 不存在" -msgstr "{} standby slave 不存在" +#: backend/ticket/builders/cloud/drs_replace.py:43 +msgid "DRS 服务替换" +msgstr "DRS 服务替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:117 -msgid "构造mydumper正则" -msgstr "构造mydumper正则" +#: backend/ticket/builders/cloud/nginx_reload.py:27 +msgid "重装的nginx id" +msgstr "重装的nginx id" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:123 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:166 -msgid "检查正则匹配" -msgstr "检查正则匹配" +#: backend/ticket/builders/cloud/nginx_reload.py:48 +msgid "Nginx 服务重装" +msgstr "Nginx 服务重装" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:141 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:114 -msgid "执行库表备份" -msgstr "执行库表备份" +#: backend/ticket/builders/cloud/nginx_replace.py:29 +#: backend/ticket/builders/cloud/service_apply.py:31 +msgid "部署nginx服务主机信息" +msgstr "部署nginx服务主机信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:155 -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:128 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:123 -msgid "关联备份id" -msgstr "关联备份id" +#: backend/ticket/builders/cloud/nginx_replace.py:32 +msgid "替换的nginx id" +msgstr "替换的nginx id" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:160 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:130 -msgid "{} 库表备份" -msgstr "{} 库表备份" +#: backend/ticket/builders/cloud/nginx_replace.py:33 +#: backend/ticket/builders/cloud/service_apply.py:45 +msgid "nginx服务部署信息" +msgstr "nginx服务部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_db_table_backup.py:163 -msgid "构建库表备份流程成功" -msgstr "构建库表备份流程成功" +#: backend/ticket/builders/cloud/nginx_replace.py:52 +msgid "Nginx 服务替换" +msgstr "Nginx 服务替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:98 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:85 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:105 -msgid "删除注册CC系统的服务实例" -msgstr "删除注册CC系统的服务实例" +#: backend/ticket/builders/cloud/redis_dts_add.py:28 +msgid "新Redis Dts机器的部署信息" +msgstr "新Redis Dts机器的部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:142 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:356 -msgid "卸载proxy实例" -msgstr "卸载proxy实例" +#: backend/ticket/builders/cloud/redis_dts_add.py:43 +msgid "RedisDts 服务新增" +msgstr "RedisDts 服务新增" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:155 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:122 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:164 -msgid "卸载mysql实例" -msgstr "卸载mysql实例" +#: backend/ticket/builders/cloud/redis_dts_reduce.py:28 +msgid "裁撤的redis_dts列表" +msgstr "裁撤的redis_dts列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:136 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:173 -msgid "清理db_meta元信息" -msgstr "清理db_meta元信息" +#: backend/ticket/builders/cloud/redis_dts_reduce.py:42 +msgid "RedisDts 服务裁撤" +msgstr "RedisDts 服务裁撤" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:178 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:187 -msgid "清理机器级别配置" -msgstr "清理机器级别配置" +#: backend/ticket/builders/cloud/service_apply.py:28 +msgid "部署drs服务主机信息" +msgstr "部署drs服务主机信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_destroy_flow.py:184 -msgid "下架MySQL高可用集群[{}]" -msgstr "下架MySQL高可用集群[{}]" +#: backend/ticket/builders/cloud/service_apply.py:34 +#: backend/ticket/builders/cloud/service_apply.py:41 +msgid "部署dns服务主机信息" +msgstr "部署dns服务主机信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:85 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:77 -msgid "删除集群域名" -msgstr "删除集群域名" +#: backend/ticket/builders/cloud/service_apply.py:37 +msgid "部署dbha-agent服务主机信息" +msgstr "部署dbha-agent服务主机信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:112 -msgid "重启proxy实例" -msgstr "重启proxy实例" +#: backend/ticket/builders/cloud/service_apply.py:38 +msgid "部署dbha-gm服务主机信息" +msgstr "部署dbha-gm服务主机信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:67 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:119 -msgid "集群变更OFFLINE状态" -msgstr "集群变更OFFLINE状态" +#: backend/ticket/builders/cloud/service_apply.py:44 +msgid "drs服务部署信息" +msgstr "drs服务部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_disable_flow.py:140 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:130 -msgid "禁用MySQL高可用集群[{}]" -msgstr "禁用MySQL高可用集群[{}]" +#: backend/ticket/builders/cloud/service_apply.py:46 +msgid "dns服务部署信息" +msgstr "dns服务部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:133 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:93 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:127 -msgid "集群变更ONLINE状态" -msgstr "集群变更ONLINE状态" +#: backend/ticket/builders/cloud/service_apply.py:47 +msgid "dbha服务部署信息" +msgstr "dbha服务部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_enable_flow.py:144 -msgid "启动MySQL高可用集群[{}]" -msgstr "启动MySQL高可用集群[{}]" +#: backend/ticket/builders/cloud/service_apply.py:48 +msgid "redis_dts服务部署信息" +msgstr "redis_dts服务部署信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:133 -msgid "{} 全库备份" -msgstr "{} 全库备份" +#: backend/ticket/builders/cloud/service_apply.py:112 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "Nginx 服务部署" +msgstr "Nginx 服务部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_ha_full_backup_flow.py:136 -msgid "构建全库备份流程成功" -msgstr "构建全库备份流程成功" +#: backend/ticket/builders/cloud/service_apply.py:118 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DNS 服务部署" +msgstr "DNS 服务部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:119 -msgid "执行集群主故障转移" -msgstr "执行集群主故障转移" +#: backend/ticket/builders/cloud/service_apply.py:124 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DRS 服务部署" +msgstr "DRS 服务部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:134 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:274 -msgid "salve节点同步新master数据" -msgstr "salve节点同步新master数据" +#: backend/ticket/builders/cloud/service_apply.py:130 +#: backend/ticket/builders/cloud/service_apply.py:149 +msgid "DBHA 服务部署" +msgstr "DBHA 服务部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:153 -msgid "{}集群执行主故障切换" -msgstr "{}集群执行主故障切换" +#: backend/ticket/builders/cloud/service_apply.py:140 +msgid "RedisDts 服务部署" +msgstr "RedisDts 服务部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:160 -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:300 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:278 -msgid "变更db_meta元信息" -msgstr "变更db_meta元信息" +#: backend/ticket/builders/common/base.py:111 +msgid "展示字段" +msgstr "展示字段" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_fail_over.py:183 -msgid "主故障切换流程[整机切换]" -msgstr "主故障切换流程[整机切换]" +#: backend/ticket/builders/common/base.py:141 +msgid "此单据只用于临时集群的销毁,请不要用于其他正常集群" +msgstr "此单据只用于临时集群的销毁,请不要用于其他正常集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:87 -msgid "the is_stand_by of new-master-instance [{}] is False " -msgstr "the is_stand_by of new-master-instance [{}] is False " +#: backend/ticket/builders/common/base.py:145 +msgid "存在临时集群已禁用,请在集群页面进行销毁" +msgstr "存在临时集群已禁用,请在集群页面进行销毁" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:129 -msgid "回收新master的域名映射" -msgstr "回收新master的域名映射" +#: backend/ticket/builders/common/base.py:158 +msgid "主机{}不在空闲机池,请保证所选的主机均来自空闲机" +msgstr "主机{}不在空闲机池,请保证所选的主机均来自空闲机" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:144 -msgid "对旧master添加域名映射" -msgstr "对旧master添加域名映射" +#: backend/ticket/builders/common/base.py:167 +msgid "所选主机存在已经被使用,请重新选择主机。主机信息: {}" +msgstr "所选主机存在已经被使用,请重新选择主机。主机信息: {}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:224 -msgid "旧master添加切换临时账号" -msgstr "旧master添加切换临时账号" +#: backend/ticket/builders/common/base.py:176 +msgid "请输入主机的云区域信息" +msgstr "请输入主机的云区域信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:239 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:453 -msgid "新master克隆旧master权限" -msgstr "新master克隆旧master权限" +#: backend/ticket/builders/common/base.py:194 +msgid "请保证所选集群{}都是{}集群" +msgstr "请保证所选集群{}都是{}集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:260 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:461 -msgid "执行集群切换" -msgstr "执行集群切换" +#: backend/ticket/builders/common/base.py:240 +msgid "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" +msgstr "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:293 -msgid "{}集群执行主从切换" -msgstr "{}集群执行主从切换" +#: backend/ticket/builders/common/base.py:246 +msgid "[{}]集群无法通过正则性校验{}" +msgstr "[{}]集群无法通过正则性校验{}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_master_slave_switch.py:323 -msgid "主从切换流程[整机切换]" -msgstr "主从切换流程[整机切换]" +#: backend/ticket/builders/common/base.py:249 +msgid "[{}]集群域名长度过长,请不要让域名长度超过{}" +msgstr "[{}]集群域名长度过长,请不要让域名长度超过{}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:112 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:575 -msgid "下发MySQL介质{}" -msgstr "下发MySQL介质{}" +#: backend/ticket/builders/common/base.py:285 +msgid "数据库{}不在所属集群{}中,请重新查验" +msgstr "数据库{}不在所属集群{}中,请重新查验" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:129 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:590 -msgid "初始化机器{}" -msgstr "初始化机器{}" +#: backend/ticket/builders/common/base.py:378 +msgid "源DB名和新DB名不允许包含通配符" +msgstr "源DB名和新DB名不允许包含通配符" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:155 -msgid "安装MySQL实例:{}" -msgstr "安装MySQL实例:{}" +#: backend/ticket/builders/common/base.py:385 +msgid "数据库[{}]不存在于集群{}中" +msgstr "数据库[{}]不存在于集群{}中" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:611 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:364 -msgid "写入初始化实例的db_meta元信息" -msgstr "写入初始化实例的db_meta元信息" +#: backend/ticket/builders/common/base.py:390 +msgid "重命名数据库[{}]已存在于集群{}中" +msgstr "重命名数据库[{}]已存在于集群{}中" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:213 -msgid "下发db-actor到新节点{}" -msgstr "下发db-actor到新节点{}" +#: backend/ticket/builders/common/base.py:393 +msgid "请保证集群{}中源数据库名{}的名字唯一" +msgstr "请保证集群{}中源数据库名{}的名字唯一" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:228 -msgid "获取MASTER节点备份介质{}" -msgstr "获取MASTER节点备份介质{}" +#: backend/ticket/builders/common/base.py:396 +msgid "请保证集群{}中新数据库名{}的名字唯一" +msgstr "请保证集群{}中新数据库名{}的名字唯一" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:237 -msgid "获取SLAVE节点备份介质{}" -msgstr "获取SLAVE节点备份介质{}" +#: backend/ticket/builders/common/base.py:400 +msgid "请保证源数据库名{}不要出现在新数据库名列表中" +msgstr "请保证源数据库名{}不要出现在新数据库名列表中" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:245 -msgid "判断备份文件来源,并传输备份文件新机器" -msgstr "判断备份文件来源,并传输备份文件新机器" +#: backend/ticket/builders/common/base.py:414 +msgid "slave: {}的is_stand_by不为true,或者处于异常状态" +msgstr "slave: {}的is_stand_by不为true,或者处于异常状态" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:264 -msgid "恢复新主节点数据{}:{}" -msgstr "恢复新主节点数据{}:{}" +#: backend/ticket/builders/common/bigdata.py:36 +msgid "节点列表信息" +msgstr "节点列表信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:275 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:189 -msgid "恢复新从节点数据{}:{}" -msgstr "恢复新从节点数据{}:{}" +#: backend/ticket/builders/common/bigdata.py:70 +msgid "操作额外信息(用于前端渲染)" +msgstr "操作额外信息(用于前端渲染)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:286 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:304 -msgid "新增repl帐户{}" -msgstr "新增repl帐户{}" +#: backend/ticket/builders/common/bigdata.py:82 +#: backend/ticket/builders/mysql/base.py:175 +msgid "集群{}状态转移不合法:{}--->{} is invalid" +msgstr "集群{}状态转移不合法:{}--->{} is invalid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:295 -msgid "建立主从关系{}" -msgstr "建立主从关系{}" +#: backend/ticket/builders/common/bigdata.py:90 +#: backend/ticket/builders/mongodb/mongo_restore.py:50 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:31 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:35 +msgid "资源池规格" +msgstr "资源池规格" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:313 -msgid "建立主从关系 {}" -msgstr "建立主从关系 {}" +#: backend/ticket/builders/common/bigdata.py:111 +#: backend/ticket/builders/influxdb/influxdb_apply.py:32 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:34 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:29 +#: backend/ticket/builders/mysql/mysql_single_apply.py:48 +#: backend/ticket/builders/redis/redis_cluster_apply.py:31 +#: backend/ticket/builders/redis/redis_instance_apply.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:47 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:34 +msgid "城市代码" +msgstr "城市代码" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:320 -msgid "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" -msgstr "数据恢复完毕,写入新主节点和旧主节点的关系链元数据" +#: backend/ticket/builders/common/bigdata.py:119 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:32 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:27 +#: backend/ticket/builders/redis/redis_cluster_apply.py:29 +#: backend/ticket/builders/redis/redis_instance_apply.py:35 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:31 +#: backend/ticket/serializers.py:95 +msgid "业务英文缩写" +msgstr "业务英文缩写" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:330 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:205 -msgid "恢复实例数据" -msgstr "恢复实例数据" +#: backend/ticket/builders/common/bigdata.py:120 +msgid "集群名称(英文数字及下划线)" +msgstr "集群名称(英文数字及下划线)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:341 -msgid "写入切换集群 {} 的元信息" -msgstr "写入切换集群 {} 的元信息" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:351 -msgid "切换实例" -msgstr "切换实例" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:360 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:582 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:302 -msgid "卸载实例" -msgstr "卸载实例" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:364 -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:378 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:164 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:261 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:305 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:318 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:306 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:195 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:301 -#: backend/ticket/builders/__init__.py:316 -#: backend/ticket/builders/common/constants.py:80 -#: backend/ticket/builders/mysql/mysql_checksum.py:168 -msgid "人工确认" -msgstr "人工确认" +#: backend/ticket/builders/common/bigdata.py:121 +#: backend/ticket/builders/redis/redis_cluster_apply.py:43 +msgid "集群别名(一般为中文别名)" +msgstr "集群别名(一般为中文别名)" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:380 -msgid "成对迁移集群的主从节点" -msgstr "成对迁移集群的主从节点" +#: backend/ticket/builders/common/bigdata.py:125 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:43 +msgid "资源申请规格" +msgstr "资源申请规格" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:424 -msgid "给master添加切换临时账号" -msgstr "给master添加切换临时账号" +#: backend/ticket/builders/common/bigdata.py:169 +msgid "主机{}出现角色互斥,{}与{}冲突" +msgstr "主机{}出现角色互斥,{}与{}冲突" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:432 -msgid "给新slave添加切换临时账号" -msgstr "给新slave添加切换临时账号" +#: backend/ticket/builders/common/bigdata.py:183 +msgid "旧节点信息集合" +msgstr "旧节点信息集合" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:476 -msgid "其余slave节点同步新master数据" -msgstr "其余slave节点同步新master数据" +#: backend/ticket/builders/common/bigdata.py:183 +#: backend/ticket/builders/common/bigdata.py:185 +msgid "节点信息" +msgstr "节点信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:486 -msgid "回收旧slave的域名映射" -msgstr "回收旧slave的域名映射" +#: backend/ticket/builders/common/bigdata.py:185 +msgid "新节点信息集合" +msgstr "新节点信息集合" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:501 -msgid "对新slave添加域名映射" -msgstr "对新slave添加域名映射" +#: backend/ticket/builders/common/bigdata.py:187 +msgid "规格类型" +msgstr "规格类型" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:516 -msgid "{}集群执行成对切换" -msgstr "{}集群执行成对切换" +#: backend/ticket/builders/common/bigdata.py:194 +msgid "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" +msgstr "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:528 -msgid "清理实例周边配置" -msgstr "清理实例周边配置" +#: backend/ticket/builders/common/bigdata.py:202 +msgid "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" +msgstr "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:546 -msgid "卸载MySQL实例:{}:{}" -msgstr "卸载MySQL实例:{}:{}" +#: backend/ticket/builders/common/bigdata.py:224 +msgid "实例名" +msgstr "实例名" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:561 -msgid "卸载主从实例完毕,修改元数据" -msgstr "卸载主从实例完毕,修改元数据" +#: backend/ticket/builders/common/bigdata.py:235 +#: backend/ticket/builders/common/bigdata.py:313 +msgid "实例{}不存在, 请重新确认实例的合法性" +msgstr "实例{}不存在, 请重新确认实例的合法性" -#: backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_flow.py:573 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:300 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:147 -msgid "清理机器配置" -msgstr "清理机器配置" +#: backend/ticket/builders/common/bigdata.py:240 +msgid "无法进行重启操作,原因:{}" +msgstr "无法进行重启操作,原因:{}" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:93 -msgid "上传sql文件" -msgstr "上传sql文件" +#: backend/ticket/builders/common/constants.py:87 +msgid "本地" +msgstr "本地" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:104 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:124 -msgid "下发sql文件" -msgstr "下发sql文件" +#: backend/ticket/builders/common/constants.py:88 +msgid "远程" +msgstr "远程" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:133 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:145 -msgid "actuator执行partition" -msgstr "actuator执行partition" +#: backend/ticket/builders/common/constants.py:105 +msgid "整个集群" +msgstr "整个集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:146 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:163 -msgid "cluster[{}]的分区任务" -msgstr "cluster[{}]的分区任务" +#: backend/ticket/builders/common/constants.py:106 +msgid "部分实例" +msgstr "部分实例" -#: backend/flow/engine/bamboo/scene/mysql/mysql_partition.py:149 -msgid "构建mysql partition流程成功" -msgstr "构建mysql partition流程成功" +#: backend/ticket/builders/common/constants.py:114 +msgid "手动提单修复" +msgstr "手动提单修复" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:126 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:132 -msgid "下发proxy安装介质" -msgstr "下发proxy安装介质" +#: backend/ticket/builders/common/constants.py:115 +msgid "例行校验修复" +msgstr "例行校验修复" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:152 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:159 -msgid "部署proxy实例" -msgstr "部署proxy实例" +#: backend/ticket/builders/common/constants.py:123 +msgid "远程备份 + 时间" +msgstr "远程备份 + 时间" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:192 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:205 -msgid "新的proxy配置后端实例" -msgstr "新的proxy配置后端实例" +#: backend/ticket/builders/common/constants.py:124 +msgid "远程备份 + backupid" +msgstr "远程备份 + backupid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:200 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:215 -msgid "克隆proxy用户白名单" -msgstr "克隆proxy用户白名单" +#: backend/ticket/builders/common/constants.py:125 +msgid "本地备份 + 时间" +msgstr "本地备份 + 时间" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:213 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:228 -msgid "集群对新的proxy添加权限" -msgstr "集群对新的proxy添加权限" +#: backend/ticket/builders/common/constants.py:126 +msgid "本地备份 + backupid" +msgstr "本地备份 + backupid" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:225 -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:240 -msgid "增加新proxy域名映射" -msgstr "增加新proxy域名映射" +#: backend/ticket/builders/common/constants.py:134 +msgid "回档到新集群" +msgstr "回档到新集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:240 -msgid "{}集群添加proxy实例" -msgstr "{}集群添加proxy实例" +#: backend/ticket/builders/common/constants.py:135 +msgid "回档到已有集群" +msgstr "回档到已有集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:247 -msgid "添加db_meta元信息" -msgstr "添加db_meta元信息" +#: backend/ticket/builders/common/constants.py:136 +msgid "回档到原集群" +msgstr "回档到原集群" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_add.py:265 -msgid "添加proxy子流程" -msgstr "添加proxy子流程" +#: backend/ticket/builders/doris/doris_apply.py:33 +msgid "http端口" +msgstr "http端口" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:255 -msgid "{}集群替换proxy实例" -msgstr "{}集群替换proxy实例" +#: backend/ticket/builders/doris/doris_apply.py:34 +msgid "输入端口" +msgstr "输入端口" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:305 -msgid "替换proxy子流程" -msgstr "替换proxy子流程" +#: backend/ticket/builders/doris/doris_apply.py:55 +msgid "端口号必须在5000到65535之间" +msgstr "端口号必须在5000到65535之间" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:349 -msgid "清理proxy实例级别周边配置" -msgstr "清理proxy实例级别周边配置" +#: backend/ticket/builders/doris/doris_apply.py:57 +msgid "端口号{}不可用" +msgstr "端口号{}不可用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:362 -msgid "回收对应proxy集群映射" -msgstr "回收对应proxy集群映射" +#: backend/ticket/builders/doris/doris_apply.py:62 +msgid "follower节点数不为3台! 请保证follower的部署节点数等于为3" +msgstr "follower节点数不为3台! 请保证follower的部署节点数等于为3" -#: backend/flow/engine/bamboo/scene/mysql/mysql_proxy_cluster_switch.py:373 -msgid "[{}:{}]下线" -msgstr "[{}:{}]下线" +#: backend/ticket/builders/doris/doris_apply.py:67 +msgid "observer节点数小于2台! 请保证observer的部署节点数至少为2" +msgstr "observer节点数小于2台! 请保证observer的部署节点数至少为2" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:133 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:139 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:240 -msgid "准备重命名参数" -msgstr "准备重命名参数" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:139 -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:126 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:137 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:228 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:246 -msgid "构造过滤正则" -msgstr "构造过滤正则" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:151 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:252 -msgid "获得源目标的库表" -msgstr "获得源目标的库表" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:155 -msgid "检查源数据库是否在用" -msgstr "检查源数据库是否在用" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:161 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:258 -msgid "建立目标数据库" -msgstr "建立目标数据库" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:167 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:264 -msgid "表迁移" -msgstr "表迁移" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:185 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:282 -msgid "迁移源库中其他对象" -msgstr "迁移源库中其他对象" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:198 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:295 -msgid "确认源数据库已空" -msgstr "确认源数据库已空" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:203 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:300 -msgid "删除源数据库" -msgstr "删除源数据库" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:210 -msgid "{} {} 重命名数据库" -msgstr "{} {} 重命名数据库" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:216 -msgid "{} 重命名数据库" -msgstr "{} 重命名数据库" +#: backend/ticket/builders/doris/doris_apply.py:75 +#: backend/ticket/builders/doris/doris_shrink.py:93 +msgid "请保证冷/热节点必选1种以上" +msgstr "请保证冷/热节点必选1种以上" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rename_database_flow.py:220 -msgid "构建重命名数据库流程成功" -msgstr "构建重命名数据库流程成功" +#: backend/ticket/builders/doris/doris_apply.py:77 +msgid "请保证部署节点的角色为2以上" +msgstr "请保证部署节点的角色为2以上" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:106 -#, python-format -msgid "%s slave 节点不存在" -msgstr "%s slave 节点不存在" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:128 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:373 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:477 -msgid "下发db-actor到集群主从节点" -msgstr "下发db-actor到集群主从节点" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:146 -msgid "slave重建之新增repl帐户{}" -msgstr "slave重建之新增repl帐户{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:157 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:387 -msgid "slave重建之获取MASTER节点备份介质{}" -msgstr "slave重建之获取MASTER节点备份介质{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:166 -msgid "slave重建之获取SLAVE节点备份介质{}" -msgstr "slave重建之获取SLAVE节点备份介质{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:173 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:402 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:522 -msgid "判断备份文件来源,并传输备份文件到新slave节点{}" -msgstr "判断备份文件来源,并传输备份文件到新slave节点{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:195 -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:544 -msgid "slave恢复完毕,修改元数据" -msgstr "slave恢复完毕,修改元数据" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:222 -msgid "克隆主节点账号权限到新从节点" -msgstr "克隆主节点账号权限到新从节点" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:228 -msgid "先添加新从库域名{}" -msgstr "先添加新从库域名{}" - -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:241 -msgid "再删除旧从库域名{}" -msgstr "再删除旧从库域名{}" +#: backend/ticket/builders/doris/doris_apply.py:120 +msgid "DORIS集群部署" +msgstr "DORIS集群部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:254 -msgid "slave切换完毕,修改集群 {} 数据" -msgstr "slave切换完毕,修改集群 {} 数据" +#: backend/ticket/builders/doris/doris_destroy.py:36 +msgid "DORIS集群删除" +msgstr "DORIS集群删除" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:264 -msgid "实例切换" -msgstr "实例切换" +#: backend/ticket/builders/doris/doris_disable.py:39 +msgid "Doris集群停用" +msgstr "Doris集群停用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:278 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:108 -msgid "清理实例级别周边配置" -msgstr "清理实例级别周边配置" +#: backend/ticket/builders/doris/doris_enable.py:39 +msgid "Doris集群启用" +msgstr "Doris集群启用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:286 -msgid "卸载mysql实例{}:{}" -msgstr "卸载mysql实例{}:{}" +#: backend/ticket/builders/doris/doris_reboot.py:38 +msgid "DORIS实例重启" +msgstr "DORIS实例重启" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:292 -msgid "old slave卸载完毕,修改元数据" -msgstr "old slave卸载完毕,修改元数据" +#: backend/ticket/builders/doris/doris_replace.py:53 +msgid "DORIS集群替换" +msgstr "DORIS集群替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:325 -msgid "Restore Slave 重建从库" -msgstr "Restore Slave 重建从库" +#: backend/ticket/builders/doris/doris_scale_up.py:45 +#: backend/ticket/builders/es/es_scale_up.py:45 +msgid "实例数必须为正数,请确保实例的合法性" +msgstr "实例数必须为正数,请确保实例的合法性" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:396 -msgid "slave重建之清理从库{}" -msgstr "slave重建之清理从库{}" +#: backend/ticket/builders/doris/doris_scale_up.py:104 +msgid "Doris集群扩容" +msgstr "Doris集群扩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:418 -msgid "slave 原地恢复数据{}" -msgstr "slave 原地恢复数据{}" +#: backend/ticket/builders/doris/doris_shrink.py:31 +#: backend/ticket/builders/es/es_shrink.py:30 +msgid "hot信息列表" +msgstr "hot信息列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:423 -msgid "Restore local Slave 本地重建" -msgstr "Restore local Slave 本地重建" +#: backend/ticket/builders/doris/doris_shrink.py:32 +#: backend/ticket/builders/es/es_shrink.py:31 +msgid "cold信息列表" +msgstr "cold信息列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:495 -msgid "添加slave之新增repl帐户{}" -msgstr "添加slave之新增repl帐户{}" +#: backend/ticket/builders/doris/doris_shrink.py:33 +msgid "observer信息列表" +msgstr "observer信息列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:506 -msgid "添加slave之获取MASTER节点备份介质{}" -msgstr "添加slave之获取MASTER节点备份介质{}" +#: backend/ticket/builders/doris/doris_shrink.py:35 +#: backend/ticket/builders/es/es_shrink.py:34 +msgid "nodes节点列表" +msgstr "nodes节点列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:515 -msgid "添加slave之获取SLAVE节点备份介质{}" -msgstr "添加slave之获取SLAVE节点备份介质{}" +#: backend/ticket/builders/doris/doris_shrink.py:70 +msgid "请保证部署的observer节点的角色最小值为0或2以上" +msgstr "请保证部署的observer节点的角色最小值为0或2以上" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:538 -msgid "添加slave之恢复数据{}" -msgstr "添加slave之恢复数据{}" +#: backend/ticket/builders/doris/doris_shrink.py:95 +msgid "请保证部署的冷/热节点的角色为2以上" +msgstr "请保证部署的冷/热节点的角色为2以上" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:555 -msgid "添加Slave之恢复slave" -msgstr "添加Slave之恢复slave" +#: backend/ticket/builders/doris/doris_shrink.py:103 +msgid "缩容仅支持hot、cold和observer" +msgstr "缩容仅支持hot、cold和observer" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:558 -msgid "添加从库flow" -msgstr "添加从库flow" +#: backend/ticket/builders/doris/doris_shrink.py:119 +msgid "Doris集群缩容" +msgstr "Doris集群缩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:604 -msgid "安装MySQL实例{}" -msgstr "安装MySQL实例{}" +#: backend/ticket/builders/es/es_apply.py:50 +msgid "请保证master的部署节点至少为3,且为奇数" +msgstr "请保证master的部署节点至少为3,且为奇数" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:634 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:381 -msgid "安装实例flow" -msgstr "安装实例flow" +#: backend/ticket/builders/es/es_apply.py:56 +msgid "请保证部署至少一台hot/cold节点" +msgstr "请保证部署至少一台hot/cold节点" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:641 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:417 -msgid "清理机器配置{}" -msgstr "清理机器配置{}" +#: backend/ticket/builders/es/es_apply.py:142 +msgid "ES集群部署" +msgstr "ES集群部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_flow.py:651 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:422 -msgid "清理机器flow" -msgstr "清理机器flow" +#: backend/ticket/builders/es/es_destroy.py:36 +msgid "ES集群删除" +msgstr "ES集群删除" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:129 -msgid "下发db_actuator介质" -msgstr "下发db_actuator介质" +#: backend/ticket/builders/es/es_disable.py:37 +msgid "ES集群停用" +msgstr "ES集群停用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:143 -msgid "定点恢复之获取MASTER节点备份介质{}" -msgstr "定点恢复之获取MASTER节点备份介质{}" +#: backend/ticket/builders/es/es_enable.py:37 +msgid "ES集群启用" +msgstr "ES集群启用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:152 -msgid "定点恢复之获取SLAVE节点备份介质{}" -msgstr "定点恢复之获取SLAVE节点备份介质{}" +#: backend/ticket/builders/es/es_reboot.py:38 +msgid "ES实例重启" +msgstr "ES实例重启" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:159 -msgid "判断备份文件来源,并传输备份文件到新定点恢复节点{}" -msgstr "判断备份文件来源,并传输备份文件到新定点恢复节点{}" +#: backend/ticket/builders/es/es_replace.py:53 +msgid "ES集群替换" +msgstr "ES集群替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:178 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:233 -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:299 -msgid "定点恢复之恢复数据{}" -msgstr "定点恢复之恢复数据{}" +#: backend/ticket/builders/es/es_scale_up.py:104 +msgid "ES集群扩容" +msgstr "ES集群扩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:225 -msgid "下载定点恢复的全库备份介质到{}" -msgstr "下载定点恢复的全库备份介质到{}" +#: backend/ticket/builders/es/es_shrink.py:32 +msgid "client信息列表" +msgstr "client信息列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:282 -msgid "传输文件{}" -msgstr "传输文件{}" +#: backend/ticket/builders/es/es_shrink.py:54 +msgid "热节点和冷节点至少保留1台!" +msgstr "热节点和冷节点至少保留1台!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:310 -msgid "定点恢复" -msgstr "定点恢复" +#: backend/ticket/builders/es/es_shrink.py:62 +msgid "缩容仅支持hot、cold和client" +msgstr "缩容仅支持hot、cold和client" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:328 -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:105 -msgid "下发MySQL介质" -msgstr "下发MySQL介质" +#: backend/ticket/builders/es/es_shrink.py:78 +msgid "ES集群缩容" +msgstr "ES集群缩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:377 -msgid "安装备份程序" -msgstr "安装备份程序" +#: backend/ticket/builders/hdfs/hdfs_apply.py:44 +msgid "Datanode节点数量<2台,请增加Datanode节点数量" +msgstr "Datanode节点数量<2台,请增加Datanode节点数量" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:398 -msgid "卸载rollback实例{}" -msgstr "卸载rollback实例{}" +#: backend/ticket/builders/hdfs/hdfs_apply.py:49 +msgid "Namenode节点数量不等于2台,请确保Namenode数量为2台" +msgstr "Namenode节点数量不等于2台,请确保Namenode数量为2台" -#: backend/flow/engine/bamboo/scene/mysql/mysql_rollback_data_flow.py:404 -msgid "卸载rollback实例完毕,修改元数据" -msgstr "卸载rollback实例完毕,修改元数据" +#: backend/ticket/builders/hdfs/hdfs_apply.py:55 +msgid "资源池部署ZooKeeper/JournalNode的角色数量为1-3台" +msgstr "资源池部署ZooKeeper/JournalNode的角色数量为1-3台" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:162 -msgid "录入db_meta元信息" -msgstr "录入db_meta元信息" +#: backend/ticket/builders/hdfs/hdfs_apply.py:58 +msgid "" +"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" +msgstr "" +"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_apply_flow.py:185 -msgid "部署单节点集群" -msgstr "部署单节点集群" +#: backend/ticket/builders/hdfs/hdfs_apply.py:147 +#: backend/ticket/constants.py:341 +msgid "HDFS 集群部署" +msgstr "HDFS 集群部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_destroy_flow.py:160 -msgid "下架MySQL单节点集群[{}]" -msgstr "下架MySQL单节点集群[{}]" +#: backend/ticket/builders/hdfs/hdfs_destroy.py:36 +#: backend/ticket/constants.py:348 +msgid "HDFS 集群删除" +msgstr "HDFS 集群删除" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:56 -msgid "回收集群域名" -msgstr "回收集群域名" +#: backend/ticket/builders/hdfs/hdfs_disable.py:39 +#: backend/ticket/constants.py:347 +msgid "HDFS 集群禁用" +msgstr "HDFS 集群禁用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_disable_flow.py:77 -msgid "禁用MySQL单节点集群[{}]" -msgstr "禁用MySQL单节点集群[{}]" +#: backend/ticket/builders/hdfs/hdfs_enable.py:40 +#: backend/ticket/constants.py:346 +msgid "HDFS 集群启用" +msgstr "HDFS 集群启用" -#: backend/flow/engine/bamboo/scene/mysql/mysql_single_enable_flow.py:104 -msgid "启动MySQL单节点集群[{}]" -msgstr "启动MySQL单节点集群[{}]" +#: backend/ticket/builders/hdfs/hdfs_reboot.py:39 +msgid "HDFS实例重启" +msgstr "HDFS实例重启" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:132 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:142 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:234 -msgid "获得清档目标" -msgstr "获得清档目标" +#: backend/ticket/builders/hdfs/hdfs_replace.py:36 +msgid "hdfs替换只支持datanode角色" +msgstr "hdfs替换只支持datanode角色" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:139 -msgid "检查清档目标是否在用" -msgstr "检查清档目标是否在用" +#: backend/ticket/builders/hdfs/hdfs_replace.py:56 +#: backend/ticket/constants.py:345 +msgid "HDFS 集群替换" +msgstr "HDFS 集群替换" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:145 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:155 -msgid "生成备份库名" -msgstr "生成备份库名" +#: backend/ticket/builders/hdfs/hdfs_scale_up.py:64 +#: backend/ticket/constants.py:342 +msgid "HDFS 集群扩容" +msgstr "HDFS 集群扩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:151 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:159 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:165 -msgid "建立备份库" -msgstr "建立备份库" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:30 +#: backend/ticket/builders/kafka/kafka_shrink.py:31 +#: backend/ticket/builders/pulsar/pulsar_shrink.py:34 +msgid "broker信息列表" +msgstr "broker信息列表" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:157 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:252 -msgid "备份清档表" -msgstr "备份清档表" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:32 +#: backend/ticket/builders/kafka/kafka_shrink.py:33 +msgid "nodes节点信息" +msgstr "nodes节点信息" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:164 -msgid "重建空表" -msgstr "重建空表" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:56 +msgid "{}: 至少保留2台!" +msgstr "{}: 至少保留2台!" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:183 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:269 -msgid "备份库中其他对象" -msgstr "备份库中其他对象" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:59 +msgid "缩容仅支持DataNode角色" +msgstr "缩容仅支持DataNode角色" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:198 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:303 -msgid "删除备份库" -msgstr "删除备份库" +#: backend/ticket/builders/hdfs/hdfs_shrink.py:75 +#: backend/ticket/constants.py:343 +msgid "HDFS 集群缩容" +msgstr "HDFS 集群缩容" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:205 -msgid "{} {} 清档" -msgstr "{} {} 清档" +#: backend/ticket/builders/influxdb/influxdb_apply.py:41 +msgid "分组名字" +msgstr "分组名字" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:210 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:308 -msgid "{} 清档" -msgstr "{} 清档" +#: backend/ticket/builders/influxdb/influxdb_apply.py:82 +#: backend/ticket/constants.py:369 +msgid "InfluxDB 实例部署" +msgstr "InfluxDB 实例部署" -#: backend/flow/engine/bamboo/scene/mysql/mysql_truncate_flow.py:213 -msgid "构建清档流程成功" -msgstr "构建清档流程成功" +#: backend/ticket/builders/influxdb/influxdb_destroy.py:37 +#: backend/ticket/constants.py:373 +msgid "InfluxDB 实例删除" +msgstr "InfluxDB 实例删除" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:100 -msgid "执行数据修复" -msgstr "执行数据修复" +#: backend/ticket/builders/influxdb/influxdb_disable.py:40 +#: backend/ticket/constants.py:372 +msgid "InfluxDB 实例禁用" +msgstr "InfluxDB 实例禁用" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:113 -msgid "{}:{}做数据修复" -msgstr "{}:{}做数据修复" +#: backend/ticket/builders/influxdb/influxdb_enable.py:40 +#: backend/ticket/constants.py:371 +msgid "InfluxDB 实例启用" +msgstr "InfluxDB 实例启用" -#: backend/flow/engine/bamboo/scene/mysql/pt_table_sync.py:118 -msgid "{}数据修复" -msgstr "{}数据修复" +#: backend/ticket/builders/influxdb/influxdb_reboot.py:39 +#: backend/ticket/constants.py:370 +msgid "InfluxDB 实例重启" +msgstr "InfluxDB 实例重启" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:50 -msgid "创建clb" -msgstr "创建clb" +#: backend/ticket/builders/influxdb/influxdb_replace.py:47 +#: backend/ticket/constants.py:374 +msgid "InfluxDB 实例替换" +msgstr "InfluxDB 实例替换" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:68 -msgid "删除clb" -msgstr "删除clb" +#: backend/ticket/builders/kafka/kafka_apply.py:75 +msgid "无认证开关, 1表示无认证。0表示认证,默认0" +msgstr "无认证开关, 1表示无认证。0表示认证,默认0" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:87 -msgid "创建polaris" -msgstr "创建polaris" +#: backend/ticket/builders/kafka/kafka_apply.py:77 +msgid "消息保留大小" +msgstr "消息保留大小" -#: backend/flow/engine/bamboo/scene/name_service/name_service.py:107 -msgid "删除polaris" -msgstr "删除polaris" +#: backend/ticket/builders/kafka/kafka_apply.py:78 +#: backend/ticket/builders/pulsar/pulsar_apply.py:29 +msgid "副本数量" +msgstr "副本数量" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:18 -msgid "Flow模块Pulsar集群异常" -msgstr "Flow模块Pulsar集群异常" +#: backend/ticket/builders/kafka/kafka_apply.py:79 +#: backend/ticket/builders/pulsar/pulsar_apply.py:30 +msgid "分区数量" +msgstr "分区数量" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:29 -msgid "Pulsar-Broker异常" -msgstr "Pulsar-Broker异常" +#: backend/ticket/builders/kafka/kafka_apply.py:80 +#: backend/ticket/builders/pulsar/pulsar_apply.py:31 +msgid "保留时长(小时)" +msgstr "保留时长(小时)" -#: backend/flow/engine/bamboo/scene/pulsar/exceptions.py:30 -msgid "Pulsar集群Broker数量不能为0" -msgstr "Pulsar集群Broker数量不能为0" +#: backend/ticket/builders/kafka/kafka_apply.py:104 +msgid "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" +msgstr "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:96 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:86 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:142 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:73 -msgid "下发pulsar介质" -msgstr "下发pulsar介质" +#: backend/ticket/builders/kafka/kafka_apply.py:110 +msgid "" +"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" +msgstr "" +"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:112 -msgid "添加ZK域名" -msgstr "添加ZK域名" +#: backend/ticket/builders/kafka/kafka_apply.py:136 +#: backend/ticket/constants.py:332 +msgid "Kafka 集群部署" +msgstr "Kafka 集群部署" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:124 -msgid "仅非DNS环境使用-添加broker hosts" -msgstr "仅非DNS环境使用-添加broker hosts" +#: backend/ticket/builders/kafka/kafka_destroy.py:37 +msgid "Kafka 集群销毁" +msgstr "Kafka 集群销毁" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:161 -msgid "初始化集群配置-{}" -msgstr "初始化集群配置-{}" +#: backend/ticket/builders/kafka/kafka_disable.py:40 +msgid "Kafka 集群停用" +msgstr "Kafka 集群停用" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:176 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:163 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_scale_up_flow.py:98 -msgid "分发密钥及token" -msgstr "分发密钥及token" +#: backend/ticket/builders/kafka/kafka_enable.py:40 +#: backend/ticket/constants.py:337 +msgid "Kafka 集群启用" +msgstr "Kafka 集群启用" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:192 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:286 -msgid "安装pulsar manager" -msgstr "安装pulsar manager" +#: backend/ticket/builders/kafka/kafka_reboot.py:39 +#: backend/ticket/constants.py:335 +msgid "Kafka 实例重启" +msgstr "Kafka 实例重启" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:205 -msgid "插入pulsar manager实例信息" -msgstr "插入pulsar manager实例信息" +#: backend/ticket/builders/kafka/kafka_replace.py:47 +#: backend/ticket/constants.py:336 +msgid "Kafka 集群替换" +msgstr "Kafka 集群替换" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_apply_flow.py:221 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:294 -msgid "初始化pulsar manager" -msgstr "初始化pulsar manager" +#: backend/ticket/builders/kafka/kafka_scale_up.py:64 +#: backend/ticket/constants.py:333 +msgid "Kafka 集群扩容" +msgstr "Kafka 集群扩容" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:187 -msgid "仅非DNS环境使用-添加zookeeper hosts" -msgstr "仅非DNS环境使用-添加zookeeper hosts" +#: backend/ticket/builders/kafka/kafka_shrink.py:58 +msgid "{}: 至少保留1台!" +msgstr "{}: 至少保留1台!" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:192 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:231 -msgid "安装Pulsar-{}-common子流程" -msgstr "安装Pulsar-{}-common子流程" +#: backend/ticket/builders/kafka/kafka_shrink.py:61 +msgid "缩容仅支持Broker" +msgstr "缩容仅支持Broker" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:241 -msgid "安装bookkeeper-{}" -msgstr "安装bookkeeper-{}" +#: backend/ticket/builders/kafka/kafka_shrink.py:77 +#: backend/ticket/constants.py:334 +msgid "Kafka 集群缩容" +msgstr "Kafka 集群缩容" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:271 -msgid "缩容Pulsar-Broker-{}" -msgstr "缩容Pulsar-Broker-{}" +#: backend/ticket/builders/mongodb/base.py:69 +msgid "缩容规格: {} 的台数: {} 后不满足容灾要求!" +msgstr "缩容规格: {} 的台数: {} 后不满足容灾要求!" + +#: backend/ticket/builders/mongodb/base.py:79 +msgid "缩容机器: {} 后不满足容灾要求!" +msgstr "缩容机器: {} 后不满足容灾要求!" + +#: backend/ticket/builders/mongodb/base.py:90 +msgid "请保证机器{}不能再同一个分片{}中" +msgstr "请保证机器{}不能再同一个分片{}中" + +#: backend/ticket/builders/mongodb/base.py:99 +msgid "请保证这一批集群的属性: {}是一致的" +msgstr "请保证这一批集群的属性: {}是一致的" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:32 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:30 +msgid "接入层角色" +msgstr "接入层角色" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:35 +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:43 +#: backend/ticket/builders/mongodb/mongo_clear.py:34 +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:33 +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:31 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:34 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:22 +msgid "是否做安全检测" +msgstr "是否做安全检测" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:39 +msgid "扩容接入层申请信息" +msgstr "扩容接入层申请信息" + +#: backend/ticket/builders/mongodb/mongo_add_mongos.py:74 +msgid "MongoDB 扩容接入层执行" +msgstr "MongoDB 扩容接入层执行" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:34 +msgid "当前shard节点数" +msgstr "当前shard节点数" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:35 +msgid "扩容shard节点数" +msgstr "扩容shard节点数" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:36 +msgid "单机部署实例数" +msgstr "单机部署实例数" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:37 +msgid "扩容shard分片数" +msgstr "扩容shard分片数" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:44 +msgid "扩容shard节点数申请信息" +msgstr "扩容shard节点数申请信息" + +#: backend/ticket/builders/mongodb/mongo_add_shard_nodes.py:97 +msgid "MongoDB 扩容shard节点数执行" +msgstr "MongoDB 扩容shard节点数执行" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:26 +msgid "授权数据列表" +msgstr "授权数据列表" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:38 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:66 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:39 +msgid "用户输入的excel下载文件地址" +msgstr "用户输入的excel下载文件地址" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:301 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:193 -msgid "检查Broker配置-{}" -msgstr "检查Broker配置-{}" +#: backend/ticket/builders/mongodb/mongo_authorize.py:40 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:68 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:41 +msgid "授权数据信息列表" +msgstr "授权数据信息列表" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:312 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:205 -msgid "检查NameSpace配置-{}" -msgstr "检查NameSpace配置-{}" +#: backend/ticket/builders/mongodb/mongo_authorize.py:52 +msgid "MongoDB 授权执行" +msgstr "MongoDB 授权执行" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:58 +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:106 +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:72 +msgid "授权数据不存在/已过期,请重新提交授权表单或excel文件" +msgstr "授权数据不存在/已过期,请重新提交授权表单或excel文件" + +#: backend/ticket/builders/mongodb/mongo_authorize.py:66 +msgid "MongoDB Excel授权执行" +msgstr "MongoDB Excel授权执行" + +#: backend/ticket/builders/mongodb/mongo_backup.py:32 +#: backend/ticket/builders/mongodb/mongo_clear.py:31 +#: backend/ticket/builders/mongodb/mongo_restore.py:45 +msgid "库表选择器" +msgstr "库表选择器" + +#: backend/ticket/builders/mongodb/mongo_backup.py:33 +msgid "备份节点" +msgstr "备份节点" + +#: backend/ticket/builders/mongodb/mongo_backup.py:38 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:59 +msgid "备份方式" +msgstr "备份方式" + +#: backend/ticket/builders/mongodb/mongo_backup.py:40 +#: backend/ticket/builders/mongodb/mongo_full_backup.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:53 +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:30 +msgid "备份保存时间" +msgstr "备份保存时间" + +#: backend/ticket/builders/mongodb/mongo_backup.py:62 +msgid "如果备份方式选择mongos,请输入备份节点" +msgstr "如果备份方式选择mongos,请输入备份节点" + +#: backend/ticket/builders/mongodb/mongo_backup.py:65 +msgid "请保证备份节点{}是分片集群的机器" +msgstr "请保证备份节点{}是分片集群的机器" + +#: backend/ticket/builders/mongodb/mongo_backup.py:85 +msgid "MongoDB 库表备份执行" +msgstr "MongoDB 库表备份执行" + +#: backend/ticket/builders/mongodb/mongo_clear.py:29 +msgid "删除类型" +msgstr "删除类型" + +#: backend/ticket/builders/mongodb/mongo_clear.py:30 +msgid "是否删除索引" +msgstr "是否删除索引" + +#: backend/ticket/builders/mongodb/mongo_clear.py:33 +msgid "清档信息" +msgstr "清档信息" + +#: backend/ticket/builders/mongodb/mongo_clear.py:52 +msgid "MongoDB 清档执行" +msgstr "MongoDB 清档执行" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:35 +msgid "替换主机IP" +msgstr "替换主机IP" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:36 +msgid "主机所在云区域" +msgstr "主机所在云区域" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:37 +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:47 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:34 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:37 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:38 +msgid "规格ID" +msgstr "规格ID" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:40 +msgid "替换mongos的信息" +msgstr "替换mongos的信息" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:41 +msgid "替换mongodb的信息" +msgstr "替换mongodb的信息" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:42 +msgid "替换mongo_config的信息" +msgstr "替换mongo_config的信息" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:47 +msgid "整机替换信息" +msgstr "整机替换信息" + +#: backend/ticket/builders/mongodb/mongo_cutoff.py:160 +msgid "MongoDB 整机替换执行" +msgstr "MongoDB 整机替换执行" + +#: backend/ticket/builders/mongodb/mongo_destroy.py:41 +msgid "MongoDB 集群下架" +msgstr "MongoDB 集群下架" + +#: backend/ticket/builders/mongodb/mongo_disable.py:44 +#: backend/ticket/constants.py:409 +msgid "MongoDB 集群禁用" +msgstr "MongoDB 集群禁用" + +#: backend/ticket/builders/mongodb/mongo_enable.py:44 +#: backend/ticket/constants.py:407 +msgid "MongoDB 集群启用" +msgstr "MongoDB 集群启用" + +#: backend/ticket/builders/mongodb/mongo_full_backup.py:26 +msgid "是否需要oplog备份" +msgstr "是否需要oplog备份" + +#: backend/ticket/builders/mongodb/mongo_full_backup.py:53 +msgid "MongoDB 全库备份执行" +msgstr "MongoDB 全库备份执行" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:28 +msgid "实例主机ID" +msgstr "实例主机ID" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:32 +msgid "重启信息" +msgstr "重启信息" + +#: backend/ticket/builders/mongodb/mongo_instance_reload.py:67 +#: backend/ticket/constants.py:408 +msgid "MongoDB 实例重启" +msgstr "MongoDB 实例重启" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:31 +#: backend/ticket/builders/riak/riak_shrink.py:30 +msgid "缩容节点" +msgstr "缩容节点" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:34 +msgid "缩容接入层申请信息" +msgstr "缩容接入层申请信息" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:53 +msgid "缩容后的整体mongos机器数量不能小于2" +msgstr "缩容后的整体mongos机器数量不能小于2" + +#: backend/ticket/builders/mongodb/mongo_reduce_mongos.py:80 +msgid "MongoDB 缩容接入层执行" +msgstr "MongoDB 缩容接入层执行" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:29 +msgid "缩容数量" +msgstr "缩容数量" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:32 +msgid "缩容shard节点数信息" +msgstr "缩容shard节点数信息" + +#: backend/ticket/builders/mongodb/mongo_reduce_shard_nodes.py:67 +msgid "MongoDB 缩容Shard节点数执行" +msgstr "MongoDB 缩容Shard节点数执行" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:27 +msgid "复制集群ID(英文数字及下划线)" +msgstr "复制集群ID(英文数字及下划线)" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:42 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:39 +msgid "起始端口" +msgstr "起始端口" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:43 +msgid "副本集数量" +msgstr "副本集数量" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:44 +msgid "副本集节点数量" +msgstr "副本集节点数量" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:45 +msgid "单机副本集数量" +msgstr "单机副本集数量" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:46 +msgid "副本集列表" +msgstr "副本集列表" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:48 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:40 +msgid "oplog容量占比" +msgstr "oplog容量占比" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:55 +msgid "集群规格" +msgstr "集群规格" + +#: backend/ticket/builders/mongodb/mongo_replicaset_apply.py:101 +msgid "MongoDB 副本集集群部署执行" +msgstr "MongoDB 副本集集群部署执行" + +#: backend/ticket/builders/mongodb/mongo_restore.py:43 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:34 +msgid "集群列表" +msgstr "集群列表" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:319 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:216 -msgid "检查未复制ledger-{}" -msgstr "检查未复制ledger-{}" +#: backend/ticket/builders/mongodb/mongo_restore.py:47 +msgid "指定备份记录[集群ID: 记录]" +msgstr "指定备份记录[集群ID: 记录]" + +#: backend/ticket/builders/mongodb/mongo_restore.py:48 +msgid "部署城市" +msgstr "部署城市" + +#: backend/ticket/builders/mongodb/mongo_restore.py:49 +msgid "每台主机部署的节点数" +msgstr "每台主机部署的节点数" + +#: backend/ticket/builders/mongodb/mongo_restore.py:59 +msgid "分片集群暂时不支持批量回档" +msgstr "分片集群暂时不支持批量回档" + +#: backend/ticket/builders/mongodb/mongo_restore.py:248 +msgid "[{}]回档临时集群部署" +msgstr "[{}]回档临时集群部署" + +#: backend/ticket/builders/mongodb/mongo_restore.py:255 +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +msgid "MongoDB 回档执行" +msgstr "MongoDB 回档执行" + +#: backend/ticket/builders/mongodb/mongo_restore.py:269 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:204 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:224 +msgid "回档临时集群部署" +msgstr "回档临时集群部署" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:33 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:46 +#: backend/ticket/builders/redis/redis_cluster_apply.py:49 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:44 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:45 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:33 +msgid "集群分片数" +msgstr "集群分片数" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:326 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:274 -msgid "停止BookKeeper服务-{}" -msgstr "停止BookKeeper服务-{}" +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:34 +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:45 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:54 +msgid "机器组数" +msgstr "机器组数" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:35 +msgid "集群每分片节点数" +msgstr "集群每分片节点数" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:42 +msgid "集群容量变更申请信息" +msgstr "集群容量变更申请信息" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:50 +msgid "请保证申请机器数{} = 机器组数{} * 集群分片节点数{}" +msgstr "请保证申请机器数{} = 机器组数{} * 集群分片节点数{}" + +#: backend/ticket/builders/mongodb/mongo_scale_updown.py:115 +msgid "MongoDB 集群容量变更执行" +msgstr "MongoDB 集群容量变更执行" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:32 +msgid "脚本内容列表" +msgstr "脚本内容列表" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:33 +msgid "脚本导入类型" +msgstr "脚本导入类型" + +#: backend/ticket/builders/mongodb/mongo_script_exec.py:57 +msgid "MongoDB 变更脚本执行执行" +msgstr "MongoDB 变更脚本执行执行" + +#: backend/ticket/builders/mongodb/mongo_shard_apply.py:101 +msgid "MongoDB 分片集群部署执行" +msgstr "MongoDB 分片集群部署执行" + +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:54 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:68 +msgid "MongoDB 临时集群下架" +msgstr "MongoDB 临时集群下架" + +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:60 +#: backend/ticket/builders/mongodb/mongodb_temporary_destroy.py:68 +#: backend/ticket/constants.py:415 +msgid "MongoDB 临时集群销毁" +msgstr "MongoDB 临时集群销毁" + +#: backend/ticket/builders/mysql/base.py:101 +msgid "单节点实例状态异常,暂时无法执行该单据类型:{}" +msgstr "单节点实例状态异常,暂时无法执行该单据类型:{}" + +#: backend/ticket/builders/mysql/base.py:107 +#: backend/ticket/builders/sqlserver/base.py:91 +msgid "集群实例状态异常:{},暂时无法执行该单据类型:{}" +msgstr "集群实例状态异常:{},暂时无法执行该单据类型:{}" + +#: backend/ticket/builders/mysql/base.py:118 +msgid "请保证所选集群{}与新增机器{}在同一云区域下" +msgstr "请保证所选集群{}与新增机器{}在同一云区域下" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:332 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:280 -msgid "退役BookKeeper-{}" -msgstr "退役BookKeeper-{}" +#: backend/ticket/builders/mysql/base.py:127 +msgid "请保证实例f{}的角色类型为{}" +msgstr "请保证实例f{}的角色类型为{}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_base_flow.py:337 -msgid "缩容Pulsar-BookKeeper-{}-子流程" -msgstr "缩容Pulsar-BookKeeper-{}-子流程" +#: backend/ticket/builders/mysql/base.py:143 +msgid "请保证所选实例{}的关联集群为{}" +msgstr "请保证所选实例{}的关联集群为{}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:77 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:67 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_enable_flow.py:67 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_reboot_flow.py:65 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:66 -msgid "下发pulsar actuator" -msgstr "下发pulsar actuator" +#: backend/ticket/builders/mysql/base.py:166 +msgid "是否强制下架" +msgstr "是否强制下架" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:86 -msgid "Pulsar集群节点清理-{}" -msgstr "Pulsar集群节点清理-{}" +#: backend/ticket/builders/mysql/base.py:217 +msgid "" +"【库表字段校验】库表只能由`[0-9],[a-z],[A-Z],-,_` 组成,(某些单据)支持*/%/?通" +"配符。库表长度最大为35" +msgstr "【库表字段校验】库表只能由`[0-9],[a-z],[A-Z],-,_` 组成,(某些单据)支持*/%/?通配符。库表长度最大为35" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:110 -msgid "删除ZK域名" -msgstr "删除ZK域名" +#: backend/ticket/builders/mysql/base.py:223 +msgid "【库表字段校验】{}" +msgstr "【库表字段校验】{}" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_destroy_flow.py:121 -msgid "删除PULSAR_MANAGER实例信息" -msgstr "删除PULSAR_MANAGER实例信息" +#: backend/ticket/builders/mysql/base.py:228 +msgid "【库表字段校验】不允许系统库(除test)做任何变更类操作" +msgstr "【库表字段校验】不允许系统库(除test)做任何变更类操作" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_disable_flow.py:78 -msgid "停止Pulsar集群进程-{}-{}" -msgstr "停止Pulsar集群进程-{}-{}" +#: backend/ticket/builders/mysql/base.py:230 +msgid "【库表字段校验】DB名{}不能以stage_truncate开头" +msgstr "【库表字段校验】DB名{}不能以stage_truncate开头" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:105 -msgid "替换pulsar manager子流程" -msgstr "替换pulsar manager子流程" +#: backend/ticket/builders/mysql/base.py:232 +msgid "【库表字段校验】DB名{}不能以dba_rollback结尾" +msgstr "【库表字段校验】DB名{}不能以dba_rollback结尾" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:123 -msgid "更新DBMeta" -msgstr "更新DBMeta" +#: backend/ticket/builders/mysql/mysql_add_slave.py:27 +msgid "新从库机器信息" +msgstr "新从库机器信息" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:132 -msgid "替换ZooKeeper子流程" -msgstr "替换ZooKeeper子流程" +#: backend/ticket/builders/mysql/mysql_add_slave.py:31 +msgid "添加从库信息" +msgstr "添加从库信息" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:195 -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_shrink_flow.py:73 -msgid "缩容BookKeeper子流程" -msgstr "缩容BookKeeper子流程" +#: backend/ticket/builders/mysql/mysql_add_slave.py:36 +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:33 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:43 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:32 +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:40 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:34 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:34 +msgid "机器来源" +msgstr "机器来源" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:262 -msgid "更新pulsar_manager实例信息" -msgstr "更新pulsar_manager实例信息" +#: backend/ticket/builders/mysql/mysql_add_slave.py:88 +msgid "添加从库执行" +msgstr "添加从库执行" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_replace_flow.py:275 -msgid "仅非DNS环境使用-添加broker域名" -msgstr "仅非DNS环境使用-添加broker域名" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:31 +msgid "目标集群域名" +msgstr "目标集群域名" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:86 -msgid "停止ZooKeeper服务-{}" -msgstr "停止ZooKeeper服务-{}" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:43 +msgid "第三方接口/插件授权信息" +msgstr "第三方接口/插件授权信息" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:100 -msgid "更新ZK域名" -msgstr "更新ZK域名" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:45 +msgid "是否需要审批" +msgstr "是否需要审批" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:117 -msgid "仅非DNS环境使用-更新ZK映射" -msgstr "仅非DNS环境使用-更新ZK映射" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:49 +msgid "请保证授权数据存在" +msgstr "请保证授权数据存在" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:133 -msgid "替换Pulsar-ZooKeeper-{}-子流程" -msgstr "替换Pulsar-ZooKeeper-{}-子流程" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:89 +msgid "授权执行" +msgstr "授权执行" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:230 -msgid "检查Ledger Metadata-{}" -msgstr "检查Ledger Metadata-{}" +#: backend/ticket/builders/mysql/mysql_authorize_rules.py:114 +msgid "Excel 授权执行" +msgstr "Excel 授权执行" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:243 -msgid "修改Bookie参数为ReadOnly-{}" -msgstr "修改Bookie参数为ReadOnly-{}" +#: backend/ticket/builders/mysql/mysql_checksum.py:39 +msgid "slave信息列表" +msgstr "slave信息列表" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:257 -msgid "滚动重启BookKeeper-{}" -msgstr "滚动重启BookKeeper-{}" +#: backend/ticket/builders/mysql/mysql_checksum.py:46 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:61 +#: backend/ticket/constants.py:489 +msgid "超时时间" +msgstr "超时时间" -#: backend/flow/engine/bamboo/scene/pulsar/pulsar_sub_flow.py:264 -msgid "等待数据过期" -msgstr "等待数据过期" +#: backend/ticket/builders/mysql/mysql_checksum.py:47 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:62 +msgid "定时触发时间" +msgstr "定时触发时间" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:68 -msgid "Proxy-001-{}-下发介质包" -msgstr "Proxy-001-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_checksum.py:48 +msgid "数据校验信息列表" +msgstr "数据校验信息列表" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:75 -msgid "Proxy-002-{}-初始化机器" -msgstr "Proxy-002-{}-初始化机器" +#: backend/ticket/builders/mysql/mysql_checksum.py:49 +#: backend/ticket/builders/mysql/mysql_data_repair.py:30 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:60 +msgid "数据修复信息" +msgstr "数据修复信息" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:100 -msgid "Proxy-003-{}-安装实例" -msgstr "Proxy-003-{}-安装实例" +#: backend/ticket/builders/mysql/mysql_checksum.py:50 +#: backend/ticket/builders/mysql/mysql_data_repair.py:32 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:64 +msgid "非innodb表是否修复" +msgstr "非innodb表是否修复" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:109 -msgid "Proxy-004-{}-写入元数据" -msgstr "Proxy-004-{}-写入元数据" +#: backend/ticket/builders/mysql/mysql_checksum.py:61 +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:72 +msgid "定时时间必须晚于当前时间" +msgstr "定时时间必须晚于当前时间" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:130 -msgid "Proxy-005-{}-安装监控" -msgstr "Proxy-005-{}-安装监控" +#: backend/ticket/builders/mysql/mysql_checksum.py:185 +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +msgid "数据校验执行" +msgstr "数据校验执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/proxy_install.py:135 -msgid "Proxy-{}-安装原子任务" -msgstr "Proxy-{}-安装原子任务" +#: backend/ticket/builders/mysql/mysql_checksum.py:202 +msgid "手动" +msgstr "手动" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:57 -msgid "Redis-201-{}-下发介质包" -msgstr "Redis-201-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_checksum.py:204 +msgid "自动" +msgstr "自动" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:77 -msgid "Redis-202-{}-安装监控" -msgstr "Redis-202-{}-安装监控" +#: backend/ticket/builders/mysql/mysql_checksum.py:212 +msgid "数据修复{}执行" +msgstr "数据修复{}执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_dbmon.py:83 -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:129 -msgid "Redis-{}-安装原子任务" -msgstr "Redis-{}-安装原子任务" +#: backend/ticket/builders/mysql/mysql_checksum.py:221 +#: backend/ticket/builders/mysql/mysql_data_repair.py:59 +msgid "数据修复执行" +msgstr "数据修复执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:63 -msgid "Redis-001-{}-下发介质包" -msgstr "Redis-001-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:30 +msgid "源IP" +msgstr "源IP" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:71 -msgid "Redis-002-{}-初始化机器" -msgstr "Redis-002-{}-初始化机器" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:31 +msgid "目标IP列表" +msgstr "目标IP列表" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:90 -msgid "Redis-003-{}-安装实例" -msgstr "Redis-003-{}-安装实例" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:39 +msgid "插件的权限克隆信息" +msgstr "插件的权限克隆信息" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:104 -msgid "Redis-004-{}-写入元数据" -msgstr "Redis-004-{}-写入元数据" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:45 +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:29 +msgid "克隆集群类型" +msgstr "克隆集群类型" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_install.py:124 -msgid "Redis-005-{}-安装监控" -msgstr "Redis-005-{}-安装监控" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:69 +msgid "客户端权限克隆执行" +msgstr "客户端权限克隆执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:56 -msgid "Redis-101-{}-下发介质包" -msgstr "Redis-101-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:78 +msgid "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" +msgstr "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:76 -msgid "Redis-102-{}-卸载dbmon" -msgstr "Redis-102-{}-卸载dbmon" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:85 +msgid "权限克隆数据不合法!请检查" +msgstr "权限克隆数据不合法!请检查" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:112 -msgid "Redis-{}-拉起dbmon" -msgstr "Redis-{}-拉起dbmon" +#: backend/ticket/builders/mysql/mysql_clone_rules.py:90 +msgid "DB实例权限克隆执行" +msgstr "DB实例权限克隆执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:117 -msgid "Redis-{}-创建同步关系原子任务" -msgstr "Redis-{}-创建同步关系原子任务" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:27 +#: backend/ticket/builders/mysql/mysql_openarea.py:43 +msgid "目标集群列表" +msgstr "目标集群列表" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:142 -msgid "Redis-103-{}-建立主从关系" -msgstr "Redis-103-{}-建立主从关系" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:28 +msgid "迁移库列表" +msgstr "迁移库列表" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:162 -msgid "Redis-104-{}-建立主从关系" -msgstr "Redis-104-{}-建立主从关系" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:29 +msgid "克隆类型" +msgstr "克隆类型" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_makesync.py:237 -msgid "Redis-103-{}-发起备份" -msgstr "Redis-103-{}-发起备份" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:31 +msgid "数据迁移信息" +msgstr "数据迁移信息" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:55 -msgid "Redis-301-{}-下发介质包" -msgstr "Redis-301-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:46 +msgid "迁移存在不属于源集群的数据库" +msgstr "迁移存在不属于源集群的数据库" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_repair.py:70 -msgid "Redis-302-{}-检查同步状态" -msgstr "Redis-302-{}-检查同步状态" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:52 +msgid "迁移的数据库不能与目标集群有交集" +msgstr "迁移的数据库不能与目标集群有交集" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:51 -msgid "Redis-801-{}-下发介质包" -msgstr "Redis-801-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_data_migrate.py:55 +msgid "即将迁移的数据库和目标集群不允许重复" +msgstr "即将迁移的数据库和目标集群不允许重复" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:66 -msgid "Redis-802-{}-请求检查" -msgstr "Redis-802-{}-请求检查" +#: backend/ticket/builders/mysql/mysql_data_repair.py:27 +msgid "master信息" +msgstr "master信息" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:78 -msgid "Redis-803-{}-干掉非活跃链接" -msgstr "Redis-803-{}-干掉非活跃链接" +#: backend/ticket/builders/mysql/mysql_data_repair.py:28 +msgid "slaves信息" +msgstr "slaves信息" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:89 -msgid "Redis-804-{}-下架实例" -msgstr "Redis-804-{}-下架实例" +#: backend/ticket/builders/mysql/mysql_data_repair.py:31 +msgid "校验单据结果表名" +msgstr "校验单据结果表名" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:104 -msgid "Redis-805-{}-卸载监控" -msgstr "Redis-805-{}-卸载监控" +#: backend/ticket/builders/mysql/mysql_data_repair.py:33 +msgid "校验结果是否一致" +msgstr "校验结果是否一致" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:118 -msgid "Redis-806-{}-清理元数据" -msgstr "Redis-806-{}-清理元数据" +#: backend/ticket/builders/mysql/mysql_data_repair.py:36 +msgid "数据修复触发类型" +msgstr "数据修复触发类型" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_shutdown.py:123 -msgid "Redis-{}-下架原子任务" -msgstr "Redis-{}-下架原子任务" +#: backend/ticket/builders/mysql/mysql_dump_data.py:31 +msgid "where条件" +msgstr "where条件" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:73 -msgid "Redis-501-元数据加入集群" -msgstr "Redis-501-元数据加入集群" +#: backend/ticket/builders/mysql/mysql_dump_data.py:32 +msgid "导出库列表" +msgstr "导出库列表" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:77 -msgid "Redis-502-人工确认" -msgstr "Redis-502-人工确认" +#: backend/ticket/builders/mysql/mysql_dump_data.py:35 +msgid "是否导出表结构" +msgstr "是否导出表结构" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:84 -msgid "Redis-003-{}-下发介质包" -msgstr "Redis-003-{}-下发介质包" +#: backend/ticket/builders/mysql/mysql_dump_data.py:36 +msgid "是否导出表数据" +msgstr "是否导出表数据" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:114 -msgid "Redis-504-{}-实例切换" -msgstr "Redis-504-{}-实例切换" +#: backend/ticket/builders/mysql/mysql_dump_data.py:75 +msgid "数据导出执行" +msgstr "数据导出执行" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:137 -msgid "Redis-505-元数据切换" -msgstr "Redis-505-元数据切换" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:34 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:43 +msgid "回档集群ID" +msgstr "回档集群ID" -#: backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_switch.py:140 -msgid "Redis-{}-实例切换" -msgstr "Redis-{}-实例切换" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:35 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:44 +msgid "备份新机器" +msgstr "备份新机器" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:98 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:98 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:114 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:104 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:137 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:135 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:118 -#: backend/flow/engine/bamboo/scene/redis/redis_dbmon.py:78 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:102 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:100 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:88 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:128 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:88 -msgid "初始化配置" -msgstr "初始化配置" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:41 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:50 +msgid "备份文件信息" +msgstr "备份文件信息" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:160 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:157 -msgid "redis建立主从 元数据" -msgstr "redis建立主从 元数据" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:49 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:60 +msgid "回档集群类型" +msgstr "回档集群类型" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:186 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:184 -msgid "建立集群 元数据" -msgstr "建立集群 元数据" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:51 +msgid "定点构造信息" +msgstr "定点构造信息" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:210 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:197 -msgid "回写集群配置[Redis]" -msgstr "回写集群配置[Redis]" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:57 +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:62 +msgid "请提供部署新集群的机器信息" +msgstr "请提供部署新集群的机器信息" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:226 -msgid "回写集群配置[Twemproxy]" -msgstr "回写集群配置[Twemproxy]" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:66 +msgid "请保证rollback_time或backupinfo参数至少存在一个" +msgstr "请保证rollback_time或backupinfo参数至少存在一个" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_apply_flow.py:241 -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:228 -msgid "注册域名" -msgstr "注册域名" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:74 +msgid "定点时间{}不能晚于当前时间{}" +msgstr "定点时间{}不能晚于当前时间{}" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:103 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:119 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:109 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:123 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:107 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:105 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:94 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:98 -msgid "下发介质包" -msgstr "下发介质包" +#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:118 +msgid "定点构造执行" +msgstr "定点构造执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:112 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:146 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:133 -msgid "redis备份: {}" -msgstr "redis备份: {}" +#: backend/ticket/builders/mysql/mysql_flashback.py:41 +msgid "flashback工具地址" +msgstr "flashback工具地址" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_backup.py:119 -msgid "集群[{}]备份" -msgstr "集群[{}]备份" +#: backend/ticket/builders/mysql/mysql_flashback.py:43 +msgid "记录文件" +msgstr "记录文件" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:79 -msgid "获取源集群、目的集群信息" -msgstr "获取源集群、目的集群信息" +#: backend/ticket/builders/mysql/mysql_flashback.py:56 +msgid "" +"flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时" +"间" +msgstr "" +"flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时" +"间" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:95 -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:139 -msgid "获取磁盘使用情况: {}" -msgstr "获取磁盘使用情况: {}" +#: backend/ticket/builders/mysql/mysql_flashback.py:78 +msgid "闪回执行" +msgstr "闪回执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:104 -msgid "redis dts前置检查" -msgstr "redis dts前置检查" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:93 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:198 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:132 +msgid "人工确认执行" +msgstr "人工确认执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:109 -msgid "redis dts发起任务并等待至增量同步阶段" -msgstr "redis dts发起任务并等待至增量同步阶段" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:105 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:209 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:143 +msgid "库表备份" +msgstr "库表备份" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:128 -msgid "redis dts数据校验: {}" -msgstr "redis dts数据校验: {}" +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:115 +msgid "强制变更SQL执行" +msgstr "强制变更SQL执行" + +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:124 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +msgid "库表备份(可选)" +msgstr "库表备份(可选)" + +#: backend/ticket/builders/mysql/mysql_force_import_sqlfile.py:124 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:219 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:153 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +#: backend/ticket/constants.py:260 +msgid "变更SQL执行" +msgstr "变更SQL执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_dts.py:136 -msgid "源集群:{} 数据迁移到 目的集群:{}" -msgstr "源集群:{} 数据迁移到 目的集群:{}" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:41 +msgid "Proxy起始端口" +msgstr "Proxy起始端口" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:118 -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:132 -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:118 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:111 -msgid "redis请求检查: {}" -msgstr "redis请求检查: {}" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:61 +msgid "" +"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" +"台backend机器" +msgstr "" +"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" +"台backend机器" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:138 -msgid "更新实例状态" -msgstr "更新实例状态" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:130 +msgid "MySQL高可用部署执行" +msgstr "MySQL高可用部署执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:162 -msgid "[{}]卸载bkdbmon" -msgstr "[{}]卸载bkdbmon" +#: backend/ticket/builders/mysql/mysql_ha_apply.py:149 +#: backend/ticket/builders/mysql/mysql_single_apply.py:223 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:131 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:220 +msgid "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" +msgstr "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:164 -msgid "[{}]安装bkdbmon" -msgstr "[{}]安装bkdbmon" +#: backend/ticket/builders/mysql/mysql_ha_backup.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:37 +msgid "备份信息列表" +msgstr "备份信息列表" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:179 -msgid "集群[{}]启停" -msgstr "集群[{}]启停" +#: backend/ticket/builders/mysql/mysql_ha_backup.py:57 +msgid "库表备份执行" +msgstr "库表备份执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_open_close.py:188 -msgid "更新集群状态" -msgstr "更新集群状态" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:33 +msgid "清档类型" +msgstr "清档类型" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:148 -msgid "REDIS_MASTER-裁撤替换" -msgstr "REDIS_MASTER-裁撤替换" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:37 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:36 +msgid "清档信息列表" +msgstr "清档信息列表" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_master.py:249 -msgid "REDIS_MASTER-故障自愈" -msgstr "REDIS_MASTER-故障自愈" +#: backend/ticket/builders/mysql/mysql_ha_clear.py:62 +msgid "清档执行" +msgstr "清档执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:146 -msgid "REDIS_SLAVE-裁撤替换" -msgstr "REDIS_SLAVE-裁撤替换" +#: backend/ticket/builders/mysql/mysql_ha_destroy.py:51 +msgid "MySQL高可用销毁执行" +msgstr "MySQL高可用销毁执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:204 -msgid "Redis-新节点加入集群" -msgstr "Redis-新节点加入集群" +#: backend/ticket/builders/mysql/mysql_ha_destroy.py:85 +msgid "dumper 下架" +msgstr "dumper 下架" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_slave.py:224 -msgid "REDIS_SLAVE-故障自愈" -msgstr "REDIS_SLAVE-故障自愈" +#: backend/ticket/builders/mysql/mysql_ha_disable.py:38 +msgid "MySQL高可用禁用执行" +msgstr "MySQL高可用禁用执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:169 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:234 -msgid "{}下架proxy实例" -msgstr "{}下架proxy实例" +#: backend/ticket/builders/mysql/mysql_ha_enable.py:38 +msgid "MySQL高可用启用执行" +msgstr "MySQL高可用启用执行" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:180 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:125 -msgid "{}下架redis实例" -msgstr "{}下架redis实例" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:30 +#: backend/ticket/builders/tendbcluster/tendb_backup.py:26 +msgid "备份位置" +msgstr "备份位置" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:205 -msgid "[redis]卸载bkdbmon" -msgstr "[redis]卸载bkdbmon" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:35 +msgid "备份类型" +msgstr "备份类型" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:225 -msgid "清理Redis配置" -msgstr "清理Redis配置" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:36 +msgid "备份文件tag" +msgstr "备份文件tag" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:242 -msgid "清理Proxy配置" -msgstr "清理Proxy配置" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:37 +#: backend/ticket/builders/redis/redis_instance_apply.py:45 +msgid "集群信息" +msgstr "集群信息" -#: backend/flow/engine/bamboo/scene/redis/redis_cluster_shutdown.py:255 -msgid "删除集群元数据" -msgstr "删除集群元数据" +#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:67 +msgid "全库备份执行" +msgstr "全库备份执行" -#: backend/flow/engine/bamboo/scene/redis/redis_dbmon.py:89 -msgid "REDIS-重装DBMON" -msgstr "REDIS-重装DBMON" +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:31 +#: backend/ticket/builders/spider/metadata_import.py:31 +#: backend/ticket/builders/tendbsingle/metadata_import.py:30 +msgid "元数据json内容" +msgstr "元数据json内容" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:61 +#: backend/ticket/builders/spider/metadata_import.py:56 +#: backend/ticket/builders/tendbsingle/metadata_import.py:52 +msgid "bk_biz_id: {} 不存在" +msgstr "bk_biz_id: {} 不存在" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:67 +#: backend/ticket/builders/spider/metadata_import.py:62 +#: backend/ticket/builders/tendbsingle/metadata_import.py:58 +msgid "db_module_id: {} 不存在" +msgstr "db_module_id: {} 不存在" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:89 +msgid "proxy_spec_id: {} 不存在" +msgstr "proxy_spec_id: {} 不存在" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:96 +#: backend/ticket/builders/tendbsingle/metadata_import.py:78 +msgid "storage_spec_id: {} 不存在" +msgstr "storage_spec_id: {} 不存在" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:121 +#: backend/ticket/builders/tendbsingle/metadata_import.py:190 +msgid "{} 超出 scr mysql segment 范围" +msgstr "{} 超出 scr mysql segment 范围" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:127 +#: backend/ticket/builders/spider/metadata_import.py:112 +msgid "隔离级别 {} 不支持" +msgstr "隔离级别 {} 不支持" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:145 +#: backend/ticket/builders/spider/metadata_import.py:129 +#: backend/ticket/builders/tendbsingle/metadata_import.py:107 +msgid "{} version: {} or charset: {} not match to db module: {}: {}, {}" +msgstr "{} version: {} or charset: {} not match to db module: {}: {}, {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:161 +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:172 +#: backend/ticket/builders/spider/metadata_import.py:153 +#: backend/ticket/builders/spider/metadata_import.py:168 +#: backend/ticket/builders/tendbsingle/metadata_import.py:121 +msgid "{} not found in machine part" +msgstr "{} not found in machine part" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:188 +#: backend/ticket/builders/spider/metadata_import.py:184 +#: backend/ticket/builders/tendbsingle/metadata_import.py:137 +msgid "{} cpu={} not match to {}" +msgstr "{} cpu={} not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:198 +#: backend/ticket/builders/spider/metadata_import.py:194 +#: backend/ticket/builders/tendbsingle/metadata_import.py:147 +msgid "{} mem={}GB not match to {}GB" +msgstr "{} mem={}GB not match to {}GB" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:213 +#: backend/ticket/builders/spider/metadata_import.py:209 +#: backend/ticket/builders/tendbsingle/metadata_import.py:162 +msgid "{} {} size={}GB not match to {}" +msgstr "{} {} size={}GB not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:222 +#: backend/ticket/builders/spider/metadata_import.py:218 +#: backend/ticket/builders/tendbsingle/metadata_import.py:171 +msgid "{} {} type={} not match to {}" +msgstr "{} {} type={} not match to {}" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:229 +#: backend/ticket/builders/spider/metadata_import.py:225 +#: backend/ticket/builders/tendbsingle/metadata_import.py:178 +msgid "{} mount point {} not found" +msgstr "{} mount point {} not found" + +#: backend/ticket/builders/mysql/mysql_ha_metadata_import.py:243 +msgid "MySQL高可用元数据导入" +msgstr "MySQL高可用元数据导入" -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:146 -msgid "redis清档: {}" -msgstr "redis清档: {}" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:29 +msgid "源数据库名" +msgstr "源数据库名" -#: backend/flow/engine/bamboo/scene/redis/redis_flush_data.py:154 -msgid "集群[{}]清档" -msgstr "集群[{}]清档" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:30 +msgid "目标数据库名" +msgstr "目标数据库名" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:115 -msgid "按正则删除key: {}" -msgstr "按正则删除key: {}" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:32 +msgid "重命名数据库列表" +msgstr "重命名数据库列表" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:123 -msgid "集群[{}]按正则删除keys" -msgstr "集群[{}]按正则删除keys" +#: backend/ticket/builders/mysql/mysql_ha_rename.py:67 +msgid "DB重命名执行" +msgstr "DB重命名执行" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:148 -msgid "获取磁盘空闲最大机器" -msgstr "获取磁盘空闲最大机器" +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:29 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:29 +#: backend/ticket/builders/tendbsingle/standardize.py:27 +msgid "标准化信息" +msgstr "标准化信息" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:41 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:41 +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:46 +#: backend/ticket/builders/tendbsingle/standardize.py:40 +msgid "{} 不是 {} 集群" +msgstr "{} 不是 {} 集群" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:51 +#: backend/ticket/builders/spider/mysql_spider_standardize.py:49 +msgid "{} proxy 数量异常" +msgstr "{} proxy 数量异常" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:56 +msgid "{} 存储 master 数量异常" +msgstr "{} 存储 master 数量异常" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:61 +msgid "{} 存储 slave 数量异常" +msgstr "{} 存储 slave 数量异常" + +#: backend/ticket/builders/mysql/mysql_ha_standardize.py:74 +msgid "MySQL高可用标准化" +msgstr "MySQL高可用标准化" + +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:41 +msgid "语义执行的流程ID" +msgstr "语义执行的流程ID" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:158 -msgid "按文件删除key" -msgstr "按文件删除key" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:49 +msgid "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" +msgstr "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_delete.py:163 -msgid "集群[{}]按文件删除keys" -msgstr "集群[{}]按文件删除keys" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:64 +msgid "模拟执行链接" +msgstr "模拟执行链接" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:103 -msgid "提取key: {}" -msgstr "提取key: {}" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:70 +msgid "模拟执行结果" +msgstr "模拟执行结果" -#: backend/flow/engine/bamboo/scene/redis/redis_keys_extract.py:110 -msgid "集群[{}提取keys" -msgstr "集群[{}提取keys" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:78 +msgid "无" +msgstr "无" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:136 -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:211 -msgid "proxy下发介质包" -msgstr "proxy下发介质包" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:81 +msgid "SQL高危语句" +msgstr "SQL高危语句" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:151 -msgid "{}安装proxy实例" -msgstr "{}安装proxy实例" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:140 +msgid "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" +msgstr "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:158 -msgid "{}部署bkdbmon" -msgstr "{}部署bkdbmon" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:175 +msgid "SQL语法检查查询" +msgstr "SQL语法检查查询" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:171 -msgid "{}proxy扩容 元数据" -msgstr "{}proxy扩容 元数据" +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:182 +#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:228 +#: backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py:76 +msgid "SQL模拟执行状态查询" +msgstr "SQL模拟执行状态查询" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:184 -msgid "{}添加域名" -msgstr "{}添加域名" +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:25 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:37 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:25 +msgid "目标版本包ID" +msgstr "目标版本包ID" + +#: backend/ticket/builders/mysql/mysql_local_upgrade.py:27 +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:39 +#: backend/ticket/builders/mysql/mysql_proxy_upgrade.py:27 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:28 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:31 +msgid "单据信息" +msgstr "单据信息" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:200 -msgid "主机转移" -msgstr "主机转移" +#: backend/ticket/builders/mysql/mysql_master_fail_over.py:38 +msgid "主库故障切换执行" +msgstr "主库故障切换执行" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:203 -msgid "新增proxy实例" -msgstr "新增proxy实例" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:35 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:24 +msgid "主库 IP" +msgstr "主库 IP" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:226 -msgid "{}删除域名" -msgstr "{}删除域名" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:36 +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:25 +msgid "从库 IP" +msgstr "从库 IP" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:244 -#: backend/flow/engine/bamboo/scene/redis/singele_redis_shutdown.py:136 -msgid "主机转移到空闲机" -msgstr "主机转移到空闲机" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:40 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:33 +msgid "是否检测连接" +msgstr "是否检测连接" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:249 -msgid "下架proxy实例" -msgstr "下架proxy实例" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:42 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:35 +msgid "是否检测数据同步延时情况(互切单据延时属于强制检测,故必须传True)" +msgstr "是否检测数据同步延时情况(互切单据延时属于强制检测,故必须传True)" -#: backend/flow/engine/bamboo/scene/redis/redis_proxy_scale.py:259 -msgid "proxy下架元数据" -msgstr "proxy下架元数据" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:44 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:37 +msgid "是否检测历史数据检验结果" +msgstr "是否检测历史数据检验结果" -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:140 -msgid "建立集群meet关系" -msgstr "建立集群meet关系" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:104 +msgid "主从互换执行" +msgstr "主从互换执行" -#: backend/flow/engine/bamboo/scene/redis/tendis_plus_apply_flow.py:213 -msgid "回写集群配置[predixy]" -msgstr "回写集群配置[predixy]" +#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:138 +msgid "dumper 迁移" +msgstr "dumper 迁移" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:82 -msgid "下发actuator以及riak介质" -msgstr "下发actuator以及riak介质" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:27 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:39 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:26 +msgid "新主库主机" +msgstr "新主库主机" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:93 -msgid "actuator_riak系统配置初始化" -msgstr "actuator_riak系统配置初始化" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:28 +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:40 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:27 +msgid "新从库主机" +msgstr "新从库主机" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:107 -msgid "actuator_riak部署节点" -msgstr "actuator_riak部署节点" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:35 +msgid "迁移主从信息" +msgstr "迁移主从信息" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:121 -msgid "actuator_riak节点加入集群" -msgstr "actuator_riak节点加入集群" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:39 +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:35 +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:40 +msgid "安全模式" +msgstr "安全模式" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:135 -msgid "actuator_集群变更生效" -msgstr "actuator_集群变更生效" +#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:90 +msgid "迁移主从执行" +msgstr "迁移主从执行" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:149 -msgid "actuator_初始化bucket_type" -msgstr "actuator_初始化bucket_type" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:38 +msgid "数据库模块ID" +msgstr "数据库模块ID" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:162 -msgid "riak修改元数据" -msgstr "riak修改元数据" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:46 +#: backend/ticket/builders/mysql/mysql_proxy_add.py:34 +msgid "添加信息" +msgstr "添加信息" -#: backend/flow/engine/bamboo/scene/riak/riak_cluster_apply_flow.py:172 -msgid "部署Riak集群" -msgstr "部署Riak集群" +#: backend/ticket/builders/mysql/mysql_migrate_upgrade.py:60 +msgid "集群{}无法找到最近一次备份,或最近一次备份不为logical" +msgstr "集群{}无法找到最近一次备份,或最近一次备份不为logical" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:72 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:210 -msgid "下发spider安装介质" -msgstr "下发spider安装介质" +#: backend/ticket/builders/mysql/mysql_openarea.py:26 +msgid "源DB" +msgstr "源DB" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:114 -msgid "安装Spider_slave实例" -msgstr "安装Spider_slave实例" +#: backend/ticket/builders/mysql/mysql_openarea.py:27 +msgid "目标DB" +msgstr "目标DB" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:130 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:284 -msgid "克隆权限到spider节点[{}]" -msgstr "克隆权限到spider节点[{}]" +#: backend/ticket/builders/mysql/mysql_openarea.py:28 +msgid "表结构列表" +msgstr "表结构列表" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:149 -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:307 -msgid "添加对应路由关系" -msgstr "添加对应路由关系" +#: backend/ticket/builders/mysql/mysql_openarea.py:29 +msgid "表数据列表" +msgstr "表数据列表" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:176 -msgid "集群[{}]添加spider slave节点" -msgstr "集群[{}]添加spider slave节点" +#: backend/ticket/builders/mysql/mysql_openarea.py:32 +msgid "分区执行信息" +msgstr "分区执行信息" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:252 -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:129 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:268 -msgid "安装Spider实例" -msgstr "安装Spider实例" +#: backend/ticket/builders/mysql/mysql_openarea.py:36 +msgid "db名" +msgstr "db名" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:267 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:284 -msgid "安装Spider集群中控实例" -msgstr "安装Spider集群中控实例" +#: backend/ticket/builders/mysql/mysql_openarea.py:41 +msgid "用户" +msgstr "用户" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:344 -msgid "集群[{}]添加spider master节点" -msgstr "集群[{}]添加spider master节点" +#: backend/ticket/builders/mysql/mysql_openarea.py:42 +#: backend/ticket/serializers.py:337 +msgid "IP列表" +msgstr "IP列表" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:382 -msgid "spider[{}]安装DBATools工具箱" -msgstr "spider[{}]安装DBATools工具箱" +#: backend/ticket/builders/mysql/mysql_openarea.py:44 +msgid "授权DB列表" +msgstr "授权DB列表" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:398 -msgid "spider[{}]安装mysql-monitor" -msgstr "spider[{}]安装mysql-monitor" +#: backend/ticket/builders/mysql/mysql_openarea.py:46 +msgid "准入DB列表" +msgstr "准入DB列表" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:415 -msgid "spider[{}]安装备份程序" -msgstr "spider[{}]安装备份程序" +#: backend/ticket/builders/mysql/mysql_openarea.py:49 +msgid "模板ID" +msgstr "模板ID" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:429 -msgid "安装Spider周边程序" -msgstr "安装Spider周边程序" +#: backend/ticket/builders/mysql/mysql_openarea.py:51 +#: backend/ticket/builders/mysql/mysql_partition.py:52 +#: backend/ticket/builders/mysql/mysql_partition_cron.py:28 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:29 +msgid "分区信息" +msgstr "分区信息" -#: backend/flow/engine/bamboo/scene/spider/common/common_sub_flow.py:479 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:429 -msgid "部署spider-ctl集群" -msgstr "部署spider-ctl集群" +#: backend/ticket/builders/mysql/mysql_partition.py:23 +msgid "初始化分区语句" +msgstr "初始化分区语句" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:17 -msgid "Flow模块TenDB Cluster异常" -msgstr "Flow模块TenDB Cluster异常" +#: backend/ticket/builders/mysql/mysql_partition.py:24 +msgid "所需空间Byte" +msgstr "所需空间Byte" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:28 -msgid "添加spider-master节点是分配incr初始值失败" -msgstr "添加spider-master节点是分配incr初始值失败" +#: backend/ticket/builders/mysql/mysql_partition.py:25 +msgid "表是否包含唯一键或者主键" +msgstr "表是否包含唯一键或者主键" + +#: backend/ticket/builders/mysql/mysql_partition.py:29 +msgid "配置ID" +msgstr "配置ID" + +#: backend/ticket/builders/mysql/mysql_partition.py:30 +msgid "库名匹配规则" +msgstr "库名匹配规则" -#: backend/flow/engine/bamboo/scene/spider/common/exceptions.py:34 -msgid "添加spider节点路由失败" -msgstr "添加spider节点路由失败" +#: backend/ticket/builders/mysql/mysql_partition.py:31 +msgid "表明匹配规则" +msgstr "表明匹配规则" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:209 -msgid "查询remotedb version 失败" -msgstr "查询remotedb version 失败" +#: backend/ticket/builders/mysql/mysql_partition.py:32 +msgid "初始化分区表" +msgstr "初始化分区表" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:215 -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:231 -#, python-brace-format -msgid "存在多个版本{version}" -msgstr "存在多个版本{version}" +#: backend/ticket/builders/mysql/mysql_partition.py:33 +msgid "添加分区" +msgstr "添加分区" -#: backend/flow/engine/bamboo/scene/spider/import_sqlfile_flow.py:225 -msgid "查询spider version 失败" -msgstr "查询spider version 失败" +#: backend/ticket/builders/mysql/mysql_partition.py:34 +msgid "删除分区" +msgstr "删除分区" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:87 -msgid "[{}]The cluster has not added a slave cluster, skip" -msgstr "[{}]The cluster has not added a slave cluster, skip" +#: backend/ticket/builders/mysql/mysql_partition.py:40 +msgid "分片名" +msgstr "分片名" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:96 -msgid "[{}]This type of role addition is not supported" -msgstr "[{}]This type of role addition is not supported" +#: backend/ticket/builders/mysql/mysql_partition.py:41 +msgid "执行对象列表" +msgstr "执行对象列表" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:140 -msgid "[{}]添加spider-master节点流程" -msgstr "[{}]添加spider-master节点流程" +#: backend/ticket/builders/mysql/mysql_partition.py:46 +msgid "配置ID列表" +msgstr "配置ID列表" -#: backend/flow/engine/bamboo/scene/spider/spider_add_nodes.py:177 -msgid "[{}]添加spider-slave节点流程" -msgstr "[{}]添加spider-slave节点流程" +#: backend/ticket/builders/mysql/mysql_partition.py:67 +#: backend/ticket/builders/tendbcluster/tendb_partition.py:36 +msgid "分区管理执行" +msgstr "分区管理执行" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:79 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:202 -msgid "下发Spider/tdbCtl介质包" -msgstr "下发Spider/tdbCtl介质包" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:24 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:25 +msgid "服务器IP" +msgstr "服务器IP" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:140 -msgid "spider上对中控主节点进行授权" -msgstr "spider上对中控主节点进行授权" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:26 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:27 +msgid "分区文件名" +msgstr "分区文件名" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:150 -msgid "中控主节点注册临时spider节点路由信息" -msgstr "中控主节点注册临时spider节点路由信息" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:30 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:31 +msgid "定时任务执行日期" +msgstr "定时任务执行日期" -#: backend/flow/engine/bamboo/scene/spider/spider_add_tmp_node.py:155 -msgid "{}添加临时spider节点" -msgstr "{}添加临时spider节点" +#: backend/ticket/builders/mysql/mysql_partition_cron.py:45 +#: backend/ticket/builders/tendbcluster/tendb_partition_cron.py:46 +msgid "分区管理定时任务执行" +msgstr "分区管理定时任务执行" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:167 -msgid "分片{}:创建临时用户" -msgstr "分片{}:创建临时用户" +#: backend/ticket/builders/mysql/mysql_proxy_add.py:27 +msgid "Proxy IP + 云区域" +msgstr "Proxy IP + 云区域" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:221 -msgid "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" -msgstr "分片{}:master[{}{}{}],slave[{}{}{}]的校验结果" +#: backend/ticket/builders/mysql/mysql_proxy_add.py:78 +msgid "添加PROXY执行" +msgstr "添加PROXY执行" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:236 -msgid "分片{}:master[{}{}{}]的校验任务" -msgstr "分片{}:master[{}{}{}]的校验任务" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:35 +msgid "旧Proxy实例信息" +msgstr "旧Proxy实例信息" -#: backend/flow/engine/bamboo/scene/spider/spider_checksum.py:244 -msgid "集群[{}]的校验任务" -msgstr "集群[{}]的校验任务" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:36 +msgid "新Proxy机器信息" +msgstr "新Proxy机器信息" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:121 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:120 -msgid "不支持的备份位置 {}" -msgstr "不支持的备份位置 {}" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:42 +msgid "是否强制替换" +msgstr "是否强制替换" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:134 -msgid "构造库表备份流程成功" -msgstr "构造库表备份流程成功" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:43 +msgid "替换信息" +msgstr "替换信息" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:160 -msgid "构造 spider/ctl mydumper正则" -msgstr "构造 spider/ctl mydumper正则" +#: backend/ticket/builders/mysql/mysql_proxy_switch.py:96 +msgid "替换PROXY执行" +msgstr "替换PROXY执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:184 -msgid "spider 执行库表备份" -msgstr "spider 执行库表备份" +#: backend/ticket/builders/mysql/mysql_push_peripheral_config.py:25 +msgid "单据输入" +msgstr "单据输入" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:197 -msgid "ctl 执行库表备份" -msgstr "ctl 执行库表备份" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:26 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:25 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:30 +msgid "从库实例信息" +msgstr "从库实例信息" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:208 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:191 -msgid "spider/ctl备份库表结构" -msgstr "spider/ctl备份库表结构" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:29 +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:34 +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:39 +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:33 +msgid "重建从库列表" +msgstr "重建从库列表" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:256 -msgid "构造remote mydumper正则" -msgstr "构造remote mydumper正则" +#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:72 +msgid "Slave原地重建执行" +msgstr "Slave原地重建执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:274 -msgid "remote 执行库表备份" -msgstr "remote 执行库表备份" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:26 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:28 +msgid "旧从库 IP" +msgstr "旧从库 IP" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:286 -msgid "remote 备份库表" -msgstr "remote 备份库表" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:27 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:29 +msgid "新从库 IP" +msgstr "新从库 IP" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:311 -msgid "构造运维节点正则" -msgstr "构造运维节点正则" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:31 +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:37 +msgid "集群重建信息" +msgstr "集群重建信息" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:329 -msgid "运维节点执行库表备份" -msgstr "运维节点执行库表备份" +#: backend/ticket/builders/mysql/mysql_restore_slave.py:76 +msgid "Slave重建执行" +msgstr "Slave重建执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_db_table_backup.py:340 -msgid "spider_mnt库表备份" -msgstr "spider_mnt库表备份" +#: backend/ticket/builders/mysql/mysql_single_apply.py:42 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:43 +msgid "域名关键字" +msgstr "域名关键字" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:84 -msgid "存入的存储节点数量不是偶数,请检查!" -msgstr "存入的存储节点数量不是偶数,请检查!" +#: backend/ticket/builders/mysql/mysql_single_apply.py:50 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:49 +msgid "机器规格" +msgstr "机器规格" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:316 -msgid "集群内部节点间授权" -msgstr "集群内部节点间授权" +#: backend/ticket/builders/mysql/mysql_single_apply.py:52 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:51 +msgid "申请数量" +msgstr "申请数量" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_deploy.py:328 -msgid "初始化集群节点间关系" -msgstr "初始化集群节点间关系" +#: backend/ticket/builders/mysql/mysql_single_apply.py:54 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:53 +msgid "每台机器部署的实例数量" +msgstr "每台机器部署的实例数量" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:136 -msgid "卸载spider实例" -msgstr "卸载spider实例" +#: backend/ticket/builders/mysql/mysql_single_apply.py:60 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:59 +#: backend/ticket/builders/tendbcluster/tendb_apply.py:43 +msgid "部署规格" +msgstr "部署规格" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:150 -msgid "卸载中控实例" -msgstr "卸载中控实例" +#: backend/ticket/builders/mysql/mysql_single_apply.py:68 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:67 +msgid "机器规格展示名" +msgstr "机器规格展示名" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_destroy.py:193 -msgid "下架TenDB-Cluster集群[{}]" -msgstr "下架TenDB-Cluster集群[{}]" +#: backend/ticket/builders/mysql/mysql_single_apply.py:71 +msgid "MySQL起始端口" +msgstr "MySQL起始端口" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_disable_deploy.py:103 -msgid "重启spider实例" -msgstr "重启spider实例" +#: backend/ticket/builders/mysql/mysql_single_apply.py:95 +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:89 +#, python-brace-format +msgid "不允许存在重复的域名关键字[{duplicates}]" +msgstr "不允许存在重复的域名关键字[{duplicates}]" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_enable_deploy.py:137 -msgid "启用spider集群[{}]" -msgstr "启用spider集群[{}]" +#: backend/ticket/builders/mysql/mysql_single_apply.py:204 +msgid "MySQL单节点部署执行" +msgstr "MySQL单节点部署执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:128 -msgid "{} 全备" -msgstr "{} 全备" +#: backend/ticket/builders/mysql/mysql_single_clear.py:46 +msgid "MySQL 单节点清档执行" +msgstr "MySQL 单节点清档执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:131 -msgid "构造全库备份流程成功" -msgstr "构造全库备份流程成功" +#: backend/ticket/builders/mysql/mysql_single_destroy.py:36 +msgid "MySQL单节点销毁执行" +msgstr "MySQL单节点销毁执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:167 -msgid "spider 执行全库备份" -msgstr "spider 执行全库备份" +#: backend/ticket/builders/mysql/mysql_single_disable.py:36 +msgid "MySQL单节点禁用执行" +msgstr "MySQL单节点禁用执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:180 -msgid "ctl 执行全库备份" -msgstr "ctl 执行全库备份" +#: backend/ticket/builders/mysql/mysql_single_enable.py:36 +msgid "MySQL单节点启用执行" +msgstr "MySQL单节点启用执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:238 -msgid "remote 执行全库备份" -msgstr "remote 执行全库备份" +#: backend/ticket/builders/mysql/mysql_single_rename.py:40 +msgid "MySQL 单节点DB重命名执行" +msgstr "MySQL 单节点DB重命名执行" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:250 -msgid "remote 全库备份" -msgstr "remote 全库备份" +#: backend/ticket/builders/pulsar/pulsar_apply.py:32 +msgid "至少写入成功副本数" +msgstr "至少写入成功副本数" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:285 -msgid "运维节点执行全库备份" -msgstr "运维节点执行全库备份" +#: backend/ticket/builders/pulsar/pulsar_apply.py:57 +msgid "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" +msgstr "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_full_backup.py:296 -msgid "spider_mnt全库备份" -msgstr "spider_mnt全库备份" +#: backend/ticket/builders/pulsar/pulsar_apply.py:62 +msgid "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" +msgstr "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:182 -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:186 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:190 -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:194 -msgid "预清理备份库" -msgstr "预清理备份库" +#: backend/ticket/builders/pulsar/pulsar_apply.py:67 +msgid "broker节点数小于1台! 请保证broker的部署节点数至少为1" +msgstr "broker节点数小于1台! 请保证broker的部署节点数至少为1" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:240 -msgid "适配备份库映射" -msgstr "适配备份库映射" +#: backend/ticket/builders/pulsar/pulsar_apply.py:71 +msgid "请保证副本数量至少为2,且不超过bookkeeper数量" +msgstr "请保证副本数量至少为2,且不超过bookkeeper数量" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:246 -msgid "重建备份库" -msgstr "重建备份库" +#: backend/ticket/builders/pulsar/pulsar_apply.py:74 +msgid "最小成功写入副本数量不得大于副本数量" +msgstr "最小成功写入副本数量不得大于副本数量" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:283 -msgid "{} on remote {} 清档" -msgstr "{} on remote {} 清档" +#: backend/ticket/builders/pulsar/pulsar_apply.py:101 +#: backend/ticket/constants.py:359 +msgid "Pulsar 集群部署" +msgstr "Pulsar 集群部署" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:294 -msgid "处理集群表" -msgstr "处理集群表" +#: backend/ticket/builders/pulsar/pulsar_destroy.py:37 +#: backend/ticket/constants.py:366 +msgid "Pulsar 集群删除" +msgstr "Pulsar 集群删除" -#: backend/flow/engine/bamboo/scene/spider/spider_cluster_truncate_database.py:311 -msgid "构造清档流程成功" -msgstr "构造清档流程成功" +#: backend/ticket/builders/pulsar/pulsar_disable.py:40 +#: backend/ticket/constants.py:365 +msgid "Pulsar 集群禁用" +msgstr "Pulsar 集群禁用" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:110 -msgid "partition_sql_file_{}_{}_{}_{}.txt" -msgstr "partition_sql_file_{}_{}_{}_{}.txt" +#: backend/ticket/builders/pulsar/pulsar_enable.py:40 +#: backend/ticket/constants.py:364 +msgid "Pulsar 集群启用" +msgstr "Pulsar 集群启用" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:113 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:124 -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:145 -msgid "{}: {}" -msgstr "{}: {}" +#: backend/ticket/builders/pulsar/pulsar_reboot.py:39 +msgid "Pulsar 集群重启" +msgstr "Pulsar 集群重启" -#: backend/flow/engine/bamboo/scene/spider/spider_partition.py:167 -msgid "构建spider partition流程成功" -msgstr "构建spider partition流程成功" +#: backend/ticket/builders/pulsar/pulsar_replace.py:46 +#: backend/ticket/constants.py:363 +msgid "Pulsar 集群替换" +msgstr "Pulsar 集群替换" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:307 -msgid "{} on remote {} 重命名数据库" -msgstr "{} on remote {} 重命名数据库" +#: backend/ticket/builders/pulsar/pulsar_scale_up.py:46 +#: backend/ticket/constants.py:360 +msgid "Pulsar 集群扩容" +msgstr "Pulsar 集群扩容" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:315 -msgid "删除集群源库" -msgstr "删除集群源库" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:35 +msgid "bookkeeper信息列表" +msgstr "bookkeeper信息列表" -#: backend/flow/engine/bamboo/scene/spider/spider_rename_database_flow.py:323 -msgid "构造数据库重命名流程成功" -msgstr "构造数据库重命名流程成功" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:61 +msgid "{}: 至少保留{}台!" +msgstr "{}: 至少保留{}台!" -#: backend/flow/engine/bamboo/scene/spider/spider_slave_cluster_deploy.py:106 -msgid "[{}]添加slave集群" -msgstr "[{}]添加slave集群" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:64 +msgid "请选择Broker和BookKeeper实例进行缩容" +msgstr "请选择Broker和BookKeeper实例进行缩容" -#: backend/flow/engine/exceptions.py:28 -msgid "组件服务未部署" -msgstr "组件服务未部署" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:69 +msgid "缩容不支持ZooKeeper" +msgstr "缩容不支持ZooKeeper" -#: backend/flow/engine/exceptions.py:32 -msgid "MySQL备份位置异常" -msgstr "MySQL备份位置异常" +#: backend/ticket/builders/pulsar/pulsar_shrink.py:85 +#: backend/ticket/constants.py:361 +msgid "Pulsar 集群缩容" +msgstr "Pulsar 集群缩容" -#: backend/flow/engine/exceptions.py:37 -msgid "MySQL备份方式和位置不兼容" -msgstr "MySQL备份方式和位置不兼容" +#: backend/ticket/builders/redis/base.py:48 +msgid "集群【{}({})】锁定中,请等待" +msgstr "集群【{}({})】锁定中,请等待" -#: backend/flow/engine/exceptions.py:38 -#, python-brace-format -msgid "MySQL备份方式{backup_type}和位置{backup_local}不兼容" -msgstr "MySQL备份方式{backup_type}和位置{backup_local}不兼容" +#: backend/ticket/builders/redis/base.py:50 +msgid "集群【{}】不存在" +msgstr "集群【{}】不存在" -#: backend/flow/models.py:22 backend/flow/models.py:38 -msgid "流程ID" -msgstr "流程ID" +#: backend/ticket/builders/redis/base.py:57 +msgid "提取/删除/备份规则列表" +msgstr "提取/删除/备份规则列表" -#: backend/flow/models.py:23 -msgid "流程树" -msgstr "流程树" +#: backend/ticket/builders/redis/base.py:145 +msgid "集群{}已被禁用,请先启用!" +msgstr "集群{}已被禁用,请先启用!" -#: backend/flow/models.py:25 backend/ticket/serializers.py:108 -msgid "流程状态" -msgstr "流程状态" +#: backend/ticket/builders/redis/base.py:147 +msgid "集群{}不存在." +msgstr "集群{}不存在." -#: backend/flow/models.py:27 -msgid "流程创建人" -msgstr "流程创建人" +#: backend/ticket/builders/redis/plugin_create_clb.py:42 +msgid "创建CLB" +msgstr "创建CLB" -#: backend/flow/models.py:28 -msgid "启动时间" -msgstr "启动时间" +#: backend/ticket/builders/redis/plugin_create_polaris.py:42 +msgid "创建Polaris" +msgstr "创建Polaris" -#: backend/flow/models.py:29 -msgid "流程结束时间" -msgstr "流程结束时间" +#: backend/ticket/builders/redis/plugin_delete_clb.py:42 +msgid "删除CLB" +msgstr "删除CLB" -#: backend/flow/models.py:40 -msgid "当前版本ID" -msgstr "当前版本ID" +#: backend/ticket/builders/redis/plugin_delete_polaris.py:42 +msgid "删除Polaris" +msgstr "删除Polaris" + +#: backend/ticket/builders/redis/plugin_dns_bind_clb.py:42 +msgid "域名绑定CLB" +msgstr "域名绑定CLB" -#: backend/flow/models.py:42 -msgid "节点状态" -msgstr "节点状态" +#: backend/ticket/builders/redis/plugin_dns_unbind_clb.py:42 +msgid "域名接绑CLB" +msgstr "域名接绑CLB" -#: backend/flow/models.py:44 -msgid "节点运行时IP" -msgstr "节点运行时IP" +#: backend/ticket/builders/redis/redis_backup.py:67 +msgid "集群备份" +msgstr "集群备份" -#: backend/flow/models.py:46 -msgid "开始执行时间" -msgstr "开始执行时间" +#: backend/ticket/builders/redis/redis_close.py:51 +#: backend/ticket/builders/redis/redis_close.py:69 +msgid "禁用集群" +msgstr "禁用集群" -#: backend/flow/plugins/components/collections/cloud/exec_service_script.py:58 -msgid "该节点{}获取到执行ip信息为空,请联系系统管理员" -msgstr "该节点{}获取到执行ip信息为空,请联系系统管理员" +#: backend/ticket/builders/redis/redis_close.py:56 +#: backend/ticket/builders/redis/redis_open.py:53 +msgid "是否强制" +msgstr "是否强制" -#: backend/flow/plugins/components/collections/cloud/push_config_file.py:56 -#: backend/flow/plugins/components/collections/cloud/trans_files.py:59 -#: backend/flow/plugins/components/collections/es/trans_files.py:63 -#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:70 -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:99 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:85 -#: backend/flow/plugins/components/collections/redis/trans_flies.py:79 -#: backend/flow/plugins/components/collections/riak/trans_files.py:63 -msgid "[{}] 下发介质包参数:{}" -msgstr "[{}] 下发介质包参数:{}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:28 +#: backend/ticket/builders/redis/redis_instance_apply.py:41 +msgid "集群端口" +msgstr "集群端口" -#: backend/flow/plugins/components/collections/cloud/trans_files.py:44 -msgid "该节点{}获取到执行ip信息为空,请联系系统管理员{}" -msgstr "该节点{}获取到执行ip信息为空,请联系系统管理员{}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:39 +msgid "申请容量" +msgstr "申请容量" -#: backend/flow/plugins/components/collections/common/base_service.py:83 -msgid "[{}] 运行成功" -msgstr "[{}] 运行成功" +#: backend/ticket/builders/redis/redis_cluster_apply.py:40 +msgid "申请容量详情" +msgstr "申请容量详情" -#: backend/flow/plugins/components/collections/common/base_service.py:87 -msgid "[{}] 失败: {}" -msgstr "[{}] 失败: {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:42 +#: backend/ticket/builders/redis/redis_instance_apply.py:30 +msgid "集群ID(英文数字及下划线)" +msgstr "集群ID(英文数字及下划线)" -#: backend/flow/plugins/components/collections/common/base_service.py:216 -msgid "[写入上下文结果失败] failed: {}" -msgstr "[写入上下文结果失败] failed: {}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:44 +msgid "proxy访问密码" +msgstr "proxy访问密码" -#: backend/flow/plugins/components/collections/common/base_service.py:253 -msgid "[{}] 任务正在执行🤔" -msgstr "[{}] 任务正在执行🤔" +#: backend/ticket/builders/redis/redis_cluster_apply.py:48 +#: backend/ticket/builders/redis/redis_instance_apply.py:47 +msgid "proxy部署方案" +msgstr "proxy部署方案" -#: backend/flow/plugins/components/collections/common/base_service.py:262 -msgid "[{}] 任务调度失败😱" -msgstr "[{}] 任务调度失败😱" +#: backend/ticket/builders/redis/redis_cluster_apply.py:72 +msgid "redis集群部署的集群分片数至少大于3" +msgstr "redis集群部署的集群分片数至少大于3" -#: backend/flow/plugins/components/collections/common/base_service.py:273 -msgid "[{}]任务调度成功🥳︎" -msgstr "[{}]任务调度成功🥳︎" +#: backend/ticket/builders/redis/redis_cluster_apply.py:105 +msgid "master、slave、proxy中存在重复节点" +msgstr "master、slave、proxy中存在重复节点" -#: backend/flow/plugins/components/collections/common/base_service.py:279 -msgid "[{}]该节点需要获取执行后日志,赋值到trans_data" -msgstr "[{}]该节点需要获取执行后日志,赋值到trans_data" +#: backend/ticket/builders/redis/redis_cluster_apply.py:109 +msgid "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" +msgstr "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" -#: backend/flow/plugins/components/collections/common/base_service.py:290 -msgid "[{}] 获取执行后日志失败,获取ip[{}]" -msgstr "[{}] 获取执行后日志失败,获取ip[{}]" +#: backend/ticket/builders/redis/redis_cluster_apply.py:111 +msgid "proxy至少提供2台机器" +msgstr "proxy至少提供2台机器" -#: backend/flow/plugins/components/collections/common/bigdata_manager_service.py:123 -msgid "无法找到Manager处理类型,请联系系统管理员:{}" -msgstr "无法找到Manager处理类型,请联系系统管理员:{}" +#: backend/ticket/builders/redis/redis_cluster_apply.py:282 +#: backend/ticket/constants.py:289 +msgid "Redis 集群部署" +msgstr "Redis 集群部署" -#: backend/flow/plugins/components/collections/common/create_ticket.py:36 -msgid "未知单据类型, {}不存在于已知单据类型中" -msgstr "未知单据类型, {}不存在于已知单据类型中" +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:31 +msgid "集群新域名" +msgstr "集群新域名" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:32 +msgid "集群额外信息" +msgstr "集群额外信息" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:38 +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:47 +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:45 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:42 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:54 +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:76 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:38 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:62 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:36 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:37 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:58 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:42 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:83 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:86 +msgid "批量操作参数列表" +msgstr "批量操作参数列表" + +#: backend/ticket/builders/redis/redis_cluster_rename_domain.py:52 +msgid "集群域名重命名" +msgstr "集群域名重命名" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:24 +msgid "节点类型" +msgstr "节点类型" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:25 +msgid "当前版本列表" +msgstr "当前版本列表" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:26 +msgid "目标版本" +msgstr "目标版本" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:28 +msgid "版本升级信息" +msgstr "版本升级信息" + +#: backend/ticket/builders/redis/redis_cluster_version_update.py:45 +msgid "redis 集群版本升级" +msgstr "redis 集群版本升级" + +#: backend/ticket/builders/redis/redis_destroy.py:49 +#: backend/ticket/builders/redis/redis_destroy.py:65 +msgid "下架集群" +msgstr "下架集群" -#: backend/flow/plugins/components/collections/common/create_ticket.py:41 -msgid "不允许自动创建单据,单据创建流程结束" -msgstr "不允许自动创建单据,单据创建流程结束" +#: backend/ticket/builders/redis/redis_instance_apply.py:31 +msgid "db数量" +msgstr "db数量" -#: backend/flow/plugins/components/collections/common/external_service.py:36 -msgid "第三方接口: {} 请求成功! 返回参数为: {}" -msgstr "第三方接口: {} 请求成功! 返回参数为: {}" +#: backend/ticket/builders/redis/redis_instance_apply.py:32 +msgid "追加部署的主机信息" +msgstr "追加部署的主机信息" -#: backend/flow/plugins/components/collections/common/external_service.py:38 -msgid "第三方接口:{} 调用失败!错误信息为: {}" -msgstr "第三方接口:{} 调用失败!错误信息为: {}" +#: backend/ticket/builders/redis/redis_instance_apply.py:42 +msgid "访问密码" +msgstr "访问密码" -#: backend/flow/plugins/components/collections/common/external_service.py:40 -msgid "请求遇到未知错误!错误信息为: {}" -msgstr "请求遇到未知错误!错误信息为: {}" +#: backend/ticket/builders/redis/redis_instance_apply.py:49 +msgid "是否是追加部署" +msgstr "是否是追加部署" -#: backend/flow/plugins/components/collections/common/pause.py:44 -msgid "【{}】自动化流程待确认,是否继续?" -msgstr "【{}】自动化流程待确认,是否继续?" +#: backend/ticket/builders/redis/redis_instance_apply.py:68 +msgid "请保证机器组数{}能整除集群数{}" +msgstr "请保证机器组数{}能整除集群数{}" -#: backend/flow/plugins/components/collections/common/pause.py:78 -msgid "回调数据" -msgstr "回调数据" +#: backend/ticket/builders/redis/redis_instance_apply.py:167 +msgid "Redis 主从部署" +msgstr "Redis 主从部署" -#: backend/flow/plugins/components/collections/common/pause.py:87 -#: backend/ticket/constants.py:315 -msgid "暂停" -msgstr "暂停" +#: backend/ticket/builders/redis/redis_key_delete.py:30 +msgid "删除方式" +msgstr "删除方式" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:38 -msgid "{}-空闲检查" -msgstr "{}-空闲检查" +#: backend/ticket/builders/redis/redis_key_delete.py:90 +msgid "删除Key" +msgstr "删除Key" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:70 -#: backend/flow/plugins/components/collections/common/sa_init.py:66 -msgid "空闲检查失败" -msgstr "空闲检查失败" +#: backend/ticket/builders/redis/redis_key_extract.py:67 +msgid "提取Key" +msgstr "提取Key" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:72 -#: backend/flow/plugins/components/collections/common/sa_init.py:68 -msgid "任务状态异常{}" -msgstr "任务状态异常{}" +#: backend/ticket/builders/redis/redis_maxmemory_set.py:80 +msgid "集群maxmemory设置" +msgstr "集群maxmemory设置" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:85 -msgid "错误详情{}" -msgstr "错误详情{}" +#: backend/ticket/builders/redis/redis_open.py:48 +#: backend/ticket/builders/redis/redis_open.py:66 +msgid "启用集群" +msgstr "启用集群" -#: backend/flow/plugins/components/collections/common/sa_idle_check.py:90 -msgid "sa空闲检查" -msgstr "sa空闲检查" +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:31 +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:33 +msgid "主从切换对" +msgstr "主从切换对" + +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:43 +msgid "集群{}不存在异常的从库主机" +msgstr "集群{}不存在异常的从库主机" + +#: backend/ticket/builders/redis/redis_toolbox_add_slave.py:74 +msgid "Redis 新建从库" +msgstr "Redis 新建从库" + +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:40 +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:38 +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:35 +msgid "slave列表" +msgstr "slave列表" + +#: backend/ticket/builders/redis/redis_toolbox_autofix.py:93 +msgid "故障自愈" +msgstr "故障自愈" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:37 +msgid "master列表" +msgstr "master列表" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:39 +msgid "资源申请信息(前端不用传递,后台渲染)" +msgstr "资源申请信息(前端不用传递,后台渲染)" + +#: backend/ticket/builders/redis/redis_toolbox_cut_off.py:95 +msgid "整机替换" +msgstr "整机替换" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:29 +msgid "源集群访问入口" +msgstr "源集群访问入口" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:30 +msgid "目标集群访问入口" +msgstr "目标集群访问入口" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:32 +msgid "源实例列表" +msgstr "源实例列表" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:32 +msgid "IP:PORT" +msgstr "IP:PORT" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:34 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:38 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:29 +msgid "包含key" +msgstr "包含key" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:35 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:39 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:30 +msgid "排除key" +msgstr "排除key" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:37 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:48 +msgid "执行模式" +msgstr "执行模式" -#: backend/flow/plugins/components/collections/common/sa_init.py:35 -msgid "SA初始化" -msgstr "SA初始化" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:38 +msgid "执行模式为定时执行时,需要设置执行时间" +msgstr "执行模式为定时执行时,需要设置执行时间" -#: backend/flow/plugins/components/collections/common/sa_init.py:82 -msgid "sa初始化" -msgstr "sa初始化" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:40 +msgid "是否保持校验" +msgstr "是否保持校验" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:50 -msgid "定时时间" -msgstr "定时时间" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:41 +msgid "校验终止时间,当不保持校验时,需要设置该时间" +msgstr "校验终止时间,当不保持校验时,需要设置该时间" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:53 -#, python-format -msgid "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" -msgstr "定时时间,格式为秒(s) 或 (%%Y-%%m-%%d %%H:%%M:%%S)" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:43 +msgid "是否修复数据" +msgstr "是否修复数据" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:56 -msgid "是否强制晚于当前时间" -msgstr "是否强制晚于当前时间" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:44 +msgid "数据修复模式" +msgstr "数据修复模式" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:59 -msgid "" -"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" -msgstr "" -"用户输入日期格式时是否强制要求时间晚于当前时间,只对日期格式定时输入有效" +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:46 +msgid "批量校验与修复列表" +msgstr "批量校验与修复列表" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:53 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:105 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:69 +msgid "请补齐缺少正则配置的行" +msgstr "请补齐缺少正则配置的行" + +#: backend/ticket/builders/redis/redis_toolbox_data_check_repair.py:74 +#: backend/ticket/constants.py:316 +msgid "Redis 数据校验与修复" +msgstr "Redis 数据校验与修复" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:51 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:57 +msgid "集群IP端口" +msgstr "集群IP端口" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:52 +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:58 +msgid "集群访问密码" +msgstr "集群访问密码" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:80 +msgid "批量数据复制列表" +msgstr "批量数据复制列表" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:99 +msgid "仅支持两个不同集群间的复制: {}" +msgstr "仅支持两个不同集群间的复制: {}" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:102 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:66 +msgid "源集群不能重复: {}" +msgstr "源集群不能重复: {}" + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:109 +msgid "源集群{}不存在,请确认." +msgstr "源集群{}不存在,请确认." + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:111 +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:39 +msgid "目标集群{}不存在,请确认." +msgstr "目标集群{}不存在,请确认." + +#: backend/ticket/builders/redis/redis_toolbox_data_copy.py:134 +msgid "Redis 数据复制" +msgstr "Redis 数据复制" + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:29 +msgid "关联单据ID" +msgstr "关联单据ID" + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:48 +msgid "集群{}: 没有找到未销毁的实例." +msgstr "集群{}: 没有找到未销毁的实例." + +#: backend/ticket/builders/redis/redis_toolbox_datastruct_task_delete.py:65 +msgid "Redis 销毁构造实例" +msgstr "Redis 销毁构造实例" + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:38 +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:31 +msgid "待构造时间点" +msgstr "待构造时间点" + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:52 +msgid "集群{}: 主机数量({})不能大于实例数量({})." +msgstr "集群{}: 主机数量({})不能大于实例数量({})." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:66 +msgid "集群{}: 不支持部分实例构造." +msgstr "集群{}: 不支持部分实例构造." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:71 +msgid "集群{}: 构造时间最多向前追溯15天." +msgstr "集群{}: 构造时间最多向前追溯15天." + +#: backend/ticket/builders/redis/redis_toolbox_fixpoint_make.py:106 +msgid "Redis 定点构造" +msgstr "Redis 定点构造" + +#: backend/ticket/builders/redis/redis_toolbox_instance_shutdown.py:52 +msgid "实例下架" +msgstr "实例下架" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:29 +msgid "master主机" +msgstr "master主机" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:30 +msgid "slave主机" +msgstr "slave主机" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:35 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:33 +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:50 +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:55 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:58 +msgid "切换类型" +msgstr "切换类型" + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:52 +msgid "集群{}的主从关系不匹配:{} -> {}." +msgstr "集群{}的主从关系不匹配:{} -> {}." + +#: backend/ticket/builders/redis/redis_toolbox_master_slave_switch.py:73 +#: backend/ticket/constants.py:305 +msgid "Redis 主从切换" +msgstr "Redis 主从切换" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:28 +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:33 +msgid "目标proxy数量" +msgstr "目标proxy数量" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:30 +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:28 +msgid "缩容指定主机" +msgstr "缩容指定主机" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:48 +msgid "请保证集群{}缩容后proxy数量不小于2" +msgstr "请保证集群{}缩容后proxy数量不小于2" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py:64 +msgid "Proxy缩容" +msgstr "Proxy缩容" + +#: backend/ticket/builders/redis/redis_toolbox_proxy_scale_up.py:65 +msgid "Proxy扩容" +msgstr "Proxy扩容" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:45 +msgid "部署机器组数" +msgstr "部署机器组数" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:53 +msgid "容量变更类型" +msgstr "容量变更类型" + +#: backend/ticket/builders/redis/redis_toolbox_redis_scale_updown.py:80 +#: backend/ticket/constants.py:301 +msgid "Redis 集群容量变更" +msgstr "Redis 集群容量变更" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:27 +msgid "构造产物访问入口(ip:port)" +msgstr "构造产物访问入口(ip:port)" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:60 +msgid "构造记录不存在,请确认: {}" +msgstr "构造记录不存在,请确认: {}" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:63 +msgid "目标集群不能重复: {}" +msgstr "目标集群不能重复: {}" + +#: backend/ticket/builders/redis/redis_toolbox_rollback_data_copy.py:88 +#: backend/ticket/constants.py:315 +msgid "Redis 构造实例数据回写" +msgstr "Redis 构造实例数据回写" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:43 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:44 +msgid "申请proxy资源" +msgstr "申请proxy资源" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:44 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:45 +msgid "申请redis主从资源" +msgstr "申请redis主从资源" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:47 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:48 +msgid "当前规格ID" +msgstr "当前规格ID" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:48 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:49 +msgid "当前分片数" +msgstr "当前分片数" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:49 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:50 +msgid "目标分片数" +msgstr "目标分片数" + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:63 +msgid "集群({}):目标分片数({})和原始分片数({})相同." +msgstr "集群({}):目标分片数({})和原始分片数({})相同." + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:72 +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:75 +msgid "集群({}):{} 类集群不支持版本 {}." +msgstr "集群({}):{} 类集群不支持版本 {}." + +#: backend/ticket/builders/redis/redis_toolbox_shard_update.py:105 +msgid "Redis 集群分片变更" +msgstr "Redis 集群分片变更" + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:51 +msgid "当前集群类型" +msgstr "当前集群类型" + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:66 +msgid "集群({}):目标类型({})和原始类型({})相同." +msgstr "集群({}):目标类型({})和原始类型({})相同." + +#: backend/ticket/builders/redis/redis_toolbox_type_update.py:108 +#: backend/ticket/constants.py:313 +msgid "Redis 集群类型变更" +msgstr "Redis 集群类型变更" + +#: backend/ticket/builders/riak/riak_apply.py:77 +msgid "Riak 集群部署执行" +msgstr "Riak 集群部署执行" + +#: backend/ticket/builders/riak/riak_destroy.py:43 +#: backend/ticket/constants.py:389 +msgid "Riak 集群销毁" +msgstr "Riak 集群销毁" + +#: backend/ticket/builders/riak/riak_disable.py:46 +#: backend/ticket/constants.py:391 +msgid "Riak 集群禁用" +msgstr "Riak 集群禁用" + +#: backend/ticket/builders/riak/riak_enable.py:46 +#: backend/ticket/constants.py:390 +msgid "Riak 集群启用" +msgstr "Riak 集群启用" + +#: backend/ticket/builders/riak/riak_migrate.py:69 +msgid "Riak 集群迁移执行" +msgstr "Riak 集群迁移执行" + +#: backend/ticket/builders/riak/riak_reboot.py:28 +msgid "重启主机ID" +msgstr "重启主机ID" + +#: backend/ticket/builders/riak/riak_reboot.py:35 +msgid "等待重启的riak节点{}不存在,请重新选择" +msgstr "等待重启的riak节点{}不存在,请重新选择" + +#: backend/ticket/builders/riak/riak_reboot.py:52 +msgid "Riak 集群重启" +msgstr "Riak 集群重启" + +#: backend/ticket/builders/riak/riak_scale_up.py:62 +#: backend/ticket/constants.py:387 +msgid "Riak 集群扩容" +msgstr "Riak 集群扩容" + +#: backend/ticket/builders/riak/riak_shrink.py:45 +#: backend/ticket/constants.py:388 +msgid "Riak 集群缩容" +msgstr "Riak 集群缩容" + +#: backend/ticket/builders/spider/metadata_import.py:34 +msgid "spider规格ID" +msgstr "spider规格ID" + +#: backend/ticket/builders/spider/metadata_import.py:35 +msgid "remote规格ID" +msgstr "remote规格ID" + +#: backend/ticket/builders/spider/metadata_import.py:82 +msgid "spider_spec_id: {} 不存在" +msgstr "spider_spec_id: {} 不存在" + +#: backend/ticket/builders/spider/metadata_import.py:89 +msgid "remote_spec_id: {} 不存在" +msgstr "remote_spec_id: {} 不存在" + +#: backend/ticket/builders/spider/mysql_spider_standardize.py:73 +msgid "TendbCluster 高可用标准化" +msgstr "TendbCluster 高可用标准化" + +#: backend/ticket/builders/sqlserver/base.py:85 +msgid "副本集实例状态异常,暂时无法执行该单据类型:{}" +msgstr "副本集实例状态异常,暂时无法执行该单据类型:{}" + +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:37 +msgid "新slave机器信息" +msgstr "新slave机器信息" + +#: backend/ticket/builders/sqlserver/sqlserver_add_slave.py:66 +msgid "SQLServer 添加Slave执行" +msgstr "SQLServer 添加Slave执行" + +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:62 +msgid "SQLServer 授权执行" +msgstr "SQLServer 授权执行" + +#: backend/ticket/builders/sqlserver/sqlserver_authorize.py:79 +msgid "SQLServer Excel授权执行" +msgstr "SQLServer Excel授权执行" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:28 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:41 +msgid "备份db列表" +msgstr "备份db列表" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:32 +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:51 +msgid "备份位置(先固定为master)" +msgstr "备份位置(先固定为master)" + +#: backend/ticket/builders/sqlserver/sqlserver_backup.py:67 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:153 +msgid "SQLServer 库表备份执行" +msgstr "SQLServer 库表备份执行" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:42 +msgid "同步的数据库" +msgstr "同步的数据库" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:44 +msgid "同步信息列表" +msgstr "同步信息列表" + +#: backend/ticket/builders/sqlserver/sqlserver_build_db_sync_for_autofix.py:61 +msgid "SQLServer 同步数据" +msgstr "SQLServer 同步数据" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:26 +msgid "清档db列表" +msgstr "清档db列表" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:27 +msgid "清档db正则列表" +msgstr "清档db正则列表" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:29 +msgid "忽略db正则列表" +msgstr "忽略db正则列表" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:31 +msgid "清档表" +msgstr "清档表" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:32 +msgid "忽略表" +msgstr "忽略表" + +#: backend/ticket/builders/sqlserver/sqlserver_clear.py:56 +msgid "SQLServer 清档执行" +msgstr "SQLServer 清档执行" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:30 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:33 +msgid "源集群库名" +msgstr "源集群库名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:31 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:34 +msgid "目标集群库名" +msgstr "目标集群库名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:33 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:36 +msgid "集群重命名库名" +msgstr "集群重命名库名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:48 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:52 +msgid "迁移DB信息" +msgstr "迁移DB信息" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:49 +msgid "迁移记录ID" +msgstr "迁移记录ID" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:51 +msgid "迁移后,系统是否对源DB进行重命名" +msgstr "迁移后,系统是否对源DB进行重命名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:52 +msgid "手动终止迁移" +msgstr "手动终止迁移" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:53 +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:56 +msgid "迁移信息列表" +msgstr "迁移信息列表" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:149 +msgid "SQLServer 全备迁移执行" +msgstr "SQLServer 全备迁移执行" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:213 +msgid "SQLServer 增量迁移执行(断开同步)" +msgstr "SQLServer 增量迁移执行(断开同步)" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:225 +msgid "SQLServer 目标数据库重命名" +msgstr "SQLServer 目标数据库重命名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:231 +msgid "SQLServer 源数据库重命名" +msgstr "SQLServer 源数据库重命名" + +#: backend/ticket/builders/sqlserver/sqlserver_data_migrate.py:252 +msgid "SQLServer 增量迁移执行" +msgstr "SQLServer 增量迁移执行" + +#: backend/ticket/builders/sqlserver/sqlserver_dbrename.py:68 +msgid "SQLServer DB重命名执行" +msgstr "SQLServer DB重命名执行" + +#: backend/ticket/builders/sqlserver/sqlserver_destroy.py:35 +msgid "SQLServer 销毁执行" +msgstr "SQLServer 销毁执行" + +#: backend/ticket/builders/sqlserver/sqlserver_disable.py:38 +msgid "SQLServer 禁用执行" +msgstr "SQLServer 禁用执行" + +#: backend/ticket/builders/sqlserver/sqlserver_enable.py:39 +msgid "SQLServer 启用执行" +msgstr "SQLServer 启用执行" + +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:49 +msgid "机器输入数量{}有误,预期数量{}" +msgstr "机器输入数量{}有误,预期数量{}" + +#: backend/ticket/builders/sqlserver/sqlserver_ha_apply.py:114 +msgid "SQLServer 高可用部署执行" +msgstr "SQLServer 高可用部署执行" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:31 +msgid "执行DB" +msgstr "执行DB" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:42 +msgid "忽略备份db列表" +msgstr "忽略备份db列表" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:88 +msgid "所选备份DB信息为空,请检查库表正则" +msgstr "所选备份DB信息为空,请检查库表正则" + +#: backend/ticket/builders/sqlserver/sqlserver_import_sqlfile.py:162 +msgid "定时执行(人工确认)" +msgstr "定时执行(人工确认)" + +#: backend/ticket/builders/sqlserver/sqlserver_master_fail_over.py:24 +msgid "是否强制切换(强切固定为true)" +msgstr "是否强制切换(强切固定为true)" + +#: backend/ticket/builders/sqlserver/sqlserver_master_fail_over.py:44 +msgid "SQLServer 主故障切换执行" +msgstr "SQLServer 主故障切换执行" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:83 -#, python-format -msgid "输入参数%s不符合【时区(+08:00、-08:00)】格式" -msgstr "输入参数%s不符合【时区(+08:00、-08:00)】格式" +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:29 +msgid "是否强制切换(互切固定为false)" +msgstr "是否强制切换(互切固定为false)" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:98 -msgid "定时时间需晚于当前时间" -msgstr "定时时间需晚于当前时间" +#: backend/ticket/builders/sqlserver/sqlserver_master_slave_switch.py:55 +msgid "SQLServer 主从互换执行" +msgstr "SQLServer 主从互换执行" -#: backend/flow/plugins/components/collections/common/sleep_timer_service.py:106 -#, python-format -msgid "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" -msgstr "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:27 +msgid "重置集群名" +msgstr "重置集群名" -#: backend/flow/plugins/components/collections/es/es_dns_manage.py:61 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:37 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:48 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:75 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:57 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:69 -#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:29 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:43 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:78 -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:44 -msgid "该节点获取到执行ip信息为空,请联系系统管理员" -msgstr "该节点获取到执行ip信息为空,请联系系统管理员" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:28 +msgid "重置集群主域名" +msgstr "重置集群主域名" -#: backend/flow/plugins/components/collections/es/es_dns_manage.py:146 -#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:71 -#: backend/flow/plugins/components/collections/kafka/dns_manage.py:93 -#: backend/flow/plugins/components/collections/mysql/dns_manage.py:84 -#: backend/flow/plugins/components/collections/pulsar/pulsar_dns_manage.py:61 -#: backend/flow/plugins/components/collections/pulsar/pulsar_zk_dns_manage.py:51 -#: backend/flow/plugins/components/collections/redis/dns_manage.py:84 -msgid "无法适配到传入的域名处理类型,请联系系统管理员:{}" -msgstr "无法适配到传入的域名处理类型,请联系系统管理员:{}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:29 +msgid "重置集群从域名" +msgstr "重置集群从域名" -#: backend/flow/plugins/components/collections/es/exec_es_actuator_script.py:65 -#: backend/flow/plugins/components/collections/es/trans_files.py:47 -#: backend/flow/plugins/components/collections/hdfs/exec_actuator_script.py:69 -#: backend/flow/plugins/components/collections/hdfs/trans_flies.py:53 -#: backend/flow/plugins/components/collections/influxdb/exec_actuator_script.py:62 -#: backend/flow/plugins/components/collections/kafka/exec_actuator_script.py:62 -#: backend/flow/plugins/components/collections/mysql/exec_actuator_script.py:103 -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:60 -#: backend/flow/plugins/components/collections/pulsar/exec_actuator_script.py:66 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:46 -#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:82 -#: backend/flow/plugins/components/collections/redis/trans_flies.py:61 -#: backend/flow/plugins/components/collections/riak/exec_actuator_script.py:80 -#: backend/flow/plugins/components/collections/riak/trans_files.py:47 -msgid "该节点获取到执行ip信息为空,请联系系统管理员{}" -msgstr "该节点获取到执行ip信息为空,请联系系统管理员{}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:31 +msgid "集群重置信息" +msgstr "集群重置信息" -#: backend/flow/plugins/components/collections/es/get_es_resource.py:57 -#: backend/flow/plugins/components/collections/kafka/get_kafka_resource.py:50 -msgid "获取机器资源成功成功。 {}" -msgstr "获取机器资源成功成功。 {}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:38 +msgid "集群:{}不处于禁用态,无法重置" +msgstr "集群:{}不处于禁用态,无法重置" -#: backend/flow/plugins/components/collections/hdfs/get_hdfs_resource.py:61 -#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:48 -msgid "获取机器资源成功。 {}" -msgstr "获取机器资源成功。 {}" +#: backend/ticket/builders/sqlserver/sqlserver_reset.py:53 +msgid "SQLServer 集群重置执行" +msgstr "SQLServer 集群重置执行" -#: backend/flow/plugins/components/collections/hdfs/hdfs_dns_manage.py:48 -msgid "获取DNS操作IP为空" -msgstr "获取DNS操作IP为空" +#: backend/ticket/builders/sqlserver/sqlserver_restore_local_slave.py:57 +msgid "SQLServer Slave原地重建执行" +msgstr "SQLServer Slave原地重建执行" -#: backend/flow/plugins/components/collections/hdfs/update_hdfs_resource.py:67 -msgid "更新机器资源成功成功。 {}" -msgstr "更新机器资源成功成功。 {}" +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:36 +msgid "旧slave机器信息" +msgstr "旧slave机器信息" -#: backend/flow/plugins/components/collections/influxdb/trans_flies.py:52 -#: backend/flow/plugins/components/collections/kafka/trans_flies.py:52 -msgid " 下发介质包参数:{}" -msgstr " 下发介质包参数:{}" +#: backend/ticket/builders/sqlserver/sqlserver_restore_slave.py:116 +msgid "SQLServer Slave重建执行" +msgstr "SQLServer Slave重建执行" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:64 -msgid "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" -msgstr "{}. 账号规则: {}-{}, 来源ip: {}, 目标集群: {}" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:45 +msgid "备份ID" +msgstr "备份ID" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:70 -msgid "" -"授权规则明细:\n" -"{}\n" -msgstr "" -"授权规则明细:\n" -"{}\n" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:46 +msgid "备份日志" +msgstr "备份日志" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:83 -msgid "「授权接口返回结果异常」{}" -msgstr "「授权接口返回结果异常」{}" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:57 +msgid "是否原地构造" +msgstr "是否原地构造" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:85 -msgid "「授权接口调用异常」{}" -msgstr "「授权接口调用异常」{}" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:140 +msgid "SQLServer 定点构造执行" +msgstr "SQLServer 定点构造执行" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:88 -msgid "授权异常,相关信息: {}\n" -msgstr "授权异常,相关信息: {}\n" +#: backend/ticket/builders/sqlserver/sqlserver_rollback.py:146 +msgid "SQLServer 数据库重命名" +msgstr "SQLServer 数据库重命名" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:95 -msgid "授权整体结果{}" -msgstr "授权整体结果{}" +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:70 +msgid "SQLServer起始端口" +msgstr "SQLServer起始端口" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:99 -msgid "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" -msgstr "Excel导入授权行数:{},成功授权数目:{},失败授权数目:{}" +#: backend/ticket/builders/sqlserver/sqlserver_single_apply.py:206 +msgid "SQLServer 单节点部署执行" +msgstr "SQLServer 单节点部署执行" -#: backend/flow/plugins/components/collections/mysql/authorize_rules.py:108 -msgid "" -"授权结果详情请下载excel: excel 下载" -msgstr "" -"授权结果详情请下载excel: excel 下载" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:32 +msgid "订阅库名" +msgstr "订阅库名" -#: backend/flow/plugins/components/collections/mysql/build_database_table_filter_regex.py:47 -msgid "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" -msgstr "[{}] 成功: db_table_filter_regex: {}, db_filter_regex: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:33 +msgid "订阅表名列表" +msgstr "订阅表名列表" -#: backend/flow/plugins/components/collections/mysql/clear_machine.py:45 -msgid "机器还在系统中注册,暂不用清理[{}]" -msgstr "机器还在系统中注册,暂不用清理[{}]" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:36 +msgid "数据库原源群" +msgstr "数据库原源群" -#: backend/flow/plugins/components/collections/mysql/clear_machine.py:50 -msgid "本次操作没有机器可以清理,提前结束活动节点" -msgstr "本次操作没有机器可以清理,提前结束活动节点" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:37 +msgid "集群module id" +msgstr "集群module id" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:92 -#: backend/flow/plugins/components/collections/mysql/clone_user.py:61 -msgid "「权限克隆返回结果异常」{}" -msgstr "「权限克隆返回结果异常」{}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:38 +msgid "部署的dumper id" +msgstr "部署的dumper id" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:94 -#: backend/flow/plugins/components/collections/mysql/clone_user.py:63 -msgid "「权限克隆调用异常」{}" -msgstr "「权限克隆调用异常」{}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:40 +msgid "接收端集群域名/IP" +msgstr "接收端集群域名/IP" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:98 -msgid "权限克隆失败,错误信息: {}\n" -msgstr "权限克隆失败,错误信息: {}\n" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:41 +msgid "接收端端口" +msgstr "接收端端口" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:105 -msgid "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" -msgstr "权限克隆整体执行结果——总数:{},成功数:{},失败数:{}\n" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:43 +msgid "l5_modid配置" +msgstr "l5_modid配置" -#: backend/flow/plugins/components/collections/mysql/clone_rules.py:111 -msgid "" -"详情请下载excel: excel 下载" -msgstr "" -"详情请下载excel: excel 下载" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:44 +msgid "l5_cmdid配置" +msgstr "l5_cmdid配置" -#: backend/flow/plugins/components/collections/mysql/clone_user.py:64 -msgid "执行克隆失败!" -msgstr "执行克隆失败!" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:45 +msgid "kafka用户名" +msgstr "kafka用户名" -#: backend/flow/plugins/components/collections/mysql/create_user.py:52 -msgid "在「{}」创建临时用户「{}@{}」成功" -msgstr "在「{}」创建临时用户「{}@{}」成功" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:46 +msgid "kafka密码" +msgstr "kafka密码" -#: backend/flow/plugins/components/collections/mysql/create_user.py:54 -msgid "创建用户接口异常,相关信息: {}" -msgstr "创建用户接口异常,相关信息: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:48 +msgid "订阅名称" +msgstr "订阅名称" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:38 -msgid "在「{}」执行sql失败,相关信息: {}" -msgstr "在「{}」执行sql失败,相关信息: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:50 +msgid "订阅库表" +msgstr "订阅库表" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:42 -msgid "在「{}」执行sql{}失败,相关信息: {}" -msgstr "在「{}」执行sql{}失败,相关信息: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:51 +msgid "dumper配置信息" +msgstr "dumper配置信息" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:49 -msgid "删除用户接口异常,相关信息: {}" -msgstr "删除用户接口异常,相关信息: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:79 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:106 +msgid "全局订阅中, 数据源 + 接收端(类型+接收地址)需要唯一" +msgstr "全局订阅中, 数据源 + 接收端(类型+接收地址)需要唯一" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:83 +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:127 +msgid "同一个订阅中,dumper ID + 接收端(类型+接收地址) 需要唯一" +msgstr "同一个订阅中,dumper ID + 接收端(类型+接收地址) 需要唯一" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:135 +msgid "接收端协议选择KAFKA时,请填写kafka用户名和密码" +msgstr "接收端协议选择KAFKA时,请填写kafka用户名和密码" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:137 +msgid "接收端协议选择L5_AGENT时,请填写l5_modid和l5_cmdid" +msgstr "接收端协议选择L5_AGENT时,请填写l5_modid和l5_cmdid" + +#: backend/ticket/builders/tbinlogdumper/dumper_apply.py:180 +msgid "Tbinlogdumper 上架" +msgstr "Tbinlogdumper 上架" + +#: backend/ticket/builders/tbinlogdumper/dumper_disable.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_enable.py:24 +#: backend/ticket/builders/tbinlogdumper/dumper_reduce_nodes.py:30 +msgid "dumper实例ID" +msgstr "dumper实例ID" -#: backend/flow/plugins/components/collections/mysql/drop_user.py:52 -msgid "在「{}」删除临时用户「{}@{}」成功" -msgstr "在「{}」删除临时用户「{}@{}」成功" +#: backend/ticket/builders/tbinlogdumper/dumper_disable.py:38 +msgid "Tbinlogdumper 禁用" +msgstr "Tbinlogdumper 禁用" -#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:58 -msgid "这是一个fake的模拟执行" -msgstr "这是一个fake的模拟执行" +#: backend/ticket/builders/tbinlogdumper/dumper_enable.py:38 +msgid "Tbinlogdumper 启用" +msgstr "Tbinlogdumper 启用" -#: backend/flow/plugins/components/collections/mysql/fake_semantic_check.py:65 -msgid "语义检查执行成功" -msgstr "语义检查执行成功" +#: backend/ticket/builders/tbinlogdumper/dumper_reduce_nodes.py:72 +msgid "Tbinlogdumper 下架" +msgstr "Tbinlogdumper 下架" -#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:91 -msgid "[{}] 过滤所得库表: {}" -msgstr "[{}] 过滤所得库表: {}" +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:25 +msgid "dumper进程ID" +msgstr "dumper进程ID" -#: backend/flow/plugins/components/collections/mysql/filter_database_table_from_regex.py:94 -msgid "[{}] 未匹配到任何库" -msgstr "[{}] 未匹配到任何库" +#: backend/ticket/builders/tbinlogdumper/dumper_switch.py:46 +msgid "Tbinlogdumper 切换" +msgstr "Tbinlogdumper 切换" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:56 -msgid "在{}执行sql失败,相关信息: {}" -msgstr "在{}执行sql失败,相关信息: {}" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:41 +msgid "{} 不是 [{}]{} 的集群" +msgstr "{} 不是 [{}]{} 的集群" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:61 -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:68 -msgid "在{}执行sql{}失败,相关信息: {}" -msgstr "在{}执行sql{}失败,相关信息: {}" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:60 +msgid "{} spider master 数量不足 2 个" +msgstr "{} spider master 数量不足 2 个" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:87 -msgid "查询数据库接口异常,相关信息: {}" -msgstr "查询数据库接口异常,相关信息: {}" +#: backend/ticket/builders/tendbcluster/append_deploy_ctl.py:65 +msgid "{} remote 数量异常" +msgstr "{} remote 数量异常" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:90 -msgid "uid:{}" -msgstr "uid:{}" +#: backend/ticket/builders/tendbcluster/base.py:112 +msgid "【{}】请保证集群部署的接入层主节点和运维节点的总和小于37" +msgstr "【{}】请保证集群部署的接入层主节点和运维节点的总和小于37" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:119 -msgid "ERROR 数据不一致的表的数量: {}" -msgstr "ERROR 数据不一致的表的数量: {}" +#: backend/ticket/builders/tendbcluster/base.py:129 +msgid "【{}】请保证缩容后的接入层数量小于当前节点数量" +msgstr "【{}】请保证缩容后的接入层数量小于当前节点数量" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:120 -msgid "WARNING 被跳过校验的表的数量: {}" -msgstr "WARNING 被跳过校验的表的数量: {}" +#: backend/ticket/builders/tendbcluster/base.py:133 +msgid "【{}】请保证缩容后的接入层spider master数量>=2" +msgstr "【{}】请保证缩容后的接入层spider master数量>=2" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:121 -msgid "SUCCESS 数据一致的表的数量: {}" -msgstr "SUCCESS 数据一致的表的数量: {}" +#: backend/ticket/builders/tendbcluster/base.py:136 +msgid "【{}】请保证缩容后的接入层spider slave数量>=1" +msgstr "【{}】请保证缩容后的接入层spider slave数量>=1" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:126 -msgid "ERROR 校验失败,数据不一致的表:" -msgstr "ERROR 校验失败,数据不一致的表:" +#: backend/ticket/builders/tendbcluster/base.py:155 +msgid "集群总分片数{}与单机分片数{}、机器部署组数{}不匹配" +msgstr "集群总分片数{}与单机分片数{}、机器部署组数{}不匹配" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:132 -msgid "WARNING 校验程序没有校验的表:" -msgstr "WARNING 校验程序没有校验的表:" +#: backend/ticket/builders/tendbcluster/base.py:165 +msgid "是否只禁用只读接入层" +msgstr "是否只禁用只读接入层" -#: backend/flow/plugins/components/collections/mysql/mysql_checksum_report.py:138 -msgid "SUCCESS 校验成功,数据一致的表:" -msgstr "SUCCESS 校验成功,数据一致的表:" +#: backend/ticket/builders/tendbcluster/base.py:166 +msgid "是否只启用只读接入层" +msgstr "是否只启用只读接入层" -#: backend/flow/plugins/components/collections/mysql/mysql_db_meta.py:41 -#: backend/flow/plugins/components/collections/redis/get_redis_payload.py:45 -#: backend/flow/plugins/components/collections/redis/redis_db_meta.py:45 -#: backend/flow/plugins/components/collections/spider/spider_db_meta.py:40 -msgid "集群元信息:{}" -msgstr "集群元信息:{}" +#: backend/ticket/builders/tendbcluster/tendb_apply.py:44 +msgid "集群访问端口" +msgstr "集群访问端口" + +#: backend/ticket/builders/tendbcluster/tendb_apply.py:46 +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:34 +msgid "单机分片数" +msgstr "单机分片数" -#: backend/flow/plugins/components/collections/mysql/mysql_link_backup_id_bill_id.py:28 -msgid "[{}] 备份 id: {}" -msgstr "[{}] 备份 id: {}" +#: backend/ticket/builders/tendbcluster/tendb_apply.py:125 +msgid "TenDB Cluster 集群部署执行" +msgstr "TenDB Cluster 集群部署执行" -#: backend/flow/plugins/components/collections/mysql/mysql_master_slave_relationship_check.py:72 -msgid "主备关系校验成功" -msgstr "主备关系校验成功" +#: backend/ticket/builders/tendbcluster/tendb_authorize_rules.py:29 +#: backend/ticket/builders/tendbcluster/tendb_authorize_rules.py:44 +msgid "TenDB Cluster 授权执行" +msgstr "TenDB Cluster 授权执行" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:40 -msgid "分区管理服务api异常,相关信息: {}" -msgstr "分区管理服务api异常,相关信息: {}" +#: backend/ticket/builders/tendbcluster/tendb_backup.py:32 +msgid "库表备份信息" +msgstr "库表备份信息" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:45 -#: backend/flow/plugins/components/collections/mysql/upload_file.py:43 -msgid "单据id{}" -msgstr "单据id{}" +#: backend/ticket/builders/tendbcluster/tendb_backup.py:51 +#: backend/ticket/constants.py:213 +msgid "TenDB Cluster 库表备份" +msgstr "TenDB Cluster 库表备份" -#: backend/flow/plugins/components/collections/mysql/mysql_partition_check.py:46 -msgid "获取分区语句成功" -msgstr "获取分区语句成功" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:44 +msgid "是否修复" +msgstr "是否修复" -#: backend/flow/plugins/components/collections/mysql/rename_database_confirm_empty_from.py:69 -msgid "确认源数据库已空完成" -msgstr "确认源数据库已空完成" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:45 +msgid "数据校验后修复执行类型" +msgstr "数据校验后修复执行类型" -#: backend/flow/plugins/components/collections/mysql/rename_database_drop_from.py:51 -msgid "删除源数据库完成" -msgstr "删除源数据库完成" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:49 +msgid "主库实例" +msgstr "主库实例" -#: backend/flow/plugins/components/collections/mysql/rename_database_prepare_param.py:28 -msgid "[{}] 构造 old_new_map 完成: {}" -msgstr "[{}] 构造 old_new_map 完成: {}" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:50 +msgid "从库实例" +msgstr "从库实例" -#: backend/flow/plugins/components/collections/mysql/rollback_trans_flies.py:53 -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:63 -msgid "没有符合的备份文件提供定点恢复" -msgstr "没有符合的备份文件提供定点恢复" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:57 +msgid "校验范围" +msgstr "校验范围" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:56 -msgid "创建模拟执行任务resp{}" -msgstr "创建模拟执行任务resp{}" +#: backend/ticket/builders/tendbcluster/tendb_checksum.py:63 +msgid "全备信息列表" +msgstr "全备信息列表" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:60 -msgid "创建模拟任务失败:{}" -msgstr "创建模拟任务失败:{}" +#: backend/ticket/builders/tendbcluster/tendb_clear.py:46 +msgid "TenDB Cluster 清档执行" +msgstr "TenDB Cluster 清档执行" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:62 -msgid "创建模拟任务成功" -msgstr "创建模拟任务成功" +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:41 +msgid "TenDB Cluster 客户端权限克隆执行" +msgstr "TenDB Cluster 客户端权限克隆执行" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:66 -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:68 -msgid "「执行语义分析任务异常」{}" -msgstr "「执行语义分析任务异常」{}" +#: backend/ticket/builders/tendbcluster/tendb_clone_rules.py:49 +msgid "TenDB Cluster 实例权限克隆执行" +msgstr "TenDB Cluster 实例权限克隆执行" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:69 -msgid "创建模拟任务失败!" -msgstr "创建模拟任务失败!" +#: backend/ticket/builders/tendbcluster/tendb_data_repair.py:46 +msgid "Tendb Cluster 数据修复执行" +msgstr "Tendb Cluster 数据修复执行" -#: backend/flow/plugins/components/collections/mysql/semantic_check.py:119 -msgid "语义检查出发的自动创建单据" -msgstr "语义检查出发的自动创建单据" +#: backend/ticket/builders/tendbcluster/tendb_destroy.py:37 +msgid "TenDB Cluster 下架执行" +msgstr "TenDB Cluster 下架执行" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:42 -msgid "仅在主库查找备份源" -msgstr "仅在主库查找备份源" +#: backend/ticket/builders/tendbcluster/tendb_disable.py:40 +msgid "TenDB Cluster 禁用执行" +msgstr "TenDB Cluster 禁用执行" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:46 -msgid "在主、从库查找备份源" -msgstr "在主、从库查找备份源" +#: backend/ticket/builders/tendbcluster/tendb_dump_data.py:41 +msgid "Tendb Cluster 数据导出执行" +msgstr "Tendb Cluster 数据导出执行" -#: backend/flow/plugins/components/collections/mysql/slave_trans_flies.py:50 -msgid "从备份源中筛选符合的备份" -msgstr "从备份源中筛选符合的备份" +#: backend/ticket/builders/tendbcluster/tendb_enable.py:40 +msgid "TenDB Cluster 启用执行" +msgstr "TenDB Cluster 启用执行" -#: backend/flow/plugins/components/collections/mysql/trans_flies.py:66 -#: backend/flow/plugins/components/collections/pulsar/trans_files.py:52 -msgid "" -"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" -"{}" -msgstr "" -"选择服务器之间文件传输模式,应当源文件的机器ip列表不能为空,请联系系统管理员" -"{}" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:39 +msgid "spider新机器" +msgstr "spider新机器" -#: backend/flow/plugins/components/collections/mysql/truncate_data_create_stage_database.py:55 -msgid "建立备份库完成" -msgstr "建立备份库完成" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:40 +msgid "remote新机器" +msgstr "remote新机器" -#: backend/flow/plugins/components/collections/mysql/truncate_data_drop_stage_database.py:49 -msgid "删除备份库完成" -msgstr "删除备份库完成" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:45 +msgid "回档类型" +msgstr "回档类型" -#: backend/flow/plugins/components/collections/mysql/truncate_data_generate_stage_database_name.py:31 -msgid "生成备份库名完成" -msgstr "生成备份库名完成" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:62 +msgid "回档信息" +msgstr "回档信息" -#: backend/flow/plugins/components/collections/mysql/truncate_data_recreate_table.py:60 -msgid "重建表成功" -msgstr "重建表成功" +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:214 +#: backend/ticket/builders/tendbcluster/tendb_fixpoint_rollback.py:224 +msgid "TenDBCluster 回档执行" +msgstr "TenDBCluster 回档执行" -#: backend/flow/plugins/components/collections/mysql/truncate_data_rename_table.py:88 -msgid "[{}] 备份清档表完成" -msgstr "[{}] 备份清档表完成" +#: backend/ticket/builders/tendbcluster/tendb_flashback.py:49 +msgid "TenDB Cluster 闪回执行" +msgstr "TenDB Cluster 闪回执行" -#: backend/flow/plugins/components/collections/mysql/upload_file.py:38 -msgid "分区sql为空无需上传" -msgstr "分区sql为空无需上传" +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:27 +msgid "备份位置信息" +msgstr "备份位置信息" -#: backend/flow/plugins/components/collections/mysql/upload_file.py:44 -msgid "分区sql文件上传成功" -msgstr "分区sql文件上传成功" +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:29 +msgid "备份选项" +msgstr "备份选项" -#: backend/flow/plugins/components/collections/pulsar/blank_schedule_service.py:66 -msgid "successfully enter blank schedule, interval times: {}" -msgstr "successfully enter blank schedule, interval times: {}" +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:31 +msgid "集群备份信息" +msgstr "集群备份信息" -#: backend/flow/plugins/components/collections/redis/exec_actuator_script.py:100 -msgid "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" -msgstr "[{}] kwargs['payload'] 是不完整,需要将{}内容加到payload中" +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:56 +msgid "备份位置选择spider_mnt时,请提供运维节点的地址" +msgstr "备份位置选择spider_mnt时,请提供运维节点的地址" -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:113 -msgid "无符合要求机器" -msgstr "无符合要求机器" +#: backend/ticket/builders/tendbcluster/tendb_full_backup.py:69 +#: backend/ticket/constants.py:236 +msgid "TenDB Cluster 全库备份" +msgstr "TenDB Cluster 全库备份" -#: backend/flow/plugins/components/collections/redis/exec_shell_script.py:117 -msgid "获取最大磁盘空闲机器失败:{}" -msgstr "获取最大磁盘空闲机器失败:{}" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:23 +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:32 +msgid "是否强制执行(互切不强制,故障切强制)" +msgstr "是否强制执行(互切不强制,故障切强制)" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:393 -msgid "源redis集群{}存在{}个非running状态的slave" -msgstr "源redis集群{}存在{}个非running状态的slave" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:24 +msgid "是否检测数据同步延时情况" +msgstr "是否检测数据同步延时情况" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:450 -msgid "所有源redis slave机器:{} 磁盘空间检查通过" -msgstr "所有源redis slave机器:{} 磁盘空间检查通过" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:28 +msgid "主故障切换场景需要强制执行" +msgstr "主故障切换场景需要强制执行" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:461 -msgid "src_cluster:{} type:{} 无需检查cluster nodes是否ok" -msgstr "src_cluster:{} type:{} 无需检查cluster nodes是否ok" +#: backend/ticket/builders/tendbcluster/tendb_master_fail_over.py:41 +msgid "TendbCluster 主故障切换" +msgstr "TendbCluster 主故障切换" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:523 -msgid "src_cluster:{} 类型是:{} 无需检查cluster state" -msgstr "src_cluster:{} 类型是:{} 无需检查cluster state" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:25 +msgid "主库信息" +msgstr "主库信息" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:696 -msgid "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" -msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 某些tasks迁移失败" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:26 +msgid "从库信息" +msgstr "从库信息" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:705 -msgid "" -"bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了迁移进程" -msgstr "" -"bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都成功且终止了迁移进程" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:28 +msgid "切换的主从组" +msgstr "切换的主从组" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:715 -msgid "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" -msgstr "bill_id:{} src_cluster:{} dst_cluster:{} 所有tasks都是增量同步" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:41 +msgid "主从互切场景:非强制执行,强制检查延时" +msgstr "主从互切场景:非强制执行,强制检查延时" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:797 -msgid "task:{} {}:{} 迁移失败" -msgstr "task:{} {}:{} 迁移失败" +#: backend/ticket/builders/tendbcluster/tendb_master_slave_switch.py:54 +msgid "TendbCluster 主从互换执行" +msgstr "TendbCluster 主从互换执行" -#: backend/flow/plugins/components/collections/redis/redis_dts.py:862 -msgid "{}中有{}个proxy不是running状态" -msgstr "{}中有{}个proxy不是running状态" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:28 +msgid "旧主库主机" +msgstr "旧主库主机" -#: backend/flow/plugins/components/collections/redis/trans_flies.py:87 -msgid "下发介质包失败: [{}/{}] resp:{}" -msgstr "下发介质包失败: [{}/{}] resp:{}" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:29 +msgid "旧从库主机" +msgstr "旧从库主机" -#: backend/flow/plugins/components/collections/riak/get_riak_resource.py:43 -msgid "获取机器资源失败,新建集群至少3台机器,添加节点至少1台机器" -msgstr "获取机器资源失败,新建集群至少3台机器,添加节点至少1台机器" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:36 +msgid "克隆主从信息" +msgstr "克隆主从信息" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:60 -msgid "select mysql.servers failed: {}" -msgstr "select mysql.servers failed: {}" +#: backend/ticket/builders/tendbcluster/tendb_migrate_cluster.py:78 +msgid "TenDB Cluster 主从迁移执行" +msgstr "TenDB Cluster 主从迁移执行" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:94 -msgid "TdbCtl-create-node failed: {}" -msgstr "TdbCtl-create-node failed: {}" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:26 +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:24 +msgid "运维节点信息" +msgstr "运维节点信息" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:142 -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:148 -#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:23 -msgid "在[{}]创建添加内置账号成功" -msgstr "在[{}]创建添加内置账号成功" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:28 +msgid "添加spider运维节点信息" +msgstr "添加spider运维节点信息" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:151 -#: backend/flow/plugins/components/collections/spider/add_system_user_in_cluster.py:25 -msgid "[{}]添加用户接口异常,相关信息: {}" -msgstr "[{}]添加用户接口异常,相关信息: {}" +#: backend/ticket/builders/tendbcluster/tendb_mnt_apply.py:52 +msgid "TendbCluster 添加运维节点" +msgstr "TendbCluster 添加运维节点" -#: backend/flow/plugins/components/collections/spider/add_spider_routing.py:186 -msgid "This spider-role is not supported,check" -msgstr "This spider-role is not supported,check" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:26 +msgid "下架spider运维节点信息" +msgstr "下架spider运维节点信息" -#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:45 -msgid "{} {} 检查库表是否在用" -msgstr "{} {} 检查库表是否在用" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:27 +msgid "是否安全模式执行" +msgstr "是否安全模式执行" -#: backend/flow/plugins/components/collections/spider/check_cluster_table_using_sub.py:50 -msgid "{} 检查库表是否在用" -msgstr "{} 检查库表是否在用" +#: backend/ticket/builders/tendbcluster/tendb_mnt_destroy.py:42 +msgid "TendbCluster 下架运维节点" +msgstr "TendbCluster 下架运维节点" -#: backend/flow/plugins/components/collections/spider/clear_database_on_remote_service.py:56 -msgid "remote drop 新库完成" -msgstr "remote drop 新库完成" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:35 +msgid "规格要求" +msgstr "规格要求" -#: backend/flow/plugins/components/collections/spider/create_database_like_via_ctl.py:110 -msgid "建立集群备份库表完成" -msgstr "建立集群备份库表完成" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:37 +msgid "变更前的规格名" +msgstr "变更前的规格名" -#: backend/flow/plugins/components/collections/spider/drop_spider_table_via_ctl.py:49 -msgid "删除老数据库完成" -msgstr "删除老数据库完成" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:38 +msgid "变更前机器组数" +msgstr "变更前机器组数" -#: backend/flow/plugins/components/collections/spider/truncate_database_drop_stage_db_via_ctl.py:47 -msgid "清理备份库完成" -msgstr "清理备份库完成" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:40 +msgid "集群扩缩容信息" +msgstr "集群扩缩容信息" -#: backend/flow/plugins/components/collections/spider/truncate_database_on_spider_via_ctl.py:145 -msgid "处理集群表完成" -msgstr "处理集群表完成" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:47 +msgid "执行前是否需要数据校验" +msgstr "执行前是否需要数据校验" -#: backend/flow/signal/handlers.py:35 -msgid "【状态信号捕获】{} root_id={}, node_id={}, status:{}" -msgstr "【状态信号捕获】{} root_id={}, node_id={}, status:{}" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:48 +msgid "数据校验触发类型" +msgstr "数据校验触发类型" -#: backend/flow/signal/handlers.py:68 -msgid "【状态信号捕获】未查找到FlowTree root_id={}" -msgstr "【状态信号捕获】未查找到FlowTree root_id={}" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:49 +msgid "数据校验 触发时间" +msgstr "数据校验 触发时间" -#: backend/flow/utils/cc_manage.py:55 -msgid "查询主机bk_host_id失败[数量不匹配]" -msgstr "查询主机bk_host_id失败[数量不匹配]" +#: backend/ticket/builders/tendbcluster/tendb_node_reblance.py:93 +msgid "TendbCluster 集群容量变更" +msgstr "TendbCluster 集群容量变更" -#: backend/flow/utils/cc_manage.py:67 -msgid "查询空闲机模块ID bk_module_id 失败" -msgstr "查询空闲机模块ID bk_module_id 失败" +#: backend/ticket/builders/tendbcluster/tendb_openarea.py:31 +msgid "Tendb Cluster 开区执行" +msgstr "Tendb Cluster 开区执行" -#: backend/flow/utils/cloud/cloud_act_payload.py:42 -msgid "单据中不包含DRS的部署信息" -msgstr "单据中不包含DRS的部署信息" +#: backend/ticket/builders/tendbcluster/tendb_rename.py:42 +msgid "TenDBCluster Cluster 重命名执行" +msgstr "TenDBCluster Cluster 重命名执行" -#: backend/flow/utils/cloud/cloud_act_payload.py:50 -msgid "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" -msgstr "DNS服务未部署,请在DNS服务部署后再进行该服务的部署" +#: backend/ticket/builders/tendbcluster/tendb_restore_local_slave.py:83 +msgid "TenDB Cluster Slave原地重建执行" +msgstr "TenDB Cluster Slave原地重建执行" -#: backend/flow/utils/cloud/cloud_act_payload.py:58 -msgid "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" -msgstr "Nginx服务未部署,请在Nginx服务部署后再进行该服务的部署" +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:30 +msgid "新从库资源池参数" +msgstr "新从库资源池参数" -#: backend/flow/utils/cloud/cloud_db_proxy.py:52 -msgid "找不到单据类型需要变更的proxy函数,服务信息入库失败" -msgstr "找不到单据类型需要变更的proxy函数,服务信息入库失败" +#: backend/ticket/builders/tendbcluster/tendb_restore_slave.py:80 +#: backend/ticket/constants.py:227 +msgid "TenDB Cluster Slave重建" +msgstr "TenDB Cluster Slave重建" -#: backend/flow/utils/cloud/cloud_module_operate.py:135 -msgid "主机{}转移{}失败,转移参数:{}, 错误信息:{}" -msgstr "主机{}转移{}失败,转移参数:{}, 错误信息:{}" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:30 +msgid "接入层类型" +msgstr "接入层类型" -#: backend/flow/utils/cloud/cloud_module_operate.py:196 -msgid "主机{}转移待回收失败,错误信息:{}" -msgstr "主机{}转移待回收失败,错误信息:{}" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:31 +msgid "规格参数" +msgstr "规格参数" -#: backend/flow/utils/es/es_db_meta.py:94 -msgid "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" -msgstr "找不到单据类型需要变更的cmdb函数{},请联系系统管理员" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:34 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:38 +msgid "机器导入类型" +msgstr "机器导入类型" -#: backend/flow/utils/hdfs/hdfs_db_meta.py:52 -#: backend/flow/utils/influxdb/influxdb_db_meta.py:114 -#: backend/flow/utils/kafka/kafka_db_meta.py:160 -#: backend/flow/utils/redis/redis_db_meta.py:48 -msgid "找不到单据类型需要变更的cmdb函数,请联系系统管理员" -msgstr "找不到单据类型需要变更的cmdb函数,请联系系统管理员" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:36 +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:36 +msgid "扩容信息" +msgstr "扩容信息" -#: backend/flow/utils/mysql/db_resource.py:106 -msgid " 获取资源失败: {}" -msgstr " 获取资源失败: {}" +#: backend/ticket/builders/tendbcluster/tendb_spider_add_nodes.py:71 +msgid "TenDBCluster Cluster 接入层扩容" +msgstr "TenDBCluster Cluster 接入层扩容" -#: backend/flow/utils/mysql/db_table_filter/exception.py:18 -msgid "库表过滤异常" -msgstr "库表过滤异常" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:26 +msgid "剩余spider数量" +msgstr "剩余spider数量" -#: backend/flow/utils/mysql/db_table_filter/exception.py:23 -msgid "输入校验异常" -msgstr "输入校验异常" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:31 +msgid "缩容的角色" +msgstr "缩容的角色" -#: backend/flow/utils/mysql/db_table_filter/filter.py:42 -msgid "include patterns 不能为空" -msgstr "include patterns 不能为空" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:35 +msgid "缩容信息" +msgstr "缩容信息" -#: backend/flow/utils/mysql/db_table_filter/filter.py:48 -msgid "exclude patterns 要么同时为空, 要么都不为空" -msgstr "exclude patterns 要么同时为空, 要么都不为空" +#: backend/ticket/builders/tendbcluster/tendb_spider_reduce_nodes.py:54 +msgid "TenDB Cluster 接入层缩容" +msgstr "TenDB Cluster 接入层缩容" -#: backend/flow/utils/mysql/db_table_filter/tools.py:30 -msgid "使用通配符时, 只能有一个模式: {}" -msgstr "使用通配符时, 只能有一个模式: {}" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:32 +msgid "slave信息" +msgstr "slave信息" -#: backend/flow/utils/mysql/db_table_filter/tools.py:33 -msgid "% ? 不能独立使用" -msgstr "% ? 不能独立使用" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:34 +msgid "资源规格参数" +msgstr "资源规格参数" -#: backend/flow/utils/mysql/db_table_filter/tools.py:36 -msgid "* 只能独立使用" -msgstr "* 只能独立使用" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:50 +msgid "集群{}已经存在只读接入层,无法再次部署" +msgstr "集群{}已经存在只读接入层,无法再次部署" -#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:27 -msgid "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" -msgstr "exec_ip变量和get_trans_data_ip_var变量不能同时赋值" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_apply.py:86 +#: backend/ticket/constants.py:225 +msgid "TenDB Cluster 部署只读接入层" +msgstr "TenDB Cluster 部署只读接入层" -#: backend/flow/utils/mysql/mysql_act_dataclass_validator.py:29 -msgid "exec_ip变量和get_trans_data_ip_var变量不能同时为None" -msgstr "exec_ip变量和get_trans_data_ip_var变量不能同时为None" +#: backend/ticket/builders/tendbcluster/tendb_spider_slave_destroy.py:34 +#: backend/ticket/constants.py:226 +msgid "TenDB Cluster 只读接入层下架" +msgstr "TenDB Cluster 只读接入层下架" -#: backend/flow/utils/mysql/mysql_act_playload.py:305 -msgid "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" -msgstr "传入的安装mysql端口列表为空或者非法值,请联系系统管理员" +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:49 +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:63 +msgid "TenDBCluster 临时集群下架" +msgstr "TenDBCluster 临时集群下架" -#: backend/flow/utils/mysql/mysql_act_playload.py:349 -msgid "传入的安装spider端口列表为空或者非法值,请联系系统管理员" -msgstr "传入的安装spider端口列表为空或者非法值,请联系系统管理员" +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:55 +#: backend/ticket/builders/tendbcluster/tendb_temporary_destroy.py:63 +msgid "TenDBCluster 临时集群销毁" +msgstr "TenDBCluster 临时集群销毁" -#: backend/flow/utils/mysql/mysql_act_playload.py:676 -msgid "不支持的机器类型: {}" -msgstr "不支持的机器类型: {}" +#: backend/ticket/builders/tendbsingle/standardize.py:52 +msgid "TenDB Single 标准化" +msgstr "TenDB Single 标准化" -#: backend/flow/utils/pulsar/consts.py:20 -msgid "broker默认分区数" -msgstr "broker默认分区数" +#: backend/ticket/constants.py:32 +msgid "主流程-人工确认" +msgstr "主流程-人工确认" -#: backend/flow/utils/pulsar/consts.py:21 -msgid "broker认证配置" -msgstr "broker认证配置" +#: backend/ticket/constants.py:33 +msgid "自动化流程-人工确认" +msgstr "自动化流程-人工确认" -#: backend/flow/utils/pulsar/consts.py:22 -msgid "默认bookie池大小" -msgstr "默认bookie池大小" +#: backend/ticket/constants.py:34 +msgid "资源补货" +msgstr "资源补货" -#: backend/flow/utils/pulsar/consts.py:23 -msgid "写入副本数" -msgstr "写入副本数" +#: backend/ticket/constants.py:42 +msgid "我的待办" +msgstr "我的待办" -#: backend/flow/utils/pulsar/consts.py:24 -msgid "确认写入副本数" -msgstr "确认写入副本数" +#: backend/ticket/constants.py:43 +msgid "我的申请" +msgstr "我的申请" -#: backend/flow/utils/pulsar/consts.py:25 -msgid "数据保留时间,单位为分钟" -msgstr "数据保留时间,单位为分钟" +#: backend/ticket/constants.py:55 +msgid "已处理" +msgstr "已处理" -#: backend/flow/utils/pulsar/consts.py:26 -msgid "broker服务端口" -msgstr "broker服务端口" +#: backend/ticket/constants.py:64 +msgid "资源不足" +msgstr "资源不足" -#: backend/flow/utils/pulsar/consts.py:27 -msgid "访问Pulsar Manager账户名" -msgstr "访问Pulsar Manager账户名" +#: backend/ticket/constants.py:65 +msgid "获取资源所失败" +msgstr "获取资源所失败" -#: backend/flow/utils/pulsar/consts.py:28 -msgid "访问Pulsar Manager密码" -msgstr "访问Pulsar Manager密码" +#: backend/ticket/constants.py:66 +msgid "参数合法性校验失败" +msgstr "参数合法性校验失败" -#: backend/flow/utils/redis/redis_db_meta.py:56 -msgid "找不到单据类型需要查询的cmdb函数,请联系系统管理员" -msgstr "找不到单据类型需要查询的cmdb函数,请联系系统管理员" +#: backend/ticket/constants.py:67 +msgid "锁定返回机器失败" +msgstr "锁定返回机器失败" -#: backend/flow/utils/spider/get_spider_incr.py:45 -msgid "select spider_auto_increment failed: {}" -msgstr "select spider_auto_increment failed: {}" +#: backend/ticket/constants.py:77 backend/ticket/constants.py:88 +msgid "等待中" +msgstr "等待中" -#: backend/flow/utils/spider/get_spider_incr.py:49 -msgid "select spider_auto_increment is null, check " -msgstr "select spider_auto_increment is null, check " +#: backend/ticket/constants.py:81 backend/ticket/constants.py:93 +msgid "撤销" +msgstr "撤销" -#: backend/flow/utils/spider/get_spider_incr.py:65 -msgid "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" -msgstr "The obtained incr is greater than MAX_SPIDER_MASTER_COUNT, check" +#: backend/ticket/constants.py:82 backend/ticket/constants.py:91 +msgid "终止" +msgstr "终止" -#: backend/flow/views/cloud_dbha_apply.py:39 -#: backend/flow/views/cloud_dns_bind_apply.py:39 -msgid "开始部署dns-bind服务场景" -msgstr "开始部署dns-bind服务场景" +#: backend/ticket/constants.py:94 +msgid "跳过" +msgstr "跳过" -#: backend/flow/views/cloud_drs_apply.py:44 -msgid "开始部署drs服务场景" -msgstr "开始部署drs服务场景" +#: backend/ticket/constants.py:157 +msgid "无法找到{}关联的组件类型" +msgstr "无法找到{}关联的组件类型" + +#: backend/ticket/constants.py:161 +msgid "MySQL 单节点部署" +msgstr "MySQL 单节点部署" -#: backend/flow/views/cloud_nginx_apply.py:44 -msgid "开始部署nginx服务场景" -msgstr "开始部署nginx服务场景" +#: backend/ticket/constants.py:162 +msgid "MySQL 添加从库" +msgstr "MySQL 添加从库" -#: backend/flow/views/cloud_nginx_apply.py:54 -msgid "开始替换nginx服务场景" -msgstr "开始替换nginx服务场景" +#: backend/ticket/constants.py:162 backend/ticket/constants.py:163 +#: backend/ticket/constants.py:164 backend/ticket/constants.py:165 +#: backend/ticket/constants.py:166 backend/ticket/constants.py:167 +#: backend/ticket/constants.py:172 backend/ticket/constants.py:173 +#: backend/ticket/constants.py:184 backend/ticket/constants.py:195 +#: backend/ticket/constants.py:216 backend/ticket/constants.py:217 +#: backend/ticket/constants.py:221 backend/ticket/constants.py:222 +#: backend/ticket/constants.py:227 backend/ticket/constants.py:228 +#: backend/ticket/constants.py:229 backend/ticket/constants.py:235 +#: backend/ticket/constants.py:266 backend/ticket/constants.py:267 +#: backend/ticket/constants.py:268 backend/ticket/constants.py:269 +#: backend/ticket/constants.py:270 backend/ticket/constants.py:271 +#: backend/ticket/constants.py:272 backend/ticket/constants.py:301 +#: backend/ticket/constants.py:302 backend/ticket/constants.py:303 +#: backend/ticket/constants.py:304 backend/ticket/constants.py:305 +#: backend/ticket/constants.py:306 backend/ticket/constants.py:307 +#: backend/ticket/constants.py:312 backend/ticket/constants.py:313 +#: backend/ticket/constants.py:317 backend/ticket/constants.py:402 +#: backend/ticket/constants.py:403 backend/ticket/constants.py:404 +#: backend/ticket/constants.py:405 backend/ticket/constants.py:406 +#: backend/ticket/constants.py:411 backend/ticket/constants.py:414 +#: backend/ticket/constants.py:415 backend/ticket/constants.py:416 +msgid "集群维护" +msgstr "集群维护" -#: backend/flow/views/es_apply.py:63 -msgid "开始部署ES场景" -msgstr "开始部署ES场景" +#: backend/ticket/constants.py:163 +msgid "MySQL Slave重建" +msgstr "MySQL Slave重建" -#: backend/flow/views/es_destroy.py:39 -msgid "开始下架ES场景" -msgstr "开始下架ES场景" +#: backend/ticket/constants.py:164 +msgid "MySQL Slave原地重建" +msgstr "MySQL Slave原地重建" -#: backend/flow/views/es_disable.py:39 -msgid "开始禁用ES场景" -msgstr "开始禁用ES场景" +#: backend/ticket/constants.py:165 +msgid "MySQL 迁移主从" +msgstr "MySQL 迁移主从" -#: backend/flow/views/es_enable.py:39 -msgid "开始启用ES场景" -msgstr "开始启用ES场景" +#: backend/ticket/constants.py:166 +msgid "MySQL 主从互换" +msgstr "MySQL 主从互换" -#: backend/flow/views/es_reboot.py:47 -msgid "开始重启ES节点场景" -msgstr "开始重启ES节点场景" +#: backend/ticket/constants.py:167 +msgid "MySQL 主库故障切换" +msgstr "MySQL 主库故障切换" -#: backend/flow/views/es_replace.py:63 backend/flow/views/es_scale_up.py:52 -msgid "开始扩容ES场景" -msgstr "开始扩容ES场景" +#: backend/ticket/constants.py:168 +msgid "MySQL 高可用部署" +msgstr "MySQL 高可用部署" -#: backend/flow/views/es_shrink.py:52 -msgid "开始缩容ES场景" -msgstr "开始缩容ES场景" +#: backend/ticket/constants.py:169 +msgid "MySQL 变更SQL执行" +msgstr "MySQL 变更SQL执行" -#: backend/flow/views/hdfs_apply.py:61 -msgid "开始部署HDFS场景" -msgstr "开始部署HDFS场景" +#: backend/ticket/constants.py:170 +msgid "MySQL 强制变更SQL执行" +msgstr "MySQL 强制变更SQL执行" -#: backend/flow/views/hdfs_destroy.py:39 -msgid "开始HDFS集群销毁场景" -msgstr "开始HDFS集群销毁场景" +#: backend/ticket/constants.py:171 +msgid "MySQL 模拟执行" +msgstr "MySQL 模拟执行" -#: backend/flow/views/hdfs_disable.py:39 -msgid "开始HDFS集群禁用场景" -msgstr "开始HDFS集群禁用场景" +#: backend/ticket/constants.py:172 +msgid "MySQL 添加Proxy" +msgstr "MySQL 添加Proxy" -#: backend/flow/views/hdfs_enable.py:39 -msgid "开始HDFS集群启用场景" -msgstr "开始HDFS集群启用场景" +#: backend/ticket/constants.py:173 +msgid "MySQL 替换Proxy" +msgstr "MySQL 替换Proxy" -#: backend/flow/views/hdfs_reboot.py:55 -msgid "开始重启HDFS场景" -msgstr "开始重启HDFS场景" +#: backend/ticket/constants.py:174 +msgid "MySQL 单节点删除" +msgstr "MySQL 单节点删除" -#: backend/flow/views/hdfs_replace.py:65 -msgid "开始替换HDFS场景" -msgstr "开始替换HDFS场景" +#: backend/ticket/constants.py:175 +msgid "MySQL 单节点启用" +msgstr "MySQL 单节点启用" -#: backend/flow/views/hdfs_scale_up.py:42 -msgid "开始扩容HDFS场景" -msgstr "开始扩容HDFS场景" +#: backend/ticket/constants.py:176 +msgid "MySQL 单节点禁用" +msgstr "MySQL 单节点禁用" -#: backend/flow/views/hdfs_shrink.py:42 -msgid "开始HDFS集群缩容场景" -msgstr "开始HDFS集群缩容场景" +#: backend/ticket/constants.py:177 +msgid "MySQL 高可用删除" +msgstr "MySQL 高可用删除" -#: backend/flow/views/influxdb_apply.py:57 -msgid "开始部署influxdb场景" -msgstr "开始部署influxdb场景" +#: backend/ticket/constants.py:178 +msgid "MySQL 高可用禁用" +msgstr "MySQL 高可用禁用" -#: backend/flow/views/influxdb_destroy.py:39 -msgid "开始下架Influxdb场景" -msgstr "开始下架Influxdb场景" +#: backend/ticket/constants.py:179 +msgid "MySQL 高可用启用" +msgstr "MySQL 高可用启用" -#: backend/flow/views/influxdb_disable.py:39 -msgid "开始禁用Influxdb场景" -msgstr "开始禁用Influxdb场景" +#: backend/ticket/constants.py:180 +msgid "MySQL 集群授权" +msgstr "MySQL 集群授权" -#: backend/flow/views/influxdb_enable.py:39 -msgid "开始启用Influxdb场景" -msgstr "开始启用Influxdb场景" +#: backend/ticket/constants.py:181 +msgid "MySQL EXCEL授权" +msgstr "MySQL EXCEL授权" -#: backend/flow/views/influxdb_reboot.py:47 -msgid "开始重启Influxdb节点场景" -msgstr "开始重启Influxdb节点场景" +#: backend/ticket/constants.py:183 +msgid "MySQL DB实例权限克隆" +msgstr "MySQL DB实例权限克隆" -#: backend/flow/views/influxdb_replace.py:49 -msgid "开始替换influxdb场景" -msgstr "开始替换influxdb场景" +#: backend/ticket/constants.py:184 +msgid "MySQL 高可用DB重命名" +msgstr "MySQL 高可用DB重命名" -#: backend/flow/views/kafka_apply.py:70 -msgid "开始部署kafka场景" -msgstr "开始部署kafka场景" +#: backend/ticket/constants.py:185 +msgid "MySQL 高可用清档" +msgstr "MySQL 高可用清档" -#: backend/flow/views/kafka_destroy.py:39 -msgid "开始下架Kafka场景" -msgstr "开始下架Kafka场景" +#: backend/ticket/constants.py:186 +msgid "MySQL 高可用库表备份" +msgstr "MySQL 高可用库表备份" -#: backend/flow/views/kafka_disable.py:39 -msgid "开始禁用Kafka场景" -msgstr "开始禁用Kafka场景" +#: backend/ticket/constants.py:186 backend/ticket/constants.py:193 +#: backend/ticket/constants.py:213 backend/ticket/constants.py:236 +#: backend/ticket/constants.py:261 backend/ticket/constants.py:400 +#: backend/ticket/constants.py:401 +msgid "备份" +msgstr "备份" -#: backend/flow/views/kafka_enable.py:39 -msgid "开始启用Kafka场景" -msgstr "开始启用Kafka场景" +#: backend/ticket/constants.py:187 +msgid "MySQL 数据校验修复" +msgstr "MySQL 数据校验修复" -#: backend/flow/views/kafka_reboot.py:47 -msgid "开始重启Kafka节点场景" -msgstr "开始重启Kafka节点场景" +#: backend/ticket/constants.py:188 +msgid "MySQL 分区" +msgstr "MySQL 分区" -#: backend/flow/views/kafka_replace.py:51 -msgid "开始替换kafka场景" -msgstr "开始替换kafka场景" +#: backend/ticket/constants.py:189 +msgid "MySQL 分区定时任务" +msgstr "MySQL 分区定时任务" -#: backend/flow/views/kafka_scale_up.py:49 -msgid "开始扩容kafka场景" -msgstr "开始扩容kafka场景" +#: backend/ticket/constants.py:190 +msgid "MySQL 数据修复" +msgstr "MySQL 数据修复" -#: backend/flow/views/kafka_shrink.py:44 -msgid "开始缩容kafka场景" -msgstr "开始缩容kafka场景" +#: backend/ticket/constants.py:191 +msgid "MySQL 闪回" +msgstr "MySQL 闪回" -#: backend/flow/views/mysql_add_slave.py:44 -msgid "开始添加slave" -msgstr "开始添加slave" +#: backend/ticket/constants.py:191 backend/ticket/constants.py:192 +#: backend/ticket/constants.py:237 backend/ticket/constants.py:238 +msgid "回档" +msgstr "回档" -#: backend/flow/views/mysql_edit_config.py:60 -msgid "开始下发修改的参数" -msgstr "开始下发修改的参数" +#: backend/ticket/constants.py:192 +msgid "MySQL 定点构造" +msgstr "MySQL 定点构造" -#: backend/flow/views/mysql_flashback.py:49 -msgid "开始flashback" -msgstr "开始flashback" +#: backend/ticket/constants.py:193 +msgid "MySQL 高可用全库备份" +msgstr "MySQL 高可用全库备份" -#: backend/flow/views/mysql_ha_db_table_backup.py:32 -msgid "开始库表备份场景" -msgstr "开始库表备份场景" +#: backend/ticket/constants.py:194 +msgid "MySQL 单节点清档" +msgstr "MySQL 单节点清档" -#: backend/flow/views/mysql_ha_destroy.py:31 -msgid "开始回收mysql主从版场景" -msgstr "开始回收mysql主从版场景" +#: backend/ticket/constants.py:195 +msgid "MySQL 单节点DB重命名" +msgstr "MySQL 单节点DB重命名" -#: backend/flow/views/mysql_ha_destroy.py:49 -msgid "开始禁用mysql主从版场景" -msgstr "开始禁用mysql主从版场景" +#: backend/ticket/constants.py:196 +msgid "TendbHA 标准化" +msgstr "TendbHA 标准化" -#: backend/flow/views/mysql_ha_destroy.py:65 -msgid "开始启动mysql主从版场景" -msgstr "开始启动mysql主从版场景" +#: backend/ticket/constants.py:197 +msgid "TendbHA 元数据导入" +msgstr "TendbHA 元数据导入" -#: backend/flow/views/mysql_ha_full_backup.py:32 -msgid "开始全库备份场景" -msgstr "开始全库备份场景" +#: backend/ticket/constants.py:198 +msgid "MySQL 开区" +msgstr "MySQL 开区" -#: backend/flow/views/mysql_ha_master_fail_over.py:30 -msgid "开始执行主故障切换[整机切换]的任务" -msgstr "开始执行主故障切换[整机切换]的任务" +#: backend/ticket/constants.py:199 +msgid "MySQL DB克隆" +msgstr "MySQL DB克隆" -#: backend/flow/views/mysql_ha_rename_database.py:30 -#: backend/flow/views/mysql_ha_truncate_data.py:30 -msgid "开始TenDBHA清档场景" -msgstr "开始TenDBHA清档场景" +#: backend/ticket/constants.py:200 +msgid "MySQL 数据导出" +msgstr "MySQL 数据导出" -#: backend/flow/views/mysql_ha_switch.py:30 -msgid "开始执行主从切换[整机切换]的任务" -msgstr "开始执行主从切换[整机切换]的任务" +#: backend/ticket/constants.py:201 +msgid "MySQL 原地升级" +msgstr "MySQL 原地升级" -#: backend/flow/views/mysql_migrate_cluster.py:46 -#: backend/flow/views/mysql_restore_slave.py:49 -msgid "开始重建slave" -msgstr "开始重建slave" +#: backend/ticket/constants.py:201 backend/ticket/constants.py:202 +#: backend/ticket/constants.py:203 +msgid "版本升级" +msgstr "版本升级" -#: backend/flow/views/mysql_proxy_add.py:30 -msgid "开始添加mysql_proxy实例场景" -msgstr "开始添加mysql_proxy实例场景" +#: backend/ticket/constants.py:202 +msgid "MySQL 迁移升级" +msgstr "MySQL 迁移升级" -#: backend/flow/views/mysql_proxy_reduce.py:30 -msgid "开始回收mysql_proxy实例场景" -msgstr "开始回收mysql_proxy实例场景" +#: backend/ticket/constants.py:203 +msgid "MySQL Proxy升级" +msgstr "MySQL Proxy升级" -#: backend/flow/views/mysql_proxy_switch.py:30 -msgid "开始替换mysql_proxy实例场景" -msgstr "开始替换mysql_proxy实例场景" +#: backend/ticket/constants.py:204 +msgid "TendbHA集群迁移至其他业务" +msgstr "TendbHA集群迁移至其他业务" -#: backend/flow/views/mysql_pt_table_sync.py:30 -msgid "开始执行数据修复" -msgstr "开始执行数据修复" +#: backend/ticket/constants.py:205 +msgid "推送周边配置" +msgstr "推送周边配置" -#: backend/flow/views/mysql_restore_local_slave.py:44 -msgid "开始原地重建slave" -msgstr "开始原地重建slave" +#: backend/ticket/constants.py:208 +msgid "TenDB Cluster 开区" +msgstr "TenDB Cluster 开区" -#: backend/flow/views/mysql_rollback_data.py:48 -msgid "开始重建定点回档数据" -msgstr "开始重建定点回档数据" +#: backend/ticket/constants.py:209 +msgid "TenDB Cluster 数据校验修复" +msgstr "TenDB Cluster 数据校验修复" -#: backend/flow/views/mysql_single_apply.py:57 -msgid "开始部署mysql单实例场景" -msgstr "开始部署mysql单实例场景" +#: backend/ticket/constants.py:210 +msgid "TenDB Cluster 数据修复" +msgstr "TenDB Cluster 数据修复" -#: backend/flow/views/mysql_single_destroy.py:30 -msgid "开始回收mysql单节点版场景" -msgstr "开始回收mysql单节点版场景" +#: backend/ticket/constants.py:211 +msgid "TenDB Cluster 分区管理" +msgstr "TenDB Cluster 分区管理" -#: backend/flow/views/mysql_single_destroy.py:46 -msgid "开始禁用mysql单节点版场景" -msgstr "开始禁用mysql单节点版场景" +#: backend/ticket/constants.py:212 +msgid "TenDB Cluster 分区定时任务" +msgstr "TenDB Cluster 分区定时任务" -#: backend/flow/views/mysql_single_destroy.py:62 -msgid "开始启动mysql单节点版场景" -msgstr "开始启动mysql单节点版场景" +#: backend/ticket/constants.py:214 +msgid "TenDB Cluster 数据库重命名" +msgstr "TenDB Cluster 数据库重命名" -#: backend/flow/views/mysql_single_rename_database.py:30 -#: backend/flow/views/mysql_single_truncate_data.py:30 -msgid "开始TenDBSingle清档场景" -msgstr "开始TenDBSingle清档场景" +#: backend/ticket/constants.py:215 +msgid "TenDB Cluster 清档" +msgstr "TenDB Cluster 清档" -#: backend/flow/views/pulsar_destroy.py:39 -msgid "开始pulsar集群销毁场景" -msgstr "开始pulsar集群销毁场景" +#: backend/ticket/constants.py:216 +msgid "TenDB Cluster 主库故障切换" +msgstr "TenDB Cluster 主库故障切换" -#: backend/flow/views/pulsar_disable.py:39 -msgid "开始PULSAR集群禁用场景" -msgstr "开始PULSAR集群禁用场景" +#: backend/ticket/constants.py:217 +msgid "TenDB Cluster 主从互切" +msgstr "TenDB Cluster 主从互切" -#: backend/flow/views/pulsar_enable.py:39 -msgid "开始PULSAR集群启用场景" -msgstr "开始PULSAR集群启用场景" +#: backend/ticket/constants.py:218 +msgid "TenDB Cluster 变更SQL执行" +msgstr "TenDB Cluster 变更SQL执行" -#: backend/flow/views/pulsar_reboot.py:55 -msgid "开始重启PULSAR场景" -msgstr "开始重启PULSAR场景" +#: backend/ticket/constants.py:219 +msgid "TenDB Cluster 强制变更SQL执行" +msgstr "TenDB Cluster 强制变更SQL执行" -#: backend/flow/views/pulsar_replace.py:28 -msgid "开始PULSAR集群替换场景" -msgstr "开始PULSAR集群替换场景" +#: backend/ticket/constants.py:220 +msgid "TenDB Cluster 模拟执行" +msgstr "TenDB Cluster 模拟执行" -#: backend/flow/views/pulsar_shrink.py:28 -msgid "开始PULSAR集群缩容场景" -msgstr "开始PULSAR集群缩容场景" +#: backend/ticket/constants.py:221 +msgid "TenDB Cluster 扩容接入层" +msgstr "TenDB Cluster 扩容接入层" -#: backend/flow/views/rollback_pipeline.py:151 -msgid "导入资源池失败" -msgstr "导入资源池失败" +#: backend/ticket/constants.py:222 +msgid "TenDB Cluster 缩容接入层" +msgstr "TenDB Cluster 缩容接入层" -#: backend/flow/views/rollback_pipeline.py:171 -msgid "高可用架构" -msgstr "高可用架构" +#: backend/ticket/constants.py:223 +msgid "TenDB Cluster 添加运维节点" +msgstr "TenDB Cluster 添加运维节点" -#: backend/flow/views/rollback_pipeline.py:172 -msgid "单实例架构" -msgstr "单实例架构" +#: backend/ticket/constants.py:223 backend/ticket/constants.py:224 +msgid "运维 Spider 管理" +msgstr "运维 Spider 管理" -#: backend/flow/views/spider_cluster_database_table_backup.py:30 -msgid "开始TenDBCluster库表备份场景" -msgstr "开始TenDBCluster库表备份场景" +#: backend/ticket/constants.py:224 +msgid "TenDB Cluster 下架运维节点" +msgstr "TenDB Cluster 下架运维节点" -#: backend/flow/views/spider_cluster_destroy.py:34 -msgid "开始禁用spider集群场景" -msgstr "开始禁用spider集群场景" +#: backend/ticket/constants.py:228 +msgid "TenDB Cluster Slave原地重建" +msgstr "TenDB Cluster Slave原地重建" -#: backend/flow/views/spider_cluster_destroy.py:53 -msgid "开始启用spider集群场景" -msgstr "开始启用spider集群场景" +#: backend/ticket/constants.py:229 +msgid "TenDB Cluster 主从迁移" +msgstr "TenDB Cluster 主从迁移" -#: backend/flow/views/spider_cluster_full_backup.py:30 -msgid "开始TenDBCluster全库备份场景" -msgstr "开始TenDBCluster全库备份场景" +#: backend/ticket/constants.py:230 +msgid "TenDB Cluster 集群部署" +msgstr "TenDB Cluster 集群部署" -#: backend/flow/views/spider_cluster_rename_database.py:30 -msgid "开始TenDBCluster数据库重命名场景" -msgstr "开始TenDBCluster数据库重命名场景" +#: backend/ticket/constants.py:231 +msgid "TenDB Cluster 集群启用" +msgstr "TenDB Cluster 集群启用" -#: backend/flow/views/spider_cluster_truncate_database.py:30 -msgid "开始TenDBCluster清档场景" -msgstr "开始TenDBCluster清档场景" +#: backend/ticket/constants.py:232 +msgid "TenDB Cluster 集群禁用" +msgstr "TenDB Cluster 集群禁用" -#: backend/iam_app/dataclass/actions.py:47 -msgid "业务访问" -msgstr "业务访问" +#: backend/ticket/constants.py:233 +msgid "TenDB Cluster 集群销毁" +msgstr "TenDB Cluster 集群销毁" -#: backend/iam_app/dataclass/actions.py:56 -msgid "数据库管理" -msgstr "数据库管理" +#: backend/ticket/constants.py:234 +msgid "TenDB Cluster 临时集群销毁" +msgstr "TenDB Cluster 临时集群销毁" -#: backend/iam_app/dataclass/actions.py:65 -msgid "平台管理" -msgstr "平台管理" +#: backend/ticket/constants.py:235 +msgid "TenDB Cluster 集群容量变更" +msgstr "TenDB Cluster 集群容量变更" -#: backend/iam_app/dataclass/actions.py:78 -msgid "动作ID不存在: {}" -msgstr "动作ID不存在: {}" +#: backend/ticket/constants.py:237 +msgid "TenDB Cluster 定点构造" +msgstr "TenDB Cluster 定点构造" -#: backend/iam_app/dataclass/resources.py:94 -msgid "资源类型ID不存在: {}" -msgstr "资源类型ID不存在: {}" +#: backend/ticket/constants.py:238 +msgid "TenDB Cluster 闪回" +msgstr "TenDB Cluster 闪回" -#: backend/iam_app/exceptions.py:51 -#, python-brace-format -msgid "当前用户无 [{action_name}] 权限" -msgstr "当前用户无 [{action_name}] 权限" +#: backend/ticket/constants.py:242 +msgid "TenDB Cluster EXCEL授权" +msgstr "TenDB Cluster EXCEL授权" -#: backend/iam_app/handlers/drf_perm.py:162 -msgid "JWT鉴权错误,错误信息: {}" -msgstr "JWT鉴权错误,错误信息: {}" +#: backend/ticket/constants.py:248 +msgid "TenDB Cluster DB克隆" +msgstr "TenDB Cluster DB克隆" -#: backend/iam_app/handlers/permission.py:74 -#, python-brace-format -msgid "获取系统信息错误:{message}" -msgstr "获取系统信息错误:{message}" +#: backend/ticket/constants.py:249 +msgid "TenDB Cluster 数据导出" +msgstr "TenDB Cluster 数据导出" -#: backend/iam_app/serializers.py:18 -msgid "资源类型" -msgstr "资源类型" +#: backend/ticket/constants.py:251 +msgid "TBINLOGDUMPER 上架" +msgstr "TBINLOGDUMPER 上架" -#: backend/iam_app/serializers.py:19 -msgid "资源ID" -msgstr "资源ID" +#: backend/ticket/constants.py:252 +msgid "TBINLOGDUMPER 下架" +msgstr "TBINLOGDUMPER 下架" -#: backend/iam_app/serializers.py:21 -msgid "动作ID列表" -msgstr "动作ID列表" +#: backend/ticket/constants.py:253 +msgid "TBINLOGDUMPER 切换" +msgstr "TBINLOGDUMPER 切换" -#: backend/iam_app/serializers.py:22 -msgid "资源列表" -msgstr "资源列表" +#: backend/ticket/constants.py:254 +msgid "TBINLOGDUMPER 禁用" +msgstr "TBINLOGDUMPER 禁用" -#: backend/iam_app/views/views.py:27 -msgid "获取系统权限中心信息" -msgstr "获取系统权限中心信息" +#: backend/ticket/constants.py:255 +msgid "TBINLOGDUMPER 启用" +msgstr "TBINLOGDUMPER 启用" -#: backend/iam_app/views/views.py:34 -msgid "检查当前用户对该动作是否有权限" -msgstr "检查当前用户对该动作是否有权限" +#: backend/ticket/constants.py:258 +msgid "SQLServer 单节点部署" +msgstr "SQLServer 单节点部署" -#: backend/iam_app/views/views.py:51 -msgid "获取权限申请数据" -msgstr "获取权限申请数据" +#: backend/ticket/constants.py:259 +msgid "SQLServer 高可用部署" +msgstr "SQLServer 高可用部署" -#: backend/ticket/builders/__init__.py:149 -#, python-brace-format -msgid "{creator}提交了{title}的单据,请查看详情后进行审批" -msgstr "{creator}提交了{title}的单据,请查看详情后进行审批" +#: backend/ticket/constants.py:260 +msgid "SQLServer SQL导入执行" +msgstr "SQLServer SQL导入执行" -#: backend/ticket/builders/__init__.py:154 -msgid "单据链接" -msgstr "单据链接" +#: backend/ticket/constants.py:261 +msgid "SQLServer 库表备份" +msgstr "SQLServer 库表备份" -#: backend/ticket/builders/__init__.py:159 -msgid "需求信息" -msgstr "需求信息" +#: backend/ticket/constants.py:262 +msgid "SQLServer 清档" +msgstr "SQLServer 清档" -#: backend/ticket/builders/__init__.py:305 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:176 -#: backend/ticket/constants.py:307 -msgid "单据审批" -msgstr "单据审批" +#: backend/ticket/constants.py:263 +msgid "SQLServer 集群卸载" +msgstr "SQLServer 集群卸载" -#: backend/ticket/builders/cloud/dbha_add.py:30 -msgid "新DBHA-GM机器的部署信息" -msgstr "新DBHA-GM机器的部署信息" +#: backend/ticket/constants.py:264 +msgid "SQLServer 集群禁用" +msgstr "SQLServer 集群禁用" -#: backend/ticket/builders/cloud/dbha_add.py:31 -msgid "新DBHA-AGENT机器的部署信息" -msgstr "新DBHA-AGENT机器的部署信息" +#: backend/ticket/constants.py:265 +msgid "SQLServer 集群启用" +msgstr "SQLServer 集群启用" -#: backend/ticket/builders/cloud/dbha_add.py:47 -msgid "DBHA 服务新增" -msgstr "DBHA 服务新增" +#: backend/ticket/constants.py:266 +msgid "SQLServer DB重命名" +msgstr "SQLServer DB重命名" -#: backend/ticket/builders/cloud/dbha_reduce.py:32 -msgid "裁撤的DBHA-GM列表" -msgstr "裁撤的DBHA-GM列表" +#: backend/ticket/constants.py:267 +msgid "SQLServer 主从互切" +msgstr "SQLServer 主从互切" -#: backend/ticket/builders/cloud/dbha_reduce.py:35 -msgid "裁撤的DBHA-AGENT列表" -msgstr "裁撤的DBHA-AGENT列表" +#: backend/ticket/constants.py:268 +msgid "SQLServer 主库故障切换" +msgstr "SQLServer 主库故障切换" -#: backend/ticket/builders/cloud/dbha_reduce.py:44 -msgid "请至少保证一个agent/gm存活" -msgstr "请至少保证一个agent/gm存活" +#: backend/ticket/constants.py:269 +msgid "SQLServer 原地重建" +msgstr "SQLServer 原地重建" -#: backend/ticket/builders/cloud/dbha_reduce.py:61 -msgid "DBHA 服务裁撤" -msgstr "DBHA 服务裁撤" +#: backend/ticket/constants.py:270 +msgid "SQLServer 新机重建" +msgstr "SQLServer 新机重建" -#: backend/ticket/builders/cloud/dbha_reload.py:29 -msgid "重装的GM ID列表" -msgstr "重装的GM ID列表" +#: backend/ticket/constants.py:271 +msgid "SQLServer 添加从库" +msgstr "SQLServer 添加从库" -#: backend/ticket/builders/cloud/dbha_reload.py:30 -msgid "重装的AGENT ID列表" -msgstr "重装的AGENT ID列表" +#: backend/ticket/constants.py:272 +msgid "SQLServer 集群重置" +msgstr "SQLServer 集群重置" -#: backend/ticket/builders/cloud/dbha_reload.py:46 -msgid "DBHA 服务重装" -msgstr "DBHA 服务重装" +#: backend/ticket/constants.py:273 +msgid "SQLServer 全备迁移" +msgstr "SQLServer 全备迁移" -#: backend/ticket/builders/cloud/dbha_replace.py:30 -msgid "被替换旧DBHA-GM服务ID" -msgstr "被替换旧DBHA-GM服务ID" +#: backend/ticket/constants.py:274 +msgid "SQLServer 增量迁移" +msgstr "SQLServer 增量迁移" -#: backend/ticket/builders/cloud/dbha_replace.py:31 -msgid "替换后的新的DBHA-GM服务信息" -msgstr "替换后的新的DBHA-GM服务信息" +#: backend/ticket/constants.py:275 +msgid "SQLServer 定点构造" +msgstr "SQLServer 定点构造" -#: backend/ticket/builders/cloud/dbha_replace.py:33 -msgid "被替换旧DBHA-AGENT服务ID" -msgstr "被替换旧DBHA-AGENT服务ID" +#: backend/ticket/constants.py:277 +msgid "SQLServer EXCEL授权" +msgstr "SQLServer EXCEL授权" -#: backend/ticket/builders/cloud/dbha_replace.py:34 -msgid "替换后的新的DBHA-AGENT服务信息" -msgstr "替换后的新的DBHA-AGENT服务信息" +#: backend/ticket/constants.py:278 +msgid "SQLServer DB建立同步" +msgstr "SQLServer DB建立同步" -#: backend/ticket/builders/cloud/dbha_replace.py:38 -msgid "不允许同时对agent和gm进行替换" -msgstr "不允许同时对agent和gm进行替换" +#: backend/ticket/constants.py:281 +msgid "Redis 创建CLB" +msgstr "Redis 创建CLB" -#: backend/ticket/builders/cloud/dbha_replace.py:62 -msgid "DBHA 服务替换" -msgstr "DBHA 服务替换" +#: backend/ticket/constants.py:282 +msgid "Redis 删除CLB" +msgstr "Redis 删除CLB" -#: backend/ticket/builders/cloud/dns_add.py:29 -msgid "新DNS机器的部署信息" -msgstr "新DNS机器的部署信息" +#: backend/ticket/constants.py:283 +msgid "Redis 域名绑定CLB" +msgstr "Redis 域名绑定CLB" -#: backend/ticket/builders/cloud/dns_add.py:43 -#: backend/ticket/builders/cloud/drs_add.py:43 -msgid "DNS 服务新增" -msgstr "DNS 服务新增" +#: backend/ticket/constants.py:284 +msgid "Redis 域名解绑CLB" +msgstr "Redis 域名解绑CLB" -#: backend/ticket/builders/cloud/dns_reduce.py:30 -msgid "裁撤的DNS列表" -msgstr "裁撤的DNS列表" +#: backend/ticket/constants.py:285 +msgid "Redis 创建Polaris" +msgstr "Redis 创建Polaris" -#: backend/ticket/builders/cloud/dns_reduce.py:36 -msgid "请至少保证一个dns服务存活" -msgstr "请至少保证一个dns服务存活" +#: backend/ticket/constants.py:286 +msgid "Redis 删除Polaris" +msgstr "Redis 删除Polaris" -#: backend/ticket/builders/cloud/dns_reduce.py:52 -msgid "DNS 服务裁撤" -msgstr "DNS 服务裁撤" +#: backend/ticket/constants.py:287 +msgid "Redis 单节点部署" +msgstr "Redis 单节点部署" -#: backend/ticket/builders/cloud/dns_reload.py:29 -msgid "重装的DNSID列表" -msgstr "重装的DNSID列表" +#: backend/ticket/constants.py:288 +msgid "Redis 主从节点部署" +msgstr "Redis 主从节点部署" -#: backend/ticket/builders/cloud/dns_reload.py:43 -msgid "DNS 服务重装" -msgstr "DNS 服务重装" +#: backend/ticket/constants.py:290 +msgid "Redis 提取 Key" +msgstr "Redis 提取 Key" -#: backend/ticket/builders/cloud/dns_replace.py:29 -msgid "被替换旧DNS服务ID" -msgstr "被替换旧DNS服务ID" +#: backend/ticket/constants.py:291 +msgid "Redis 删除 key" +msgstr "Redis 删除 key" -#: backend/ticket/builders/cloud/dns_replace.py:30 -msgid "替换后的新的DNS服务信息" -msgstr "替换后的新的DNS服务信息" +#: backend/ticket/constants.py:292 +msgid "Redis 集群备份" +msgstr "Redis 集群备份" -#: backend/ticket/builders/cloud/dns_replace.py:44 -msgid "DNS 服务替换" -msgstr "DNS 服务替换" +#: backend/ticket/constants.py:293 +msgid "Redis 集群启用" +msgstr "Redis 集群启用" -#: backend/ticket/builders/cloud/drs_add.py:29 -msgid "新drs机器的部署信息" -msgstr "新drs机器的部署信息" +#: backend/ticket/constants.py:294 +msgid "Redis 集群禁用" +msgstr "Redis 集群禁用" -#: backend/ticket/builders/cloud/drs_reduce.py:30 -msgid "裁撤的drs列表" -msgstr "裁撤的drs列表" +#: backend/ticket/constants.py:295 +msgid "Redis 主从启用" +msgstr "Redis 主从启用" -#: backend/ticket/builders/cloud/drs_reduce.py:36 -msgid "请至少保证一个drs服务存活" -msgstr "请至少保证一个drs服务存活" +#: backend/ticket/constants.py:296 +msgid "Redis 主从禁用" +msgstr "Redis 主从禁用" -#: backend/ticket/builders/cloud/drs_reduce.py:52 -msgid "DRS 服务裁撤" -msgstr "DRS 服务裁撤" +#: backend/ticket/constants.py:297 +msgid "Redis 集群删除" +msgstr "Redis 集群删除" -#: backend/ticket/builders/cloud/drs_reload.py:29 -msgid "重装的drsID列表" -msgstr "重装的drsID列表" +#: backend/ticket/constants.py:298 +msgid "Redis 主从集群删除" +msgstr "Redis 主从集群删除" -#: backend/ticket/builders/cloud/drs_reload.py:43 -msgid "DRS 服务重装" -msgstr "DRS 服务重装" +#: backend/ticket/constants.py:299 +msgid "Redis 集群清档" +msgstr "Redis 集群清档" -#: backend/ticket/builders/cloud/drs_replace.py:29 -msgid "被替换旧DRS服务ID" -msgstr "被替换旧DRS服务ID" +#: backend/ticket/constants.py:302 +msgid "Redis 整机替换" +msgstr "Redis 整机替换" -#: backend/ticket/builders/cloud/drs_replace.py:30 -msgid "替换后的新的DRS服务信息" -msgstr "替换后的新的DRS服务信息" +#: backend/ticket/constants.py:303 +msgid "Redis 故障自愈" +msgstr "Redis 故障自愈" -#: backend/ticket/builders/cloud/drs_replace.py:44 -msgid "DRS 服务替换" -msgstr "DRS 服务替换" +#: backend/ticket/constants.py:304 +msgid "Redis 故障自愈-实例下架" +msgstr "Redis 故障自愈-实例下架" -#: backend/ticket/builders/cloud/nginx_reload.py:28 -msgid "重装的nginx id" -msgstr "重装的nginx id" +#: backend/ticket/constants.py:306 +msgid "Redis Proxy扩容" +msgstr "Redis Proxy扩容" -#: backend/ticket/builders/cloud/nginx_reload.py:49 -msgid "Nginx 服务重装" -msgstr "Nginx 服务重装" +#: backend/ticket/constants.py:307 +msgid "Redis Proxy缩容" +msgstr "Redis Proxy缩容" -#: backend/ticket/builders/cloud/nginx_replace.py:30 -#: backend/ticket/builders/cloud/service_apply.py:31 -msgid "部署nginx服务主机信息" -msgstr "部署nginx服务主机信息" +#: backend/ticket/constants.py:308 +msgid "Redis 新增DTS SERVER" +msgstr "Redis 新增DTS SERVER" -#: backend/ticket/builders/cloud/nginx_replace.py:33 -msgid "替换的nginx id" -msgstr "替换的nginx id" +#: backend/ticket/constants.py:309 +msgid "Redis 删除DTS SERVER" +msgstr "Redis 删除DTS SERVER" -#: backend/ticket/builders/cloud/nginx_replace.py:34 -#: backend/ticket/builders/cloud/service_apply.py:42 -#: backend/ticket/builders/cloud/service_apply.py:51 -msgid "nginx服务部署信息" -msgstr "nginx服务部署信息" +#: backend/ticket/constants.py:310 +msgid "Redis 集群数据构造" +msgstr "Redis 集群数据构造" -#: backend/ticket/builders/cloud/nginx_replace.py:53 -msgid "Nginx 服务替换" -msgstr "Nginx 服务替换" +#: backend/ticket/constants.py:310 backend/ticket/constants.py:311 +#: backend/ticket/constants.py:315 +msgid "数据构造" +msgstr "数据构造" -#: backend/ticket/builders/cloud/service_apply.py:28 -msgid "部署drs服务主机信息" -msgstr "部署drs服务主机信息" +#: backend/ticket/constants.py:311 +msgid "Redis 数据构造记录删除" +msgstr "Redis 数据构造记录删除" -#: backend/ticket/builders/cloud/service_apply.py:34 -msgid "部署dns服务主机信息" -msgstr "部署dns服务主机信息" +#: backend/ticket/constants.py:312 +msgid "Redis 集群分片数变更" +msgstr "Redis 集群分片数变更" -#: backend/ticket/builders/cloud/service_apply.py:37 -msgid "部署dbha-agent服务主机信息" -msgstr "部署dbha-agent服务主机信息" +#: backend/ticket/constants.py:314 +msgid "Redis 集群数据复制" +msgstr "Redis 集群数据复制" -#: backend/ticket/builders/cloud/service_apply.py:38 -msgid "部署dbha-gm服务主机信息" -msgstr "部署dbha-gm服务主机信息" +#: backend/ticket/constants.py:314 +msgid "数据传输" +msgstr "数据传输" -#: backend/ticket/builders/cloud/service_apply.py:41 -#: backend/ticket/builders/cloud/service_apply.py:50 -msgid "drs服务部署信息" -msgstr "drs服务部署信息" +#: backend/ticket/constants.py:317 +msgid "Redis 重建从库" +msgstr "Redis 重建从库" -#: backend/ticket/builders/cloud/service_apply.py:43 -#: backend/ticket/builders/cloud/service_apply.py:52 -msgid "dns服务部署信息" -msgstr "dns服务部署信息" +#: backend/ticket/constants.py:318 +msgid "Redis DTS在线切换" +msgstr "Redis DTS在线切换" -#: backend/ticket/builders/cloud/service_apply.py:44 -#: backend/ticket/builders/cloud/service_apply.py:53 -msgid "dbha服务部署信息" -msgstr "dbha服务部署信息" +#: backend/ticket/constants.py:319 +msgid "Redis 数据迁移" +msgstr "Redis 数据迁移" -#: backend/ticket/builders/cloud/service_apply.py:115 -msgid "Nginx 服务部署" -msgstr "Nginx 服务部署" +#: backend/ticket/constants.py:320 +msgid "Redis slots 迁移" +msgstr "Redis slots 迁移" -#: backend/ticket/builders/cloud/service_apply.py:121 -msgid "DNS 服务部署" -msgstr "DNS 服务部署" +#: backend/ticket/constants.py:321 +msgid "Redis 集群版本升级" +msgstr "Redis 集群版本升级" -#: backend/ticket/builders/cloud/service_apply.py:127 -msgid "DRS 服务部署" -msgstr "DRS 服务部署" +#: backend/ticket/constants.py:322 +msgid "Redis 集群重装DBMON" +msgstr "Redis 集群重装DBMON" -#: backend/ticket/builders/cloud/service_apply.py:133 -msgid "DBHA 服务部署" -msgstr "DBHA 服务部署" +#: backend/ticket/constants.py:323 +msgid "predixy配置重写" +msgstr "predixy配置重写" -#: backend/ticket/builders/common/base.py:76 -msgid "请输入主机的云区域信息" -msgstr "请输入主机的云区域信息" +#: backend/ticket/constants.py:324 +msgid "Redis 集群proxys版本升级" +msgstr "Redis 集群proxys版本升级" -#: backend/ticket/builders/common/base.py:137 -msgid "" -"新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连接" -"符-和下划线_,并且长度在1到39字符之间" -msgstr "" -"新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连接" -"符-和下划线_,并且长度在1到39字符之间" +#: backend/ticket/constants.py:325 +msgid "Redis脏机清理" +msgstr "Redis脏机清理" -#: backend/ticket/builders/common/base.py:141 -msgid "DB名{}不能以stage_truncate开头" -msgstr "DB名{}不能以stage_truncate开头" +#: backend/ticket/constants.py:326 +msgid "Redis 集群存储层cli连接kill" +msgstr "Redis 集群存储层cli连接kill" + +#: backend/ticket/constants.py:327 +msgid "Redis集群域名重命名" +msgstr "Redis集群域名重命名" -#: backend/ticket/builders/common/base.py:144 -msgid "DB名{}不能以dba_rollback结尾" -msgstr "DB名{}不能以dba_rollback结尾" +#: backend/ticket/constants.py:328 +msgid "Redis 集群设置maxmemory" +msgstr "Redis 集群设置maxmemory" -#: backend/ticket/builders/common/base.py:153 -msgid "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" -msgstr "业务{}下已经存在同类型: {}, 同名: {} 集群,请重新命名" +#: backend/ticket/constants.py:329 +msgid "Redis 集群加载modules" +msgstr "Redis 集群加载modules" -#: backend/ticket/builders/common/base.py:173 -msgid "不允许%单独使用,不允许*组合使用" -msgstr "不允许%单独使用,不允许*组合使用" +#: backend/ticket/constants.py:338 +msgid "Kafka 集群禁用" +msgstr "Kafka 集群禁用" -#: backend/ticket/builders/common/base.py:176 -msgid "包含通配符时,每一个输入框只能允许单一对象" -msgstr "包含通配符时,每一个输入框只能允许单一对象" +#: backend/ticket/constants.py:339 +msgid "Kafka 集群删除" +msgstr "Kafka 集群删除" -#: backend/ticket/builders/common/base.py:179 -msgid "字符不允许只包含空格" -msgstr "字符不允许只包含空格" +#: backend/ticket/constants.py:344 +msgid "HDFS 实例重启" +msgstr "HDFS 实例重启" -#: backend/ticket/builders/common/base.py:182 -msgid "DB选择框不允许为空" -msgstr "DB选择框不允许为空" +#: backend/ticket/constants.py:351 +msgid "ES 集群扩容" +msgstr "ES 集群扩容" -#: backend/ticket/builders/common/base.py:185 -msgid "table选择框不允许为空" -msgstr "table选择框不允许为空" +#: backend/ticket/constants.py:352 +msgid "ES 集群缩容" +msgstr "ES 集群缩容" -#: backend/ticket/builders/common/base.py:188 -msgid "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" -msgstr "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" +#: backend/ticket/constants.py:353 +msgid "ES 实例重启" +msgstr "ES 实例重启" -#: backend/ticket/builders/common/base.py:200 -msgid "数据库{}不在所属集群{}中,请重新查验" -msgstr "数据库{}不在所属集群{}中,请重新查验" +#: backend/ticket/constants.py:354 +msgid "ES 集群替换" +msgstr "ES 集群替换" -#: backend/ticket/builders/common/bigdata.py:38 -msgid "节点列表信息" -msgstr "节点列表信息" +#: backend/ticket/constants.py:355 +msgid "ES 集群启用" +msgstr "ES 集群启用" -#: backend/ticket/builders/common/bigdata.py:52 -#: backend/ticket/builders/redis/redis_cluster_apply.py:96 -msgid "主机{}不在空闲机池,请保证所选的主机均来自空闲机" -msgstr "主机{}不在空闲机池,请保证所选的主机均来自空闲机" +#: backend/ticket/constants.py:356 +msgid "ES 集群禁用" +msgstr "ES 集群禁用" -#: backend/ticket/builders/common/bigdata.py:61 -msgid "主机{}已经被使用,请重新选择主机" -msgstr "主机{}已经被使用,请重新选择主机" +#: backend/ticket/constants.py:357 +msgid "ES 集群删除" +msgstr "ES 集群删除" -#: backend/ticket/builders/common/bigdata.py:82 -#: backend/ticket/builders/mysql/base.py:175 -msgid "集群{}状态转移不合法:{}--->{} is invalid" -msgstr "集群{}状态转移不合法:{}--->{} is invalid" +#: backend/ticket/constants.py:362 +msgid "Pulsar 实例重启" +msgstr "Pulsar 实例重启" -#: backend/ticket/builders/common/bigdata.py:90 -msgid "资源池规格" -msgstr "资源池规格" +#: backend/ticket/constants.py:369 backend/ticket/constants.py:370 +#: backend/ticket/constants.py:373 backend/ticket/constants.py:374 +msgid "实例管理" +msgstr "实例管理" -#: backend/ticket/builders/common/bigdata.py:110 -#: backend/ticket/builders/influxdb/influxdb_apply.py:29 -#: backend/ticket/builders/mysql/mysql_single_apply.py:48 -#: backend/ticket/builders/redis/redis_cluster_apply.py:33 -#: backend/ticket/builders/spider/tendb_apply.py:32 -msgid "城市代码" -msgstr "城市代码" +#: backend/ticket/constants.py:376 +msgid "Doris 集群部署" +msgstr "Doris 集群部署" -#: backend/ticket/builders/common/bigdata.py:112 -#: backend/ticket/builders/redis/redis_cluster_apply.py:31 -#: backend/ticket/serializers.py:77 -msgid "业务英文缩写" -msgstr "业务英文缩写" +#: backend/ticket/constants.py:377 +msgid "Doris 集群扩容" +msgstr "Doris 集群扩容" -#: backend/ticket/builders/common/bigdata.py:113 -msgid "集群名称(英文数字及下划线)" -msgstr "集群名称(英文数字及下划线)" +#: backend/ticket/constants.py:378 +msgid "Doris 集群缩容" +msgstr "Doris 集群缩容" -#: backend/ticket/builders/common/bigdata.py:114 -#: backend/ticket/builders/redis/redis_cluster_apply.py:42 -msgid "集群别名(一般为中文别名)" -msgstr "集群别名(一般为中文别名)" +#: backend/ticket/constants.py:379 +msgid "Doris 实例重启" +msgstr "Doris 实例重启" -#: backend/ticket/builders/common/bigdata.py:118 -msgid "资源申请规格" -msgstr "资源申请规格" +#: backend/ticket/constants.py:380 +msgid "Doris 集群替换" +msgstr "Doris 集群替换" -#: backend/ticket/builders/common/bigdata.py:156 -msgid "主机{}出现角色互斥,{}与{}冲突" -msgstr "主机{}出现角色互斥,{}与{}冲突" +#: backend/ticket/constants.py:381 +msgid "Doris 集群启用" +msgstr "Doris 集群启用" -#: backend/ticket/builders/common/bigdata.py:170 -#: backend/ticket/builders/common/bigdata.py:291 -msgid "旧节点信息集合" -msgstr "旧节点信息集合" +#: backend/ticket/constants.py:382 +msgid "Doris 集群禁用" +msgstr "Doris 集群禁用" -#: backend/ticket/builders/common/bigdata.py:170 -#: backend/ticket/builders/common/bigdata.py:172 -#: backend/ticket/builders/common/bigdata.py:291 -#: backend/ticket/builders/common/bigdata.py:293 -msgid "节点信息" -msgstr "节点信息" +#: backend/ticket/constants.py:383 +msgid "Doris 集群删除" +msgstr "Doris 集群删除" -#: backend/ticket/builders/common/bigdata.py:172 -#: backend/ticket/builders/common/bigdata.py:293 -msgid "新节点信息集合" -msgstr "新节点信息集合" +#: backend/ticket/constants.py:386 +msgid "Riak 集群部署" +msgstr "Riak 集群部署" -#: backend/ticket/builders/common/bigdata.py:174 -msgid "规格类型" -msgstr "规格类型" +#: backend/ticket/constants.py:392 +msgid "Riak 集群节点重启" +msgstr "Riak 集群节点重启" -#: backend/ticket/builders/common/bigdata.py:181 -#: backend/ticket/builders/common/bigdata.py:302 -msgid "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" -msgstr "替换前后角色类型不一致,请保证替换前后角色类型和数量一致!" +#: backend/ticket/constants.py:393 +msgid "Riak 集群迁移" +msgstr "Riak 集群迁移" -#: backend/ticket/builders/common/bigdata.py:189 -#: backend/ticket/builders/common/bigdata.py:310 -msgid "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" -msgstr "角色{}替换前后数量不一致,请保证替换前后角色类型和数量一致!" +#: backend/ticket/constants.py:396 +msgid "MongoDB 副本集集群部署" +msgstr "MongoDB 副本集集群部署" -#: backend/ticket/builders/common/bigdata.py:208 -msgid "实例名" -msgstr "实例名" +#: backend/ticket/constants.py:397 +msgid "MongoDB 分片集群部署" +msgstr "MongoDB 分片集群部署" -#: backend/ticket/builders/common/bigdata.py:219 -#: backend/ticket/builders/common/bigdata.py:285 -msgid "实例{}不存在, 请重新确认实例的合法性" -msgstr "实例{}不存在, 请重新确认实例的合法性" +#: backend/ticket/constants.py:398 +msgid "MongoDB 变更脚本执行" +msgstr "MongoDB 变更脚本执行" -#: backend/ticket/builders/common/bigdata.py:224 -msgid "无法进行重启操作,原因:{}" -msgstr "无法进行重启操作,原因:{}" +#: backend/ticket/constants.py:398 +msgid "脚本任务" +msgstr "脚本任务" -#: backend/ticket/builders/common/bigdata.py:295 -msgid "规格" -msgstr "规格" +#: backend/ticket/constants.py:399 +msgid "MongoDB 清档" +msgstr "MongoDB 清档" -#: backend/ticket/builders/common/constants.py:70 -msgid "本地" -msgstr "本地" +#: backend/ticket/constants.py:400 +msgid "MongoDB 全库备份" +msgstr "MongoDB 全库备份" -#: backend/ticket/builders/common/constants.py:71 -msgid "远程" -msgstr "远程" +#: backend/ticket/constants.py:401 +msgid "MongoDB 库表备份" +msgstr "MongoDB 库表备份" -#: backend/ticket/builders/common/constants.py:88 -msgid "手动提单修复" -msgstr "手动提单修复" +#: backend/ticket/constants.py:402 +msgid "MongoDB 扩容接入层" +msgstr "MongoDB 扩容接入层" -#: backend/ticket/builders/common/constants.py:89 -msgid "例行校验修复" -msgstr "例行校验修复" +#: backend/ticket/constants.py:403 +msgid "MongoDB 缩容接入层" +msgstr "MongoDB 缩容接入层" -#: backend/ticket/builders/common/constants.py:97 -msgid "远程备份 + 时间" -msgstr "远程备份 + 时间" +#: backend/ticket/constants.py:404 +msgid "MongoDB 扩容shard节点数" +msgstr "MongoDB 扩容shard节点数" -#: backend/ticket/builders/common/constants.py:98 -msgid "远程备份 + backupid" -msgstr "远程备份 + backupid" +#: backend/ticket/constants.py:405 +msgid "MongoDB 缩容shard节点数" +msgstr "MongoDB 缩容shard节点数" -#: backend/ticket/builders/common/constants.py:99 -msgid "本地备份 + 时间" -msgstr "本地备份 + 时间" +#: backend/ticket/constants.py:406 +msgid "MongoDB 集群容量变更" +msgstr "MongoDB 集群容量变更" -#: backend/ticket/builders/common/constants.py:100 -msgid "本地备份 + backupid" -msgstr "本地备份 + backupid" +#: backend/ticket/constants.py:410 +msgid "MongoDB 集群删除" +msgstr "MongoDB 集群删除" -#: backend/ticket/builders/es/es_apply.py:45 -msgid "master节点数不为3台! 请保证master的部署节点为3" -msgstr "master节点数不为3台! 请保证master的部署节点为3" +#: backend/ticket/constants.py:411 +msgid "MongoDB 整机替换" +msgstr "MongoDB 整机替换" -#: backend/ticket/builders/es/es_apply.py:52 -msgid "请保证在部署client节点的情况下,部署至少一台hot/cold节点" -msgstr "请保证在部署client节点的情况下,部署至少一台hot/cold节点" +#: backend/ticket/constants.py:412 +msgid "MongoDB 授权" +msgstr "MongoDB 授权" -#: backend/ticket/builders/es/es_apply.py:125 -msgid "ES集群部署" -msgstr "ES集群部署" +#: backend/ticket/constants.py:413 +msgid "MongoDB Excel授权" +msgstr "MongoDB Excel授权" -#: backend/ticket/builders/es/es_destroy.py:36 -msgid "ES集群删除" -msgstr "ES集群删除" +#: backend/ticket/constants.py:414 +msgid "MongoDB 定点回档" +msgstr "MongoDB 定点回档" -#: backend/ticket/builders/es/es_disable.py:36 -msgid "ES集群停用" -msgstr "ES集群停用" +#: backend/ticket/constants.py:416 +msgid "MongoDB 安装DBMon" +msgstr "MongoDB 安装DBMon" -#: backend/ticket/builders/es/es_enable.py:36 -msgid "ES集群启用" -msgstr "ES集群启用" +#: backend/ticket/constants.py:419 +msgid "云区域服务部署" +msgstr "云区域服务部署" -#: backend/ticket/builders/es/es_reboot.py:38 -msgid "ES实例重启" -msgstr "ES实例重启" +#: backend/ticket/constants.py:420 +msgid "云区域Nginx 服务部署" +msgstr "云区域Nginx 服务部署" -#: backend/ticket/builders/es/es_replace.py:47 -msgid "ES集群替换" -msgstr "ES集群替换" +#: backend/ticket/constants.py:421 +msgid "云区域nginx 服务重装" +msgstr "云区域nginx 服务重装" -#: backend/ticket/builders/es/es_scale_up.py:44 -msgid "实例数必须为正数,请确保实例的合法性" -msgstr "实例数必须为正数,请确保实例的合法性" +#: backend/ticket/constants.py:422 +msgid "云区域nginx 服务替换" +msgstr "云区域nginx 服务替换" -#: backend/ticket/builders/es/es_scale_up.py:98 -msgid "ES集群扩容" -msgstr "ES集群扩容" +#: backend/ticket/constants.py:423 +msgid "云区域dns 服务部署" +msgstr "云区域dns 服务部署" -#: backend/ticket/builders/es/es_shrink.py:30 -msgid "hot信息列表" -msgstr "hot信息列表" +#: backend/ticket/constants.py:424 +msgid "云区域dns 服务添加" +msgstr "云区域dns 服务添加" -#: backend/ticket/builders/es/es_shrink.py:31 -msgid "cold信息列表" -msgstr "cold信息列表" +#: backend/ticket/constants.py:425 +msgid "云区域dns 服务裁撤" +msgstr "云区域dns 服务裁撤" -#: backend/ticket/builders/es/es_shrink.py:32 -msgid "client信息列表" -msgstr "client信息列表" +#: backend/ticket/constants.py:426 +msgid "云区域dns 服务替换" +msgstr "云区域dns 服务替换" -#: backend/ticket/builders/es/es_shrink.py:34 -msgid "nodes节点列表" -msgstr "nodes节点列表" +#: backend/ticket/constants.py:427 +msgid "云区域dns 服务重装" +msgstr "云区域dns 服务重装" -#: backend/ticket/builders/es/es_shrink.py:59 -#: backend/ticket/builders/kafka/kafka_shrink.py:58 -msgid "{}: 至少保留1台!" -msgstr "{}: 至少保留1台!" +#: backend/ticket/constants.py:428 +msgid "云区域dbha 服务部署" +msgstr "云区域dbha 服务部署" -#: backend/ticket/builders/es/es_shrink.py:62 -msgid "缩容仅支持hot、cold和client" -msgstr "缩容仅支持hot、cold和client" +#: backend/ticket/constants.py:429 +msgid "云区域dbha 服务重装" +msgstr "云区域dbha 服务重装" -#: backend/ticket/builders/es/es_shrink.py:78 -msgid "ES集群缩容" -msgstr "ES集群缩容" +#: backend/ticket/constants.py:430 +msgid "云区域dbha 服务替换" +msgstr "云区域dbha 服务替换" -#: backend/ticket/builders/hdfs/hdfs_apply.py:40 -msgid "Datanode节点数量<2台,请增加Datanode节点数量" -msgstr "Datanode节点数量<2台,请增加Datanode节点数量" +#: backend/ticket/constants.py:431 +msgid "云区域dbha 服务新增" +msgstr "云区域dbha 服务新增" -#: backend/ticket/builders/hdfs/hdfs_apply.py:45 -msgid "Namenode节点数量不等于2台,请确保Namenode数量为2台" -msgstr "Namenode节点数量不等于2台,请确保Namenode数量为2台" +#: backend/ticket/constants.py:432 +msgid "云区域dbha 服务删除" +msgstr "云区域dbha 服务删除" -#: backend/ticket/builders/hdfs/hdfs_apply.py:50 -msgid "" -"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" -msgstr "" -"ZooKeeper/JournalNode节点数量不等于3台,请确保ZooKeeper/JournalNode数量为3台" +#: backend/ticket/constants.py:433 +msgid "云区域drs 服务部署" +msgstr "云区域drs 服务部署" -#: backend/ticket/builders/hdfs/hdfs_apply.py:139 -#: backend/ticket/constants.py:184 -msgid "HDFS 集群部署" -msgstr "HDFS 集群部署" +#: backend/ticket/constants.py:434 +msgid "云区域drs 服务重启" +msgstr "云区域drs 服务重启" -#: backend/ticket/builders/hdfs/hdfs_destroy.py:36 -#: backend/ticket/constants.py:191 -msgid "HDFS 集群删除" -msgstr "HDFS 集群删除" +#: backend/ticket/constants.py:435 +msgid "云区域drs 服务新增" +msgstr "云区域drs 服务新增" -#: backend/ticket/builders/hdfs/hdfs_disable.py:36 -#: backend/ticket/constants.py:190 -msgid "HDFS 集群禁用" -msgstr "HDFS 集群禁用" +#: backend/ticket/constants.py:436 +msgid "云区域drs 服务删除" +msgstr "云区域drs 服务删除" -#: backend/ticket/builders/hdfs/hdfs_enable.py:36 -#: backend/ticket/constants.py:189 -msgid "HDFS 集群启用" -msgstr "HDFS 集群启用" +#: backend/ticket/constants.py:437 +msgid "云区域drs 服务替换" +msgstr "云区域drs 服务替换" +#: backend/ticket/constants.py:438 +msgid "云区域redis_dts 服务部署" +msgstr "云区域redis_dts 服务部署" -#: backend/ticket/builders/hdfs/hdfs_replace.py:37 -msgid "hdfs替换只支持datanode角色" -msgstr "hdfs替换只支持datanode角色" +#: backend/ticket/constants.py:439 +msgid "云区域redis_dts 服务新增" +msgstr "云区域redis_dts 服务新增" -#: backend/ticket/builders/hdfs/hdfs_replace.py:57 -#: backend/ticket/constants.py:188 -msgid "HDFS 集群替换" -msgstr "HDFS 集群替换" +#: backend/ticket/constants.py:440 +msgid "云区域redis_dts 服务删除" +msgstr "云区域redis_dts 服务删除" -#: backend/ticket/builders/hdfs/hdfs_scale_up.py:64 -msgid "HDFS 集群扩容" -msgstr "HDFS 集群扩容" +#: backend/ticket/constants.py:447 +msgid "VM 集群部署" +msgstr "VM 集群部署" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:30 -#: backend/ticket/builders/kafka/kafka_shrink.py:31 -#: backend/ticket/builders/pulsar/pulsar_shrink.py:34 -msgid "broker信息列表" -msgstr "broker信息列表" +#: backend/ticket/constants.py:448 +msgid "VM 集群扩容" +msgstr "VM 集群扩容" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:32 -#: backend/ticket/builders/kafka/kafka_shrink.py:33 -msgid "nodes节点信息" -msgstr "nodes节点信息" +#: backend/ticket/constants.py:449 +msgid "VM 集群缩容" +msgstr "VM 集群缩容" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:56 -msgid "{}: 至少保留2台!" -msgstr "{}: 至少保留2台!" +#: backend/ticket/constants.py:450 +msgid "VM 实例重启" +msgstr "VM 实例重启" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:59 -msgid "缩容仅支持DataNode角色" -msgstr "缩容仅支持DataNode角色" +#: backend/ticket/constants.py:451 +msgid "VM 集群替换" +msgstr "VM 集群替换" -#: backend/ticket/builders/hdfs/hdfs_shrink.py:75 -#: backend/ticket/constants.py:186 -msgid "HDFS 集群缩容" -msgstr "HDFS 集群缩容" +#: backend/ticket/constants.py:452 +msgid "VM 集群启用" +msgstr "VM 集群启用" -#: backend/ticket/builders/influxdb/influxdb_apply.py:35 -msgid "分组名字" -msgstr "分组名字" +#: backend/ticket/constants.py:453 +msgid "VM 集群禁用" +msgstr "VM 集群禁用" -#: backend/ticket/builders/influxdb/influxdb_apply.py:36 -#: backend/ticket/builders/mysql/mysql_add_slave.py:37 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:33 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:34 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:35 -msgid "资源规格" -msgstr "资源规格" +#: backend/ticket/constants.py:454 +msgid "VM 集群删除" +msgstr "VM 集群删除" -#: backend/ticket/builders/influxdb/influxdb_apply.py:75 -#: backend/ticket/constants.py:211 -msgid "InfluxDB 实例部署" -msgstr "InfluxDB 实例部署" +#: backend/ticket/constants.py:463 +msgid "生产部署" +msgstr "生产部署" -#: backend/ticket/builders/influxdb/influxdb_destroy.py:37 -#: backend/ticket/constants.py:215 -msgid "InfluxDB 实例删除" -msgstr "InfluxDB 实例删除" +#: backend/ticket/constants.py:465 +msgid "快速执行" +msgstr "快速执行" -#: backend/ticket/builders/influxdb/influxdb_disable.py:37 -#: backend/ticket/constants.py:214 -msgid "InfluxDB 实例禁用" -msgstr "InfluxDB 实例禁用" +#: backend/ticket/constants.py:467 +msgid "结果忽略执行" +msgstr "结果忽略执行" -#: backend/ticket/builders/influxdb/influxdb_enable.py:37 -#: backend/ticket/constants.py:213 -msgid "InfluxDB 实例启用" -msgstr "InfluxDB 实例启用" +#: backend/ticket/constants.py:471 +msgid "交付" +msgstr "交付" -#: backend/ticket/builders/influxdb/influxdb_reboot.py:39 -#: backend/ticket/constants.py:212 -msgid "InfluxDB 实例重启" -msgstr "InfluxDB 实例重启" +#: backend/ticket/constants.py:473 +msgid "描述任务信息" +msgstr "描述任务信息" + +#: backend/ticket/constants.py:479 +msgid "资源交付" +msgstr "资源交付" -#: backend/ticket/builders/influxdb/influxdb_replace.py:46 -#: backend/ticket/constants.py:216 -msgid "InfluxDB 实例替换" -msgstr "InfluxDB 实例替换" +#: backend/ticket/constants.py:481 +msgid "资源批量申请" +msgstr "资源批量申请" -#: backend/ticket/builders/kafka/kafka_apply.py:73 -#: backend/ticket/builders/pulsar/pulsar_apply.py:29 -msgid "副本数量" -msgstr "副本数量" +#: backend/ticket/constants.py:483 +msgid "资源批量交付" +msgstr "资源批量交付" -#: backend/ticket/builders/kafka/kafka_apply.py:76 -#: backend/ticket/builders/pulsar/pulsar_apply.py:30 -msgid "分区数量" -msgstr "分区数量" +#: backend/ticket/constants.py:500 +msgid "单据过期配置" +msgstr "单据过期配置" -#: backend/ticket/builders/kafka/kafka_apply.py:79 -#: backend/ticket/builders/pulsar/pulsar_apply.py:31 -msgid "保留时长(小时)" -msgstr "保留时长(小时)" +#: backend/ticket/constants.py:506 +msgid "前置动作" +msgstr "前置动作" -#: backend/ticket/builders/kafka/kafka_apply.py:101 -msgid "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" -msgstr "Zookeeper节点数量不等于3台,请确保Zookeeper节点数量为3" +#: backend/ticket/constants.py:507 +msgid "后继动作" +msgstr "后继动作" -#: backend/ticket/builders/kafka/kafka_apply.py:107 -msgid "" -"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" -msgstr "" -"Broker节点与副本节点数量有误,请确保Broker节点至少为1且副本数量<=Broker数量" +#: backend/ticket/constants.py:513 +msgid "自动重试" +msgstr "自动重试" -#: backend/ticket/builders/kafka/kafka_apply.py:133 -#: backend/ticket/constants.py:175 -msgid "Kafka 集群部署" -msgstr "Kafka 集群部署" +#: backend/ticket/constants.py:514 +msgid "手动重试" +msgstr "手动重试" -#: backend/ticket/builders/kafka/kafka_destroy.py:37 -msgid "Kafka 集群销毁" -msgstr "Kafka 集群销毁" +#: backend/ticket/constants.py:520 +msgid "通用错误代码" +msgstr "通用错误代码" -#: backend/ticket/builders/kafka/kafka_disable.py:37 -msgid "Kafka 集群停用" -msgstr "Kafka 集群停用" +#: backend/ticket/constants.py:521 +msgid "自动互斥重试错误代码" +msgstr "自动互斥重试错误代码" -#: backend/ticket/builders/kafka/kafka_enable.py:37 -#: backend/ticket/constants.py:180 -msgid "Kafka 集群启用" -msgstr "Kafka 集群启用" +#: backend/ticket/constants.py:522 +msgid "手动互斥重试错误代码" +msgstr "手动互斥重试错误代码" -#: backend/ticket/builders/kafka/kafka_reboot.py:39 -#: backend/ticket/constants.py:178 -msgid "Kafka 实例重启" -msgstr "Kafka 实例重启" +#: backend/ticket/constants.py:523 +msgid "系统终止错误代码" +msgstr "系统终止错误代码" -#: backend/ticket/builders/kafka/kafka_replace.py:48 -#: backend/ticket/constants.py:179 -msgid "Kafka 集群替换" -msgstr "Kafka 集群替换" +#: backend/ticket/constants.py:541 +msgid "需要人工确认" +msgstr "需要人工确认" -#: backend/ticket/builders/kafka/kafka_scale_up.py:65 -#: backend/ticket/constants.py:176 -msgid "Kafka 集群扩容" -msgstr "Kafka 集群扩容" +#: backend/ticket/constants.py:542 +msgid "无需确认" +msgstr "无需确认" -#: backend/ticket/builders/kafka/kafka_shrink.py:61 -msgid "缩容仅支持Broker" -msgstr "缩容仅支持Broker" +#: backend/ticket/constants.py:550 +msgid "数据复制完成后自动断开同步关系" +msgstr "数据复制完成后自动断开同步关系" -#: backend/ticket/builders/kafka/kafka_shrink.py:77 -#: backend/ticket/constants.py:177 -msgid "Kafka 集群缩容" -msgstr "Kafka 集群缩容" +#: backend/ticket/constants.py:551 +msgid "数据复制完成后保持同步关系,定时发送断开同步提醒" +msgstr "数据复制完成后保持同步关系,定时发送断开同步提醒" -#: backend/ticket/builders/mysql/base.py:98 -msgid "matser实例状态异常,暂时无法执行该单据类型:{}" -msgstr "matser实例状态异常,暂时无法执行该单据类型:{}" +#: backend/ticket/constants.py:569 +msgid "一天一次" +msgstr "一天一次" -#: backend/ticket/builders/mysql/base.py:104 -msgid "slave实例状态异常,暂时无法执行该单据类型:{}" -msgstr "slave实例状态异常,暂时无法执行该单据类型:{}" +#: backend/ticket/constants.py:570 backend/ticket/constants.py:580 +msgid "一周一次" +msgstr "一周一次" -#: backend/ticket/builders/mysql/base.py:110 -msgid "proxy实例状态异常,暂时无法执行该单据类型:{}" -msgstr "proxy实例状态异常,暂时无法执行该单据类型:{}" +#: backend/ticket/constants.py:578 +msgid "一次" +msgstr "一次" -#: backend/ticket/builders/mysql/base.py:120 -msgid "请保证所选集群{}与新增机器{}在同一云区域下" -msgstr "请保证所选集群{}与新增机器{}在同一云区域下" +#: backend/ticket/constants.py:579 +msgid "三天一次" +msgstr "三天一次" -#: backend/ticket/builders/mysql/base.py:129 -msgid "请保证实例f{}的角色类型为{}" -msgstr "请保证实例f{}的角色类型为{}" +#: backend/ticket/constants.py:588 +msgid "删除同名key再写入" +msgstr "删除同名key再写入" -#: backend/ticket/builders/mysql/base.py:136 -msgid "请保证所选集群{}都是{}集群" -msgstr "请保证所选集群{}都是{}集群" +#: backend/ticket/constants.py:589 +msgid "保留同名key追加写入" +msgstr "保留同名key追加写入" -#: backend/ticket/builders/mysql/base.py:148 -msgid "请保证所选实例{}的关联集群为{}" -msgstr "请保证所选实例{}的关联集群为{}" +#: backend/ticket/constants.py:590 +msgid "清空集群后写入" +msgstr "清空集群后写入" -#: backend/ticket/builders/mysql/base.py:166 -msgid "是否强制下架" -msgstr "是否强制下架" +#: backend/ticket/constants.py:598 +msgid "立刻触发" +msgstr "立刻触发" -#: backend/ticket/builders/mysql/mysql_add_slave.py:32 -msgid "新从库机器信息" -msgstr "新从库机器信息" +#: backend/ticket/constants.py:599 +msgid "定时触发" +msgstr "定时触发" -#: backend/ticket/builders/mysql/mysql_add_slave.py:39 -msgid "添加从库信息" -msgstr "添加从库信息" +#: backend/ticket/constants.py:605 backend/ticket/constants.py:614 +msgid "审批" +msgstr "审批" -#: backend/ticket/builders/mysql/mysql_add_slave.py:41 -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:37 -#: backend/ticket/builders/mysql/mysql_proxy_add.py:38 -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:38 -msgid "机器来源" -msgstr "机器来源" +#: backend/ticket/constants.py:606 backend/ticket/constants.py:615 +msgid "认领" +msgstr "认领" -#: backend/ticket/builders/mysql/mysql_add_slave.py:87 -msgid "添加从库执行" -msgstr "添加从库执行" +#: backend/ticket/constants.py:607 +msgid "分派" +msgstr "分派" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:41 -msgid "用户输入的excel下载文件地址" -msgstr "用户输入的excel下载文件地址" +#: backend/ticket/constants.py:608 +msgid "自动处理" +msgstr "自动处理" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:43 -msgid "授权数据信息列表" -msgstr "授权数据信息列表" +#: backend/ticket/constants.py:616 +msgid "派单" +msgstr "派单" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:55 -msgid "授权数据已过期,请重新提交授权表单或excel文件" -msgstr "授权数据已过期,请重新提交授权表单或excel文件" +#: backend/ticket/constants.py:617 +msgid "转单" +msgstr "转单" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:73 -msgid "授权执行" -msgstr "授权执行" +#: backend/ticket/constants.py:618 +msgid "终止节点和单据" +msgstr "终止节点和单据" -#: backend/ticket/builders/mysql/mysql_authorize_rules.py:83 -msgid "Excel 授权执行" -msgstr "Excel 授权执行" +#: backend/ticket/constants.py:634 +msgid "待办" +msgstr "待办" -#: backend/ticket/builders/mysql/mysql_checksum.py:32 -msgid "slave信息列表" -msgstr "slave信息列表" +#: backend/ticket/constants.py:639 +msgid "待确认" +msgstr "待确认" -#: backend/ticket/builders/mysql/mysql_checksum.py:39 -msgid "超时时间" -msgstr "超时时间" +#: backend/ticket/constants.py:640 +msgid "待审批" +msgstr "待审批" -#: backend/ticket/builders/mysql/mysql_checksum.py:40 -msgid "定时触发时间" -msgstr "定时触发时间" +#: backend/ticket/constants.py:646 +msgid "审批过期" +msgstr "审批过期" -#: backend/ticket/builders/mysql/mysql_checksum.py:41 -msgid "全备信息列表" -msgstr "全备信息列表" +#: backend/ticket/constants.py:647 +msgid "执行过期" +msgstr "执行过期" -#: backend/ticket/builders/mysql/mysql_checksum.py:42 -#: backend/ticket/builders/mysql/mysql_data_repair.py:32 -msgid "数据修复信息" -msgstr "数据修复信息" +#: backend/ticket/constants.py:648 +msgid "单据流程todo过期" +msgstr "单据流程todo过期" -#: backend/ticket/builders/mysql/mysql_checksum.py:43 -#: backend/ticket/builders/mysql/mysql_data_repair.py:34 -msgid "非innodb表是否修复" -msgstr "非innodb表是否修复" +#: backend/ticket/exceptions.py:18 +msgid "单据模块异常" +msgstr "单据模块异常" -#: backend/ticket/builders/mysql/mysql_checksum.py:156 -msgid "数据校验执行" -msgstr "数据校验执行" +#: backend/ticket/exceptions.py:23 +msgid "ITSM单据不存在" +msgstr "ITSM单据不存在" -#: backend/ticket/builders/mysql/mysql_checksum.py:173 -msgid "手动" -msgstr "手动" +#: backend/ticket/exceptions.py:24 +#, python-brace-format +msgid "ITSM单据[{sn}]不存在" +msgstr "ITSM单据[{sn}]不存在" -#: backend/ticket/builders/mysql/mysql_checksum.py:175 -msgid "自动" -msgstr "自动" +#: backend/ticket/exceptions.py:29 +msgid "单据类型不支持" +msgstr "单据类型不支持" -#: backend/ticket/builders/mysql/mysql_checksum.py:183 -msgid "数据修复{}执行" -msgstr "数据修复{}执行" +#: backend/ticket/exceptions.py:30 +#, python-brace-format +msgid "单据类型不支持{ticket_type}" +msgstr "单据类型不支持{ticket_type}" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:51 -msgid "客户端权限克隆执行" -msgstr "客户端权限克隆执行" +#: backend/ticket/exceptions.py:35 +msgid "单据参数校验异常" +msgstr "单据参数校验异常" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:64 -msgid "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" -msgstr "权限克隆数据已过期,请重新提交权限克隆表单或excel文件" +#: backend/ticket/exceptions.py:36 +#, python-brace-format +msgid "单据{ticket_type}参数校验异常" +msgstr "单据{ticket_type}参数校验异常" -#: backend/ticket/builders/mysql/mysql_clone_rules.py:71 -msgid "DB实例权限克隆执行" -msgstr "DB实例权限克隆执行" +#: backend/ticket/exceptions.py:41 +msgid "单据执行互斥" +msgstr "单据执行互斥" -#: backend/ticket/builders/mysql/mysql_data_repair.py:29 -msgid "master信息" -msgstr "master信息" +#: backend/ticket/exceptions.py:42 +#, python-brace-format +msgid "单据{ticket_type}执行互斥" +msgstr "单据{ticket_type}执行互斥" -#: backend/ticket/builders/mysql/mysql_data_repair.py:30 -msgid "slaves信息" -msgstr "slaves信息" +#: backend/ticket/exceptions.py:47 +msgid "单据提交重复" +msgstr "单据提交重复" -#: backend/ticket/builders/mysql/mysql_data_repair.py:33 -msgid "校验单据结果表名" -msgstr "校验单据结果表名" +#: backend/ticket/exceptions.py:48 +#, python-brace-format +msgid "单据{ticket_type}提交重复" +msgstr "单据{ticket_type}提交重复" -#: backend/ticket/builders/mysql/mysql_data_repair.py:35 -msgid "校验结果是否一致" -msgstr "校验结果是否一致" +#: backend/ticket/exceptions.py:53 +msgid "单据任务定时触发异常" +msgstr "单据任务定时触发异常" -#: backend/ticket/builders/mysql/mysql_data_repair.py:38 -msgid "数据修复触发类型" -msgstr "数据修复触发类型" +#: backend/ticket/exceptions.py:54 +msgid "单据任务{ticket_type}定时触发异常" +msgstr "单据任务{ticket_type}定时触发异常" -#: backend/ticket/builders/mysql/mysql_data_repair.py:51 -msgid "数据修复执行" -msgstr "数据修复执行" +#: backend/ticket/exceptions.py:59 +msgid "错误的todo处理人" +msgstr "错误的todo处理人" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:29 -msgid "备份新机器" -msgstr "备份新机器" +#: backend/ticket/exceptions.py:60 +#, python-brace-format +msgid "错误的todo处理人{username}" +msgstr "错误的todo处理人{username}" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:35 -msgid "备份文件信息" -msgstr "备份文件信息" +#: backend/ticket/exceptions.py:65 +msgid "审批处理异常" +msgstr "审批处理异常" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:37 -#: backend/ticket/builders/mysql/mysql_flashback.py:30 -msgid "目标库列表" -msgstr "目标库列表" +#: backend/ticket/exceptions.py:66 +#, python-brace-format +msgid "审批处理异常{username}" +msgstr "审批处理异常{username}" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:38 -#: backend/ticket/builders/mysql/mysql_flashback.py:31 -msgid "忽略库列表" -msgstr "忽略库列表" +#: backend/ticket/exceptions.py:71 +msgid "单据流程设置失败" +msgstr "单据流程设置失败" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:39 -#: backend/ticket/builders/mysql/mysql_flashback.py:32 -msgid "目标table列表" -msgstr "目标table列表" +#: backend/ticket/exceptions.py:72 +msgid "单据流程{ticket_type}设置失败" +msgstr "单据流程{ticket_type}设置失败" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:40 -#: backend/ticket/builders/mysql/mysql_flashback.py:33 -msgid "忽略table列表" -msgstr "忽略table列表" +#: backend/ticket/flow_manager/base.py:110 +msgid "{}流程已跳过" +msgstr "{}流程已跳过" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:42 -msgid "定点回档信息" -msgstr "定点回档信息" +#: backend/ticket/flow_manager/delivery.py:42 +msgid "交付成功" +msgstr "交付成功" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:52 -msgid "请保证rollback_time或backupinfo参数至少存在一个" -msgstr "请保证rollback_time或backupinfo参数至少存在一个" +#: backend/ticket/flow_manager/delivery.py:89 +msgid "失败后继续提交" +msgstr "失败后继续提交" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:60 -msgid "定点时间{}不能晚于当前时间{}" -msgstr "定点时间{}不能晚于当前时间{}" +#: backend/ticket/flow_manager/delivery.py:93 +msgid "执行{}" +msgstr "执行{}" -#: backend/ticket/builders/mysql/mysql_fixpoint_rollback.py:81 -msgid "定点回档执行" -msgstr "定点回档执行" +#: backend/ticket/flow_manager/inner.py:85 +#, python-brace-format +msgid "任务{status_display}" +msgstr "任务{status_display}" -#: backend/ticket/builders/mysql/mysql_flashback.py:35 -msgid "flashback工具地址" -msgstr "flashback工具地址" +#: backend/ticket/flow_manager/inner.py:200 +msgid "该任务流程跳过,相关信息可在历史任务中查看" +msgstr "该任务流程跳过,相关信息可在历史任务中查看" -#: backend/ticket/builders/mysql/mysql_flashback.py:37 -msgid "记录文件" -msgstr "记录文件" +#: backend/ticket/flow_manager/inner.py:220 +#, python-brace-format +msgid "(执行结果可忽略)任务状态: {status_display}" +msgstr "(执行结果可忽略)任务状态: {status_display}" -#: backend/ticket/builders/mysql/mysql_flashback.py:39 -msgid "flashback信息" -msgstr "flashback信息" +#: backend/ticket/flow_manager/itsm.py:63 +msgid "未知单据" +msgstr "未知单据" -#: backend/ticket/builders/mysql/mysql_flashback.py:51 -msgid "" -"flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时" -"间" -msgstr "" -"flash的起止时间{}--{}不合法,请保证开始时间小于结束时间,并且二者不大于当前时" -"间" +#: backend/ticket/flow_manager/itsm.py:70 +msgid "审批中" +msgstr "审批中" -#: backend/ticket/builders/mysql/mysql_flashback.py:68 -msgid "闪回执行" -msgstr "闪回执行" +#: backend/ticket/flow_manager/itsm.py:71 +msgid "已通过" +msgstr "已通过" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:37 -msgid "容灾级别" -msgstr "容灾级别" +#: backend/ticket/flow_manager/itsm.py:72 +msgid "已撤销" +msgstr "已撤销" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:39 -msgid "Proxy起始端口" -msgstr "Proxy起始端口" +#: backend/ticket/flow_manager/itsm.py:73 +msgid "被拒绝" +msgstr "被拒绝" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:59 -msgid "" -"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" -"台backend机器" -msgstr "" -"机器输入数量有误,期待输入{}台proxy和backend机器,但实际输入{}台proxy机器和{}" -"台backend机器" +#: backend/ticket/flow_manager/pause.py:43 +#, python-brace-format +msgid "暂停状态{status_display}" +msgstr "暂停状态{status_display}" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:126 -msgid "MySQL高可用部署执行" -msgstr "MySQL高可用部署执行" +#: backend/ticket/flow_manager/pause.py:66 +msgid "【{}】流程待确认,是否继续?" +msgstr "【{}】流程待确认,是否继续?" -#: backend/ticket/builders/mysql/mysql_ha_apply.py:145 -#: backend/ticket/builders/mysql/mysql_single_apply.py:203 -msgid "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" -msgstr "获取数据库字符集或版本失败,请检查获取参数, db_config: {}" +#: backend/ticket/flow_manager/resource.py:60 +#, python-brace-format +msgid "资源申请状态{status_display}" +msgstr "资源申请状态{status_display}" -#: backend/ticket/builders/mysql/mysql_ha_backup.py:36 -msgid "备份信息列表" -msgstr "备份信息列表" +#: backend/ticket/flow_manager/resource.py:165 +msgid "资源不足申请失败,请前往补货后重试{}" +msgstr "资源不足申请失败,请前往补货后重试{}" -#: backend/ticket/builders/mysql/mysql_ha_backup.py:58 -msgid "库表备份执行" -msgstr "库表备份执行" +#: backend/ticket/flow_manager/resource.py:168 +msgid "资源池服务出现系统错误,请联系管理员或稍后重试。错误信息: [{}]{}" +msgstr "资源池服务出现系统错误,请联系管理员或稍后重试。错误信息: [{}]{}" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:34 -msgid "清档类型" -msgstr "清档类型" +#: backend/ticket/flow_manager/resource.py:174 +msgid "资源池相关服务出现未知异常,请联系管理员处理。错误信息: [{}]{}" +msgstr "资源池相关服务出现未知异常,请联系管理员处理。错误信息: [{}]{}" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:37 -msgid "清档信息列表" -msgstr "清档信息列表" +#: backend/ticket/flow_manager/resource.py:203 +msgid "【{}】流程所需资源不足" +msgstr "【{}】流程所需资源不足" -#: backend/ticket/builders/mysql/mysql_ha_clear.py:63 -msgid "清档执行" -msgstr "清档执行" +#: backend/ticket/flow_manager/resource.py:246 +msgid "申请的资源总数为0,资源申请不合法" +msgstr "申请的资源总数为0,资源申请不合法" -#: backend/ticket/builders/mysql/mysql_ha_destroy.py:36 -msgid "MySQL高可用销毁执行" -msgstr "MySQL高可用销毁执行" +#: backend/ticket/flow_manager/resource.py:284 +msgid "资源申请下一个节点不为部署节点,请重新编排" +msgstr "资源申请下一个节点不为部署节点,请重新编排" -#: backend/ticket/builders/mysql/mysql_ha_disable.py:36 -msgid "MySQL高可用禁用执行" -msgstr "MySQL高可用禁用执行" +#: backend/ticket/flow_manager/resource.py:431 +msgid "模拟资源申请失败,主机数量不够" +msgstr "模拟资源申请失败,主机数量不够" -#: backend/ticket/builders/mysql/mysql_ha_enable.py:36 -msgid "MySQL高可用启用执行" -msgstr "MySQL高可用启用执行" +#: backend/ticket/flow_manager/resource.py:437 +msgid "模拟资源申请失败,主机数量不够:{} < {}" +msgstr "模拟资源申请失败,主机数量不够:{} < {}" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:30 -msgid "备份类型" -msgstr "备份类型" +#: backend/ticket/flow_manager/resource.py:439 +#, python-format +msgid "模拟资源申请成功(%s):%s" +msgstr "模拟资源申请成功(%s):%s" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:31 -msgid "备份文件tag" -msgstr "备份文件tag" +#: backend/ticket/flow_manager/timer.py:56 +msgid "定时时间{},已超时{},需手动触发。暂停状态:{}" +msgstr "定时时间{},已超时{},需手动触发。暂停状态:{}" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:32 -msgid "集群列表" -msgstr "集群列表" +#: backend/ticket/flow_manager/timer.py:64 +msgid "定时节点已触发" +msgstr "定时节点已触发" -#: backend/ticket/builders/mysql/mysql_ha_full_backup.py:47 -msgid "全库备份执行" -msgstr "全库备份执行" +#: backend/ticket/flow_manager/timer.py:66 +msgid "定时时间{},倒计时:{}" +msgstr "定时时间{},倒计时:{}" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:31 -msgid "源数据库名" -msgstr "源数据库名" +#: backend/ticket/flow_manager/timer.py:99 +msgid "【{}】定时流程待确认,是否继续?" +msgstr "【{}】定时流程待确认,是否继续?" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:32 -msgid "目标数据库名" -msgstr "目标数据库名" +#: backend/ticket/handler.py:164 +msgid "云区域组件快速部署单据" +msgstr "云区域组件快速部署单据" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:35 -msgid "重命名数据库列表" -msgstr "重命名数据库列表" +#: backend/ticket/handler.py:236 +msgid "{} 终止了此单据" +msgstr "{} 终止了此单据" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:58 -msgid "系统内置数据库[{}],不允许重命名" -msgstr "系统内置数据库[{}],不允许重命名" +#: backend/ticket/handler.py:268 +msgid "单据[{}]没有需要终止的流程,跳过..." +msgstr "单据[{}]没有需要终止的流程,跳过..." -#: backend/ticket/builders/mysql/mysql_ha_rename.py:61 -msgid "请保证集群{}中源数据库名{}的名字唯一" -msgstr "请保证集群{}中源数据库名{}的名字唯一" +#: backend/ticket/handler.py:282 +msgid "操作人[{}]终止了单据[{}]" +msgstr "操作人[{}]终止了单据[{}]" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:64 -msgid "请保证集群{}中新数据库名{}的名字唯一" -msgstr "请保证集群{}中新数据库名{}的名字唯一" +#: backend/ticket/handler.py:298 +msgid "不允许新增平台级别的流程设置" +msgstr "不允许新增平台级别的流程设置" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:68 -msgid "请保证源数据库名{}不要出现在新数据库名列表中" -msgstr "请保证源数据库名{}不要出现在新数据库名列表中" +#: backend/ticket/handler.py:304 +msgid "业务级别不允许编辑[人工确认]设置" +msgstr "业务级别不允许编辑[人工确认]设置" -#: backend/ticket/builders/mysql/mysql_ha_rename.py:84 -msgid "DB重命名执行" -msgstr "DB重命名执行" +#: backend/ticket/handler.py:311 +msgid "业务[{}]已存在{}的流程配置" +msgstr "业务[{}]已存在{}的流程配置" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:37 -msgid "语义执行的流程ID" -msgstr "语义执行的流程ID" +#: backend/ticket/handler.py:313 +msgid "业务[{}]已存在{}的集群流程配置" +msgstr "业务[{}]已存在{}的集群流程配置" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:45 -msgid "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" -msgstr "无法获取语义执行id:{}的上下文数据,请检查语义执行任务是否成功完成" +#: backend/ticket/handler.py:318 +msgid "业务[{}]已存在{}的相同范围配置" +msgstr "业务[{}]已存在{}的相同范围配置" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:59 -msgid "sql文件路径" -msgstr "sql文件路径" +#: backend/ticket/mock_data.py:60 +msgid "测试创建es集群" +msgstr "测试创建es集群" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:61 -msgid "执行模式" -msgstr "执行模式" +#: backend/ticket/mock_data.py:65 backend/ticket/mock_data.py:92 +#: backend/ticket/mock_data.py:121 backend/ticket/mock_data.py:158 +msgid "深圳" +msgstr "深圳" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:63 -msgid "模拟执行node_id" -msgstr "模拟执行node_id" +#: backend/ticket/mock_data.py:87 +msgid "测试创建kafka集群" +msgstr "测试创建kafka集群" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:64 -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:93 -msgid "模拟执行root_id" -msgstr "模拟执行root_id" +#: backend/ticket/mock_data.py:116 +msgid "测试创建hdfs集群" +msgstr "测试创建hdfs集群" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:71 -msgid "sql文件名" -msgstr "sql文件名" +#: backend/ticket/mock_data.py:156 +msgid "测试集群" +msgstr "测试集群" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:72 -msgid "目标变更db" -msgstr "目标变更db" +#: backend/ticket/models/ticket.py:47 +msgid "流程类型" +msgstr "流程类型" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:73 -msgid "忽略db" -msgstr "忽略db" +#: backend/ticket/models/ticket.py:48 +msgid "流程别名" +msgstr "流程别名" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:77 -msgid "sql执行体信息" -msgstr "sql执行体信息" +#: backend/ticket/models/ticket.py:50 +msgid "单据流程对象ID" +msgstr "单据流程对象ID" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:82 -msgid "备份匹配DB列表" -msgstr "备份匹配DB列表" +#: backend/ticket/models/ticket.py:51 +msgid "单据流程详情" +msgstr "单据流程详情" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:83 -msgid "备份匹配Table列表" -msgstr "备份匹配Table列表" +#: backend/ticket/models/ticket.py:53 +msgid "单据流程状态" +msgstr "单据流程状态" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:87 -msgid "sql备份信息" -msgstr "sql备份信息" +#: backend/ticket/models/ticket.py:59 +msgid "错误代码" +msgstr "错误代码" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:95 -msgid "模拟执行链接" -msgstr "模拟执行链接" +#: backend/ticket/models/ticket.py:61 +msgid "重试类型(专用于inner_flow)" +msgstr "重试类型(专用于inner_flow)" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:140 -msgid "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" -msgstr "模拟执行的pipeline数据还未准备好,请检查celery状态并稍后重试单据。" +#: backend/ticket/models/ticket.py:63 +msgid "流程上下文(用于扩展字段)" +msgstr "流程上下文(用于扩展字段)" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:170 -msgid "SQL模拟执行状态查询" -msgstr "SQL模拟执行状态查询" +#: backend/ticket/models/ticket.py:66 +msgid "单据流程(Flow)" +msgstr "单据流程(Flow)" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:182 -msgid "人工确认执行" -msgstr "人工确认执行" +#: backend/ticket/models/ticket.py:93 backend/ticket/models/ticket.py:237 +#: backend/ticket/serializers.py:88 backend/ticket/serializers.py:291 +#: backend/ticket/serializers.py:323 +msgid "单据分组类型" +msgstr "单据分组类型" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:193 -msgid "库表备份" -msgstr "库表备份" +#: backend/ticket/models/ticket.py:101 +msgid "单据差异化详情" +msgstr "单据差异化详情" -#: backend/ticket/builders/mysql/mysql_import_sqlfile.py:203 -msgid "变更SQL执行" -msgstr "变更SQL执行" +#: backend/ticket/models/ticket.py:102 +msgid "单据通知设置" +msgstr "单据通知设置" -#: backend/ticket/builders/mysql/mysql_master_fail_over.py:40 -msgid "主库故障切换执行" -msgstr "主库故障切换执行" +#: backend/ticket/models/ticket.py:103 +msgid "单据是否审阅过" +msgstr "单据是否审阅过" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:27 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:23 -msgid "主库 IP" -msgstr "主库 IP" +#: backend/ticket/models/ticket.py:106 +msgid "单据(Ticket)" +msgstr "单据(Ticket)" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:28 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:24 -msgid "从库 IP" -msgstr "从库 IP" +#: backend/ticket/models/ticket.py:195 +msgid "正在自动创建单据,单据详情: {}" +msgstr "正在自动创建单据,单据详情: {}" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:31 -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:27 -msgid "单据信息" -msgstr "单据信息" +#: backend/ticket/models/ticket.py:204 +msgid "单据{}正在初始化流程" +msgstr "单据{}正在初始化流程" -#: backend/ticket/builders/mysql/mysql_master_slave_switch.py:63 -msgid "主从互换执行" -msgstr "主从互换执行" +#: backend/ticket/models/ticket.py:219 +msgid "不支持该类型的单据" +msgstr "不支持该类型的单据" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:31 -msgid "新主库主机" -msgstr "新主库主机" +#: backend/ticket/models/ticket.py:225 +msgid "发起故障自愈,告警事件 ID:" +msgstr "发起故障自愈,告警事件 ID:" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:32 -msgid "新从库主机" -msgstr "新从库主机" +#: backend/ticket/models/ticket.py:239 +msgid "是否支持用户配置" +msgstr "是否支持用户配置" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:39 -msgid "克隆主从信息" -msgstr "克隆主从信息" +#: backend/ticket/models/ticket.py:240 +msgid "单据配置 eg: {'need_itsm': false, 'need_manual_confirm': false}" +msgstr "单据配置 eg: {'need_itsm': false, 'need_manual_confirm': false}" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:40 -msgid "安全模式" -msgstr "安全模式" +#: backend/ticket/models/ticket.py:243 +msgid "单据流程配置(TicketFlowsConfig)" +msgstr "单据流程配置(TicketFlowsConfig)" -#: backend/ticket/builders/mysql/mysql_migrate_cluster.py:85 -msgid "克隆主从执行" -msgstr "克隆主从执行" +#: backend/ticket/models/ticket.py:327 backend/ticket/models/ticket.py:397 +#: backend/ticket/models/todo.py:51 +msgid "关联流程任务" +msgstr "关联流程任务" -#: backend/ticket/builders/mysql/mysql_partition.py:24 -msgid "初始化分区语句" -msgstr "初始化分区语句" +#: backend/ticket/models/ticket_result_relation.py:25 +msgid "第三方系统id" +msgstr "第三方系统id" -#: backend/ticket/builders/mysql/mysql_partition.py:25 -msgid "所需空间Byte" -msgstr "所需空间Byte" +#: backend/ticket/models/todo.py:50 +msgid "待办标题" +msgstr "待办标题" -#: backend/ticket/builders/mysql/mysql_partition.py:29 -msgid "配置ID" -msgstr "配置ID" +#: backend/ticket/models/todo.py:53 +msgid "待办人" +msgstr "待办人" -#: backend/ticket/builders/mysql/mysql_partition.py:30 -msgid "库名匹配规则" -msgstr "库名匹配规则" +#: backend/ticket/models/todo.py:55 +msgid "待办类型" +msgstr "待办类型" -#: backend/ticket/builders/mysql/mysql_partition.py:31 -msgid "表明匹配规则" -msgstr "表明匹配规则" +#: backend/ticket/models/todo.py:60 +msgid "上下文" +msgstr "上下文" -#: backend/ticket/builders/mysql/mysql_partition.py:32 -msgid "初始化分区表" -msgstr "初始化分区表" +#: backend/ticket/models/todo.py:62 +msgid "待办状态" +msgstr "待办状态" -#: backend/ticket/builders/mysql/mysql_partition.py:33 -msgid "添加分区" -msgstr "添加分区" +#: backend/ticket/models/todo.py:67 +msgid "待办完成人" +msgstr "待办完成人" -#: backend/ticket/builders/mysql/mysql_partition.py:34 -msgid "删除分区" -msgstr "删除分区" +#: backend/ticket/models/todo.py:68 +msgid "待办完成时间" +msgstr "待办完成时间" -#: backend/ticket/builders/mysql/mysql_partition.py:38 -msgid "ip" -msgstr "ip" +#: backend/ticket/models/todo.py:73 +msgid "待办(Todo)" +msgstr "待办(Todo)" -#: backend/ticket/builders/mysql/mysql_partition.py:39 -msgid "port" -msgstr "port" +#: backend/ticket/models/todo.py:104 +msgid "关联待办" +msgstr "关联待办" -#: backend/ticket/builders/mysql/mysql_partition.py:40 -msgid "分片名" -msgstr "分片名" +#: backend/ticket/models/todo.py:105 +msgid "操作" +msgstr "操作" -#: backend/ticket/builders/mysql/mysql_partition.py:41 -msgid "执行对象列表" -msgstr "执行对象列表" +#: backend/ticket/models/todo.py:108 backend/ticket/models/todo.py:109 +msgid "待办操作记录" +msgstr "待办操作记录" -#: backend/ticket/builders/mysql/mysql_partition.py:46 -msgid "配置ID列表" -msgstr "配置ID列表" +#: backend/ticket/serializers.py:36 +msgid "发送类型" +msgstr "发送类型" -#: backend/ticket/builders/mysql/mysql_partition.py:50 -msgid "分区执行对象列表" -msgstr "分区执行对象列表" +#: backend/ticket/serializers.py:38 +msgid "包含用户名,用户需在蓝鲸平台注册,多个以逗号分隔" +msgstr "包含用户名,用户需在蓝鲸平台注册,多个以逗号分隔" -#: backend/ticket/builders/mysql/mysql_partition.py:52 -msgid "分区信息" -msgstr "分区信息" +#: backend/ticket/serializers.py:39 +msgid "发件人/企微机器人ID" +msgstr "发件人/企微机器人ID" -#: backend/ticket/builders/mysql/mysql_partition.py:66 -#: backend/ticket/builders/spider/spider_partition.py:38 -msgid "分区管理执行" -msgstr "分区管理执行" +#: backend/ticket/serializers.py:40 +msgid "(机器人专用)接收者,可以传@all,或者会话id" +msgstr "(机器人专用)接收者,可以传@all,或者会话id" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:33 -msgid "Proxy IP + 云区域" -msgstr "Proxy IP + 云区域" +#: backend/ticket/serializers.py:41 +msgid "提醒群中的指定成员(@某个成员),@all表示提醒所有人" +msgstr "提醒群中的指定成员(@某个成员),@all表示提醒所有人" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:40 -msgid "添加信息" -msgstr "添加信息" +#: backend/ticket/serializers.py:42 +msgid "提醒手机号对应的群成员(@某个成员),@all表示提醒所有人" +msgstr "提醒手机号对应的群成员(@某个成员),@all表示提醒所有人" -#: backend/ticket/builders/mysql/mysql_proxy_add.py:84 -msgid "添加PROXY执行" -msgstr "添加PROXY执行" +#: backend/ticket/serializers.py:43 +msgid "是否只给指定用户可见,默认给所有人可见" +msgstr "是否只给指定用户可见,默认给所有人可见" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:33 -msgid "旧Proxy实例信息" -msgstr "旧Proxy实例信息" +#: backend/ticket/serializers.py:89 backend/ticket/views.py:228 +#: backend/ticket/views.py:229 +msgid "单据详情" +msgstr "单据详情" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:34 -msgid "新Proxy机器信息" -msgstr "新Proxy机器信息" +#: backend/ticket/serializers.py:92 +msgid "状态名称" +msgstr "状态名称" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:40 -msgid "是否强制替换" -msgstr "是否强制替换" +#: backend/ticket/serializers.py:98 +msgid "是否忽略重复提交" +msgstr "是否忽略重复提交" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:41 -msgid "替换信息" -msgstr "替换信息" +#: backend/ticket/serializers.py:101 +msgid "通知设置" +msgstr "通知设置" -#: backend/ticket/builders/mysql/mysql_proxy_switch.py:94 -msgid "替换PROXY执行" -msgstr "替换PROXY执行" +#: backend/ticket/serializers.py:111 +msgid "不允许提交敏感单据类型{}" +msgstr "不允许提交敏感单据类型{}" -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:28 -msgid "从库实例信息" -msgstr "从库实例信息" +#: backend/ticket/serializers.py:134 +msgid "流程待办" +msgstr "流程待办" -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:34 -msgid "重建从库列表" -msgstr "重建从库列表" +#: backend/ticket/serializers.py:135 +msgid "跳转链接" +msgstr "跳转链接" -#: backend/ticket/builders/mysql/mysql_restore_local_slave.py:67 -msgid "Slave原地重建执行" -msgstr "Slave原地重建执行" +#: backend/ticket/serializers.py:139 +msgid "流程类型显示名" +msgstr "流程类型显示名" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:27 -msgid "旧从库 IP" -msgstr "旧从库 IP" +#: backend/ticket/serializers.py:140 +msgid "概览" +msgstr "概览" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:28 -msgid "新从库 IP" -msgstr "新从库 IP" +#: backend/ticket/serializers.py:141 +msgid "流程输出数据" +msgstr "流程输出数据" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:32 -msgid "集群重建信息" -msgstr "集群重建信息" +#: backend/ticket/serializers.py:214 +msgid "待办人列表" +msgstr "待办人列表" -#: backend/ticket/builders/mysql/mysql_restore_slave.py:70 -msgid "Slave重建执行" -msgstr "Slave重建执行" +#: backend/ticket/serializers.py:232 backend/ticket/serializers.py:360 +msgid "待办ID" +msgstr "待办ID" -#: backend/ticket/builders/mysql/mysql_single_apply.py:42 -msgid "域名关键字" -msgstr "域名关键字" +#: backend/ticket/serializers.py:233 +msgid "动作" +msgstr "动作" -#: backend/ticket/builders/mysql/mysql_single_apply.py:50 -msgid "机器规格" -msgstr "机器规格" +#: backend/ticket/serializers.py:234 backend/ticket/serializers.py:361 +msgid "动作参数" +msgstr "动作参数" -#: backend/ticket/builders/mysql/mysql_single_apply.py:52 -msgid "申请数量" -msgstr "申请数量" +#: backend/ticket/serializers.py:241 +msgid "是否是部署类单据" +msgstr "是否是部署类单据" -#: backend/ticket/builders/mysql/mysql_single_apply.py:54 -msgid "每台机器部署的实例数量" -msgstr "每台机器部署的实例数量" +#: backend/ticket/serializers.py:256 backend/ticket/serializers.py:260 +msgid "单据流程的ID" +msgstr "单据流程的ID" -#: backend/ticket/builders/mysql/mysql_single_apply.py:60 -#: backend/ticket/builders/spider/tendb_apply.py:38 -msgid "部署规格" -msgstr "部署规格" +#: backend/ticket/serializers.py:275 backend/ticket/serializers.py:283 +msgid "查询起始时间" +msgstr "查询起始时间" -#: backend/ticket/builders/mysql/mysql_single_apply.py:68 -msgid "机器规格展示名" -msgstr "机器规格展示名" +#: backend/ticket/serializers.py:276 backend/ticket/serializers.py:284 +msgid "查询终止时间" +msgstr "查询终止时间" -#: backend/ticket/builders/mysql/mysql_single_apply.py:71 -msgid "MySQL起始端口" -msgstr "MySQL起始端口" +#: backend/ticket/serializers.py:278 backend/ticket/serializers.py:286 +msgid "操作状态" +msgstr "操作状态" -#: backend/ticket/builders/mysql/mysql_single_apply.py:90 -#, python-brace-format -msgid "不允许存在重复的域名关键字[{duplicates}]" -msgstr "不允许存在重复的域名关键字[{duplicates}]" +#: backend/ticket/serializers.py:308 +msgid "单据可配置项" +msgstr "单据可配置项" -#: backend/ticket/builders/mysql/mysql_single_apply.py:184 -msgid "MySQL单节点部署执行" -msgstr "MySQL单节点部署执行" +#: backend/ticket/serializers.py:313 backend/ticket/serializers.py:318 +msgid "流程规则ID列表)" +msgstr "流程规则ID列表)" -#: backend/ticket/builders/mysql/mysql_single_destroy.py:32 -msgid "MySQL单节点销毁执行" -msgstr "MySQL单节点销毁执行" +#: backend/ticket/serializers.py:322 backend/ticket/serializers.py:330 +msgid "单据流程描述" +msgstr "单据流程描述" -#: backend/ticket/builders/mysql/mysql_single_disable.py:32 -msgid "MySQL单节点禁用执行" -msgstr "MySQL单节点禁用执行" +#: backend/ticket/serializers.py:325 +msgid "是否需要单据审批" +msgstr "是否需要单据审批" -#: backend/ticket/builders/mysql/mysql_single_enable.py:32 -msgid "MySQL单节点启用执行" -msgstr "MySQL单节点启用执行" +#: backend/ticket/serializers.py:326 +msgid "是否需要人工确认" +msgstr "是否需要人工确认" -#: backend/ticket/builders/pulsar/pulsar_apply.py:32 -msgid "至少写入成功副本数" -msgstr "至少写入成功副本数" +#: backend/ticket/serializers.py:335 +msgid "主机所在业务" +msgstr "主机所在业务" -#: backend/ticket/builders/pulsar/pulsar_apply.py:54 -msgid "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" -msgstr "bookkeeper节点数小于2台! 请保证bookkeeper的部署节点数至少为2" +#: backend/ticket/serializers.py:341 +msgid "请至少提供两台机器来部署云区域组件" +msgstr "请至少提供两台机器来部署云区域组件" -#: backend/ticket/builders/pulsar/pulsar_apply.py:59 -msgid "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" -msgstr "zookeeper节点数不为3台! 请保证zookeeper的部署节点数等于为3" +#: backend/ticket/serializers.py:347 +msgid "单据ID(逗号分割)" +msgstr "单据ID(逗号分割)" -#: backend/ticket/builders/pulsar/pulsar_apply.py:64 -msgid "broker节点数小于1台! 请保证broker的部署节点数至少为1" -msgstr "broker节点数小于1台! 请保证broker的部署节点数至少为1" +#: backend/ticket/serializers.py:351 +msgid "是否通过" +msgstr "是否通过" -#: backend/ticket/builders/pulsar/pulsar_apply.py:68 -msgid "请保证副本数量至少为2,且不超过bookkeeper数量" -msgstr "请保证副本数量至少为2,且不超过bookkeeper数量" +#: backend/ticket/serializers.py:352 +msgid "单据id集合" +msgstr "单据id集合" -#: backend/ticket/builders/pulsar/pulsar_apply.py:71 -msgid "最小成功写入副本数量不得大于副本数量" -msgstr "最小成功写入副本数量不得大于副本数量" +#: backend/ticket/serializers.py:370 +msgid "统一动作" +msgstr "统一动作" -#: backend/ticket/builders/pulsar/pulsar_apply.py:98 -#: backend/ticket/constants.py:202 -msgid "Pulsar 集群部署" -msgstr "Pulsar 集群部署" +#: backend/ticket/serializers.py:372 +msgid "待办操作列表" +msgstr "待办操作列表" -#: backend/ticket/builders/pulsar/pulsar_destroy.py:37 -#: backend/ticket/constants.py:209 -msgid "Pulsar 集群删除" -msgstr "Pulsar 集群删除" +#: backend/ticket/serializers.py:384 +msgid "待办id{}不存在" +msgstr "待办id{}不存在" -#: backend/ticket/builders/pulsar/pulsar_disable.py:37 -#: backend/ticket/constants.py:208 -msgid "Pulsar 集群禁用" -msgstr "Pulsar 集群禁用" +#: backend/ticket/tasks/ticket_tasks.py:197 +msgid "集群{}数据校验正确,不需要进行数据修复" +msgstr "集群{}数据校验正确,不需要进行数据修复" -#: backend/ticket/builders/pulsar/pulsar_enable.py:37 -#: backend/ticket/constants.py:207 -msgid "Pulsar 集群启用" -msgstr "Pulsar 集群启用" +#: backend/ticket/tasks/ticket_tasks.py:225 +msgid "集群{}存在数据不一致,自动创建的数据修复单据" +msgstr "集群{}存在数据不一致,自动创建的数据修复单据" -#: backend/ticket/builders/pulsar/pulsar_reboot.py:39 -msgid "Pulsar 集群重启" -msgstr "Pulsar 集群重启" +#: backend/ticket/tasks/ticket_tasks.py:295 +msgid "任务{}立即执行" +msgstr "任务{}立即执行" -#: backend/ticket/builders/pulsar/pulsar_replace.py:47 -#: backend/ticket/constants.py:206 -msgid "Pulsar 集群替换" -msgstr "Pulsar 集群替换" +#: backend/ticket/tasks/ticket_tasks.py:298 +msgid "任务{}定时执行,定时触发时间:{}" +msgstr "任务{}定时执行,定时触发时间:{}" -#: backend/ticket/builders/pulsar/pulsar_scale_up.py:47 -#: backend/ticket/constants.py:203 -msgid "Pulsar 集群扩容" -msgstr "Pulsar 集群扩容" +#: backend/ticket/tasks/ticket_tasks.py:306 +msgid "不支持的定时类型: {}" +msgstr "不支持的定时类型: {}" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:35 -msgid "bookkeeper信息列表" -msgstr "bookkeeper信息列表" +#: backend/ticket/tasks/ticket_tasks.py:337 +#, python-brace-format +msgid "" +" 单据类型:{ticket_type}\n" +" 所属业务:{biz_name}\n" +" 提单人:{creator}\n" +" 提单时间:{submit_time}\n" +" 处理人:{processor}\n" +" 执行情况:{flow_status}\n" +" 查看详情:{detail_address} " +msgstr " 单据类型:{ticket_type}\n 所属业务:{biz_name}\n 提单人:{creator}\n 提单时间:{submit_time}\n 处理人:{processor}\n 执行情况:{flow_status}\n 查看详情:{detail_address} " + +#: backend/ticket/tasks/ticket_tasks.py:364 +#, python-brace-format +msgid "" +"\n" +"审批链接:{approval_address}" +msgstr "\n审批链接:{approval_address}" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:61 -msgid "{}: 至少保留{}台!" -msgstr "{}: 至少保留{}台!" +#: backend/ticket/tasks/ticket_tasks.py:375 +#, python-brace-format +msgid "【数据库管理】 {flow_msg_type}通知" +msgstr "【数据库管理】 {flow_msg_type}通知" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:64 -msgid "请选择Broker和BookKeeper实例进行缩容" -msgstr "请选择Broker和BookKeeper实例进行缩容" +#: backend/ticket/todos/__init__.py:99 +msgid "确认执行" +msgstr "确认执行" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:69 -msgid "缩容不支持ZooKeeper" -msgstr "缩容不支持ZooKeeper" +#: backend/ticket/todos/__init__.py:100 +msgid "终止单据" +msgstr "终止单据" -#: backend/ticket/builders/pulsar/pulsar_shrink.py:85 -#: backend/ticket/constants.py:204 -msgid "Pulsar 集群缩容" -msgstr "Pulsar 集群缩容" +#: backend/ticket/todos/__init__.py:101 +msgid "资源重新申请" +msgstr "资源重新申请" -#: backend/ticket/builders/redis/base.py:50 -msgid "集群【{}({})】锁定中,请等待" -msgstr "集群【{}({})】锁定中,请等待" +#: backend/ticket/todos/pause_todo.py:42 backend/ticket/todos/pause_todo.py:62 +#: backend/ticket/todos/pipeline_todo.py:40 +msgid "{}不在处理人: {}中,无法处理" +msgstr "{}不在处理人: {}中,无法处理" -#: backend/ticket/builders/redis/base.py:52 -msgid "集群【{}】不存在" -msgstr "集群【{}】不存在" +#: backend/ticket/views.py:194 +msgid "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +msgstr "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -#: backend/ticket/builders/redis/base.py:59 -msgid "提取/删除/备份规则列表" -msgstr "提取/删除/备份规则列表" +#: backend/ticket/views.py:205 +msgid "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +msgstr "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -#: backend/ticket/builders/redis/redis_backup.py:79 -msgid "集群备份" -msgstr "集群备份" +#: backend/ticket/views.py:245 +msgid "单据列表" +msgstr "单据列表" -#: backend/ticket/builders/redis/redis_close.py:45 -msgid "禁用集群" -msgstr "禁用集群" +#: backend/ticket/views.py:286 backend/ticket/views.py:288 +msgid "创建单据(允许创建敏感单据)" +msgstr "创建单据(允许创建敏感单据)" -#: backend/ticket/builders/redis/redis_cluster_apply.py:30 -msgid "集群端口" -msgstr "集群端口" +#: backend/ticket/views.py:296 +msgid "获取单据流程" +msgstr "获取单据流程" -#: backend/ticket/builders/redis/redis_cluster_apply.py:38 -msgid "申请容量" -msgstr "申请容量" +#: backend/ticket/views.py:297 +msgid "流程信息" +msgstr "流程信息" -#: backend/ticket/builders/redis/redis_cluster_apply.py:39 -msgid "申请容量详情" -msgstr "申请容量详情" +#: backend/ticket/views.py:308 +msgid "单据回调" +msgstr "单据回调" -#: backend/ticket/builders/redis/redis_cluster_apply.py:41 -msgid "集群ID(英文数字及下划线)" -msgstr "集群ID(英文数字及下划线)" +#: backend/ticket/views.py:320 +msgid "单据流程重试" +msgstr "单据流程重试" -#: backend/ticket/builders/redis/redis_cluster_apply.py:47 -msgid "proxy部署方案" -msgstr "proxy部署方案" +#: backend/ticket/views.py:331 +msgid "单据流程终止" +msgstr "单据流程终止" -#: backend/ticket/builders/redis/redis_cluster_apply.py:48 -msgid "后台部署方案" -msgstr "后台部署方案" +#: backend/ticket/views.py:343 +msgid "获取单据类型列表" +msgstr "获取单据类型列表" -#: backend/ticket/builders/redis/redis_cluster_apply.py:87 -msgid "主机【{}】已经被注册到了集群元数据,请检查" -msgstr "主机【{}】已经被注册到了集群元数据,请检查" +#: backend/ticket/views.py:358 +msgid "节点列表" +msgstr "节点列表" -#: backend/ticket/builders/redis/redis_cluster_apply.py:100 -msgid "master和slave中存在重复节点" -msgstr "master和slave中存在重复节点" +#: backend/ticket/views.py:386 +msgid "待办单据列表" +msgstr "待办单据列表" -#: backend/ticket/builders/redis/redis_cluster_apply.py:103 -msgid "master和proxy中存在重复节点" -msgstr "master和proxy中存在重复节点" +#: backend/ticket/views.py:424 +msgid "待办处理" +msgstr "待办处理" -#: backend/ticket/builders/redis/redis_cluster_apply.py:106 -msgid "slave和proxy中存在重复节点" -msgstr "slave和proxy中存在重复节点" +#: backend/ticket/views.py:450 +msgid "待办单据数" +msgstr "待办单据数" -#: backend/ticket/builders/redis/redis_cluster_apply.py:110 -msgid "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" -msgstr "至少提供1台master节点和1台slave节点,且master与slave节点数要保持一致" +#: backend/ticket/views.py:473 +msgid "查询集群变更单据事件" +msgstr "查询集群变更单据事件" -#: backend/ticket/builders/redis/redis_cluster_apply.py:113 -msgid "proxy至少提供2台机器" -msgstr "proxy至少提供2台机器" +#: backend/ticket/views.py:508 +msgid "查询集群实例变更单据事件" +msgstr "查询集群实例变更单据事件" -#: backend/ticket/builders/redis/redis_cluster_apply.py:270 -msgid "集群部署" -msgstr "集群部署" +#: backend/ticket/views.py:543 +msgid "查询可编辑单据流程描述" +msgstr "查询可编辑单据流程描述" -#: backend/ticket/builders/redis/redis_destroy.py:46 -msgid "下架集群" -msgstr "下架集群" +#: backend/ticket/views.py:570 +msgid "修改可编辑的单据流程规则" +msgstr "修改可编辑的单据流程规则" -#: backend/ticket/builders/redis/redis_key_delete.py:31 -msgid "删除方式" -msgstr "删除方式" +#: backend/ticket/views.py:581 +msgid "创建单据流程规则" +msgstr "创建单据流程规则" -#: backend/ticket/builders/redis/redis_key_delete.py:103 -msgid "删除Key" -msgstr "删除Key" +#: backend/ticket/views.py:592 +msgid "删除单据流程规则" +msgstr "删除单据流程规则" -#: backend/ticket/builders/redis/redis_key_extract.py:87 -msgid "提取Key" -msgstr "提取Key" +#: backend/ticket/views.py:603 +msgid "快速部署云区域组件" +msgstr "快速部署云区域组件" -#: backend/ticket/builders/redis/redis_open.py:42 -msgid "启用集群" -msgstr "启用集群" +#: backend/ticket/views.py:618 +msgid "批量审批" +msgstr "批量审批" -#: backend/ticket/builders/redis/redis_purge.py:56 -msgid "集群清档" -msgstr "集群清档" +#: backend/ticket/views.py:639 +msgid "批量待办处理" +msgstr "批量待办处理" -#: backend/ticket/builders/spider/spider_destory.py:34 -msgid "TenDB Cluster 下架执行" -msgstr "TenDB Cluster 下架执行" +#: backend/utils/time.py:157 +msgid "搜索的时间序列为空" +msgstr "搜索的时间序列为空" -#: backend/ticket/builders/spider/spider_disable.py:34 -msgid "TenDB Cluster 禁用执行" -msgstr "TenDB Cluster 禁用执行" +#: backend/utils/time.py:169 +msgid "无法找到合适的附近时间点" +msgstr "无法找到合适的附近时间点" -#: backend/ticket/builders/spider/tendb_apply.py:39 -msgid "部署方案" -msgstr "部署方案" +#: backend/version_log/config.py:30 +msgid "版本日志" +msgstr "版本日志" -#: backend/ticket/builders/spider/tendb_apply.py:40 -msgid "集群访问端口" -msgstr "集群访问端口" +#: backend/version_log/models.py:43 +msgid "访问版本" +msgstr "访问版本" -#: backend/ticket/builders/spider/tendb_apply.py:41 -msgid "集群访问域名" -msgstr "集群访问域名" +#: backend/version_log/models.py:48 +msgid "版本日志访问记录" +msgstr "版本日志访问记录" -#: backend/ticket/builders/spider/tendb_apply.py:44 -msgid "云区域" -msgstr "云区域" +#: backend/version_log/views.py:44 +msgid "访问出错,请联系管理员。" +msgstr "访问出错,请联系管理员。" -#: backend/ticket/builders/spider/tendb_apply.py:49 -msgid "集群分片数" -msgstr "集群分片数" +#: backend/version_log/views.py:48 +msgid "日志列表获取成功" +msgstr "日志列表获取成功" -#: backend/ticket/builders/spider/tendb_apply.py:50 -msgid "机器数" -msgstr "机器数" +#: backend/version_log/views.py:64 +msgid "日志版本文件没找到,请联系管理员" +msgstr "日志版本文件没找到,请联系管理员" -#: backend/ticket/builders/spider/tendb_apply.py:113 -msgid "TenDB Cluster 集群部署执行" -msgstr "TenDB Cluster 集群部署执行" +#: backend/version_log/views.py:68 +msgid "日志详情获取成功" +msgstr "日志详情获取成功" -#: backend/ticket/builders/spider/tendb_enable.py:34 -msgid "TenDB Cluster 启用执行" -msgstr "TenDB Cluster 启用执行" +#~ msgid "部分列表元素的参数不合法,请检查" +#~ msgstr "部分列表元素的参数不合法,请检查" -#: backend/ticket/builders/spider/tendb_master_fail_over.py:33 -msgid "TendbCluster 主故障切换" -msgstr "TendbCluster 主故障切换" +#~ msgid "查询任务Node详情" +#~ msgstr "查询任务Node详情" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:28 -msgid "是否检测连接" -msgstr "是否检测连接" +#~ msgid "SQL语句导入" +#~ msgstr "SQL语句导入" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:29 -msgid "是否检测数据同步延时情况" -msgstr "是否检测数据同步延时情况" +#~ msgid "请补充:指定云区域的proxy信息" +#~ msgstr "请补充:指定云区域的proxy信息" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:30 -msgid "是否检测历史数据检验结果" -msgstr "是否检测历史数据检验结果" +#~ msgid "主从高可用-主域名配置" +#~ msgstr "主从高可用-主域名配置" -#: backend/ticket/builders/spider/tendb_master_slave_switch.py:46 -msgid "TendbCluster 主从互换执行" -msgstr "TendbCluster 主从互换执行" +#~ msgid "主从高可用-从域名配置" +#~ msgstr "主从高可用-从域名配置" -#: backend/ticket/constants.py:31 -msgid "主流程-人工确认" -msgstr "主流程-人工确认" +#~ msgid "单节点-域名配置" +#~ msgstr "单节点-域名配置" -#: backend/ticket/constants.py:32 -msgid "自动化流程-人工确认" -msgstr "自动化流程-人工确认" +#~ msgid "端口默认值-Proxy起始端口" +#~ msgstr "端口默认值-Proxy起始端口" -#: backend/ticket/constants.py:40 -msgid "我的待办" -msgstr "我的待办" +#~ msgid "端口默认值-MySQL起始端口" +#~ msgstr "端口默认值-MySQL起始端口" -#: backend/ticket/constants.py:41 -msgid "我的申请" -msgstr "我的申请" +#~ msgid "MySQL的RSA秘钥" +#~ msgstr "MySQL的RSA秘钥" -#: backend/ticket/constants.py:51 -msgid "待处理" -msgstr "待处理" +#~ msgid "密码加密失败: {}" +#~ msgstr "密码加密失败: {}" -#: backend/ticket/constants.py:53 -msgid "已处理" -msgstr "已处理" +#~ msgid "密码解密失败: {}" +#~ msgstr "密码解密失败: {}" -#: backend/ticket/constants.py:54 -msgid "已终止" -msgstr "已终止" +#~ msgid "RSA密钥" +#~ msgstr "RSA密钥" -#: backend/ticket/constants.py:63 backend/ticket/constants.py:73 -msgid "等待中" -msgstr "等待中" +#~ msgid "RSA秘钥" +#~ msgstr "RSA秘钥" -#: backend/ticket/constants.py:64 backend/ticket/constants.py:74 -msgid "执行中" -msgstr "执行中" +#~ msgid "提供服务 节点" +#~ msgstr "提供服务 节点" -#: backend/ticket/constants.py:67 backend/ticket/constants.py:77 -msgid "撤销" -msgstr "撤销" +#~ msgid "proxy {} 在集群里边" +#~ msgstr "proxy {} 在集群里边" -#: backend/ticket/constants.py:78 -msgid "跳过" -msgstr "跳过" +#~ msgid "DB 模块 ID" +#~ msgstr "DB 模块 ID" -#: backend/ticket/constants.py:108 -msgid "MySQL 单节点部署" -msgstr "MySQL 单节点部署" +#~ msgid "拓扑层级" +#~ msgstr "拓扑层级" -#: backend/ticket/constants.py:109 -msgid "MySQL 添加从库" -msgstr "MySQL 添加从库" +#~ msgid "系统角色" +#~ msgstr "系统角色" -#: backend/ticket/constants.py:110 -msgid "MySQL Slave重建" -msgstr "MySQL Slave重建" +#~ msgid "同步后继" +#~ msgstr "同步后继" -#: backend/ticket/constants.py:111 -msgid "MySQL Slave原地重建" -msgstr "MySQL Slave原地重建" +#~ msgid "同步上联" +#~ msgstr "同步上联" -#: backend/ticket/constants.py:112 -msgid "MySQL 克隆主从" -msgstr "MySQL 克隆主从" +#~ msgid "绑定入口" +#~ msgstr "绑定入口" -#: backend/ticket/constants.py:113 -msgid "MySQL 主从互换" -msgstr "MySQL 主从互换" +#~ msgid "接入层列表" +#~ msgstr "接入层列表" -#: backend/ticket/constants.py:114 -msgid "MySQL 主库故障切换" -msgstr "MySQL 主库故障切换" +#~ msgid "IDC 城市 ID" +#~ msgstr "IDC 城市 ID" -#: backend/ticket/constants.py:115 -msgid "MySQL 高可用部署" -msgstr "MySQL 高可用部署" +#~ msgid "逻辑城市 ID" +#~ msgstr "逻辑城市 ID" -#: backend/ticket/constants.py:116 -msgid "MySQL 变更SQL执行" -msgstr "MySQL 变更SQL执行" +#~ msgid "逻辑城市名" +#~ msgstr "逻辑城市名" -#: backend/ticket/constants.py:117 -msgid "MySQL 模拟执行" -msgstr "MySQL 模拟执行" +#~ msgid "网络设备 ID" +#~ msgstr "网络设备 ID" -#: backend/ticket/constants.py:118 -msgid "MySQL 添加Proxy" -msgstr "MySQL 添加Proxy" +#~ msgid "online" +#~ msgstr "online" -#: backend/ticket/constants.py:119 -msgid "MySQL 替换Proxy" -msgstr "MySQL 替换Proxy" +#~ msgid "offline" +#~ msgstr "offline" -#: backend/ticket/constants.py:120 -msgid "MySQL 单节点删除" -msgstr "MySQL 单节点删除" +#~ msgid "destroy" +#~ msgstr "destroy" -#: backend/ticket/constants.py:121 -msgid "MySQL 单节点启用" -msgstr "MySQL 单节点启用" +#~ msgid "tendbsingle" +#~ msgstr "tendbsingle" -#: backend/ticket/constants.py:122 -msgid "MySQL 单节点禁用" -msgstr "MySQL 单节点禁用" +#~ msgid "backend_master" +#~ msgstr "backend_master" -#: backend/ticket/constants.py:123 -msgid "MySQL 高可用删除" -msgstr "MySQL 高可用删除" +#~ msgid "backend_repeater" +#~ msgstr "backend_repeater" -#: backend/ticket/constants.py:124 -msgid "MySQL 高可用禁用" -msgstr "MySQL 高可用禁用" +#~ msgid "backend_slave" +#~ msgstr "backend_slave" -#: backend/ticket/constants.py:125 -msgid "MySQL 高可用启用" -msgstr "MySQL 高可用启用" +#~ msgid "redis_master" +#~ msgstr "redis_master" -#: backend/ticket/constants.py:126 -msgid "MySQL 授权" -msgstr "MySQL 授权" +#~ msgid "redis_slave" +#~ msgstr "redis_slave" -#: backend/ticket/constants.py:127 -msgid "MySQL EXCEL-授权" -msgstr "MySQL EXCEL-授权" +#~ msgid "es_datanode_hot" +#~ msgstr "es_datanode_hot" -#: backend/ticket/constants.py:128 -msgid "MySQL 客户端权限克隆" -msgstr "MySQL 客户端权限克隆" +#~ msgid "es_datanode_cold" +#~ msgstr "es_datanode_cold" -#: backend/ticket/constants.py:129 -msgid "MySQL DB实例权限克隆" -msgstr "MySQL DB实例权限克隆" +#~ msgid "hdfs_namenode" +#~ msgstr "hdfs_namenode" -#: backend/ticket/constants.py:130 -msgid "MySQL 高可用DB重命名" -msgstr "MySQL 高可用DB重命名" +#~ msgid "hdfs_zookeeper" +#~ msgstr "hdfs_zookeeper" -#: backend/ticket/constants.py:131 -msgid "MySQL 高可用清档" -msgstr "MySQL 高可用清档" +#~ msgid "hdfs_journalnode" +#~ msgstr "hdfs_journalnode" -#: backend/ticket/constants.py:132 -msgid "MySQL 高可用库表备份" -msgstr "MySQL 高可用库表备份" +#~ msgid "riak_node" +#~ msgstr "riak_node" -#: backend/ticket/constants.py:133 -msgid "MySQL 数据校验修复" -msgstr "MySQL 数据校验修复" +#~ msgid "部署方案不匹配" +#~ msgstr "部署方案不匹配" -#: backend/ticket/constants.py:134 -msgid "MySQL 分区" -msgstr "MySQL 分区" +#~ msgid "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" +#~ msgstr "集群类型:{cluster_type} 和部署方案:{deploy_plan_class} 不匹配" -#: backend/ticket/constants.py:135 -msgid "MySQL 数据修复" -msgstr "MySQL 数据修复" +#~ msgid "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" +#~ msgstr "业务需要在 dba 业务下新增一个 set, 需要记录下这个 set id" -#: backend/ticket/constants.py:136 -msgid "MySQL 闪回" -msgstr "MySQL 闪回" +#~ msgid "部署方法ID" +#~ msgstr "部署方法ID" -#: backend/ticket/constants.py:137 -msgid "MySQL 定点回档" -msgstr "MySQL 定点回档" +#~ msgid "{} 未实现 status flag" +#~ msgstr "{} 未实现 status flag" -#: backend/ticket/constants.py:138 -msgid "MySQL 高可用全库备份" -msgstr "MySQL 高可用全库备份" +#~ msgid "find primary show slave status failed: {}" +#~ msgstr "find primary show slave status failed: {}" -#: backend/ticket/constants.py:139 -msgid "MySQL 单节点清档" -msgstr "MySQL 单节点清档" +#~ msgid "分组表" +#~ msgstr "分组表" -#: backend/ticket/constants.py:140 -msgid "MySQL 单节点DB重命名" -msgstr "MySQL 单节点DB重命名" +#~ msgid "集群分片总数" +#~ msgstr "集群分片总数" -#: backend/ticket/constants.py:143 -msgid "Spider 数据校验修复" -msgstr "Spider 数据校验修复" +#~ msgid "集群存储预估总容量/G" +#~ msgstr "集群存储预估总容量/G" -#: backend/ticket/constants.py:144 -msgid "Spider 分区管理" -msgstr "Spider 分区管理" +#~ msgid "方案描述" +#~ msgstr "方案描述" -#: backend/ticket/constants.py:145 -msgid "Spider 库表备份" -msgstr "Spider 库表备份" +#~ msgid "drop_cluster - 方便调试,后面去掉" +#~ msgstr "drop_cluster - 方便调试,后面去掉" -#: backend/ticket/constants.py:146 -msgid "Spider 数据库重命名" -msgstr "Spider 数据库重命名" +#~ msgid "drop_my_cluster - 方便调试,后面去掉" +#~ msgstr "drop_my_cluster - 方便调试,后面去掉" -#: backend/ticket/constants.py:147 -msgid "Spider 清档" -msgstr "Spider 清档" +#~ msgid "告警通知组类别" +#~ msgstr "告警通知组类别" -#: backend/ticket/constants.py:149 -msgid "TenDB Cluster 主故障切换" -msgstr "TenDB Cluster 主故障切换" +#~ msgid "DBA系统专用" +#~ msgstr "DBA系统专用" -#: backend/ticket/constants.py:150 -msgid "TenDB Cluster 主从互切" -msgstr "TenDB Cluster 主从互切" +#~ msgid "[gcsdns]查询和上报切换队列" +#~ msgstr "[gcsdns]查询和上报切换队列" -#: backend/ticket/constants.py:151 -msgid "TenDB Cluster 集群部署" -msgstr "TenDB Cluster 集群部署" +#~ msgid "" +#~ "dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) " +#~ "两个操作" +#~ msgstr "" +#~ "dts task操作,目前支持 同步完成(syncStopTodo)、强制终止(ForceKillTaskTodo) " +#~ "两个操作" -#: backend/ticket/constants.py:152 -msgid "TenDB Cluster 集群启用" -msgstr "TenDB Cluster 集群启用" +#~ msgid "dts tasks重新开始" +#~ msgstr "dts tasks重新开始" -#: backend/ticket/constants.py:153 -msgid "TenDB Cluster 集群禁用" -msgstr "TenDB Cluster 集群禁用" +#~ msgid "dts tasks重试当前步骤" +#~ msgstr "dts tasks重试当前步骤" -#: backend/ticket/constants.py:154 -msgid "TenDB Cluster 集群销毁" -msgstr "TenDB Cluster 集群销毁" +#~ msgid "token:{}不存在,请传入校验token" +#~ msgstr "token:{}不存在,请传入校验token" -#: backend/ticket/constants.py:155 -msgid "Spider 全备" -msgstr "Spider 全备" +#~ msgid "部署方案操作失败" +#~ msgstr "部署方案操作失败" -#: backend/ticket/constants.py:158 -msgid "Redis 单节点部署" -msgstr "Redis 单节点部署" +#~ msgid "Redis部署方案名称" +#~ msgstr "Redis部署方案名称" -#: backend/ticket/constants.py:159 -msgid "Redis 集群部署" -msgstr "Redis 集群部署" +#~ msgid "Redis集群类型" +#~ msgstr "Redis集群类型" -#: backend/ticket/constants.py:160 -msgid "Redis 提取 Key" -msgstr "Redis 提取 Key" +#~ msgid "部署方案id列表" +#~ msgstr "部署方案id列表" -#: backend/ticket/constants.py:161 -msgid "Redis 删除 key" -msgstr "Redis 删除 key" +#~ msgid "新建{}部署方案" +#~ msgstr "新建{}部署方案" -#: backend/ticket/constants.py:162 -msgid "Redis 集群备份" -msgstr "Redis 集群备份" +#~ msgid "更新{}部署方案" +#~ msgstr "更新{}部署方案" -#: backend/ticket/constants.py:163 -msgid "Redis 集群启用" -msgstr "Redis 集群启用" +#~ msgid "部署方案: {} 正在被引用,无法修改相关参数" +#~ msgstr "部署方案: {} 正在被引用,无法修改相关参数" -#: backend/ticket/constants.py:164 -msgid "Redis 集群禁用" -msgstr "Redis 集群禁用" +#~ msgid "查询{}部署方案列表" +#~ msgstr "查询{}部署方案列表" -#: backend/ticket/constants.py:165 -msgid "Redis 集群删除" -msgstr "Redis 集群删除" +#~ msgid "删除{}部署方案" +#~ msgstr "删除{}部署方案" -#: backend/ticket/constants.py:166 -msgid "Redis 集群清档" -msgstr "Redis 集群清档" +#~ msgid "部署方案: {} 正在被引用,无法删除" +#~ msgstr "部署方案: {} 正在被引用,无法删除" -#: backend/ticket/constants.py:167 -msgid "Redis 扩缩容" -msgstr "Redis 扩缩容" +#~ msgid "批量删除{}部署方案" +#~ msgstr "批量删除{}部署方案" -#: backend/ticket/constants.py:168 -msgid "Proxy 扩缩容" -msgstr "Proxy 扩缩容" +#~ msgid "部署方案: {} 存在被引用,无法删除" +#~ msgstr "部署方案: {} 存在被引用,无法删除" -#: backend/ticket/constants.py:169 -msgid "redis集群 slave 裁撤替换" -msgstr "redis集群 slave 裁撤替换" +#~ msgid "通过下发脚本到机器获取集群备份记录" +#~ msgstr "通过下发脚本到机器获取集群备份记录" -#: backend/ticket/constants.py:170 -msgid "redis集群 master 裁撤替换" -msgstr "redis集群 master 裁撤替换" +#~ msgid "根据job id查询任务执行状态和执行结果" +#~ msgstr "根据job id查询任务执行状态和执行结果" -#: backend/ticket/constants.py:171 -msgid "redis集群 proxy 裁撤替换" -msgstr "redis集群 proxy 裁撤替换" +#~ msgid "excel表头校验不正确! 提示: 请按照模板填写授权数据" +#~ msgstr "excel表头校验不正确! 提示: 请按照模板填写授权数据" -#: backend/ticket/constants.py:172 -msgid "Redis 新建DTS任务" -msgstr "Redis 新建DTS任务" +#~ msgid "授权数据缓存UID" +#~ msgstr "授权数据缓存UID" -#: backend/ticket/constants.py:181 -msgid "Kafka 集群禁用" -msgstr "Kafka 集群禁用" +#~ msgid "密码是否满足强度" +#~ msgstr "密码是否满足强度" -#: backend/ticket/constants.py:182 -msgid "Kafka 集群删除" -msgstr "Kafka 集群删除" +#~ msgid "不允许sql_content和sql_file同时为空,请至少填写一项" +#~ msgstr "不允许sql_content和sql_file同时为空,请至少填写一项" -#: backend/ticket/constants.py:187 -msgid "HDFS 实例重启" -msgstr "HDFS 实例重启" +#~ msgid "sql执行的DB信息" +#~ msgstr "sql执行的DB信息" -#: backend/ticket/constants.py:194 -msgid "ES 集群扩容" -msgstr "ES 集群扩容" +#~ msgid "高危信息提示" +#~ msgstr "高危信息提示" -#: backend/ticket/constants.py:195 -msgid "ES 集群缩容" -msgstr "ES 集群缩容" +#~ msgid "时间{}格式解析失败: {},请按照{}格式输入时间" +#~ msgstr "时间{}格式解析失败: {},请按照{}格式输入时间" -#: backend/ticket/constants.py:196 -msgid "ES 实例重启" -msgstr "ES 实例重启" +#~ msgid "sql数据是否成功录入到pipeline" +#~ msgstr "sql数据是否成功录入到pipeline" -#: backend/ticket/constants.py:197 -msgid "ES 集群替换" -msgstr "ES 集群替换" +#~ msgid "改变流程配置" +#~ msgstr "改变流程配置" -#: backend/ticket/constants.py:198 -msgid "ES 集群启用" -msgstr "ES 集群启用" +#~ msgid "查询流程配置" +#~ msgstr "查询流程配置" -#: backend/ticket/constants.py:199 -msgid "ES 集群禁用" -msgstr "ES 集群禁用" +#~ msgid "创建分区后自动执行的分区单据" +#~ msgstr "创建分区后自动执行的分区单据" -#: backend/ticket/constants.py:200 -msgid "ES 集群删除" -msgstr "ES 集群删除" +#~ msgid "更新者" +#~ msgstr "更新者" -#: backend/ticket/constants.py:205 -msgid "Pulsar 实例重启" -msgstr "Pulsar 实例重启" +#~ msgid "分区使用的端口" +#~ msgstr "分区使用的端口" -#: backend/ticket/constants.py:219 -msgid "云区域服务部署" -msgstr "云区域服务部署" +#~ msgid "同一业务不同集群" +#~ msgstr "同一业务不同集群" -#: backend/ticket/constants.py:220 -msgid "云区域Nginx 服务部署" -msgstr "云区域Nginx 服务部署" +#~ msgid "不同业务不同集群" +#~ msgstr "不同业务不同集群" -#: backend/ticket/constants.py:221 -msgid "云区域nginx 服务重装" -msgstr "云区域nginx 服务重装" +#~ msgid "复制到其他系统" +#~ msgstr "复制到其他系统" -#: backend/ticket/constants.py:222 -msgid "云区域nginx 服务替换" -msgstr "云区域nginx 服务替换" +#~ msgid "从回档临时环境复制数据" +#~ msgstr "从回档临时环境复制数据" -#: backend/ticket/constants.py:223 -msgid "云区域dns 服务部署" -msgstr "云区域dns 服务部署" +#~ msgid "用户自建redis迁移到DBM" +#~ msgstr "用户自建redis迁移到DBM" -#: backend/ticket/constants.py:224 -msgid "云区域dns 服务添加" -msgstr "云区域dns 服务添加" +#~ msgid "用户确认修复" +#~ msgstr "用户确认修复" -#: backend/ticket/constants.py:225 -msgid "云区域dns 服务裁撤" -msgstr "云区域dns 服务裁撤" +#~ msgid "是否数据修复" +#~ msgstr "是否数据修复" -#: backend/ticket/constants.py:226 -msgid "云区域dns 服务替换" -msgstr "云区域dns 服务替换" +#~ msgid "bill备注" +#~ msgstr "bill备注" -#: backend/ticket/constants.py:227 -msgid "云区域dns 服务重装" -msgstr "云区域dns 服务重装" +#~ msgid "非超级用户,暂不允许调用此接口" +#~ msgstr "非超级用户,暂不允许调用此接口" -#: backend/ticket/constants.py:228 -msgid "云区域dbha 服务部署" -msgstr "云区域dbha 服务部署" +#~ msgid "打包下载结果文件列表" +#~ msgstr "打包下载结果文件列表" -#: backend/ticket/constants.py:229 -msgid "云区域dbha 服务重装" -msgstr "云区域dbha 服务重装" +#~ msgid "deploy-rotate" +#~ msgstr "deploy-rotate" -#: backend/ticket/constants.py:230 -msgid "云区域dbha 服务替换" -msgstr "云区域dbha 服务替换" +#~ msgid "backup-truncate-database" +#~ msgstr "backup-truncate-database" -#: backend/ticket/constants.py:231 -msgid "云区域dbha 服务新增" -msgstr "云区域dbha 服务新增" +#~ msgid "长久存储-保留三年" +#~ msgstr "长久存储-保留三年" -#: backend/ticket/constants.py:232 -msgid "云区域dbha 服务删除" -msgstr "云区域dbha 服务删除" +#~ msgid "下发MySQL介质{}" +#~ msgstr "下发MySQL介质{}" -#: backend/ticket/constants.py:233 -msgid "云区域drs 服务部署" -msgstr "云区域drs 服务部署" +#~ msgid "初始化机器{}" +#~ msgstr "初始化机器{}" -#: backend/ticket/constants.py:234 -msgid "云区域drs 服务重启" -msgstr "云区域drs 服务重启" +#~ msgid "获取MASTER节点备份介质{}" +#~ msgstr "获取MASTER节点备份介质{}" -#: backend/ticket/constants.py:235 -msgid "云区域drs 服务新增" -msgstr "云区域drs 服务新增" +#~ msgid "获取SLAVE节点备份介质{}" +#~ msgstr "获取SLAVE节点备份介质{}" -#: backend/ticket/constants.py:236 -msgid "云区域drs 服务删除" -msgstr "云区域drs 服务删除" +#~ msgid "切换实例" +#~ msgstr "切换实例" -#: backend/ticket/constants.py:237 -msgid "云区域drs 服务替换" -msgstr "云区域drs 服务替换" +#~ msgid "成对迁移集群的主从节点" +#~ msgstr "成对迁移集群的主从节点" -#: backend/ticket/constants.py:309 -msgid "生产部署" -msgstr "生产部署" +#~ msgid "卸载主从实例完毕,修改元数据" +#~ msgstr "卸载主从实例完毕,修改元数据" -#: backend/ticket/constants.py:311 -msgid "快速执行" -msgstr "快速执行" +#~ msgid "准备重命名参数" +#~ msgstr "准备重命名参数" -#: backend/ticket/constants.py:313 -msgid "结果忽略执行" -msgstr "结果忽略执行" +#~ msgid "构造过滤正则" +#~ msgstr "构造过滤正则" -#: backend/ticket/constants.py:317 -msgid "交付" -msgstr "交付" +#~ msgid "获得源目标的库表" +#~ msgstr "获得源目标的库表" -#: backend/ticket/constants.py:319 -msgid "描述任务信息" -msgstr "描述任务信息" +#~ msgid "检查源数据库是否在用" +#~ msgstr "检查源数据库是否在用" -#: backend/ticket/constants.py:325 -msgid "资源交付" -msgstr "资源交付" +#~ msgid "表迁移" +#~ msgstr "表迁移" -#: backend/ticket/constants.py:327 -msgid "资源批量申请" -msgstr "资源批量申请" +#~ msgid "迁移源库中其他对象" +#~ msgstr "迁移源库中其他对象" -#: backend/ticket/constants.py:329 -msgid "资源批量交付" -msgstr "资源批量交付" +#~ msgid "确认源数据库已空" +#~ msgstr "确认源数据库已空" -#: backend/ticket/constants.py:335 -msgid "前置动作" -msgstr "前置动作" +#~ msgid "删除源数据库" +#~ msgstr "删除源数据库" -#: backend/ticket/constants.py:336 -msgid "后继动作" -msgstr "后继动作" +#~ msgid "{} {} 重命名数据库" +#~ msgstr "{} {} 重命名数据库" -#: backend/ticket/constants.py:342 -msgid "自动重试" -msgstr "自动重试" +#, python-format +#~ msgid "%s slave 节点不存在" +#~ msgstr "%s slave 节点不存在" -#: backend/ticket/constants.py:343 -msgid "手动重试" -msgstr "手动重试" +#~ msgid "下发db-actor到集群主从节点" +#~ msgstr "下发db-actor到集群主从节点" -#: backend/ticket/constants.py:349 -msgid "通用错误代码" -msgstr "通用错误代码" +#~ msgid "slave重建之新增repl帐户{}" +#~ msgstr "slave重建之新增repl帐户{}" -#: backend/ticket/constants.py:350 -msgid "自动互斥重试错误代码" -msgstr "自动互斥重试错误代码" +#~ msgid "slave重建之获取MASTER节点备份介质{}" +#~ msgstr "slave重建之获取MASTER节点备份介质{}" -#: backend/ticket/constants.py:351 -msgid "手动互斥重试错误代码" -msgstr "手动互斥重试错误代码" +#~ msgid "slave重建之获取SLAVE节点备份介质{}" +#~ msgstr "slave重建之获取SLAVE节点备份介质{}" -#: backend/ticket/exceptions.py:18 -msgid "单据模块异常" -msgstr "单据模块异常" +#~ msgid "判断备份文件来源,并传输备份文件到新slave节点{}" +#~ msgstr "判断备份文件来源,并传输备份文件到新slave节点{}" -#: backend/ticket/exceptions.py:23 -msgid "ITSM单据不存在" -msgstr "ITSM单据不存在" +#~ msgid "克隆主节点账号权限到新从节点" +#~ msgstr "克隆主节点账号权限到新从节点" -#: backend/ticket/exceptions.py:24 -#, python-brace-format -msgid "ITSM单据[{sn}]不存在" -msgstr "ITSM单据[{sn}]不存在" +#~ msgid "old slave卸载完毕,修改元数据" +#~ msgstr "old slave卸载完毕,修改元数据" -#: backend/ticket/exceptions.py:29 -msgid "单据类型不支持" -msgstr "单据类型不支持" +#~ msgid "slave 原地恢复数据{}" +#~ msgstr "slave 原地恢复数据{}" -#: backend/ticket/exceptions.py:30 -#, python-brace-format -msgid "单据类型不支持{ticket_type}" -msgstr "单据类型不支持{ticket_type}" +#~ msgid "Restore local Slave 本地重建" +#~ msgstr "Restore local Slave 本地重建" -#: backend/ticket/exceptions.py:35 -msgid "单据参数校验异常" -msgstr "单据参数校验异常" +#~ msgid "添加slave之新增repl帐户{}" +#~ msgstr "添加slave之新增repl帐户{}" -#: backend/ticket/exceptions.py:36 -#, python-brace-format -msgid "单据{ticket_type}参数校验异常" -msgstr "单据{ticket_type}参数校验异常" +#~ msgid "添加slave之获取MASTER节点备份介质{}" +#~ msgstr "添加slave之获取MASTER节点备份介质{}" -#: backend/ticket/exceptions.py:41 -msgid "单据执行互斥" -msgstr "单据执行互斥" +#~ msgid "添加slave之获取SLAVE节点备份介质{}" +#~ msgstr "添加slave之获取SLAVE节点备份介质{}" -#: backend/ticket/exceptions.py:42 -#, python-brace-format -msgid "单据{ticket_type}执行互斥" -msgstr "单据{ticket_type}执行互斥" +#~ msgid "添加slave之恢复数据{}" +#~ msgstr "添加slave之恢复数据{}" -#: backend/ticket/exceptions.py:47 -msgid "单据提交重复" -msgstr "单据提交重复" +#~ msgid "添加Slave之恢复slave" +#~ msgstr "添加Slave之恢复slave" -#: backend/ticket/exceptions.py:48 -#, python-brace-format -msgid "单据{ticket_type}提交重复" -msgstr "单据{ticket_type}提交重复" +#~ msgid "添加从库flow" +#~ msgstr "添加从库flow" -#: backend/ticket/flow_manager/base.py:94 -msgid "{}流程已跳过" -msgstr "{}流程已跳过" +#~ msgid "清理机器配置{}" +#~ msgstr "清理机器配置{}" -#: backend/ticket/flow_manager/delivery.py:42 -msgid "交付成功" -msgstr "交付成功" +#~ msgid "清理机器flow" +#~ msgstr "清理机器flow" -#: backend/ticket/flow_manager/delivery.py:79 -msgid "{}执行{}" -msgstr "{}执行{}" +#~ msgid "定点恢复之获取MASTER节点备份介质{}" +#~ msgstr "定点恢复之获取MASTER节点备份介质{}" -#: backend/ticket/flow_manager/inner.py:82 -#, python-brace-format -msgid "任务{status_display}" -msgstr "任务{status_display}" +#~ msgid "定点恢复之获取SLAVE节点备份介质{}" +#~ msgstr "定点恢复之获取SLAVE节点备份介质{}" -#: backend/ticket/flow_manager/inner.py:206 -msgid "该任务流程跳过,相关信息可在历史任务中查看" -msgstr "该任务流程跳过,相关信息可在历史任务中查看" +#~ msgid "判断备份文件来源,并传输备份文件到新定点恢复节点{}" +#~ msgstr "判断备份文件来源,并传输备份文件到新定点恢复节点{}" -#: backend/ticket/flow_manager/inner.py:226 -#, python-brace-format -msgid "(执行结果可忽略)任务状态: {status_display}" -msgstr "(执行结果可忽略)任务状态: {status_display}" +#~ msgid "传输文件{}" +#~ msgstr "传输文件{}" -#: backend/ticket/flow_manager/itsm.py:65 -msgid "审批中" -msgstr "审批中" +#~ msgid "卸载rollback实例{}" +#~ msgstr "卸载rollback实例{}" -#: backend/ticket/flow_manager/itsm.py:66 -msgid "已撤销" -msgstr "已撤销" +#~ msgid "卸载rollback实例完毕,修改元数据" +#~ msgstr "卸载rollback实例完毕,修改元数据" -#: backend/ticket/flow_manager/itsm.py:67 -msgid "已通过" -msgstr "已通过" +#~ msgid "获得清档目标" +#~ msgstr "获得清档目标" -#: backend/ticket/flow_manager/itsm.py:68 -msgid "被拒绝" -msgstr "被拒绝" +#~ msgid "检查清档目标是否在用" +#~ msgstr "检查清档目标是否在用" -#: backend/ticket/flow_manager/pause.py:43 -#, python-brace-format -msgid "暂停状态{status_display}" -msgstr "暂停状态{status_display}" +#~ msgid "生成备份库名" +#~ msgstr "生成备份库名" -#: backend/ticket/flow_manager/pause.py:65 -msgid "【{}】流程待确认,是否继续?" -msgstr "【{}】流程待确认,是否继续?" +#~ msgid "备份清档表" +#~ msgstr "备份清档表" -#: backend/ticket/flow_manager/resource.py:52 -msgid "资源申请状态{status_display}" -msgstr "资源申请状态{status_display}" +#~ msgid "重建空表" +#~ msgstr "重建空表" -#: backend/ticket/flow_manager/resource.py:129 -msgid "资源申请失败,错误信息: {}" -msgstr "资源申请失败,错误信息: {}" +#~ msgid "备份库中其他对象" +#~ msgstr "备份库中其他对象" -#: backend/ticket/flow_manager/resource.py:166 -#: backend/ticket/flow_manager/resource.py:206 -msgid "资源申请下一个节点不为部署节点,请重新编排" -msgstr "资源申请下一个节点不为部署节点,请重新编排" +#~ msgid "{} {} 清档" +#~ msgstr "{} {} 清档" -#: backend/ticket/flow_manager/timer.py:56 -msgid "定时时间{},已超时{},需手动触发。暂停状态:{}" -msgstr "定时时间{},已超时{},需手动触发。暂停状态:{}" +#~ msgid "Redis-{}-安装原子任务" +#~ msgstr "Redis-{}-安装原子任务" -#: backend/ticket/flow_manager/timer.py:63 -msgid "定时节点已触发" -msgstr "定时节点已触发" +#~ msgid "Redis-001-{}-下发介质包" +#~ msgstr "Redis-001-{}-下发介质包" -#: backend/ticket/flow_manager/timer.py:65 -msgid "定时时间{},倒计时:{}" -msgstr "定时时间{},倒计时:{}" +#~ msgid "Redis-005-{}-安装监控" +#~ msgstr "Redis-005-{}-安装监控" -#: backend/ticket/flow_manager/timer.py:96 -msgid "【{}】定时流程待确认,是否继续?" -msgstr "【{}】定时流程待确认,是否继续?" +#~ msgid "Redis-101-{}-下发介质包" +#~ msgstr "Redis-101-{}-下发介质包" -#: backend/ticket/mock_data.py:60 -msgid "测试创建es集群" -msgstr "测试创建es集群" +#~ msgid "Redis-102-{}-卸载dbmon" +#~ msgstr "Redis-102-{}-卸载dbmon" -#: backend/ticket/mock_data.py:65 backend/ticket/mock_data.py:92 -#: backend/ticket/mock_data.py:121 backend/ticket/mock_data.py:158 -msgid "深圳" -msgstr "深圳" +#~ msgid "Redis-103-{}-建立主从关系" +#~ msgstr "Redis-103-{}-建立主从关系" -#: backend/ticket/mock_data.py:87 -msgid "测试创建kafka集群" -msgstr "测试创建kafka集群" +#~ msgid "Redis-104-{}-建立主从关系" +#~ msgstr "Redis-104-{}-建立主从关系" -#: backend/ticket/mock_data.py:116 -msgid "测试创建hdfs集群" -msgstr "测试创建hdfs集群" +#~ msgid "Redis-801-{}-下发介质包" +#~ msgstr "Redis-801-{}-下发介质包" -#: backend/ticket/mock_data.py:156 -msgid "测试集群" -msgstr "测试集群" +#~ msgid "Redis-802-{}-请求检查" +#~ msgstr "Redis-802-{}-请求检查" -#: backend/ticket/models/ticket.py:46 -msgid "流程类型" -msgstr "流程类型" +#~ msgid "Redis-003-{}-下发介质包" +#~ msgstr "Redis-003-{}-下发介质包" -#: backend/ticket/models/ticket.py:47 -msgid "流程别名" -msgstr "流程别名" +#~ msgid "Redis-504-{}-实例切换" +#~ msgstr "Redis-504-{}-实例切换" -#: backend/ticket/models/ticket.py:49 -msgid "单据流程对象ID" -msgstr "单据流程对象ID" +#~ msgid "源集群:{} 数据迁移到 目的集群:{}" +#~ msgstr "源集群:{} 数据迁移到 目的集群:{}" -#: backend/ticket/models/ticket.py:50 -msgid "单据流程详情" -msgstr "单据流程详情" +#~ msgid "REDIS_MASTER-裁撤替换" +#~ msgstr "REDIS_MASTER-裁撤替换" -#: backend/ticket/models/ticket.py:52 -msgid "单据流程状态" -msgstr "单据流程状态" +#~ msgid "REDIS_MASTER-故障自愈" +#~ msgstr "REDIS_MASTER-故障自愈" -#: backend/ticket/models/ticket.py:58 -msgid "错误代码" -msgstr "错误代码" +#~ msgid "[redis]卸载bkdbmon" +#~ msgstr "[redis]卸载bkdbmon" -#: backend/ticket/models/ticket.py:60 -msgid "重试类型(专用于inner_flow)" -msgstr "重试类型(专用于inner_flow)" +#~ msgid "清理Redis配置" +#~ msgstr "清理Redis配置" -#: backend/ticket/models/ticket.py:64 backend/ticket/models/ticket.py:65 -msgid "单据流程" -msgstr "单据流程" +#~ msgid "清理Proxy配置" +#~ msgstr "清理Proxy配置" -#: backend/ticket/models/ticket.py:93 backend/ticket/serializers.py:70 -msgid "单据分组类型" -msgstr "单据分组类型" +#~ msgid "REDIS-重装DBMON" +#~ msgstr "REDIS-重装DBMON" -#: backend/ticket/models/ticket.py:101 -msgid "单据差异化详情" -msgstr "单据差异化详情" +#~ msgid "{}部署bkdbmon" +#~ msgstr "{}部署bkdbmon" -#: backend/ticket/models/ticket.py:102 -msgid "单据是否审阅过" -msgstr "单据是否审阅过" +#~ msgid "{}添加域名" +#~ msgstr "{}添加域名" -#: backend/ticket/models/ticket.py:105 backend/ticket/models/ticket.py:106 -msgid "单据" -msgstr "单据" +#~ msgid "主机转移" +#~ msgstr "主机转移" -#: backend/ticket/models/ticket.py:187 -msgid "正在自动创建单据,单据详情: {}" -msgstr "正在自动创建单据,单据详情: {}" +#~ msgid "{}删除域名" +#~ msgstr "{}删除域名" -#: backend/ticket/models/ticket.py:196 -msgid "单据{}正在初始化流程" -msgstr "单据{}正在初始化流程" +#~ msgid "下架proxy实例" +#~ msgstr "下架proxy实例" -#: backend/ticket/models/ticket.py:246 backend/ticket/models/ticket.py:302 -#: backend/ticket/models/todo.py:31 -msgid "关联流程任务" -msgstr "关联流程任务" +#~ msgid "proxy下架元数据" +#~ msgstr "proxy下架元数据" -#: backend/ticket/models/ticket_result_relation.py:25 -msgid "第三方系统id" -msgstr "第三方系统id" +#~ msgid "集群[{}]添加spider master节点" +#~ msgstr "集群[{}]添加spider master节点" -#: backend/ticket/models/todo.py:30 -msgid "待办标题" -msgstr "待办标题" +#~ msgid "部署spider-ctl集群" +#~ msgstr "部署spider-ctl集群" -#: backend/ticket/models/todo.py:33 -msgid "待办人" -msgstr "待办人" +#~ msgid "spider上对中控主节点进行授权" +#~ msgstr "spider上对中控主节点进行授权" -#: backend/ticket/models/todo.py:35 -msgid "待办类型" -msgstr "待办类型" +#~ msgid "中控主节点注册临时spider节点路由信息" +#~ msgstr "中控主节点注册临时spider节点路由信息" -#: backend/ticket/models/todo.py:40 -msgid "上下文" -msgstr "上下文" +#~ msgid "ctl 执行库表备份" +#~ msgstr "ctl 执行库表备份" -#: backend/ticket/models/todo.py:42 -msgid "待办状态" -msgstr "待办状态" +#~ msgid "存入的存储节点数量不是偶数,请检查!" +#~ msgstr "存入的存储节点数量不是偶数,请检查!" -#: backend/ticket/models/todo.py:47 -msgid "待办完成人" -msgstr "待办完成人" +#~ msgid "ctl 执行全库备份" +#~ msgstr "ctl 执行全库备份" -#: backend/ticket/models/todo.py:48 -msgid "待办完成时间" -msgstr "待办完成时间" +#~ msgid "适配备份库映射" +#~ msgstr "适配备份库映射" -#: backend/ticket/models/todo.py:72 backend/ticket/models/todo.py:73 -msgid "待办" -msgstr "待办" +#~ msgid "重建备份库" +#~ msgstr "重建备份库" -#: backend/ticket/models/todo.py:81 -msgid "关联待办" -msgstr "关联待办" +#~ msgid "{} on remote {} 清档" +#~ msgstr "{} on remote {} 清档" -#: backend/ticket/models/todo.py:82 -msgid "操作" -msgstr "操作" +#~ msgid "处理集群表" +#~ msgstr "处理集群表" -#: backend/ticket/models/todo.py:85 backend/ticket/models/todo.py:86 -msgid "待办操作记录" -msgstr "待办操作记录" +#~ msgid "{} on remote {} 重命名数据库" +#~ msgstr "{} on remote {} 重命名数据库" -#: backend/ticket/serializers.py:71 backend/ticket/views.py:172 -#: backend/ticket/views.py:173 -msgid "单据详情" -msgstr "单据详情" +#~ msgid "删除集群源库" +#~ msgstr "删除集群源库" -#: backend/ticket/serializers.py:74 -msgid "状态名称" -msgstr "状态名称" +#~ msgid "【{}】自动化流程待确认,是否继续?" +#~ msgstr "【{}】自动化流程待确认,是否继续?" -#: backend/ticket/serializers.py:80 -msgid "是否忽略重复提交" -msgstr "是否忽略重复提交" +#~ msgid "{}-空闲检查" +#~ msgstr "{}-空闲检查" -#: backend/ticket/serializers.py:109 -msgid "流程待办" -msgstr "流程待办" +#~ msgid "空闲检查失败" +#~ msgstr "空闲检查失败" -#: backend/ticket/serializers.py:110 -msgid "跳转链接" -msgstr "跳转链接" +#~ msgid "错误详情{}" +#~ msgstr "错误详情{}" -#: backend/ticket/serializers.py:114 -msgid "流程类型显示名" -msgstr "流程类型显示名" +#, python-format +#~ msgid "输入参数%s不符合【时区(+08:00、-08:00)】格式" +#~ msgstr "输入参数%s不符合【时区(+08:00、-08:00)】格式" -#: backend/ticket/serializers.py:115 -msgid "概览" -msgstr "概览" +#, python-format +#~ msgid "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" +#~ msgstr "输入参数%s不符合【秒(s) 或 时间(%%Y-%%m-%%d %%H:%%M:%%S)】格式" -#: backend/ticket/serializers.py:165 -msgid "待办人列表" -msgstr "待办人列表" +#~ msgid "「授权接口返回结果异常」{}" +#~ msgstr "「授权接口返回结果异常」{}" -#: backend/ticket/serializers.py:183 -msgid "待办ID" -msgstr "待办ID" +#~ msgid "分区管理服务api异常,相关信息: {}" +#~ msgstr "分区管理服务api异常,相关信息: {}" -#: backend/ticket/serializers.py:184 -msgid "动作" -msgstr "动作" +#~ msgid "获取分区语句成功" +#~ msgstr "获取分区语句成功" -#: backend/ticket/serializers.py:185 -msgid "动作参数" -msgstr "动作参数" +#~ msgid "语义检查出发的自动创建单据" +#~ msgstr "语义检查出发的自动创建单据" -#: backend/ticket/serializers.py:203 -msgid "单据流程的ID" -msgstr "单据流程的ID" +#~ msgid "task:{} {}:{} 迁移失败" +#~ msgstr "task:{} {}:{} 迁移失败" -#: backend/ticket/serializers.py:218 backend/ticket/serializers.py:226 -msgid "查询起始时间" -msgstr "查询起始时间" +#~ msgid "{}中有{}个proxy不是running状态" +#~ msgstr "{}中有{}个proxy不是running状态" -#: backend/ticket/serializers.py:219 backend/ticket/serializers.py:227 -msgid "查询终止时间" -msgstr "查询终止时间" +#~ msgid "查询主机bk_host_id失败[数量不匹配]" +#~ msgstr "查询主机bk_host_id失败[数量不匹配]" -#: backend/ticket/serializers.py:221 backend/ticket/serializers.py:229 -msgid "操作状态" -msgstr "操作状态" +#~ msgid "查询空闲机模块ID bk_module_id 失败" +#~ msgstr "查询空闲机模块ID bk_module_id 失败" -#: backend/ticket/serializers.py:233 -msgid "主机所在业务" -msgstr "主机所在业务" +#~ msgid "导入资源池失败" +#~ msgstr "导入资源池失败" -#: backend/ticket/serializers.py:235 -msgid "IP列表" -msgstr "IP列表" +#~ msgid "单实例架构" +#~ msgstr "单实例架构" -#: backend/ticket/serializers.py:239 -msgid "请至少提供两台机器来部署云区域组件" -msgstr "请至少提供两台机器来部署云区域组件" +#~ msgid "数据库管理" +#~ msgstr "数据库管理" -#: backend/ticket/tasks/ticket_tasks.py:104 -msgid "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" -msgstr "无法在dbm meta中查询到集群{}的相关信息,请排查该集群的状态" +#~ msgid "平台管理" +#~ msgstr "平台管理" -#: backend/ticket/tasks/ticket_tasks.py:176 -msgid "集群{}数据校验正确,不需要进行数据修复" -msgstr "集群{}数据校验正确,不需要进行数据修复" +#~ msgid "JWT鉴权错误,错误信息: {}" +#~ msgstr "JWT鉴权错误,错误信息: {}" -#: backend/ticket/tasks/ticket_tasks.py:200 -msgid "集群{}存在数据不一致,自动创建的数据修复单据" -msgstr "集群{}存在数据不一致,自动创建的数据修复单据" +#~ msgid "" +#~ "新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连" +#~ "接符-和下划线_,并且长度在1到39字符之间" +#~ msgstr "" +#~ "新DB名字{}格式不合法,请保证数据库名以小写字母开头且只能包含字母、数字、连" +#~ "接符-和下划线_,并且长度在1到39字符之间" -#: backend/ticket/tasks/ticket_tasks.py:216 -msgid "任务{}立即执行" -msgstr "任务{}立即执行" +#~ msgid "不允许%单独使用,不允许*组合使用" +#~ msgstr "不允许%单独使用,不允许*组合使用" -#: backend/ticket/tasks/ticket_tasks.py:219 -msgid "任务{}定时执行,定时触发时间:{}" -msgstr "任务{}定时执行,定时触发时间:{}" +#~ msgid "包含通配符时,每一个输入框只能允许单一对象" +#~ msgstr "包含通配符时,每一个输入框只能允许单一对象" -#: backend/ticket/todos/__init__.py:100 -msgid "确认执行" -msgstr "确认执行" +#~ msgid "字符不允许只包含空格" +#~ msgstr "字符不允许只包含空格" -#: backend/ticket/todos/__init__.py:101 -msgid "终止单据" -msgstr "终止单据" +#~ msgid "DB选择框不允许为空" +#~ msgstr "DB选择框不允许为空" -#: backend/ticket/views.py:136 -msgid "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -msgstr "实例{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +#~ msgid "table选择框不允许为空" +#~ msgstr "table选择框不允许为空" -#: backend/ticket/views.py:149 -msgid "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" -msgstr "集群{}已存在相同类型的单据[{}]正在运行,请确认是否重复提交" +#~ msgid "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" +#~ msgstr "忽略DB选择框和忽略table选择框要么同时为空,要么同时不为空" -#: backend/ticket/views.py:189 -msgid "单据列表" -msgstr "单据列表" +#~ msgid "规格" +#~ msgstr "规格" -#: backend/ticket/views.py:208 -msgid "获取单据流程" -msgstr "获取单据流程" +#~ msgid "master节点数不为3台! 请保证master的部署节点为3" +#~ msgstr "master节点数不为3台! 请保证master的部署节点为3" -#: backend/ticket/views.py:210 -msgid "流程信息" -msgstr "流程信息" +#~ msgid "matser实例状态异常,暂时无法执行该单据类型:{}" +#~ msgstr "matser实例状态异常,暂时无法执行该单据类型:{}" -#: backend/ticket/views.py:221 -msgid "单据回调" -msgstr "单据回调" +#~ msgid "proxy实例状态异常,暂时无法执行该单据类型:{}" +#~ msgstr "proxy实例状态异常,暂时无法执行该单据类型:{}" -#: backend/ticket/views.py:234 -msgid "单据流程重试" -msgstr "单据流程重试" +#~ msgid "系统内置数据库[{}],不允许重命名" +#~ msgstr "系统内置数据库[{}],不允许重命名" -#: backend/ticket/views.py:248 -msgid "获取单据类型列表" -msgstr "获取单据类型列表" +#~ msgid "sql文件路径" +#~ msgstr "sql文件路径" -#: backend/ticket/views.py:257 -msgid "节点列表" -msgstr "节点列表" +#~ msgid "模拟执行node_id" +#~ msgstr "模拟执行node_id" -#: backend/ticket/views.py:286 -msgid "待办单据列表" -msgstr "待办单据列表" +#~ msgid "模拟执行root_id" +#~ msgstr "模拟执行root_id" -#: backend/ticket/views.py:325 -msgid "待办处理" -msgstr "待办处理" +#~ msgid "sql文件名" +#~ msgstr "sql文件名" -#: backend/ticket/views.py:346 -msgid "待办单据数" -msgstr "待办单据数" +#~ msgid "目标变更db" +#~ msgstr "目标变更db" -#: backend/ticket/views.py:370 -msgid "查询集群变更单据事件" -msgstr "查询集群变更单据事件" +#~ msgid "备份匹配DB列表" +#~ msgstr "备份匹配DB列表" -#: backend/ticket/views.py:406 -msgid "查询集群实例变更单据事件" -msgstr "查询集群实例变更单据事件" +#~ msgid "备份匹配Table列表" +#~ msgstr "备份匹配Table列表" -#: backend/ticket/views.py:442 -msgid "快速部署云区域组件" -msgstr "快速部署云区域组件" +#~ msgid "sql备份信息" +#~ msgstr "sql备份信息" -#: backend/ticket/views.py:514 -msgid "云区域组件快速部署单据" -msgstr "云区域组件快速部署单据" +#~ msgid "后台部署方案" +#~ msgstr "后台部署方案" -#: backend/utils/time.py:127 -msgid "类型{}与类型{}之间不允许进行比较" -msgstr "类型{}与类型{}之间不允许进行比较" +#~ msgid "主机【{}】已经被注册到了集群元数据,请检查" +#~ msgstr "主机【{}】已经被注册到了集群元数据,请检查" -#: backend/utils/time.py:135 -msgid "无法找到合适的附近时间点" -msgstr "无法找到合适的附近时间点" +#~ msgid "master和slave中存在重复节点" +#~ msgstr "master和slave中存在重复节点" -#: backend/version_log/config.py:30 -msgid "版本日志" -msgstr "版本日志" +#~ msgid "slave和proxy中存在重复节点" +#~ msgstr "slave和proxy中存在重复节点" -#: backend/version_log/models.py:43 -msgid "访问版本" -msgstr "访问版本" +#~ msgid "部署方案" +#~ msgstr "部署方案" -#: backend/version_log/models.py:48 -msgid "版本日志访问记录" -msgstr "版本日志访问记录" +#~ msgid "集群访问域名" +#~ msgstr "集群访问域名" -#: backend/version_log/views.py:45 -msgid "访问出错,请联系管理员。" -msgstr "访问出错,请联系管理员。" +#~ msgid "机器数" +#~ msgstr "机器数" -#: backend/version_log/views.py:49 -msgid "日志列表获取成功" -msgstr "日志列表获取成功" +#~ msgid "Spider 全备" +#~ msgstr "Spider 全备" -#: backend/version_log/views.py:65 -msgid "日志版本文件没找到,请联系管理员" -msgstr "日志版本文件没找到,请联系管理员" +#~ msgid "redis集群 slave 裁撤替换" +#~ msgstr "redis集群 slave 裁撤替换" -#: backend/version_log/views.py:69 -msgid "日志详情获取成功" -msgstr "日志详情获取成功" +#~ msgid "redis集群 proxy 裁撤替换" +#~ msgstr "redis集群 proxy 裁撤替换" + +#~ msgid "类型{}与类型{}之间不允许进行比较" +#~ msgstr "类型{}与类型{}之间不允许进行比较" From c0e34d035bea21a9b0d6447ddd13fa3ad8e49118 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Sat, 14 Sep 2024 10:31:16 +0800 Subject: [PATCH 032/164] =?UTF-8?q?feat(backend):=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=20#6943?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_services/bigdata/resources/query.py | 18 ++++++++++++++++++ dbm-ui/backend/iam_app/dataclass/resources.py | 2 +- .../builders/redis/redis_cluster_apply.py | 9 ++++++--- .../redis/redis_cluster_version_update.py | 8 ++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/dbm-ui/backend/db_services/bigdata/resources/query.py b/dbm-ui/backend/db_services/bigdata/resources/query.py index 612797c45d..b278776c3b 100644 --- a/dbm-ui/backend/db_services/bigdata/resources/query.py +++ b/dbm-ui/backend/db_services/bigdata/resources/query.py @@ -80,6 +80,23 @@ def _filter_instance_hook(cls, bk_biz_id, query_params, instances, **kwargs): **kwargs, ) + @classmethod + def _filter_instance_qs_hook(cls, storage_queryset, proxy_queryset, inst_fields, query_filters, query_params): + # 大数据只有storage_queryset,忽略proxy_queryset + inst_fields.append("instance_name") + instance_queryset = ( + StorageInstance.objects.select_related("machine") + .prefetch_related("cluster") + .annotate(role=F("instance_inner_role"), instance_name=F("name")) + .filter(query_filters) + .values(*inst_fields) + .order_by("create_at") + ) + # 部署时间表头排序 + if query_params.get("ordering"): + instance_queryset = instance_queryset.order_by(query_params.get("ordering")) + return instance_queryset + @classmethod def _to_cluster_representation( cls, @@ -126,6 +143,7 @@ def _to_instance_representation( # 补充重启时间和操作记录 restart_at = kwargs["restart_map"].get(instance["id"]) instance_info.update( + instance_name=instance["instance_name"], restart_at=datetime2str(restart_at) if restart_at else "", operations=kwargs["instance_operate_records_map"].get(instance["id"], []), ) diff --git a/dbm-ui/backend/iam_app/dataclass/resources.py b/dbm-ui/backend/iam_app/dataclass/resources.py index 0a045ea222..ff3ed6bbd5 100644 --- a/dbm-ui/backend/iam_app/dataclass/resources.py +++ b/dbm-ui/backend/iam_app/dataclass/resources.py @@ -89,7 +89,7 @@ def create_model_instance( try: instance = instance or model.objects.get(pk=instance_id) except model.DoesNotExist: - return resource, None + raise ResourceNotExistError(_("未找到模型[{}]的实例[{}]").format(model.__name__, instance_id)) display_fields = ResourceEnum.get_resource_by_id(cls.id).display_fields instance_name_values = [str(getattr(instance, _field)) for _field in display_fields] diff --git a/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py b/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py index f7182ad733..0b7a7648ed 100644 --- a/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py +++ b/dbm-ui/backend/ticket/builders/redis/redis_cluster_apply.py @@ -67,9 +67,12 @@ def validate(self, attrs): # 判断主机角色是否互斥 super().validate(attrs) - # 集群分片数至少>=3 - if attrs["cluster_shard_num"] < 3: - raise serializers.ValidationError(_("redis集群部署的集群分片数至少大于3")) + # predixyRedisCluster, tendisplus集群分片数至少>=3 + if attrs["cluster_shard_num"] < 3 and attrs["cluster_type"] in [ + ClusterType.TendisPredixyRedisCluster, + ClusterType.TendisPredixyTendisplusCluster, + ]: + raise serializers.ValidationError(_("{}集群部署的集群分片数至少大于3").format(attrs["cluster_type"])) # 集群名校验 bk_biz_id, ticket_type = self.context["bk_biz_id"], self.context["ticket_type"] diff --git a/dbm-ui/backend/ticket/builders/redis/redis_cluster_version_update.py b/dbm-ui/backend/ticket/builders/redis/redis_cluster_version_update.py index 71ba788909..80d7a523ea 100644 --- a/dbm-ui/backend/ticket/builders/redis/redis_cluster_version_update.py +++ b/dbm-ui/backend/ticket/builders/redis/redis_cluster_version_update.py @@ -30,6 +30,14 @@ class UpdateInfoSerializer(serializers.Serializer): def to_representation(self, details): return details + def validate(self, attrs): + for info in attrs["infos"]: + # 校验当前版本不能和目标版本一致 + if info["target_version"] in info["current_versions"]: + raise serializers.ValidationError(_("当前版本不能和目标版本{}一致").fromat(info["current_versions"])) + + return attrs + class RedisVersionUpdateFlowParamBuilder(builders.FlowParamBuilder): controller = RedisController.redis_cluster_version_update_online From fa7cf0c5f851172c25ff6faa1aee222d49130bb9 Mon Sep 17 00:00:00 2001 From: xfwduke Date: Mon, 23 Sep 2024 11:46:03 +0800 Subject: [PATCH 033/164] =?UTF-8?q?fix(mysql):=20=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=8D=95=E6=8D=AE=E7=BB=93=E6=9E=9C=E8=A1=A8=E5=90=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20#7074?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbactuator/pkg/components/mysql/pt_table_checksum.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go index 525aeb8ea4..6db7828036 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go @@ -133,6 +133,8 @@ func (c *PtTableChecksumComp) GenerateConfigFile() (err error) { c.GeneralParam.RuntimeAccountParam.MonitorUser, c.GeneralParam.RuntimeAccountParam.MonitorPwd, "http://127.0.0.1:9999", logDir, c.tools) + cfg.PtChecksum.Replicate = c.Params.ReplicateTable + var ignoreDbs []string ignoreDbs = append(ignoreDbs, c.Params.SystemDbs...) ignoreDbs = append(ignoreDbs, []string{ From 842e69461b86e1454b357fe993b7e6d20cd4fcbb Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 20 Sep 2024 15:54:04 +0800 Subject: [PATCH 034/164] =?UTF-8?q?fix(backend):=20=E5=8F=98=E6=9B=B4SQL?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=A2=9E=E5=8A=A0=E5=A4=87=E6=B3=A8=20#7049?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/bk_web/constants.py | 1 + .../db_services/mysql/sql_import/handlers.py | 3 +++ .../mysql/sql_import/serializers.py | 1 + dbm-ui/backend/ticket/builders/common/base.py | 2 +- .../builders/mysql/mysql_import_sqlfile.py | 2 ++ .../migrations/0012_alter_ticket_remark.py | 18 ++++++++++++++++++ dbm-ui/backend/ticket/models/ticket.py | 4 ++-- dbm-ui/backend/ticket/serializers.py | 4 ++-- 8 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 dbm-ui/backend/ticket/migrations/0012_alter_ticket_remark.py diff --git a/dbm-ui/backend/bk_web/constants.py b/dbm-ui/backend/bk_web/constants.py index 9d56b3e611..90506daa5d 100644 --- a/dbm-ui/backend/bk_web/constants.py +++ b/dbm-ui/backend/bk_web/constants.py @@ -18,6 +18,7 @@ LEN_NORMAL = 64 LEN_MIDDLE = 128 LEN_LONG = 255 +LEN_L_LONG = 512 LEN_X_LONG = 1000 LEN_XX_LONG = 10000 diff --git a/dbm-ui/backend/db_services/mysql/sql_import/handlers.py b/dbm-ui/backend/db_services/mysql/sql_import/handlers.py index 8d82ecd670..a242dfe240 100644 --- a/dbm-ui/backend/db_services/mysql/sql_import/handlers.py +++ b/dbm-ui/backend/db_services/mysql/sql_import/handlers.py @@ -158,6 +158,7 @@ def semantic_check( ticket_mode: Dict, backup: List[Dict], is_auto_commit: bool = True, + remark: str = "", ) -> Dict: """ sql 模拟执行(sql 语义检查) @@ -168,6 +169,7 @@ def semantic_check( @param ticket_mode: sql导入单据的触发类型 @param backup: 备份信息(和备份单据一样) @param is_auto_commit: 是否自动提单 + @param remark: 提单备注 """ # 语义检查参数准备 @@ -187,6 +189,7 @@ def semantic_check( "ticket_mode": ticket_mode, "backup": backup, "is_auto_commit": is_auto_commit, + "remark": remark, } try: if self.cluster_type == DBType.MySQL: diff --git a/dbm-ui/backend/db_services/mysql/sql_import/serializers.py b/dbm-ui/backend/db_services/mysql/sql_import/serializers.py index 07109135d9..e4b68fec1a 100644 --- a/dbm-ui/backend/db_services/mysql/sql_import/serializers.py +++ b/dbm-ui/backend/db_services/mysql/sql_import/serializers.py @@ -98,6 +98,7 @@ class SQLImportBackUpSerializer(serializers.Serializer): help_text=_("集群类型,默认为mysql"), choices=DBType.get_choices(), required=False, default=DBType.MySQL ) is_auto_commit = serializers.BooleanField(help_text=_("模拟执行成功后是否自动提单"), required=False, default=True) + remark = serializers.CharField(help_text=_("提单备注"), required=False, default="") class Meta: swagger_schema_fields = {"example": mock_data.SQL_SEMANTIC_CHECK_REQUEST_DATA} diff --git a/dbm-ui/backend/ticket/builders/common/base.py b/dbm-ui/backend/ticket/builders/common/base.py index 4a0fc25d52..cd05dce1ed 100644 --- a/dbm-ui/backend/ticket/builders/common/base.py +++ b/dbm-ui/backend/ticket/builders/common/base.py @@ -461,7 +461,7 @@ def patch_ticket_detail(self): self.patch_spec_details() if self.need_patch_instance_details: self.patch_instance_details() - self.ticket.save(update_fields=["details", "update_at"]) + self.ticket.save(update_fields=["details", "update_at", "remark"]) class RedisTicketFlowBuilderPatchMixin(BaseTicketFlowBuilderPatchMixin): diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py b/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py index 67132d87c7..14a718aeca 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py @@ -144,6 +144,8 @@ def patch_sqlimport_ticket_detail(cls, ticket, cluster_type): [details.pop(field, None) for field in pop_fields] ticket.details.update(details) + # 补充备注信息 + ticket.remark = ticket.remark or details.get("remark", _("由模拟执行任务[{}]发起").format(root_id)) @classmethod def patch_sqlfile_grammar_check_info(cls, ticket, cluster_type): diff --git a/dbm-ui/backend/ticket/migrations/0012_alter_ticket_remark.py b/dbm-ui/backend/ticket/migrations/0012_alter_ticket_remark.py new file mode 100644 index 0000000000..659c2a8117 --- /dev/null +++ b/dbm-ui/backend/ticket/migrations/0012_alter_ticket_remark.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.25 on 2024-09-23 04:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("ticket", "0011_auto_20240821_1846"), + ] + + operations = [ + migrations.AlterField( + model_name="ticket", + name="remark", + field=models.CharField(max_length=512, verbose_name="备注"), + ), + ] diff --git a/dbm-ui/backend/ticket/models/ticket.py b/dbm-ui/backend/ticket/models/ticket.py index 1f8f3e08f1..cea46db296 100644 --- a/dbm-ui/backend/ticket/models/ticket.py +++ b/dbm-ui/backend/ticket/models/ticket.py @@ -18,7 +18,7 @@ from django.utils.translation import ugettext_lazy as _ from backend import env -from backend.bk_web.constants import LEN_LONG, LEN_MIDDLE, LEN_NORMAL, LEN_SHORT +from backend.bk_web.constants import LEN_L_LONG, LEN_LONG, LEN_NORMAL, LEN_SHORT from backend.bk_web.models import AuditedModel from backend.configuration.constants import PLAT_BIZ_ID, DBType from backend.db_monitor.exceptions import AutofixException @@ -97,7 +97,7 @@ class Ticket(AuditedModel): max_length=LEN_SHORT, default=TicketStatus.PENDING, ) - remark = models.CharField(_("备注"), max_length=LEN_MIDDLE) + remark = models.CharField(_("备注"), max_length=LEN_L_LONG) details = models.JSONField(_("单据差异化详情"), default=dict) send_msg_config = models.JSONField(_("单据通知设置"), default=dict) is_reviewed = models.BooleanField(_("单据是否审阅过"), default=False) diff --git a/dbm-ui/backend/ticket/serializers.py b/dbm-ui/backend/ticket/serializers.py index 14e6793d60..70a9686266 100644 --- a/dbm-ui/backend/ticket/serializers.py +++ b/dbm-ui/backend/ticket/serializers.py @@ -15,7 +15,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers -from backend.bk_web.constants import LEN_MIDDLE +from backend.bk_web.constants import LEN_L_LONG from backend.bk_web.serializers import AuditedSerializer, TranslationSerializerMixin from backend.components import CmsiApi from backend.configuration.constants import PLAT_BIZ_ID, DBType @@ -83,7 +83,7 @@ class TicketSerializer(AuditedSerializer, serializers.ModelSerializer): help_text=_("单据类型"), choices=TicketType.get_choices(), default=TicketType.MYSQL_SINGLE_APPLY ) status = serializers.ChoiceField(help_text=_("状态"), choices=TicketStatus.get_choices(), read_only=True) - remark = serializers.CharField(help_text=_("备注"), required=False, max_length=LEN_MIDDLE, allow_blank=True) + remark = serializers.CharField(help_text=_("备注"), required=False, max_length=LEN_L_LONG, allow_blank=True) # 默认使用MySQL序列化器,不同单据类型不同字段序列化 group = serializers.CharField(help_text=_("单据分组类型"), required=False) details = TicketDetailsSerializer(help_text=_("单据详情")) From b23a1db67dc1938d4f119e417a2baa241157e513 Mon Sep 17 00:00:00 2001 From: xfan0805 Date: Mon, 23 Sep 2024 09:43:42 +0800 Subject: [PATCH 035/164] fix: import_sqlfile_result_display #7063 --- .../dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go index 9186940cf2..cdd064e8b4 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go @@ -14,7 +14,6 @@ import ( "bytes" "context" "database/sql" - "dbm-services/common/go-pubpkg/mysqlcomm" "fmt" "io" "os" @@ -26,6 +25,8 @@ import ( "github.com/pkg/errors" + "dbm-services/common/go-pubpkg/mysqlcomm" + "dbm-services/common/go-pubpkg/logger" "dbm-services/mysql/db-tools/dbactuator/pkg/core/cst" "dbm-services/mysql/db-tools/dbactuator/pkg/util" @@ -132,7 +133,9 @@ func (e ExecuteSqlAtLocal) ExcuteCommand(command string, report bool) (err error defer ef.Sync() stdout := io.MultiWriter(os.Stdout) - stderr := io.MultiWriter(os.Stderr, &stderrBuf, ef) + // 错误不输出控制台 去掉os.Stderr + //stderr := io.MultiWriter(os.Stderr, &stderrBuf, ef) + stderr := io.MultiWriter(&stderrBuf, ef) if !report { stderr = io.MultiWriter(&stderrBuf, ef) } @@ -150,6 +153,7 @@ func (e ExecuteSqlAtLocal) ExcuteCommand(command string, report bool) (err error wg.Done() }() + // 管道stderrIn输出到stderr。stderr又写到&stderrBuf、ef _, errStderr = io.Copy(stderr, stderrIn) wg.Wait() From 8f6f5e388fccbfa55432992c6c86560d28516e0d Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Mon, 23 Sep 2024 18:17:13 +0800 Subject: [PATCH 036/164] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0sqlserver?= =?UTF-8?q?=E8=87=AA=E6=84=88=E7=AD=96=E7=95=A5=20#7084?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/core/staticembed/monitor_dbm.sql | 28 +++++++++---------- ...\261\343\200\220Alwayson\343\200\221.json" | 3 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql index eded78544b..39401b2ad7 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql @@ -3177,30 +3177,30 @@ BEGIN --开始备份 SET @SQL = NULL SELECT @SQL = ISNULL(@SQL+CHAR(13),'')+' - DECLARE @SUCCESS_'+NAME+' INT = 0,@CHECKER_'+NAME+' INT = 0 - DECLARE @STARTTIME_'+NAME+' VARCHAR(25) = CONVERT(CHAR(19),GETDATE(),120), - @STARTTIME_SHORT_'+NAME+' VARCHAR(25) =REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19),GETDATE(),120),'':'',''''),''-'',''''),'' '','''') - DECLARE @FILENAME_'+NAME+' VARCHAR(4000) = '''+NAME+'__'+@APP+'_'+@IP+'_'+LTRIM(@PORT)+'_''+@STARTTIME_SHORT_'+NAME+'+'''+@SUFFIX+''' - DECLARE @FULLFILENAME_'+NAME+' VARCHAR(4000) = '''+@BACKUP_PATH+'''+@FILENAME_'+NAME+' - EXEC @CHECKER_'+NAME+' = DBO.TOOL_CHECK_DISK_FREE_SIZE '''+@BACKUP_PATH+''','+LTRIM(@DISK_MIN_SIZE_MB)+' - IF @CHECKER_'+NAME+' = 1 + DECLARE @SUCCESS_'+replace(NAME,'-','#')+' INT = 0,@CHECKER_'+replace(NAME,'-','#')+' INT = 0 + DECLARE @STARTTIME_'+replace(NAME,'-','#')+' VARCHAR(25) = CONVERT(CHAR(19),GETDATE(),120), + @STARTTIME_SHORT_'+replace(NAME,'-','#')+' VARCHAR(25) =REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19),GETDATE(),120),'':'',''''),''-'',''''),'' '','''') + DECLARE @FILENAME_'+replace(NAME,'-','#')+' VARCHAR(4000) = '''+NAME+'__'+@APP+'_'+@IP+'_'+LTRIM(@PORT)+'_''+@STARTTIME_SHORT_'+replace(NAME,'-','#')+'+'''+@SUFFIX+''' + DECLARE @FULLFILENAME_'+replace(NAME,'-','#')+' VARCHAR(4000) = '''+@BACKUP_PATH+'''+@FILENAME_'+replace(NAME,'-','#')+' + EXEC @CHECKER_'+replace(NAME,'-','#')+' = DBO.TOOL_CHECK_DISK_FREE_SIZE '''+@BACKUP_PATH+''','+LTRIM(@DISK_MIN_SIZE_MB)+' + IF @CHECKER_'+replace(NAME,'-','#')+' = 1 BEGIN - IF '+LTRIM(@TYPE)+' <> 1 AND NOT EXISTS(select 1 from msdb.dbo.backupset a, msdb.dbo.backupmediafamily b where a.media_set_id = b.media_set_id and a.database_name = '''+NAME+''' and backup_finish_date between getdate()-2 and getdate()) + IF '+LTRIM(@TYPE)+' <> 1 AND NOT EXISTS(select 1 from msdb.dbo.backupset a, msdb.dbo.backupmediafamily b where a.media_set_id = b.media_set_id and a.database_name = '''+replace(NAME,'-','#')+''' and backup_finish_date between getdate()-2 and getdate()) BEGIN - DECLARE @NEWFULLFILENAME_'+NAME+' VARCHAR(4000) = REPLACE(REPLACE(@FULLFILENAME_'+NAME+','''+@SUFFIX+''',''.bak''),'''+@BACKUP_PATH+''','''+@FULL_BACKUP_PATH+''') - EXEC @SUCCESS_'+NAME+' = DBO.TOOL_BACKUP_DATABASE_OPERATOR 1,'''+NAME+''',@NEWFULLFILENAME_'+NAME+' + DECLARE @NEWFULLFILENAME_'+replace(NAME,'-','#')+' VARCHAR(4000) = REPLACE(REPLACE(@FULLFILENAME_'+replace(NAME,'-','#')+','''+@SUFFIX+''',''.bak''),'''+@BACKUP_PATH+''','''+@FULL_BACKUP_PATH+''') + EXEC @SUCCESS_'+replace(NAME,'-','#')+' = DBO.TOOL_BACKUP_DATABASE_OPERATOR 1,'''+NAME+''',@NEWFULLFILENAME_'+replace(NAME,'-','#')+' END - EXEC @SUCCESS_'+NAME+' = DBO.TOOL_BACKUP_DATABASE_OPERATOR '+LTRIM(@TYPE)+','''+NAME+''',@FULLFILENAME_'+NAME+' + EXEC @SUCCESS_'+replace(NAME,'-','#')+' = DBO.TOOL_BACKUP_DATABASE_OPERATOR '+LTRIM(@TYPE)+','''+NAME+''',@FULLFILENAME_'+replace(NAME,'-','#')+' END - DECLARE @ENDTIME_'+NAME+' VARCHAR(25) = CONVERT(CHAR(19),GETDATE(),120) + DECLARE @ENDTIME_'+replace(NAME,'-','#')+' VARCHAR(25) = CONVERT(CHAR(19),GETDATE(),120) INSERT INTO DBO.BACKUP_TRACE(BACKUP_ID,DBNAME,[PATH],FILENAME,TYPE,STARTTIME,ENDTIME,FILESIZE,MD5CODE,SUCCESS,UPLOADED,WRITETIME) - VALUES('''+@BACKUP_ID+''','''+NAME+''','''+@BACKUP_PATH+''',@FILENAME_'+NAME+','+LTRIM(@TYPE)+',@STARTTIME_'+NAME+',@ENDTIME_'+NAME+',0,0,@SUCCESS_'+NAME+',0,GETDATE())' + VALUES('''+@BACKUP_ID+''','''+NAME+''','''+@BACKUP_PATH+''',@FILENAME_'+replace(NAME,'-','#')+','+LTRIM(@TYPE)+',@STARTTIME_'+replace(NAME,'-','#')+',@ENDTIME_'+replace(NAME,'-','#')+',0,0,@SUCCESS_'+replace(NAME,'-','#')+',0,GETDATE())' FROM DBO.BACKUP_DBLIST WHERE NAME in(select RowValue from dbo.SplitStringByRow(@DBLIST,',')) --PRINT(@SQL) EXEC (@SQL) END TRY BEGIN CATCH - PRINT '~~ error in backup database ~~' + PRINT '~~ error in backup database ~~' END CATCH SET @BACKUP_TASK_END_TIME=convert(varchar(19),getdate(),121) diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" index df01eaacb0..6eb63b1b19 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/sqlserver/Sqlserver-\346\225\260\346\215\256\345\272\223\351\225\234\345\203\217\347\274\272\345\244\261\343\200\220Alwayson\343\200\221.json" @@ -236,7 +236,8 @@ }, "labels": [ "DBM", - "DBM_SQLSERVER" + "DBM_SQLSERVER", + "NEED_AUTOFIX/SQLSERVER_BUILD_DB_SYNC" ], "app": "", "path": "", From 4b044caa466be102c9c50c148768e6003a3ef461 Mon Sep 17 00:00:00 2001 From: xiepaup Date: Mon, 23 Sep 2024 18:27:13 +0800 Subject: [PATCH 037/164] =?UTF-8?q?fix(redis):=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=B5=B7=E5=A4=96=20#7087?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py index d10f292660..838239322d 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_migrate_load.py @@ -213,6 +213,7 @@ def redis_cluster_migrate_load_flow(self): trans_files = GetFileList(db_type=DBType.Redis) act_kwargs.file_list = trans_files.redis_dbmon() act_kwargs.exec_ip = all_ips + act_kwargs.bk_cloud_id = self.data["bk_cloud_id"] sub_pipeline.add_act( act_name=_("下发介质包"), act_component_code=TransFileComponent.code, From b8bd0552ee0898ad8b83efcaa79c9d64974d7135 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Mon, 23 Sep 2024 19:03:29 +0800 Subject: [PATCH 038/164] =?UTF-8?q?feat(helm-charts):=20helm-chart=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8=E6=89=A9=E7=BC=A9=E5=AE=B9?= =?UTF-8?q?=20#7051?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helm-charts/bk-dbm/Chart.lock | 6 ++-- helm-charts/bk-dbm/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/dbm/Chart.yaml | 2 +- .../deployments/backend-api/backend-api.yaml | 10 +++--- .../deployments/backend-api/service.yaml | 2 +- .../deployments/celery/celery-beater.yaml | 2 -- .../deployments/celery/celery-worker.yaml | 2 +- .../deployments/celery/pipeline-worker.yaml | 2 +- .../deployments/saas-api/saas-api.yaml | 4 +-- .../deployments/saas-api/service.yaml | 2 +- .../bk-dbm/charts/dbm/templates/hpa.yaml | 28 ----------------- .../dbm/templates/hpas/backend-api-hpa.yaml | 28 +++++++++++++++++ .../dbm/templates/hpas/celery-worker-hpa.yaml | 28 +++++++++++++++++ .../templates/hpas/pipeline-worker-hpa.yaml | 28 +++++++++++++++++ .../dbm/templates/hpas/saas-api-hpa.yaml | 28 +++++++++++++++++ helm-charts/bk-dbm/charts/dbm/values.yaml | 31 ++++++++++++++++++- helm-charts/bk-dbm/values.yaml | 18 +++++++++-- 17 files changed, 174 insertions(+), 49 deletions(-) delete mode 100644 helm-charts/bk-dbm/charts/dbm/templates/hpa.yaml create mode 100644 helm-charts/bk-dbm/charts/dbm/templates/hpas/backend-api-hpa.yaml create mode 100644 helm-charts/bk-dbm/charts/dbm/templates/hpas/celery-worker-hpa.yaml create mode 100644 helm-charts/bk-dbm/charts/dbm/templates/hpas/pipeline-worker-hpa.yaml create mode 100644 helm-charts/bk-dbm/charts/dbm/templates/hpas/saas-api-hpa.yaml diff --git a/helm-charts/bk-dbm/Chart.lock b/helm-charts/bk-dbm/Chart.lock index bc281186f1..0f3face760 100644 --- a/helm-charts/bk-dbm/Chart.lock +++ b/helm-charts/bk-dbm/Chart.lock @@ -19,7 +19,7 @@ dependencies: version: 7.9.8 - name: dbm repository: file://charts/dbm - version: 0.1.41 + version: 0.1.42 - name: dbconfig repository: file://charts/dbconfig version: 0.1.13 @@ -65,5 +65,5 @@ dependencies: - name: db-dbha repository: file://charts/db-dbha version: 0.1.0 -digest: sha256:505dce199e12c74e5852a426b8997b2c527c43c5cba321aebc58ef1040b43ff6 -generated: "2024-08-28T19:45:11.596886126+08:00" +digest: sha256:a0cc97116fc4c063d525b75adb4dab479456c1509f975700b887cc19517d1348 +generated: "2024-09-23T12:17:47.539237+08:00" diff --git a/helm-charts/bk-dbm/Chart.yaml b/helm-charts/bk-dbm/Chart.yaml index fa76ad51bb..8497a0bc70 100644 --- a/helm-charts/bk-dbm/Chart.yaml +++ b/helm-charts/bk-dbm/Chart.yaml @@ -27,7 +27,7 @@ dependencies: - condition: dbm.enabled name: dbm repository: file://charts/dbm - version: 0.1.41 + version: 0.1.42 - condition: dbconfig.enabled name: dbconfig repository: file://charts/dbconfig diff --git a/helm-charts/bk-dbm/charts/dbm/Chart.yaml b/helm-charts/bk-dbm/charts/dbm/Chart.yaml index e826d198c4..bbc9064456 100644 --- a/helm-charts/bk-dbm/charts/dbm/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbm/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 1.5.0-alpha.535 description: A Helm chart for dbm name: dbm type: application -version: 0.1.41 +version: 0.1.42 diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/backend-api.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/backend-api.yaml index 0aeaddb7a8..d728bfbd0d 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/backend-api.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/backend-api.yaml @@ -1,4 +1,4 @@ -{{- if .Values.enabled -}} +{{- if .Values.saas.backendApi.enabled | default .Values.enabled -}} {{- $fullName := ( include "dbm.backend-api.fullname" .) -}} apiVersion: apps/v1 kind: Deployment @@ -7,8 +7,8 @@ metadata: labels: {{- include "dbm.labels" . | nindent 4 }} spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.saas.api.replicaCount }} + {{- if not .Values.saas.backendApi.autoscaling.enabled }} + replicas: {{ .Values.saas.backendApi.replicaCount }} {{- end }} selector: matchLabels: @@ -41,7 +41,7 @@ spec: - /bin/bash - -c args: - - export SERVICE_ONLY=true && gunicorn wsgi -w {{ .Values.saas.api.gunicornWorker }} -b :8000 --access-logfile - --error-logfile - --access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"' + - export SERVICE_ONLY=true && gunicorn wsgi -w {{ .Values.saas.backendApi.gunicornWorker }} -b :8000 --access-logfile - --error-logfile - --access-logformat '[%(h)s] %({request_id}i)s %(u)s %(t)s "%(r)s" %(s)s %(D)s %(b)s "%(f)s" "%(a)s"' ports: - name: http containerPort: 8000 @@ -66,7 +66,7 @@ spec: failureThreshold: {{ .Values.readinessProbe.failureThreshold | default 3}} {{- include "dbm.container_env" . | nindent 10 }} resources: - {{- toYaml .Values.saas.api.resources | nindent 12 }} + {{- toYaml .Values.saas.backendApi.resources | nindent 12 }} {{- include "dbm.initContainersWaitForMigrate" . | nindent 6 }} {{- with .Values.nodeSelector }} nodeSelector: diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/service.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/service.yaml index 83e0289d33..30b27503d7 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/service.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/backend-api/service.yaml @@ -1,4 +1,4 @@ -{{- if .Values.enabled -}} +{{- if .Values.saas.backendApi.enabled | default .Values.enabled -}} {{- $fullName := ( include "dbm.backend-api.fullname" .) -}} apiVersion: v1 kind: Service diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-beater.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-beater.yaml index b589dc3ec0..01f6f64efc 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-beater.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-beater.yaml @@ -7,9 +7,7 @@ metadata: labels: {{- include "dbm.labels" . | nindent 4 }} spec: - {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.saas.celeryBeat.replicaCount | default 1}} - {{- end }} selector: matchLabels: {{- include "dbm.selectorLabels" . | nindent 6 }} diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-worker.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-worker.yaml index a56ec8f0dd..6e0976481c 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-worker.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/celery-worker.yaml @@ -7,7 +7,7 @@ metadata: labels: {{- include "dbm.labels" . | nindent 4 }} spec: - {{- if not .Values.autoscaling.enabled }} + {{- if not .Values.saas.celeryWorker.autoscaling.enabled }} replicas: {{ .Values.saas.celeryWorker.replicaCount }} {{- end }} selector: diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/pipeline-worker.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/pipeline-worker.yaml index 9c0cbd759d..013179284a 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/pipeline-worker.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/celery/pipeline-worker.yaml @@ -7,7 +7,7 @@ metadata: labels: {{- include "dbm.labels" . | nindent 4 }} spec: - {{- if not .Values.autoscaling.enabled }} + {{- if not .Values.saas.pipelineWorker.autoscaling.enabled }} replicas: {{ .Values.saas.pipelineWorker.replicaCount }} {{- end }} selector: diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/saas-api.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/saas-api.yaml index 771cea27f8..58420738b6 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/saas-api.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/saas-api.yaml @@ -1,4 +1,4 @@ -{{- if .Values.enabled -}} +{{- if .Values.saas.api.enabled | default .Values.enabled -}} {{- $fullName := ( include "dbm.saas-api.fullname" .) -}} apiVersion: apps/v1 kind: Deployment @@ -7,7 +7,7 @@ metadata: labels: {{- include "dbm.labels" . | nindent 4 }} spec: - {{- if not .Values.autoscaling.enabled }} + {{- if not .Values.saas.api.autoscaling.enabled }} replicas: {{ .Values.saas.api.replicaCount }} {{- end }} selector: diff --git a/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/service.yaml b/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/service.yaml index adbd4500fd..a8be479a04 100644 --- a/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/service.yaml +++ b/helm-charts/bk-dbm/charts/dbm/templates/deployments/saas-api/service.yaml @@ -1,4 +1,4 @@ -{{- if .Values.enabled -}} +{{- if .Values.saas.api.enabled | default .Values.enabled -}} {{- $fullName := ( include "dbm.saas-api.fullname" .) -}} apiVersion: v1 kind: Service diff --git a/helm-charts/bk-dbm/charts/dbm/templates/hpa.yaml b/helm-charts/bk-dbm/charts/dbm/templates/hpa.yaml deleted file mode 100644 index 549fd6926e..0000000000 --- a/helm-charts/bk-dbm/charts/dbm/templates/hpa.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "bk-dbm.fullname" . }} - labels: - {{- include "bk-dbm.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "bk-dbm.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/helm-charts/bk-dbm/charts/dbm/templates/hpas/backend-api-hpa.yaml b/helm-charts/bk-dbm/charts/dbm/templates/hpas/backend-api-hpa.yaml new file mode 100644 index 0000000000..b1e7630754 --- /dev/null +++ b/helm-charts/bk-dbm/charts/dbm/templates/hpas/backend-api-hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.saas.backendApi.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "dbm.backend-api.fullname" . }} + labels: + {{- include "bk-dbm.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "dbm.backend-api.fullname" . }} + minReplicas: {{ .Values.saas.backendApi.autoscaling.minReplicas }} + maxReplicas: {{ .Values.saas.backendApi.autoscaling.maxReplicas }} + metrics: + {{- if .Values.saas.backendApi.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.saas.backendApi.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.saas.backendApi.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.saas.backendApi.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/helm-charts/bk-dbm/charts/dbm/templates/hpas/celery-worker-hpa.yaml b/helm-charts/bk-dbm/charts/dbm/templates/hpas/celery-worker-hpa.yaml new file mode 100644 index 0000000000..dd2aecf14b --- /dev/null +++ b/helm-charts/bk-dbm/charts/dbm/templates/hpas/celery-worker-hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.saas.celeryWorker.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "dbm.celery-worker.fullname" . }} + labels: + {{- include "bk-dbm.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "dbm.celery-worker.fullname" . }} + minReplicas: {{ .Values.saas.celeryWorker.autoscaling.minReplicas }} + maxReplicas: {{ .Values.saas.celeryWorker.autoscaling.maxReplicas }} + metrics: + {{- if .Values.saas.celeryWorker.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.saas.celeryWorker.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.saas.celeryWorker.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.saas.celeryWorker.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/helm-charts/bk-dbm/charts/dbm/templates/hpas/pipeline-worker-hpa.yaml b/helm-charts/bk-dbm/charts/dbm/templates/hpas/pipeline-worker-hpa.yaml new file mode 100644 index 0000000000..7fde8a8b06 --- /dev/null +++ b/helm-charts/bk-dbm/charts/dbm/templates/hpas/pipeline-worker-hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.saas.pipelineWorker.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "dbm.pipeline-worker.fullname" . }} + labels: + {{- include "bk-dbm.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "dbm.pipeline-worker.fullname" . }} + minReplicas: {{ .Values.saas.pipelineWorker.autoscaling.minReplicas }} + maxReplicas: {{ .Values.saas.pipelineWorker.autoscaling.maxReplicas }} + metrics: + {{- if .Values.saas.pipelineWorker.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.saas.pipelineWorker.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.saas.pipelineWorker.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.saas.pipelineWorker.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/helm-charts/bk-dbm/charts/dbm/templates/hpas/saas-api-hpa.yaml b/helm-charts/bk-dbm/charts/dbm/templates/hpas/saas-api-hpa.yaml new file mode 100644 index 0000000000..489fcfe9cf --- /dev/null +++ b/helm-charts/bk-dbm/charts/dbm/templates/hpas/saas-api-hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.saas.api.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "bk-dbm.fullname" . }} + labels: + {{- include "bk-dbm.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "bk-dbm.fullname" . }} + minReplicas: {{ .Values.saas.api.autoscaling.minReplicas }} + maxReplicas: {{ .Values.saas.api.autoscaling.maxReplicas }} + metrics: + {{- if .Values.saas.api.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.saas.api.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.saas.api.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.saas.api.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/helm-charts/bk-dbm/charts/dbm/values.yaml b/helm-charts/bk-dbm/charts/dbm/values.yaml index 96d8e14bd6..5a656fe265 100644 --- a/helm-charts/bk-dbm/charts/dbm/values.yaml +++ b/helm-charts/bk-dbm/charts/dbm/values.yaml @@ -28,15 +28,44 @@ saas: resources: {} replicaCount: 1 gunicornWorker: 8 - celeryBeat: + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + backendApi: enabled: true resources: {} replicaCount: 1 + gunicornWorker: 8 + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 celeryWorker: enabled: true resources: {} replicaCount: 1 + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 pipelineWorker: enabled: true resources: {} replicaCount: 1 + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + celeryBeat: + enabled: true + resources: {} + replicaCount: 1 diff --git a/helm-charts/bk-dbm/values.yaml b/helm-charts/bk-dbm/values.yaml index 4a8837fef5..19063d3858 100644 --- a/helm-charts/bk-dbm/values.yaml +++ b/helm-charts/bk-dbm/values.yaml @@ -157,8 +157,22 @@ dbm: pathType: ImplementationSpecific tls: [] - autoscaling: - enabled: false + saas: + api: + enabled: true + replicaCount: 1 + backendApi: + enabled: true + replicaCount: 1 + celeryBeat: + enabled: true + replicaCount: 1 + celeryWorker: + enabled: true + replicaCount: 1 + pipelineWorker: + enabled: true + replicaCount: 1 migration: images: From 731e2854fcf980c07641110a04f2d1e9a6c36257 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Wed, 18 Sep 2024 16:12:41 +0800 Subject: [PATCH 039/164] =?UTF-8?q?feat(backend):=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E9=85=8Diam=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=BB=99DBA=E7=9A=84=E8=84=9A=E6=9C=AC=20#6988?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/env/__init__.py | 1 + dbm-ui/backend/iam_app/dataclass/__init__.py | 115 +++++++++++++--- dbm-ui/backend/iam_app/handlers/client.py | 66 ++++++++++ dbm-ui/backend/iam_app/handlers/permission.py | 3 +- .../iam_app/migration_json_files/initial.json | 123 +++++++++++++++++- dbm-ui/backend/iam_app/serializers.py | 6 + dbm-ui/backend/iam_app/views/views.py | 22 ++++ 7 files changed, 317 insertions(+), 19 deletions(-) create mode 100644 dbm-ui/backend/iam_app/handlers/client.py diff --git a/dbm-ui/backend/env/__init__.py b/dbm-ui/backend/env/__init__.py index 431ade5513..bbd2070fb5 100644 --- a/dbm-ui/backend/env/__init__.py +++ b/dbm-ui/backend/env/__init__.py @@ -69,6 +69,7 @@ BK_IAM_API_VERSION = get_type_env(key="BK_IAM_API_VERSION", _type=str, default="v1") IAM_APP_URL = get_type_env(key="IAM_APP_URL", _type=str, default="https://iam.example.com") BK_IAM_RESOURCE_API_HOST = get_type_env(key="BK_IAM_RESOURCE_API_HOST", _type=str, default="https://bkdbm.example.com") +BK_IAM_GRADE_MANAGER_ID = get_type_env(key="BK_IAM_GRADE_MANAGER_ID", _type=int, default=0) # APIGW 相关配置 BK_APIGATEWAY_DOMAIN = get_type_env(key="BK_APIGATEWAY_DOMAIN", _type=str, default=BK_COMPONENT_API_URL) diff --git a/dbm-ui/backend/iam_app/dataclass/__init__.py b/dbm-ui/backend/iam_app/dataclass/__init__.py index e0df9523b0..396aef1a98 100644 --- a/dbm-ui/backend/iam_app/dataclass/__init__.py +++ b/dbm-ui/backend/iam_app/dataclass/__init__.py @@ -9,18 +9,28 @@ specific language governing permissions and limitations under the License. """ import json +import logging import os +import re +import time from collections import defaultdict from typing import Any, Dict, List from django.conf import settings from django.utils.translation import ugettext as _ -from ...env import BK_IAM_SYSTEM_ID +from backend import env +from backend.db_meta.models import AppCache + from ..constans import CommonActionLabel +from ..exceptions import BaseIAMError +from ..handlers.client import IAM +from ..handlers.permission import Permission from .actions import _all_actions from .resources import ResourceEnum, ResourceMeta, _all_resources, _extra_instance_selections +logger = logging.getLogger("root") + IAM_SYSTEM_DEFINITION = { "operation": "upsert_system", "data": { @@ -48,7 +58,7 @@ def generate_iam_migration_json(json_name: str = ""): # 获取资源的json内容 for resource in _all_resources.values(): - if resource.system_id != BK_IAM_SYSTEM_ID: + if resource.system_id != env.BK_IAM_SYSTEM_ID: continue iam_resources.append(resource.to_json()) @@ -90,7 +100,7 @@ def generate_iam_migration_json(json_name: str = ""): continue related_resource = action.related_resource_types[0] # 不关联跨系统和特殊资源(dbtype) - if related_resource.system_id != BK_IAM_SYSTEM_ID: + if related_resource.system_id != env.BK_IAM_SYSTEM_ID: continue if related_resource in [ResourceEnum.DBTYPE]: continue @@ -149,7 +159,7 @@ def generate_iam_migration_json(json_name: str = ""): iam_json_content.append({"operation": "upsert_resource_creator_actions", "data": iam_resource_creator_actions}) # 获取dbm在iam完整的注册json - dbm_iam_json = {"system_id": BK_IAM_SYSTEM_ID, "operations": iam_json_content} + dbm_iam_json = {"system_id": env.BK_IAM_SYSTEM_ID, "operations": iam_json_content} json_name = json_name or "initial—tmp.json" iam_migrate_json_path = os.path.join(settings.BASE_DIR, f"backend/iam_app/migration_json_files/{json_name}") @@ -157,25 +167,22 @@ def generate_iam_migration_json(json_name: str = ""): f.write(json.dumps(dbm_iam_json, ensure_ascii=False, indent=4)) -def generate_iam_biz_maintain_json(label: str = CommonActionLabel.BIZ_MAINTAIN, json_name: str = ""): - """ - 根据dataclass的定义自动生成业务运维的用户组迁移json - """ +def generate_resource_topo_auth(res_actions: list, bk_biz_id: int = None, bk_biz_name=None): + bk_biz_id = bk_biz_id or "{{biz_id}}" + bk_biz_name = bk_biz_name or "{{biz_name}}" def get_resource_path_info(resource: ResourceMeta): if ResourceEnum.BUSINESS not in [resource, resource.parent]: paths = [] else: - paths = [[{"system": "bk_cmdb", "type": "biz", "id": "{{biz_id}}", "name": "{{biz_name}}"}]] + paths = [[{"system": "bk_cmdb", "type": "biz", "id": bk_biz_id, "name": bk_biz_name}]] return {"system": resource.system_id, "type": resource.id, "paths": paths} resources__actions_map: Dict[str, List[str]] = defaultdict(list) - biz_maintain_migrate_content: List[Dict[str, Any]] = [] + resource_topo_auth_content: List[Dict[str, Any]] = [] # 聚合相同资源的动作 - for action in _all_actions.values(): - if label not in action.common_labels: - continue + for action in res_actions: resource_ids = ",".join([resource.id for resource in action.related_resource_types]) resources__actions_map[resource_ids].append(action.id) @@ -189,12 +196,90 @@ def get_resource_path_info(resource: ResourceMeta): resource_infos = [get_resource_path_info(resource) for resource in resource_metas] # 生成action的迁移信息 action_infos = [{"id": id} for id in action_ids] - biz_maintain_migrate_content.append( - {"system": BK_IAM_SYSTEM_ID, "actions": action_infos, "resources": resource_infos} + resource_topo_auth_content.append( + {"system": env.BK_IAM_SYSTEM_ID, "actions": action_infos, "resources": resource_infos} ) + return resource_topo_auth_content + + +def generate_iam_biz_maintain_json(label: str = CommonActionLabel.BIZ_MAINTAIN, json_name: str = ""): + """ + 根据dataclass的定义自动生成业务运维的用户组迁移json + """ + res_actions = [action for action in _all_actions.values() if label in action.common_labels] + biz_maintain_migrate_content = generate_resource_topo_auth(res_actions) + # 生成json文件 json_name = json_name or "biz_maintain_migrate.json" migrate_json_path = os.path.join(settings.BASE_DIR, f"backend/iam_app/migration_json_files/{json_name}") with open(migrate_json_path, "w+") as f: f.write(json.dumps(biz_maintain_migrate_content, ensure_ascii=False, indent=4)) + + +def assign_auth_to_group(iam: IAM, biz: AppCache, group_id): + """ + 给单个用户组分配权限,这里的权限固定是DBA权限 + """ + biz_actions = [action for action in _all_actions.values() if action.group not in [_("全局设置"), _("资源管理")]] + auth_contents = generate_resource_topo_auth(biz_actions, bk_biz_id=biz.bk_biz_id, bk_biz_name=biz.bk_biz_name) + for auth_info in auth_contents: + ok, message, data = iam._client.grant_user_group_actions(env.BK_IAM_SYSTEM_ID, group_id, data=auth_info) + if not ok: + raise BaseIAMError(_("用户组添加授权失败,错误信息: {}").format(message)) + + +def assign_auth_to_dba(bk_biz_id: int, group_name: str, members: list): + """ + 给DBA分配iam权限,具体是: + 创建用户组 ---> 给用户组分配权限 ---> 成员加入用户组 + """ + biz = AppCache.objects.get(bk_biz_id=bk_biz_id) + manager_id = env.BK_IAM_GRADE_MANAGER_ID + iam = Permission.get_iam_client() + + # 创建用户组 + group_data = {"groups": [{"name": group_name, "description": group_name}]} + ok, message, data = iam._client.create_user_groups(env.BK_IAM_SYSTEM_ID, manager_id, data=group_data) + if not ok: + raise BaseIAMError(_("创建用户组失败,错误信息: {}").format(message)) + + # 对用户组分配权限,动作不包含资源管理和全局设置 + group_id = data[0] + assign_auth_to_group(iam, biz, data[0]) + + # 对用户组添加成员,默认过期时间是1年 + expired_at = int(time.time() + 60 * 60 * 24 * 30 * 12) + members = [{"type": "user", "id": member} for member in members] + add_members_data = {"members": members, "expired_at": expired_at} + ok, message, data = iam._client.add_user_group_members(env.BK_IAM_SYSTEM_ID, group_id, data=add_members_data) + if not ok: + raise BaseIAMError(_("用户组添加成员{}失败,错误信息: {}").format(members, message)) + + +def flush_groups_auth(): + """ + 刷新存量用户组权限 + """ + iam = Permission.get_iam_client() + manager_id = env.BK_IAM_GRADE_MANAGER_ID + + # 查询包含DBA名称的用户组,默认不超过500 + params = {"name": "DBA", "page_size": 500, "page": 1} + ok, message, data = iam._client.query_user_groups(env.BK_IAM_SYSTEM_ID, manager_id, data=params) + if not ok: + raise BaseIAMError(_("用户组查询失败,错误信息: {}").format(message)) + # 匹配{biz_name}_DBA(#{biz_id})这样格式的用户组 + dba_group_pattern = re.compile(r"^.*?_DBA\(#[0-9]*\)$") + dba_groups = [group for group in data["results"] if dba_group_pattern.match(group["name"])] + + # 刷新权限 + for group in dba_groups: + try: + # 提取用户组ID和业务 + group_id, name = group["id"], group["name"] + biz = AppCache.objects.get(bk_biz_name=name.split("_DBA")[0]) + # 分配权限 + assign_auth_to_group(iam, biz, group_id) + except Exception as e: + raise BaseIAMError(_("用户组{}刷新失败,错误信息:{}").format(group, e)) diff --git a/dbm-ui/backend/iam_app/handlers/client.py b/dbm-ui/backend/iam_app/handlers/client.py new file mode 100644 index 0000000000..86ef52469f --- /dev/null +++ b/dbm-ui/backend/iam_app/handlers/client.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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. +""" + +from iam import IAM as BaseIAM +from iam.api.client import Client as IAMClient +from iam.api.http import http_get, http_post, http_put + + +class Client(IAMClient): + """补充一些额外的api请求""" + + # 创建用户组 + def create_user_groups(self, system_id, grade_manager_id, data): + path = "/api/v2/open/management/systems/{system_id}/grade_managers/{grade_manager_id}/groups/".format( + system_id=system_id, grade_manager_id=grade_manager_id + ) + ok, message, data = self._call_iam_api(http_post, path, data) + return ok, message, data + + # 用户组授权 + def grant_user_group_actions(self, system_id, group_id, data): + path = "/api/v2/open/management/systems/{system_id}/groups/{group_id}/policies".format( + system_id=system_id, group_id=group_id + ) + ok, message, data = self._call_iam_api(http_post, path, data) + return ok, message, data + + # 添加用户组成员 + def add_user_group_members(self, system_id, group_id, data): + path = "/api/v2/open/management/systems/{system_id}/groups/{group_id}/members".format( + system_id=system_id, group_id=group_id + ) + ok, message, data = self._call_iam_api(http_post, path, data) + return ok, message, data + + # 查询用户组 + def query_user_groups(self, system_id, grade_manager_id, data): + path = "/api/v2/open/management/systems/{system_id}/grade_managers/{grade_manager_id}/groups".format( + system_id=system_id, grade_manager_id=grade_manager_id + ) + ok, message, data = self._call_iam_api(http_get, path, data) + return ok, message, data + + # 更新用户组名字和描述 + def update_user_groups(self, system_id, group_id, data): + path = "/api/v2/open/management/systems/{system_id}/groups/{group_id}/".format( + system_id=system_id, group_id=group_id + ) + ok, message, data = self._call_iam_api(http_put, path, data) + return ok, message, data + + +class IAM(BaseIAM): + def __init__( + self, app_code, app_secret, bk_iam_host=None, bk_paas_host=None, bk_apigateway_url=None, api_version="v2" + ): + super().__init__(app_code, app_secret, bk_iam_host, bk_paas_host, bk_apigateway_url, api_version) + self._client = Client(app_code, app_secret, bk_iam_host, bk_paas_host, bk_apigateway_url) diff --git a/dbm-ui/backend/iam_app/handlers/permission.py b/dbm-ui/backend/iam_app/handlers/permission.py index 8223cf6ca3..d1e9a5c92c 100644 --- a/dbm-ui/backend/iam_app/handlers/permission.py +++ b/dbm-ui/backend/iam_app/handlers/permission.py @@ -17,7 +17,7 @@ from blueapps.account.models import User from django.conf import settings from django.utils.translation import ugettext as _ -from iam import IAM, DummyIAM, MultiActionRequest, ObjectSet, Request, Resource, Subject, make_expression +from iam import DummyIAM, MultiActionRequest, ObjectSet, Request, Resource, Subject, make_expression from iam.apply.models import ( ActionWithoutResources, ActionWithResources, @@ -36,6 +36,7 @@ from backend.iam_app.dataclass.actions import ActionEnum, ActionMeta, _all_actions from backend.iam_app.dataclass.resources import ResourceEnum, ResourceMeta, _all_resources from backend.iam_app.exceptions import ActionNotExistError, GetSystemInfoError, PermissionDeniedError +from backend.iam_app.handlers.client import IAM from backend.utils.local import local logger = logging.getLogger("root") diff --git a/dbm-ui/backend/iam_app/migration_json_files/initial.json b/dbm-ui/backend/iam_app/migration_json_files/initial.json index 6d385817ab..c48b09689a 100644 --- a/dbm-ui/backend/iam_app/migration_json_files/initial.json +++ b/dbm-ui/backend/iam_app/migration_json_files/initial.json @@ -8165,7 +8165,7 @@ "version": 1, "hidden": false, "group": "Redis", - "subgroup": "工具箱", + "subgroup": "集群维护", "description": "Redis集群域名重命名", "description_en": "REDIS_CLUSTER_RENAME_DOMAIN" } @@ -8199,6 +8199,64 @@ "description_en": "REDIS_CLUSTER_MAXMEMORY_SET" } }, + { + "operation": "upsert_action", + "data": { + "id": "redis_cluster_load_modules", + "name": "Redis 集群加载modules", + "name_en": "REDIS_CLUSTER_LOAD_MODULES", + "type": "execute", + "related_resource_types": [ + { + "system_id": "bk_dbm", + "id": "redis", + "selection_mode": "all", + "related_instance_selections": [ + { + "system_id": "bk_dbm", + "id": "redis_list" + } + ] + } + ], + "related_actions": [], + "version": 1, + "hidden": false, + "group": "Redis", + "subgroup": "工具箱", + "description": "Redis 集群加载modules", + "description_en": "REDIS_CLUSTER_LOAD_MODULES" + } + }, + { + "operation": "upsert_action", + "data": { + "id": "redis_tendisplus_lightning_data", + "name": "Tendisplus闪电导入数据", + "name_en": "REDIS_TENDISPLUS_LIGHTNING_DATA", + "type": "execute", + "related_resource_types": [ + { + "system_id": "bk_dbm", + "id": "redis", + "selection_mode": "all", + "related_instance_selections": [ + { + "system_id": "bk_dbm", + "id": "redis_list" + } + ] + } + ], + "related_actions": [], + "version": 1, + "hidden": false, + "group": "Redis", + "subgroup": "集群维护", + "description": "Tendisplus闪电导入数据", + "description_en": "REDIS_TENDISPLUS_LIGHTNING_DATA" + } + }, { "operation": "upsert_action", "data": { @@ -9417,6 +9475,35 @@ "description_en": "MONGODB_CUTOFF" } }, + { + "operation": "upsert_action", + "data": { + "id": "mongodb_import", + "name": "MongoDB 数据导入", + "name_en": "MONGODB_IMPORT", + "type": "execute", + "related_resource_types": [ + { + "system_id": "bk_dbm", + "id": "mongodb", + "selection_mode": "all", + "related_instance_selections": [ + { + "system_id": "bk_dbm", + "id": "mongodb_list" + } + ] + } + ], + "related_actions": [], + "version": 1, + "hidden": false, + "group": "MongoDB", + "subgroup": "集群维护", + "description": "MongoDB 数据导入", + "description_en": "MONGODB_IMPORT" + } + }, { "operation": "upsert_action", "data": { @@ -10432,6 +10519,12 @@ }, { "id": "redis_cluster_add_slave" + }, + { + "id": "redis_cluster_rename_domain" + }, + { + "id": "redis_tendisplus_lightning_data" } ] }, @@ -10473,10 +10566,10 @@ "id": "redis_cluster_reinstall_dbmon" }, { - "id": "redis_cluster_rename_domain" + "id": "redis_cluster_maxmemory_set" }, { - "id": "redis_cluster_maxmemory_set" + "id": "redis_cluster_load_modules" } ] } @@ -10809,6 +10902,9 @@ { "id": "mongodb_cutoff" }, + { + "id": "mongodb_import" + }, { "id": "mongodb_restore" }, @@ -11705,6 +11801,12 @@ { "id": "redis_cluster_maxmemory_set" }, + { + "id": "redis_cluster_load_modules" + }, + { + "id": "redis_tendisplus_lightning_data" + }, { "id": "kafka_scale_up" }, @@ -11831,6 +11933,9 @@ { "id": "mongodb_cutoff" }, + { + "id": "mongodb_import" + }, { "id": "mongodb_restore" }, @@ -12539,6 +12644,14 @@ { "id": "redis_cluster_maxmemory_set", "required": true + }, + { + "id": "redis_cluster_load_modules", + "required": true + }, + { + "id": "redis_tendisplus_lightning_data", + "required": true } ] }, @@ -12823,6 +12936,10 @@ "id": "mongodb_cutoff", "required": true }, + { + "id": "mongodb_import", + "required": true + }, { "id": "mongodb_restore", "required": true diff --git a/dbm-ui/backend/iam_app/serializers.py b/dbm-ui/backend/iam_app/serializers.py index 90549d333a..2a9a7ee7fd 100644 --- a/dbm-ui/backend/iam_app/serializers.py +++ b/dbm-ui/backend/iam_app/serializers.py @@ -61,3 +61,9 @@ class Meta: class CheckAllowedResSerializer(serializers.Serializer): class Meta: swagger_schema_fields = {"example": mock_data.ACTION_CHECK_ALLOWED} + + +class AssignAuthToDBASerializer(serializers.Serializer): + bk_biz_id = serializers.IntegerField(help_text=_("业务ID")) + group_name = serializers.CharField(help_text=_("组名")) + members = serializers.ListField(help_text=_("成员列表"), child=serializers.CharField()) diff --git a/dbm-ui/backend/iam_app/views/views.py b/dbm-ui/backend/iam_app/views/views.py index e5f0a7a419..8e515a19e7 100644 --- a/dbm-ui/backend/iam_app/views/views.py +++ b/dbm-ui/backend/iam_app/views/views.py @@ -15,8 +15,10 @@ from backend.bk_web import viewsets from backend.bk_web.swagger import common_swagger_auto_schema +from backend.iam_app.dataclass import assign_auth_to_dba, flush_groups_auth from backend.iam_app.handlers.permission import Permission from backend.iam_app.serializers import ( + AssignAuthToDBASerializer, CheckAllowedResSerializer, GetApplyDataResSerializer, IamActionResourceRequestSerializer, @@ -97,3 +99,23 @@ def simple_get_apply_data(self, request, *args, **kwargs): resources = client.batch_make_resource_instance(self.validated_data["resources"]) apply_data, apply_url = client.get_apply_data([self.validated_data["action_id"]], [resources]) return Response({"permission": apply_data, "apply_url": apply_url}) + + @common_swagger_auto_schema( + operation_summary=_("自动分配权限给DBA"), + request_body=AssignAuthToDBASerializer(), + tags=[SWAGGER_TAG], + ) + @action(detail=False, methods=["POST"], serializer_class=AssignAuthToDBASerializer) + def assign_auth_to_dba(self, request, *args, **kwargs): + data = self.validated_data + assign_auth_to_dba(bk_biz_id=data["bk_biz_id"], group_name=data["group_name"], members=data["members"]) + return Response(_("权限分配成功!")) + + @common_swagger_auto_schema( + operation_summary=_("存量用户组刷新权限"), + tags=[SWAGGER_TAG], + ) + @action(detail=False, methods=["POST"]) + def flush_groups_auth(self, request, *args, **kwargs): + flush_groups_auth() + return Response(_("存量用户组权限刷新成功!")) From 53251ef9972e9a6198e161453c78b1ab6399a567 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Mon, 23 Sep 2024 20:04:32 +0800 Subject: [PATCH 040/164] =?UTF-8?q?refactor(backend):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?helm=E6=95=B4=E5=8C=85=E7=89=88=E6=9C=AC=20#7096?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helm-charts/bk-dbm/Chart.yaml | 4 ++-- helm-charts/bk-dbm/charts/db-simulation/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/dbm/Chart.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/helm-charts/bk-dbm/Chart.yaml b/helm-charts/bk-dbm/Chart.yaml index 8497a0bc70..2db05f4504 100644 --- a/helm-charts/bk-dbm/Chart.yaml +++ b/helm-charts/bk-dbm/Chart.yaml @@ -91,5 +91,5 @@ dependencies: description: A Helm chart for bk-dbm name: bk-dbm type: application -version: 1.5.0-alpha.16 -appVersion: 1.5.0-alpha.16 +version: 1.5.0-alpha.17 +appVersion: 1.5.0-alpha.17 diff --git a/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml b/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml index 4444610266..5bc645ac89 100644 --- a/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml +++ b/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.0.1-alpha.70 +appVersion: 0.0.1-alpha.72 description: A Helm chart for Kubernetes name: db-simulation type: application diff --git a/helm-charts/bk-dbm/charts/dbm/Chart.yaml b/helm-charts/bk-dbm/charts/dbm/Chart.yaml index bbc9064456..d3f64b810e 100644 --- a/helm-charts/bk-dbm/charts/dbm/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbm/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.5.0-alpha.535 +appVersion: 1.5.0-alpha.623 description: A Helm chart for dbm name: dbm type: application From a50beda5deffcdb07614028ea7ff03a2ed908819 Mon Sep 17 00:00:00 2001 From: hlinx <327159425@qq.com> Date: Mon, 23 Sep 2024 19:44:57 +0800 Subject: [PATCH 041/164] =?UTF-8?q?fix(frontend):=20db=20=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E6=8E=88=E6=9D=83=E8=A7=84=E5=88=99=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=20db=20=E5=AD=97=E6=AE=B5=E6=A0=A1=E9=AA=8C=E8=A7=84=E5=88=99?= =?UTF-8?q?=20#7023=20#=20Reviewed,=20transaction=20id:=2019144?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/frontend/src/locales/zh-cn.json | 2 +- .../db-manage/mysql/permission-rule/components/CreateRule.vue | 4 ++-- .../db-manage/sqlserver/permission/components/CreateRule.vue | 4 ++-- .../tendb-cluster/permission/components/CreateRule.vue | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dbm-ui/frontend/src/locales/zh-cn.json b/dbm-ui/frontend/src/locales/zh-cn.json index 650fdc2e40..390c8a6b9e 100644 --- a/dbm-ui/frontend/src/locales/zh-cn.json +++ b/dbm-ui/frontend/src/locales/zh-cn.json @@ -647,7 +647,7 @@ "全选": "全选", "权限设置": "权限设置", "请输入DB名称_可以使用通配符_如Data_区分大小写_多个使用英文逗号_分号或换行分隔": "请输入 DB 名称,可以使用通配符 %,如 Data%,区分大小写,多个使用英文逗号、分号或换行分隔", - "DB名称支持通配符_如Data_区分大小写_多个使用英文逗号_分号或换行分隔": "DB名称支持通配符如 Data%,区分大小写,多个使用英文逗号、分号或换行分隔", + "DB名称不支持 *": "DB名称不支持 *", "该账号下已存在xx规则": "该账号下已存在 {0} 规则", "收藏成功": "收藏成功", "取消收藏成功": "取消收藏成功", diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/permission-rule/components/CreateRule.vue b/dbm-ui/frontend/src/views/db-manage/mysql/permission-rule/components/CreateRule.vue index c3c8d3dd1b..d4c43738fc 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/permission-rule/components/CreateRule.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/permission-rule/components/CreateRule.vue @@ -281,10 +281,10 @@ }, { trigger: 'blur', - message: t('DB名称支持通配符_如Data_区分大小写_多个使用英文逗号_分号或换行分隔'), + message: t('DB名称不支持 *'), validator: (value: string) => { const dbs = value.split(/[\n;,]/); - return _.every(dbs, item => !item ? true: /^[0-9a-zA-Z][0-9a-zA-Z%]*$/.test(item)) + return _.every(dbs, item => !item ? true: !/\*/.test(item)) }, }, { diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/CreateRule.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/CreateRule.vue index f73160db23..9702290c38 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/CreateRule.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/CreateRule.vue @@ -178,10 +178,10 @@ }, { trigger: 'blur', - message: t('DB名称支持通配符_如Data_区分大小写_多个使用英文逗号_分号或换行分隔'), + message: t('DB名称不支持 *'), validator: (value: string) => { const dbs = value.split(/[\n;,]/); - return _.every(dbs, (item) => (!item ? true : /^[0-9a-zA-Z][0-9a-zA-Z%]*$/.test(item))); + return _.every(dbs, (item) => (!item ? true : !/\*/.test(item))); }, }, { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/CreateRule.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/CreateRule.vue index 1a2be746bc..e645ac1e62 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/CreateRule.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/CreateRule.vue @@ -303,10 +303,10 @@ }, { trigger: 'blur', - message: t('DB名称支持通配符_如Data_区分大小写_多个使用英文逗号_分号或换行分隔'), + message: t('DB名称不支持 *'), validator: (value: string) => { const dbs = value.split(/[\n;,]/); - return _.every(dbs, (item) => (!item ? true : /^[0-9a-zA-Z][0-9a-zA-Z%]*$/.test(item))); + return _.every(dbs, item => !item ? true: !/\*/.test(item)) }, }, { From b0da7f394db2e6675e62099938923e5deae0e023 Mon Sep 17 00:00:00 2001 From: hlinx <327159425@qq.com> Date: Wed, 18 Sep 2024 16:58:05 +0800 Subject: [PATCH 042/164] =?UTF-8?q?perf(frontend):=20=E5=8D=95=E6=8D=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=BC=98=E5=8C=96=20#6975=20#=20Reviewed,=20?= =?UTF-8?q?transaction=20id:=2019148?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/frontend/.stylelintrc.js | 2 +- dbm-ui/frontend/.vscode/settings.json | 2 - dbm-ui/frontend/package.json | 2 +- .../components/batch-operate-icon/Index.vue | 3 +- .../src/components/db-search-select/index.vue | 44 +-- .../src/components/db-table/index.vue | 4 +- .../src/components/mult-line-text/Index.vue | 12 +- .../stretch-layout/StretchLayout.vue | 48 +++- .../generateCloneData/index.ts | 2 - dbm-ui/frontend/src/layout/Index.vue | 2 +- .../layout/components/PersonalWorkbench.vue | 18 +- dbm-ui/frontend/src/locales/en.json | 1 + dbm-ui/frontend/src/locales/zh-cn.json | 5 +- dbm-ui/frontend/src/router/index.ts | 11 +- .../src/services/model/ticket/ticket.ts | 9 +- .../frontend/src/services/source/ticket.tsx | 42 +-- dbm-ui/frontend/src/types/biz-components.d.ts | 25 +- .../db-manage/elastic-search/list/Index.vue | 4 +- .../src/views/db-manage/hdfs/list/Index.vue | 4 +- .../src/views/db-manage/kafka/list/Index.vue | 4 +- .../mongodb/mongodb-instance/index.vue | 4 +- .../mongodb/replica-set-list/Index.vue | 4 +- .../mongodb/shared-cluster-list/Index.vue | 4 +- .../db-manage/mysql/ha-cluster-list/Index.vue | 4 +- .../mysql/ha-instance-list/Index.vue | 4 +- .../mysql/single-cluster-list/Index.vue | 4 +- .../src/views/db-manage/pulsar/list/Index.vue | 4 +- .../redis/instance-list-ha/Index.vue | 4 +- .../db-manage/redis/instance-list/Index.vue | 4 +- .../views/db-manage/redis/list-ha/Index.vue | 4 +- .../src/views/db-manage/redis/list/Index.vue | 4 +- .../src/views/db-manage/riak/list/Index.vue | 4 +- .../sqlserver/ha-cluster-list/Index.vue | 4 +- .../sqlserver/ha-instance-list/Index.vue | 4 +- .../sqlserver/single-cluster/Index.vue | 4 +- .../tendb-cluster/list-instance/Index.vue | 2 +- .../db-manage/tendb-cluster/list/Index.vue | 4 +- .../src/views/ticket-manage/list/Index.vue | 39 +++ .../list/components/detail/Index.vue | 255 ++++++++++++++++++ .../list/components/list/Index.vue | 19 ++ .../components/list/components/CardMode.vue | 234 ++++++++++++++++ .../components/list/components/TableMode.vue | 184 +++++++++++++ .../list/components/hooks/use-data.ts | 107 ++++++++ .../list/components/hooks/use-date-picker.ts | 74 +++++ .../components/hooks/use-search-select.ts | 69 +++++ .../list/components/hooks/use-table-height.ts | 28 ++ .../src/views/ticket-manage/routes.ts | 50 ++-- .../src/views/ticket-self-apply/Index.vue | 39 +++ .../components/detail/Index.vue | 255 ++++++++++++++++++ .../components/list/Index.vue | 19 ++ .../components/list/components/CardMode.vue | 234 ++++++++++++++++ .../components/list/components/TableMode.vue | 184 +++++++++++++ .../list/components/hooks/use-data.ts | 104 +++++++ .../list/components/hooks/use-date-picker.ts | 74 +++++ .../components/hooks/use-search-select.ts | 84 ++++++ .../list/components/hooks/use-table-height.ts | 28 ++ .../src/views/ticket-self-apply/routes.ts | 30 +++ .../src/views/ticket-self-manage/Index.vue | 39 +++ .../components/detail/Index.vue | 255 ++++++++++++++++++ .../components/list/Index.vue | 19 ++ .../components/list/components/CardMode.vue | 234 ++++++++++++++++ .../components/list/components/TableMode.vue | 186 +++++++++++++ .../list/components/hooks/use-data.ts | 105 ++++++++ .../list/components/hooks/use-date-picker.ts | 74 +++++ .../components/hooks/use-search-select.ts | 84 ++++++ .../list/components/hooks/use-table-height.ts | 28 ++ .../src/views/ticket-self-manage/routes.ts | 30 +++ .../src/views/ticket-self-todo/Index.vue | 39 +++ .../components/detail/Index.vue | 255 ++++++++++++++++++ .../components/list/Index.vue | 19 ++ .../components/list/components/CardMode.vue | 234 ++++++++++++++++ .../components/list/components/TableMode.vue | 184 +++++++++++++ .../list/components/hooks/use-data.ts | 104 +++++++ .../list/components/hooks/use-date-picker.ts | 74 +++++ .../components/hooks/use-search-select.ts | 83 ++++++ .../list/components/hooks/use-table-height.ts | 28 ++ .../src/views/ticket-self-todo/routes.ts | 30 +++ .../details/components/flow/Index.vue | 11 +- .../components/flow/components/MySqlFlows.vue | 1 - .../my-tickets/components/list/Index.vue | 2 +- .../tickets/my-todos/components/List.vue | 46 ++-- .../details/components/BaseInfo.vue | 67 +++++ .../components/details/components/Demand.vue | 7 +- .../details/components/flow/Index.vue | 2 +- .../components/flow/components/MySqlFlows.vue | 91 ++++--- 85 files changed, 4501 insertions(+), 250 deletions(-) create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/detail/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/CardMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/TableMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-data.ts create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-date-picker.ts create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-search-select.ts create mode 100644 dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-table-height.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/detail/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/CardMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/TableMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-data.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-date-picker.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-search-select.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-table-height.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-apply/routes.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/detail/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/CardMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/TableMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-data.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-date-picker.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-search-select.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-table-height.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-manage/routes.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/detail/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/Index.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/CardMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/TableMode.vue create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-data.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-date-picker.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-search-select.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-table-height.ts create mode 100644 dbm-ui/frontend/src/views/ticket-self-todo/routes.ts create mode 100644 dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/BaseInfo.vue diff --git a/dbm-ui/frontend/.stylelintrc.js b/dbm-ui/frontend/.stylelintrc.js index 9144ef7f6b..39fd824f26 100644 --- a/dbm-ui/frontend/.stylelintrc.js +++ b/dbm-ui/frontend/.stylelintrc.js @@ -19,7 +19,7 @@ module.exports = { 'function-no-unknown': [ true, { - ignoreFunctions: ['extend'], + ignoreFunctions: ['extend', 'v-bind'], }, ], 'at-rule-no-unknown': [ diff --git a/dbm-ui/frontend/.vscode/settings.json b/dbm-ui/frontend/.vscode/settings.json index df96ea6e42..283c4db563 100644 --- a/dbm-ui/frontend/.vscode/settings.json +++ b/dbm-ui/frontend/.vscode/settings.json @@ -26,8 +26,6 @@ "[css]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, - "typescript.tsserver.log": "verbose", - "typescript.tsserver.traceResolution": true, "editor.formatOnSave": true, "editor.tabSize": 2, "css.validate": false, diff --git a/dbm-ui/frontend/package.json b/dbm-ui/frontend/package.json index 88614fe2b1..1ba0f12229 100644 --- a/dbm-ui/frontend/package.json +++ b/dbm-ui/frontend/package.json @@ -27,7 +27,7 @@ "@icon-cool/bk-icon-bk-biz-components": "0.0.4", "@vueuse/core": "^11.0.3", "axios": "^1.7.7", - "bkui-vue": "2.0.1-beta.63", + "bkui-vue": "2.0.1-beta.69", "date-fns": "3.6.0", "dayjs": "^1.11.13", "html-to-image": "1.11.11", diff --git a/dbm-ui/frontend/src/components/batch-operate-icon/Index.vue b/dbm-ui/frontend/src/components/batch-operate-icon/Index.vue index a03a6378fc..e484f7a243 100644 --- a/dbm-ui/frontend/src/components/batch-operate-icon/Index.vue +++ b/dbm-ui/frontend/src/components/batch-operate-icon/Index.vue @@ -48,9 +48,8 @@ diff --git a/dbm-ui/frontend/src/components/db-search-select/index.vue b/dbm-ui/frontend/src/components/db-search-select/index.vue index ba27052fda..2a789e36da 100644 --- a/dbm-ui/frontend/src/components/db-search-select/index.vue +++ b/dbm-ui/frontend/src/components/db-search-select/index.vue @@ -49,39 +49,32 @@ const { getSearchParams } = useUrlSearch(); const getDefaultValue = () => { - const initValues = modelValues.value ?? []; - if (!props.parseUrl) { - return initValues; - } const searchParams = getSearchParams(); const defaultValue: SearchSelectProps['modelValue'] = []; props.data?.forEach((item) => { if (_.has(searchParams, item.id)) { const searchValue = searchParams[item.id]; - const child = (item.children || []).find((child) => child.id === searchValue); + const childNameMap = (item.children || []).reduce>( + (result, item) => Object.assign(result, { [item.id]: item.name }), + {}, + ); + defaultValue.push({ ...item, - values: [ - { - id: searchValue, - name: child?.name ?? searchValue, - }, - ], + values: item.multiple + ? searchValue.split(',').map((item) => ({ id: item, name: childNameMap[item] ?? item })) + : [{ id: searchValue, name: searchValue }], }); } }); // 保留初始化时传入的 modelValues - return defaultValue.length > 0 ? defaultValue : initValues; + return defaultValue.length > 0 ? defaultValue : []; }; const modelValues = defineModel({ default: [], }); - onMounted(() => { - modelValues.value = getDefaultValue(); - }); - watch( modelValues, (values, oldValues) => { @@ -94,12 +87,27 @@ emits('change', modelValues.value); }); }, - { immediate: true, deep: true }, + { + immediate: true, + deep: true, + }, ); + + onMounted(() => { + if (props.parseUrl) { + modelValues.value = getDefaultValue(); + emits('change', modelValues.value); + } + }); - diff --git a/dbm-ui/frontend/src/components/db-table/index.vue b/dbm-ui/frontend/src/components/db-table/index.vue index 5ec7557c94..b79cde5607 100644 --- a/dbm-ui/frontend/src/components/db-table/index.vue +++ b/dbm-ui/frontend/src/components/db-table/index.vue @@ -104,7 +104,7 @@ import { getOffset } from '@utils'; interface Props { - columns: InstanceType['$props']['columns'], + columns?: InstanceType['$props']['columns'], dataSource: (params: any, payload?: IRequestPayload)=> Promise, fixedPagination?: boolean, clearSelection?: boolean, @@ -133,7 +133,7 @@ } interface Exposes { - fetchData: (params: Record, baseParams: Record, loading?: boolean) => void, + fetchData: (params?: Record, baseParams?: Record, loading?: boolean) => void, getData: () => Array, getAllData: () => Promise>, clearSelected: () => void, diff --git a/dbm-ui/frontend/src/components/mult-line-text/Index.vue b/dbm-ui/frontend/src/components/mult-line-text/Index.vue index 0c54bb432f..9b9b5fc2d0 100644 --- a/dbm-ui/frontend/src/components/mult-line-text/Index.vue +++ b/dbm-ui/frontend/src/components/mult-line-text/Index.vue @@ -13,7 +13,7 @@

+ style="margin-top: 8; line-height: 20px"> diff --git a/dbm-ui/frontend/src/components/stretch-layout/StretchLayout.vue b/dbm-ui/frontend/src/components/stretch-layout/StretchLayout.vue index 58d9256792..ebd646daad 100644 --- a/dbm-ui/frontend/src/components/stretch-layout/StretchLayout.vue +++ b/dbm-ui/frontend/src/components/stretch-layout/StretchLayout.vue @@ -20,6 +20,7 @@ class="stretch-layout-left" :style="{ width: `${renderLeftWidth}px`, + overflow: renderLeftWidth === 0 ? 'hidden' : '', }">
@@ -39,10 +40,11 @@ diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/detail/Index.vue b/dbm-ui/frontend/src/views/ticket-manage/list/components/detail/Index.vue new file mode 100644 index 0000000000..c27b7841be --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/detail/Index.vue @@ -0,0 +1,255 @@ + + + + + + diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/Index.vue b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/Index.vue new file mode 100644 index 0000000000..53caa55a4c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/Index.vue @@ -0,0 +1,19 @@ + + diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/CardMode.vue b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/CardMode.vue new file mode 100644 index 0000000000..42107de546 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/CardMode.vue @@ -0,0 +1,234 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/TableMode.vue new file mode 100644 index 0000000000..0e2a7806a2 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/TableMode.vue @@ -0,0 +1,184 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-data.ts b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-data.ts new file mode 100644 index 0000000000..510df23ac5 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-data.ts @@ -0,0 +1,107 @@ +import { reactive, ref } from 'vue'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTickets, getTicketStatus } from '@services/source/ticket'; + +import { useUrlSearch } from '@hooks'; + +import { useTimeoutFn } from '@vueuse/core'; + +const isLoading = ref(false); +const dataList = ref[]>([]); +const pagination = reactive({ + offset: 0, + limit: 15, + current: 1, + count: 0, +}); + +export default (options?: { onSuccess?: (data: TicketModel[]) => void }) => { + const { replaceSearchParams, getSearchParams } = useUrlSearch(); + const searchParams = getSearchParams(); + + if (searchParams.limit && searchParams.current) { + pagination.limit = Number(searchParams.limit); + pagination.current = Number(searchParams.current); + } + + const { run: fetchTicketStatus } = useRequest( + () => { + if (dataList.value.length < 1) { + return Promise.reject(); + } + return getTicketStatus({ + ticket_ids: dataList.value.map((item) => item.id).join(','), + }); + }, + { + manual: true, + debounceOptions: { + maxWait: 100, + }, + onSuccess(data) { + dataList.value.forEach((ticketData) => { + if (data[ticketData.id]) { + Object.assign(ticketData, { + status: data[ticketData.id], + }); + } + }); + loopFetchTicketStatus(); + }, + }, + ); + + const { start: loopFetchTicketStatus } = useTimeoutFn(() => { + fetchTicketStatus(); + }, 10000); + + const { run: fetchTicketList } = useRequest( + (params: ServiceParameters) => + getTickets({ + bk_biz_id: window.PROJECT_CONFIG.BIZ_ID, + limit: pagination.limit, + offset: (pagination.current - 1) * pagination.limit, + ...params, + }), + { + manual: true, + debounceInterval: 100, + onBefore() { + isLoading.value = true; + }, + onAfter() { + isLoading.value = false; + }, + onSuccess(data, params) { + dataList.value = data.results; + pagination.count = data.count; + + const urlSearchParams = { + limit: pagination.limit, + current: pagination.current, + ...params[0], + }; + + const searchParams = getSearchParams(); + if (Number(searchParams.viewId)) { + Object.assign(urlSearchParams, { + viewId: searchParams.viewId, + }); + } + replaceSearchParams(urlSearchParams); + if (options && options.onSuccess) { + options.onSuccess(data.results); + } + }, + }, + ); + + return { + loading: isLoading, + dataList, + pagination, + fetchTicketList, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-date-picker.ts b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-date-picker.ts new file mode 100644 index 0000000000..7d15acc4b5 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-date-picker.ts @@ -0,0 +1,74 @@ +import dayjs from 'dayjs'; +import { computed, ref } from 'vue'; + +import { useUrlSearch } from '@hooks'; + +interface IPicker { + value: () => [Date, Date]; +} + +const value = ref<[Date, Date] | [string, string]>(['', '']); + +export default () => { + const { getSearchParams } = useUrlSearch(); + + const searchParams = getSearchParams(); + if (searchParams.create_at__gte && searchParams.create_at__lte) { + value.value = [dayjs(searchParams.create_at__gte).toDate(), dayjs(searchParams.create_at__lte).toDate()]; + } + + const shortcutsRange = [ + { + text: '今天', + value() { + return [dayjs().startOf('day').toDate(), dayjs().endOf('day').toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近7天', + value() { + return [dayjs().subtract(7, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近15天', + value() { + return [dayjs().subtract(15, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近30天', + value() { + return [dayjs().subtract(30, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + ]; + + const formatValue = computed(() => { + if (value.value[0] && value.value[1]) { + return { + create_at__gte: dayjs(value.value[0]).format('YYYY-MM-DD HH:mm:ss'), + create_at__lte: dayjs(value.value[1]).format('YYYY-MM-DD HH:mm:ss'), + }; + } + return {}; + }); + + return { + value, + formatValue, + shortcutsRange, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-search-select.ts b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-search-select.ts new file mode 100644 index 0000000000..cd7d5fd1d2 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-search-select.ts @@ -0,0 +1,69 @@ +import { computed, shallowRef } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTicketTypes } from '@services/source/ticket'; + +import type { SearchValue } from '@components/vue2/search-select/index.vue'; + +import { getSearchSelectorParams } from '@utils'; + +const value = ref([]); + +export default () => { + const { t } = useI18n(); + + const ticketTypeList = shallowRef<{ id: string; name: string }[]>([]); + + const searchSelectData = computed(() => [ + { + name: t('单号'), + id: 'id', + }, + { + name: t('单据类型'), + id: 'ticket_type__in', + multiple: true, + children: ticketTypeList.value, + }, + { + name: t('集群'), + id: 'cluster', + multiple: true, + }, + { + name: t('状态'), + id: 'status__in', + multiple: true, + children: Object.keys(TicketModel.statusTextMap).reduce[]>((acc, key) => { + acc.push({ + id: key, + name: t(TicketModel.statusTextMap[key as keyof typeof TicketModel.statusTextMap]), + }); + return acc; + }, []), + }, + { + name: t('备注'), + id: 'remark', + }, + ]); + + const formatSearchValue = computed(() => getSearchSelectorParams(value.value)); + + useRequest(getTicketTypes, { + onSuccess(data) { + ticketTypeList.value = data.map((item) => ({ + id: item.key, + name: item.value, + })); + }, + }); + + return { + value, + searchSelectData, + formatSearchValue, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-table-height.ts b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-table-height.ts new file mode 100644 index 0000000000..1268499fb7 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-manage/list/components/list/components/hooks/use-table-height.ts @@ -0,0 +1,28 @@ +import { onMounted, ref, useTemplateRef } from 'vue'; + +import { getOffset } from '@utils'; + +export default () => { + const tableRef = useTemplateRef('table'); + const tableMaxHeight = ref('auto'); + + onMounted(() => { + const { top } = getOffset(tableRef.value as HTMLElement); + const totalHeight = window.innerHeight; + const tableHeaderHeight = 42; + const paginationHeight = 60; + const pageOffsetBottom = 20; + const tableRowHeight = 42; + + const tableRowTotalHeight = totalHeight - top - tableHeaderHeight - paginationHeight - pageOffsetBottom; + + const rowNum = Math.max(Math.floor(tableRowTotalHeight / tableRowHeight), 5); + + tableMaxHeight.value = tableHeaderHeight + rowNum * tableRowHeight + paginationHeight + 3; + }); + + return { + tableRef, + tableMaxHeight, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-manage/routes.ts b/dbm-ui/frontend/src/views/ticket-manage/routes.ts index aa727bfc40..110a274a73 100644 --- a/dbm-ui/frontend/src/views/ticket-manage/routes.ts +++ b/dbm-ui/frontend/src/views/ticket-manage/routes.ts @@ -16,35 +16,33 @@ import { checkDbConsole } from '@utils'; import { t } from '@locales/index'; -export default function getRoutes() { - const bizTicketManageComponent = checkDbConsole('databaseManage.missionManage') - ? () => import('@views/tickets/my-tickets/Index.vue') - : Promise.resolve(null); +const routes: RouteRecordRaw[] = [ + { + name: 'ticketManage', + path: 'ticket-manage', + component: () => import('@views/ticket-manage/Index.vue'), + meta: { + navName: t('单据管理'), + }, + redirect: { + name: 'bizTicketManage', + }, + children: [], + }, +]; - const routes: RouteRecordRaw[] = [ - { - name: 'ticketManage', - path: 'ticket-manage', - component: () => import('@views/ticket-manage/Index.vue'), +export default function getRoutes() { + if (checkDbConsole('databaseManage.missionManage')) { + routes[0].children.push({ + name: 'bizTicketManage', + path: 'index', meta: { - navName: t('单据管理'), - }, - redirect: { - name: 'bizTicketManage', + navName: t('单据'), + fullscreen: true, }, - children: [ - { - name: 'bizTicketManage', - path: 'index', - meta: { - navName: t('单据'), - fullscreen: true, - }, - component: bizTicketManageComponent, - }, - ], - }, - ]; + component: () => import('@views/ticket-manage/list/Index.vue'), + }); + } return routes; } diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/Index.vue b/dbm-ui/frontend/src/views/ticket-self-apply/Index.vue new file mode 100644 index 0000000000..3c07d5974c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/Index.vue @@ -0,0 +1,39 @@ + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/detail/Index.vue b/dbm-ui/frontend/src/views/ticket-self-apply/components/detail/Index.vue new file mode 100644 index 0000000000..c27b7841be --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/detail/Index.vue @@ -0,0 +1,255 @@ + + + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/Index.vue b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/Index.vue new file mode 100644 index 0000000000..53caa55a4c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/Index.vue @@ -0,0 +1,19 @@ + + diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/CardMode.vue b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/CardMode.vue new file mode 100644 index 0000000000..6e05a5f9d7 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/CardMode.vue @@ -0,0 +1,234 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/TableMode.vue new file mode 100644 index 0000000000..0e2a7806a2 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/TableMode.vue @@ -0,0 +1,184 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-data.ts b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-data.ts new file mode 100644 index 0000000000..24652431a6 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-data.ts @@ -0,0 +1,104 @@ +import { reactive, ref } from 'vue'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTickets, getTicketStatus } from '@services/source/ticket'; + +import { useUrlSearch } from '@hooks'; + +import { useTimeoutFn } from '@vueuse/core'; + +const isLoading = ref(false); +const dataList = ref[]>([]); +const pagination = reactive({ + offset: 0, + limit: 15, + current: 1, + count: 0, +}); + +export default (options?: { onSuccess?: (data: TicketModel[]) => void }) => { + const { replaceSearchParams, getSearchParams } = useUrlSearch(); + const searchParams = getSearchParams(); + + if (searchParams.limit && searchParams.current) { + pagination.limit = Number(searchParams.limit); + pagination.current = Number(searchParams.current); + } + + const { run: fetchTicketStatus } = useRequest( + () => { + if (dataList.value.length < 1) { + return Promise.reject(); + } + return getTicketStatus({ + ticket_ids: dataList.value.map((item) => item.id).join(','), + }); + }, + { + manual: true, + debounceInterval: 100, + onSuccess(data) { + dataList.value.forEach((ticketData) => { + if (data[ticketData.id]) { + Object.assign(ticketData, { + status: data[ticketData.id], + }); + } + }); + loopFetchTicketStatus(); + }, + }, + ); + + const { start: loopFetchTicketStatus } = useTimeoutFn(() => { + fetchTicketStatus(); + }, 10000); + + const { run: fetchTicketList } = useRequest( + (params: ServiceParameters) => + getTickets({ + limit: pagination.limit, + offset: (pagination.current - 1) * pagination.limit, + self_manage: 0, + ...params, + }), + { + manual: true, + onBefore() { + isLoading.value = true; + }, + onAfter() { + isLoading.value = false; + }, + onSuccess(data, params) { + dataList.value = data.results; + pagination.count = data.count; + + const urlSearchParams = { + limit: pagination.limit, + current: pagination.current, + ...params[0], + }; + + const searchParams = getSearchParams(); + if (Number(searchParams.viewId)) { + Object.assign(urlSearchParams, { + viewId: searchParams.viewId, + }); + } + replaceSearchParams(urlSearchParams); + if (options && options.onSuccess) { + options.onSuccess(data.results); + } + }, + }, + ); + + return { + loading: isLoading, + dataList, + pagination, + fetchTicketList, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-date-picker.ts b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-date-picker.ts new file mode 100644 index 0000000000..7d15acc4b5 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-date-picker.ts @@ -0,0 +1,74 @@ +import dayjs from 'dayjs'; +import { computed, ref } from 'vue'; + +import { useUrlSearch } from '@hooks'; + +interface IPicker { + value: () => [Date, Date]; +} + +const value = ref<[Date, Date] | [string, string]>(['', '']); + +export default () => { + const { getSearchParams } = useUrlSearch(); + + const searchParams = getSearchParams(); + if (searchParams.create_at__gte && searchParams.create_at__lte) { + value.value = [dayjs(searchParams.create_at__gte).toDate(), dayjs(searchParams.create_at__lte).toDate()]; + } + + const shortcutsRange = [ + { + text: '今天', + value() { + return [dayjs().startOf('day').toDate(), dayjs().endOf('day').toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近7天', + value() { + return [dayjs().subtract(7, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近15天', + value() { + return [dayjs().subtract(15, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近30天', + value() { + return [dayjs().subtract(30, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + ]; + + const formatValue = computed(() => { + if (value.value[0] && value.value[1]) { + return { + create_at__gte: dayjs(value.value[0]).format('YYYY-MM-DD HH:mm:ss'), + create_at__lte: dayjs(value.value[1]).format('YYYY-MM-DD HH:mm:ss'), + }; + } + return {}; + }); + + return { + value, + formatValue, + shortcutsRange, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-search-select.ts b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-search-select.ts new file mode 100644 index 0000000000..476284d8ae --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-search-select.ts @@ -0,0 +1,84 @@ +import { computed, shallowRef } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTicketTypes } from '@services/source/ticket'; + +import { useGlobalBizs } from '@stores'; + +import type { SearchValue } from '@components/vue2/search-select/index.vue'; + +import { getSearchSelectorParams } from '@utils'; + +const value = ref([]); + +export default () => { + const { t } = useI18n(); + const globalBizsStore = useGlobalBizs(); + + const ticketTypeList = shallowRef<{ id: string; name: string }[]>([]); + + const searchSelectData = computed(() => [ + { + name: t('单号'), + id: 'id', + }, + { + name: t('单据类型'), + id: 'ticket_type__in', + multiple: true, + children: ticketTypeList.value, + }, + { + name: t('集群'), + id: 'cluster', + multiple: true, + }, + { + name: t('业务'), + id: 'bk_biz_id', + children: globalBizsStore.bizs.map((item) => ({ + id: item.bk_biz_id, + name: item.name, + })), + }, + { + name: t('状态'), + id: 'status__in', + multiple: true, + children: Object.keys(TicketModel.statusTextMap).reduce[]>((acc, key) => { + acc.push({ + id: key, + name: t(TicketModel.statusTextMap[key as keyof typeof TicketModel.statusTextMap]), + }); + return acc; + }, []), + }, + { + name: t('备注'), + id: 'remark', + }, + { + name: t('提单人'), + id: 'creator', + }, + ]); + + const formatSearchValue = computed(() => getSearchSelectorParams(value.value)); + + useRequest(getTicketTypes, { + onSuccess(data) { + ticketTypeList.value = data.map((item) => ({ + id: item.key, + name: item.value, + })); + }, + }); + + return { + value, + searchSelectData, + formatSearchValue, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-table-height.ts b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-table-height.ts new file mode 100644 index 0000000000..1268499fb7 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/components/list/components/hooks/use-table-height.ts @@ -0,0 +1,28 @@ +import { onMounted, ref, useTemplateRef } from 'vue'; + +import { getOffset } from '@utils'; + +export default () => { + const tableRef = useTemplateRef('table'); + const tableMaxHeight = ref('auto'); + + onMounted(() => { + const { top } = getOffset(tableRef.value as HTMLElement); + const totalHeight = window.innerHeight; + const tableHeaderHeight = 42; + const paginationHeight = 60; + const pageOffsetBottom = 20; + const tableRowHeight = 42; + + const tableRowTotalHeight = totalHeight - top - tableHeaderHeight - paginationHeight - pageOffsetBottom; + + const rowNum = Math.max(Math.floor(tableRowTotalHeight / tableRowHeight), 5); + + tableMaxHeight.value = tableHeaderHeight + rowNum * tableRowHeight + paginationHeight + 3; + }); + + return { + tableRef, + tableMaxHeight, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-apply/routes.ts b/dbm-ui/frontend/src/views/ticket-self-apply/routes.ts new file mode 100644 index 0000000000..79935ff275 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-apply/routes.ts @@ -0,0 +1,30 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on 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 { checkDbConsole } from '@utils'; + +import { t } from '@locales/index'; + +const route = { + name: 'SelfServiceMyTickets', + path: 'ticket-self-apply/:typeId?', + meta: { + navName: t('我的申请'), + fullscreen: true, + }, + component: () => import('@views/ticket-self-apply/Index.vue'), +}; + +export default function getRoutes() { + return checkDbConsole('personalWorkbench.myTickets') ? [route] : []; +} diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/Index.vue b/dbm-ui/frontend/src/views/ticket-self-manage/Index.vue new file mode 100644 index 0000000000..3c07d5974c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/Index.vue @@ -0,0 +1,39 @@ + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/detail/Index.vue b/dbm-ui/frontend/src/views/ticket-self-manage/components/detail/Index.vue new file mode 100644 index 0000000000..c27b7841be --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/detail/Index.vue @@ -0,0 +1,255 @@ + + + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/Index.vue b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/Index.vue new file mode 100644 index 0000000000..53caa55a4c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/Index.vue @@ -0,0 +1,19 @@ + + diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/CardMode.vue b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/CardMode.vue new file mode 100644 index 0000000000..f0d5573a37 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/CardMode.vue @@ -0,0 +1,234 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/TableMode.vue new file mode 100644 index 0000000000..7078076423 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/TableMode.vue @@ -0,0 +1,186 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-data.ts b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-data.ts new file mode 100644 index 0000000000..73fd98c4b1 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-data.ts @@ -0,0 +1,105 @@ +import { reactive, ref } from 'vue'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTickets, getTicketStatus } from '@services/source/ticket'; + +import { useUrlSearch } from '@hooks'; + +import { useTimeoutFn } from '@vueuse/core'; + +const isLoading = ref(false); +const dataList = ref[]>([]); +const pagination = reactive({ + offset: 0, + limit: 15, + current: 1, + count: 0, +}); + +export default (options?: { onSuccess?: (data: TicketModel[]) => void }) => { + const { replaceSearchParams, getSearchParams } = useUrlSearch(); + + const searchParams = getSearchParams(); + + if (searchParams.limit && searchParams.current) { + pagination.limit = Number(searchParams.limit); + pagination.current = Number(searchParams.current); + } + + const { run: fetchTicketStatus } = useRequest( + () => { + if (dataList.value.length < 1) { + return Promise.reject(); + } + return getTicketStatus({ + ticket_ids: dataList.value.map((item) => item.id).join(','), + }); + }, + { + manual: true, + onSuccess(data) { + dataList.value.forEach((ticketData) => { + if (data[ticketData.id]) { + Object.assign(ticketData, { + status: data[ticketData.id], + }); + } + }); + loopFetchTicketStatus(); + }, + }, + ); + + const { start: loopFetchTicketStatus } = useTimeoutFn(() => { + fetchTicketStatus(); + }, 10000); + + const { run: fetchTicketList } = useRequest( + (params: ServiceParameters) => + getTickets({ + limit: pagination.limit, + offset: (pagination.current - 1) * pagination.limit, + self_manage: 1, + ...params, + }), + { + manual: true, + debounceInterval: 100, + onBefore() { + isLoading.value = true; + }, + onAfter() { + isLoading.value = false; + }, + onSuccess(data, params) { + dataList.value = data.results; + pagination.count = data.count; + + const urlSearchParams = { + limit: pagination.limit, + current: pagination.current, + ...params[0], + }; + + const searchParams = getSearchParams(); + if (Number(searchParams.viewId)) { + Object.assign(urlSearchParams, { + viewId: searchParams.viewId, + }); + } + replaceSearchParams(urlSearchParams); + if (options && options.onSuccess) { + options.onSuccess(data.results); + } + }, + }, + ); + + return { + loading: isLoading, + dataList, + pagination, + fetchTicketList, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-date-picker.ts b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-date-picker.ts new file mode 100644 index 0000000000..7d15acc4b5 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-date-picker.ts @@ -0,0 +1,74 @@ +import dayjs from 'dayjs'; +import { computed, ref } from 'vue'; + +import { useUrlSearch } from '@hooks'; + +interface IPicker { + value: () => [Date, Date]; +} + +const value = ref<[Date, Date] | [string, string]>(['', '']); + +export default () => { + const { getSearchParams } = useUrlSearch(); + + const searchParams = getSearchParams(); + if (searchParams.create_at__gte && searchParams.create_at__lte) { + value.value = [dayjs(searchParams.create_at__gte).toDate(), dayjs(searchParams.create_at__lte).toDate()]; + } + + const shortcutsRange = [ + { + text: '今天', + value() { + return [dayjs().startOf('day').toDate(), dayjs().endOf('day').toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近7天', + value() { + return [dayjs().subtract(7, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近15天', + value() { + return [dayjs().subtract(15, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近30天', + value() { + return [dayjs().subtract(30, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + ]; + + const formatValue = computed(() => { + if (value.value[0] && value.value[1]) { + return { + create_at__gte: dayjs(value.value[0]).format('YYYY-MM-DD HH:mm:ss'), + create_at__lte: dayjs(value.value[1]).format('YYYY-MM-DD HH:mm:ss'), + }; + } + return {}; + }); + + return { + value, + formatValue, + shortcutsRange, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-search-select.ts b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-search-select.ts new file mode 100644 index 0000000000..476284d8ae --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-search-select.ts @@ -0,0 +1,84 @@ +import { computed, shallowRef } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTicketTypes } from '@services/source/ticket'; + +import { useGlobalBizs } from '@stores'; + +import type { SearchValue } from '@components/vue2/search-select/index.vue'; + +import { getSearchSelectorParams } from '@utils'; + +const value = ref([]); + +export default () => { + const { t } = useI18n(); + const globalBizsStore = useGlobalBizs(); + + const ticketTypeList = shallowRef<{ id: string; name: string }[]>([]); + + const searchSelectData = computed(() => [ + { + name: t('单号'), + id: 'id', + }, + { + name: t('单据类型'), + id: 'ticket_type__in', + multiple: true, + children: ticketTypeList.value, + }, + { + name: t('集群'), + id: 'cluster', + multiple: true, + }, + { + name: t('业务'), + id: 'bk_biz_id', + children: globalBizsStore.bizs.map((item) => ({ + id: item.bk_biz_id, + name: item.name, + })), + }, + { + name: t('状态'), + id: 'status__in', + multiple: true, + children: Object.keys(TicketModel.statusTextMap).reduce[]>((acc, key) => { + acc.push({ + id: key, + name: t(TicketModel.statusTextMap[key as keyof typeof TicketModel.statusTextMap]), + }); + return acc; + }, []), + }, + { + name: t('备注'), + id: 'remark', + }, + { + name: t('提单人'), + id: 'creator', + }, + ]); + + const formatSearchValue = computed(() => getSearchSelectorParams(value.value)); + + useRequest(getTicketTypes, { + onSuccess(data) { + ticketTypeList.value = data.map((item) => ({ + id: item.key, + name: item.value, + })); + }, + }); + + return { + value, + searchSelectData, + formatSearchValue, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-table-height.ts b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-table-height.ts new file mode 100644 index 0000000000..1268499fb7 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/components/list/components/hooks/use-table-height.ts @@ -0,0 +1,28 @@ +import { onMounted, ref, useTemplateRef } from 'vue'; + +import { getOffset } from '@utils'; + +export default () => { + const tableRef = useTemplateRef('table'); + const tableMaxHeight = ref('auto'); + + onMounted(() => { + const { top } = getOffset(tableRef.value as HTMLElement); + const totalHeight = window.innerHeight; + const tableHeaderHeight = 42; + const paginationHeight = 60; + const pageOffsetBottom = 20; + const tableRowHeight = 42; + + const tableRowTotalHeight = totalHeight - top - tableHeaderHeight - paginationHeight - pageOffsetBottom; + + const rowNum = Math.max(Math.floor(tableRowTotalHeight / tableRowHeight), 5); + + tableMaxHeight.value = tableHeaderHeight + rowNum * tableRowHeight + paginationHeight + 3; + }); + + return { + tableRef, + tableMaxHeight, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-manage/routes.ts b/dbm-ui/frontend/src/views/ticket-self-manage/routes.ts new file mode 100644 index 0000000000..8d33521465 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-manage/routes.ts @@ -0,0 +1,30 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on 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 { checkDbConsole } from '@utils'; + +import { t } from '@locales/index'; + +const route = { + name: 'ticketSelfManage', + path: 'ticket-self-manage', + meta: { + navName: t('我负责的业务'), + fullscreen: true, + }, + component: () => import('@views/ticket-self-manage/Index.vue'), +}; + +export default function getRoutes() { + return checkDbConsole('personalWorkbench.myTickets') ? [route] : []; +} diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/Index.vue b/dbm-ui/frontend/src/views/ticket-self-todo/Index.vue new file mode 100644 index 0000000000..3c07d5974c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/Index.vue @@ -0,0 +1,39 @@ + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/detail/Index.vue b/dbm-ui/frontend/src/views/ticket-self-todo/components/detail/Index.vue new file mode 100644 index 0000000000..0ea08911dd --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/detail/Index.vue @@ -0,0 +1,255 @@ + + + + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/Index.vue b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/Index.vue new file mode 100644 index 0000000000..53caa55a4c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/Index.vue @@ -0,0 +1,19 @@ + + diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/CardMode.vue b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/CardMode.vue new file mode 100644 index 0000000000..f0d5573a37 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/CardMode.vue @@ -0,0 +1,234 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/TableMode.vue new file mode 100644 index 0000000000..0e2a7806a2 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/TableMode.vue @@ -0,0 +1,184 @@ + + + diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-data.ts b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-data.ts new file mode 100644 index 0000000000..003877287b --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-data.ts @@ -0,0 +1,104 @@ +import { reactive, ref } from 'vue'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTicketStatus, getTodoTickets } from '@services/source/ticket'; + +import { useUrlSearch } from '@hooks'; + +import { useTimeoutFn } from '@vueuse/core'; + +const isLoading = ref(false); +const dataList = ref[]>([]); +const pagination = reactive({ + offset: 0, + limit: 15, + current: 1, + count: 0, +}); + +export default (options?: { onSuccess?: (data: TicketModel[]) => void }) => { + const { replaceSearchParams, getSearchParams } = useUrlSearch(); + const searchParams = getSearchParams(); + + if (searchParams.limit && searchParams.current) { + pagination.limit = Number(searchParams.limit); + pagination.current = Number(searchParams.current); + } + + const { run: fetchTicketStatus } = useRequest( + () => { + if (dataList.value.length < 1) { + return Promise.reject(); + } + return getTicketStatus({ + ticket_ids: dataList.value.map((item) => item.id).join(','), + }); + }, + { + manual: true, + debounceInterval: 100, + onSuccess(data) { + dataList.value.forEach((ticketData) => { + if (data[ticketData.id]) { + Object.assign(ticketData, { + status: data[ticketData.id], + }); + } + }); + loopFetchTicketStatus(); + }, + }, + ); + + const { start: loopFetchTicketStatus } = useTimeoutFn(() => { + fetchTicketStatus(); + }, 10000); + + const { run: fetchTicketList } = useRequest( + (params: ServiceParameters) => + getTodoTickets({ + todo_status: 'TODO', + limit: pagination.limit, + offset: (pagination.current - 1) * pagination.limit, + ...params, + }), + { + manual: true, + onBefore() { + isLoading.value = true; + }, + onAfter() { + isLoading.value = false; + }, + onSuccess(data, params) { + dataList.value = data.results; + pagination.count = data.count; + + const urlSearchParams = { + limit: pagination.limit, + current: pagination.current, + ...params[0], + }; + + const searchParams = getSearchParams(); + if (Number(searchParams.viewId)) { + Object.assign(urlSearchParams, { + viewId: searchParams.viewId, + }); + } + replaceSearchParams(urlSearchParams); + if (options && options.onSuccess) { + options.onSuccess(data.results); + } + }, + }, + ); + + return { + loading: isLoading, + dataList, + pagination, + fetchTicketList, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-date-picker.ts b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-date-picker.ts new file mode 100644 index 0000000000..7d15acc4b5 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-date-picker.ts @@ -0,0 +1,74 @@ +import dayjs from 'dayjs'; +import { computed, ref } from 'vue'; + +import { useUrlSearch } from '@hooks'; + +interface IPicker { + value: () => [Date, Date]; +} + +const value = ref<[Date, Date] | [string, string]>(['', '']); + +export default () => { + const { getSearchParams } = useUrlSearch(); + + const searchParams = getSearchParams(); + if (searchParams.create_at__gte && searchParams.create_at__lte) { + value.value = [dayjs(searchParams.create_at__gte).toDate(), dayjs(searchParams.create_at__lte).toDate()]; + } + + const shortcutsRange = [ + { + text: '今天', + value() { + return [dayjs().startOf('day').toDate(), dayjs().endOf('day').toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近7天', + value() { + return [dayjs().subtract(7, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近15天', + value() { + return [dayjs().subtract(15, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + { + text: '近30天', + value() { + return [dayjs().subtract(30, 'day').toDate(), dayjs().toDate()]; + }, + onClick: (picker: IPicker) => { + value.value = picker.value(); + }, + }, + ]; + + const formatValue = computed(() => { + if (value.value[0] && value.value[1]) { + return { + create_at__gte: dayjs(value.value[0]).format('YYYY-MM-DD HH:mm:ss'), + create_at__lte: dayjs(value.value[1]).format('YYYY-MM-DD HH:mm:ss'), + }; + } + return {}; + }); + + return { + value, + formatValue, + shortcutsRange, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-search-select.ts b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-search-select.ts new file mode 100644 index 0000000000..69d75ad33c --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-search-select.ts @@ -0,0 +1,83 @@ +import { computed, shallowRef } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRequest } from 'vue-request'; + +import TicketModel from '@services/model/ticket/ticket'; +import { getTicketTypes } from '@services/source/ticket'; + +import { useGlobalBizs } from '@stores'; + +import type { SearchValue } from '@components/vue2/search-select/index.vue'; + +import { getSearchSelectorParams } from '@utils'; + +const value = ref([]); + +export default () => { + const { t } = useI18n(); + const globalBizsStore = useGlobalBizs(); + + const ticketTypeList = shallowRef<{ id: string; name: string }[]>([]); + + const searchSelectData = computed(() => [ + { + name: t('单号'), + id: 'id', + }, + { + name: t('单据类型'), + id: 'ticket_type__in', + multiple: true, + children: ticketTypeList.value, + }, + { + name: t('集群'), + id: 'cluster', + }, + { + name: t('业务'), + id: 'bk_biz_id', + children: globalBizsStore.bizs.map((item) => ({ + id: item.bk_biz_id, + name: item.name, + })), + }, + { + name: t('状态'), + id: 'status__in', + multiple: true, + children: Object.keys(TicketModel.statusTextMap).reduce[]>((acc, key) => { + acc.push({ + id: key, + name: t(TicketModel.statusTextMap[key as keyof typeof TicketModel.statusTextMap]), + }); + return acc; + }, []), + }, + { + name: t('备注'), + id: 'remark', + }, + { + name: t('提单人'), + id: 'creator', + }, + ]); + + const formatSearchValue = computed(() => getSearchSelectorParams(value.value)); + + useRequest(getTicketTypes, { + onSuccess(data) { + ticketTypeList.value = data.map((item) => ({ + id: item.key, + name: item.value, + })); + }, + }); + + return { + value, + searchSelectData, + formatSearchValue, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-table-height.ts b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-table-height.ts new file mode 100644 index 0000000000..1268499fb7 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/components/list/components/hooks/use-table-height.ts @@ -0,0 +1,28 @@ +import { onMounted, ref, useTemplateRef } from 'vue'; + +import { getOffset } from '@utils'; + +export default () => { + const tableRef = useTemplateRef('table'); + const tableMaxHeight = ref('auto'); + + onMounted(() => { + const { top } = getOffset(tableRef.value as HTMLElement); + const totalHeight = window.innerHeight; + const tableHeaderHeight = 42; + const paginationHeight = 60; + const pageOffsetBottom = 20; + const tableRowHeight = 42; + + const tableRowTotalHeight = totalHeight - top - tableHeaderHeight - paginationHeight - pageOffsetBottom; + + const rowNum = Math.max(Math.floor(tableRowTotalHeight / tableRowHeight), 5); + + tableMaxHeight.value = tableHeaderHeight + rowNum * tableRowHeight + paginationHeight + 3; + }); + + return { + tableRef, + tableMaxHeight, + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-self-todo/routes.ts b/dbm-ui/frontend/src/views/ticket-self-todo/routes.ts new file mode 100644 index 0000000000..17cc6cda6a --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-self-todo/routes.ts @@ -0,0 +1,30 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on 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 { checkDbConsole } from '@utils'; + +import { t } from '@locales/index'; + +const route = { + name: 'MyTodos', + path: 'ticket-self-todo', + meta: { + navName: t('我的待办'), + fullscreen: true, + }, + component: () => import('@views/ticket-self-todo/Index.vue'), +}; + +export default function getRoutes() { + return checkDbConsole('personalWorkbench.myTickets') ? [route] : []; +} diff --git a/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/Index.vue b/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/Index.vue index a13338b269..cf1a75521b 100644 --- a/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/Index.vue +++ b/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/Index.vue @@ -61,7 +61,7 @@ return CommonFlows; }); - const { runAsync: fetchTicketFlows, cancel: cancelFetchTicketFlows } = useRequest(getTicketFlows, { + const { runAsync: fetchTicketFlows } = useRequest(getTicketFlows, { manual: true, onSuccess(data, params) { if (params[0].id !== props.data.id) { @@ -72,11 +72,10 @@ }); watch( - () => props.data.id, - () => { - if (props.data.id) { - isLoading.value = true; - cancelFetchTicketFlows(); + () => props.data, + (newData, oldData) => { + if (props.data) { + isLoading.value = newData.id !== oldData?.id; fetchTicketFlows({ id: props.data.id, }).finally(() => { diff --git a/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/components/MySqlFlows.vue b/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/components/MySqlFlows.vue index 3c31e3f238..9bfad26258 100644 --- a/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/components/MySqlFlows.vue +++ b/dbm-ui/frontend/src/views/tickets/my-tickets/components/details/components/flow/components/MySqlFlows.vue @@ -185,7 +185,6 @@ const isShowMore = computed(() => executeSqlFileList.value.length > 6); const renderSqlFileList = computed(() => { - console.log('props.ticketData = ', props.ticketData); if (isShowMore.value && !isShowCollapse.value) { return executeSqlFileList.value.slice(0, 6); } diff --git a/dbm-ui/frontend/src/views/tickets/my-tickets/components/list/Index.vue b/dbm-ui/frontend/src/views/tickets/my-tickets/components/list/Index.vue index 7e58ce4d60..b9581f5cdc 100644 --- a/dbm-ui/frontend/src/views/tickets/my-tickets/components/list/Index.vue +++ b/dbm-ui/frontend/src/views/tickets/my-tickets/components/list/Index.vue @@ -81,7 +81,7 @@
{{ t('申请人') }}: {{ item.creator }}
-
{{ item.formatCreateAt }}
+
{{ item.createAtDisplay }}
{{ t('申请人') }}: {{ item.creator }} - {{ item.formatCreateAt }} + {{ item.createAtDisplay }}
@@ -123,10 +123,7 @@ import { useI18n } from 'vue-i18n'; import TicketModel from '@services/model/ticket/ticket'; - import { - getTicketTypes, - getTodoTickets, - } from '@services/source/ticket'; + import { getTicketTypes, getTodoTickets } from '@services/source/ticket'; import { useGlobalBizs } from '@stores'; @@ -140,12 +137,12 @@ import { useTimeoutPoll } from '@vueuse/core'; interface StatusItem { - label: string, - value: string + label: string; + value: string; } interface Emits { - (e: 'change', value: TicketModel | null): void + (e: 'change', value: TicketModel | null): void; } const emits = defineEmits(); @@ -211,7 +208,7 @@ // 状态选择设置 const isShowDropdown = ref(false); - const activeItemInfo = computed(() => filters.find(item => item.value === state.filters.status)); + const activeItemInfo = computed(() => filters.find((item) => item.value === state.filters.status)); const handleToggle = () => { isShowDropdown.value = !isShowDropdown.value; }; @@ -242,25 +239,30 @@ fetchTicketTypes(); state.page.current = route.query.current ? Number(route.query.current) : 1; - state.page.limit = route.query.limit ? Number(route.query.limit) : 20; + state.page.limit = route.query.limit ? Number(route.query.limit) : 20; // 任务历史跳转过来需要过滤出对应单据。 if (filterId.value) { state.filters.search.push({ name: t('单号'), id: 'id', - values: [{ - id: filterId.value as string, - name: filterId.value as string, - }], + values: [ + { + id: filterId.value as string, + name: filterId.value as string, + }, + ], }); } fetchTickets(); }); - watch(() => state.activeTicket, () => { - emits('change', state.activeTicket); - }); + watch( + () => state.activeTicket, + () => { + emits('change', state.activeTicket); + }, + ); /** * 视图定位到激活项 @@ -280,7 +282,7 @@ */ function fetchTicketTypes() { return getTicketTypes().then((res) => { - state.ticketTypes = res.map(item => ({ + state.ticketTypes = res.map((item) => ({ id: item.key, name: item.value, })); @@ -292,7 +294,7 @@ * 获取业务列表 */ function getBizIdList() { - state.bkBizIdList = globalBizsStore.bizs.map(item => ({ + state.bkBizIdList = globalBizsStore.bizs.map((item) => ({ id: item.bk_biz_id, name: item.name, })); @@ -322,12 +324,14 @@ pause(); } - if (isPoll) return; + if (isPoll) { + return; + } if (results.length > 0) { // 刷新界面自动选中 const id = initId.value || filterId.value; - const activeItem = results.find(item => item.id === Number(id)); + const activeItem = results.find((item) => item.id === Number(id)); if (activeItem) { state.activeTicket = activeItem; } else { diff --git a/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/BaseInfo.vue b/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/BaseInfo.vue new file mode 100644 index 0000000000..48a6922a8e --- /dev/null +++ b/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/BaseInfo.vue @@ -0,0 +1,67 @@ + + + diff --git a/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/Demand.vue b/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/Demand.vue index 22337b2791..ccae834a99 100644 --- a/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/Demand.vue +++ b/dbm-ui/frontend/src/views/tickets/my-todos/components/details/components/Demand.vue @@ -12,9 +12,7 @@ --> From 7a84a49e64fc9e2c62634d52ad9bc58040d35ba7 Mon Sep 17 00:00:00 2001 From: 3octaves <873551943@qq.com> Date: Tue, 20 Aug 2024 17:38:07 +0800 Subject: [PATCH 043/164] =?UTF-8?q?feat(frontend):=20spider=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8D=95=E6=8D=AE=E5=85=8B=E9=9A=86=20#4374?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/batch-edit-column/Index.vue | 46 +- .../columns/operate-column/index.vue | 20 +- .../components/search-result/Index.vue | 1 - .../src/components/ticket-remark/Index.vue | 22 + .../generateCloneData/index.ts | 46 ++ .../generateCloneData/spider/addMnt.ts | 52 +++ .../generateCloneData/spider/apply.ts | 38 ++ .../generateCloneData/spider/authorizeRule.ts | 54 +++ .../spider/capacityChange.ts | 79 ++++ .../generateCloneData/spider/checksum.ts | 45 ++ .../generateCloneData/spider/dbBackup.ts | 43 ++ .../generateCloneData/spider/dbClear.ts | 42 ++ .../generateCloneData/spider/dbRename.ts | 40 ++ .../generateCloneData/spider/dbTableBackup.ts | 43 ++ .../generateCloneData/spider/flashback.ts | 44 ++ .../generateCloneData/spider/index.ts | 35 ++ .../spider/masterFailover.ts | 46 ++ .../spider/masterSlaveClone.ts | 60 +++ .../spider/masterSlaveSwap.ts | 46 ++ .../spider/privilegeCloneClient.ts | 33 ++ .../spider/privilegeCloneInst.ts | 63 +++ .../spider/proxyScaleDown.ts | 68 +++ .../generateCloneData/spider/proxyScaleUp.ts | 75 ++++ .../spider/proxySlaveApply.ts | 61 +++ .../generateCloneData/spider/rollback.ts | 44 ++ .../spider/slaveRebuildLocal.ts | 63 +++ .../spider/slaveRebuildNew.ts | 63 +++ .../generateCloneData/spider/sqlExecute.ts | 34 ++ dbm-ui/frontend/src/locales/zh-cn.json | 1 + .../services/model/ticket/details/mysql.ts | 1 + .../services/model/ticket/details/spider.ts | 418 ++++++++++++++++++ dbm-ui/frontend/src/services/types/ticket.ts | 22 + dbm-ui/frontend/src/styles/common.less | 42 ++ .../mysql/common/edit-field/DbName.vue | 19 +- .../mysql/common/edit-field/TableName.vue | 23 +- .../page1/components/RenderData/Index.vue | 4 +- .../components/RenderData/RenderEndTime.vue | 15 +- .../components/common/render-mode/Index.vue | 17 + .../add-mnt/pages/page1/Index.vue | 48 +- .../components/RenderData/RenderHost.vue | 55 ++- .../page1/components/RenderData/RenderNet.vue | 15 +- .../pages/page1/components/RenderData/Row.vue | 46 +- .../db-manage/tendb-cluster/apply/Index.vue | 61 ++- .../apply/components/ModuleItem.vue | 4 + .../capacity-change/pages/page1/Index.vue | 53 ++- .../RenderData/RenderTargetResourceSpec.vue | 72 ++- .../pages/page1/components/RenderData/Row.vue | 43 +- .../checksum/pages/page1/Index.vue | 44 +- .../page1/components/RenderData/Index.vue | 85 +++- .../pages/page1/components/RenderData/Row.vue | 29 +- .../common/edit-field/ClusterName.vue | 5 +- .../tendb-cluster/common/edit/DateTime.vue | 7 + .../db-backup/pages/page1/Index.vue | 48 +- .../page1/components/RenderData/Index.vue | 12 +- .../RenderData/RenderBackupLocal.vue | 13 +- .../components/RenderData/RenderCluster.vue | 13 +- .../pages/page1/components/RenderData/Row.vue | 32 +- .../db-clear/pages/page1/Index.vue | 55 ++- .../page1/components/RenderData/Index.vue | 93 +++- .../components/RenderData/RenderCluster.vue | 13 +- .../RenderData/RenderTruncateDataType.vue | 13 +- .../pages/page1/components/RenderData/Row.vue | 43 +- .../db-rename/pages/page1/Index.vue | 59 ++- .../page1/components/RenderData/Index.vue | 45 ++ .../components/RenderData/RenderCluster.vue | 9 +- .../components/RenderData/RenderDbName.vue | 9 +- .../pages/page1/components/RenderData/Row.vue | 35 +- .../db-table-backup/pages/page1/Index.vue | 52 ++- .../page1/components/RenderData/Index.vue | 94 +++- .../RenderData/RenderBackupLocal.vue | 9 +- .../components/RenderData/RenderCluster.vue | 15 +- .../pages/page1/components/RenderData/Row.vue | 71 ++- .../flashback/pages/page1/Index.vue | 59 ++- .../page1/components/RenderData/Index.vue | 123 ++++++ .../components/RenderData/RenderCluster.vue | 13 +- .../components/RenderData/RenderStartTime.vue | 13 +- .../pages/page1/components/RenderData/Row.vue | 54 ++- .../list/components/CapacityChange.vue | 15 + .../master-failover/pages/page1/Index.vue | 48 +- .../components/RenderData/RenderCluster.vue | 17 +- .../components/RenderData/RenderMaster.vue | 13 +- .../components/RenderData/RenderSlave.vue | 17 +- .../pages/page1/components/RenderData/Row.vue | 29 +- .../master-slave-clone/pages/page1/Index.vue | 55 ++- .../page1/components/RenderMasterHost.vue | 5 +- .../page1/components/RenderNewInstace.vue | 62 +-- .../page1/components/RenderSlaveHost.vue | 4 + .../pages/page1/components/Row.vue | 37 +- .../master-slave-swap/pages/page1/Index.vue | 47 +- .../components/RenderData/RenderCluster.vue | 17 +- .../components/RenderData/RenderMaster.vue | 13 +- .../components/RenderData/RenderSlave.vue | 17 +- .../pages/page1/components/RenderData/Row.vue | 29 +- .../tendb-cluster/permission/Index.vue | 49 ++ .../pages/page1/Index.vue | 34 +- .../components/RenderData/RenderModule.vue | 13 +- .../components/RenderData/RenderSource.vue | 34 +- .../components/RenderData/RenderTarget.vue | 13 +- .../pages/page1/components/RenderData/Row.vue | 35 +- .../pages/page1/Index.vue | 34 +- .../components/RenderData/RenderCluster.vue | 16 +- .../components/RenderData/RenderModule.vue | 13 +- .../components/RenderData/RenderSource.vue | 23 +- .../components/RenderData/RenderTarget.vue | 13 +- .../pages/page1/components/RenderData/Row.vue | 26 +- .../proxy-scale-down/pages/page1/Index.vue | 46 +- .../pages/page1/components/RenderNodeType.vue | 5 +- .../page1/components/RenderTargetNumber.vue | 9 +- .../pages/page1/components/Row.vue | 35 +- .../proxy-scale-up/pages/page1/Index.vue | 45 +- .../pages/page1/components/RenderNodeType.vue | 5 +- .../page1/components/RenderTargetNumber.vue | 5 +- .../pages/page1/components/Row.vue | 22 +- .../proxy-slave-apply/pages/page1/Index.vue | 29 +- .../page1/components/RenderTargetNumber.vue | 11 +- .../pages/page1/components/Row.vue | 18 +- .../slave-rebuild/pages/page1/Index.vue | 29 +- .../pages/page1/components/new-host/Index.vue | 51 ++- .../render-data/RenderNewSlaveHost.vue | 8 +- .../render-data/RenderOldSlaveHost.vue | 2 +- .../new-host/components/render-data/Row.vue | 26 +- .../page1/components/original-host/Index.vue | 54 ++- .../components/RenderData/RenderSlave.vue | 5 +- .../components/RenderData/Row.vue | 24 +- .../sql-execute/steps/step1/Index.vue | 37 +- .../tickets/common/components/TicketClone.vue | 22 + .../components/demand-factory/common/types.ts | 115 +---- .../demand-factory/mysql/Partition.vue | 5 +- .../demand-factory/spider/AddNodes.vue | 5 +- .../demand-factory/spider/AuthorizeRules.vue | 8 +- .../demand-factory/spider/CheckSum.vue | 5 +- .../demand-factory/spider/Destroy.vue | 5 +- .../demand-factory/spider/Details.vue | 36 +- .../demand-factory/spider/Disable.vue | 5 +- .../demand-factory/spider/Enable.vue | 5 +- .../demand-factory/spider/Flashback.vue | 5 +- .../demand-factory/spider/FullBackup.vue | 5 +- .../demand-factory/spider/MNTApply.vue | 5 +- .../demand-factory/spider/MNTDestroy.vue | 5 +- .../spider/MasterSlaveSwitch.vue | 5 +- .../demand-factory/spider/MigrateCluster.vue | 6 +- .../demand-factory/spider/NodeRebalance.vue | 5 +- .../demand-factory/spider/ReduceNodes.vue | 5 +- .../demand-factory/spider/RenameDatabase.vue | 5 +- .../demand-factory/spider/SlaveApply.vue | 5 +- .../demand-factory/spider/SlaveDestroy.vue | 5 +- .../demand-factory/spider/SlaveRebuild.vue | 7 +- .../demand-factory/spider/TableBackup.vue | 5 +- .../spider/TruncateDatabase.vue | 5 +- 149 files changed, 4285 insertions(+), 623 deletions(-) create mode 100644 dbm-ui/frontend/src/components/ticket-remark/Index.vue create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/addMnt.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/apply.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/authorizeRule.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/capacityChange.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/checksum.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/dbBackup.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/dbClear.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/dbRename.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/dbTableBackup.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/flashback.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/index.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/masterFailover.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/masterSlaveClone.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/masterSlaveSwap.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/privilegeCloneClient.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/privilegeCloneInst.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/proxyScaleDown.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/proxyScaleUp.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/proxySlaveApply.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/rollback.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/slaveRebuildLocal.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/slaveRebuildNew.ts create mode 100644 dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/spider/sqlExecute.ts create mode 100644 dbm-ui/frontend/src/services/model/ticket/details/spider.ts diff --git a/dbm-ui/frontend/src/components/batch-edit-column/Index.vue b/dbm-ui/frontend/src/components/batch-edit-column/Index.vue index 39b6630cd9..5f6f7aeefe 100644 --- a/dbm-ui/frontend/src/components/batch-edit-column/Index.vue +++ b/dbm-ui/frontend/src/components/batch-edit-column/Index.vue @@ -9,7 +9,7 @@ @@ -47,18 +71,20 @@ value: T; label: string; }[]; - type?: 'select' | 'textarea'; + type?: 'select' | 'textarea' | 'input' | 'taginput' | 'datetime'; placeholder?: string; + disableFn?: (date?: Date | number) => boolean; } interface Emits { - (e: 'change', value: string): void; + (e: 'change', value: string | string[]): void; } const props = withDefaults(defineProps(), { dataList: () => [], type: 'select', placeholder: '', + disableFn: () => false, }); const emits = defineEmits(); @@ -71,7 +97,13 @@ const { t } = useI18n(); const inputRef = ref(); - const localValue = ref(''); + const localValue = ref(props.type === 'taginput' ? [] : ''); + + const disabled = computed(() => props.disableFn()); + + const handleChange = (value: string | string[]) => { + localValue.value = value; + }; const handleConfirm = () => { emits('change', localValue.value); diff --git a/dbm-ui/frontend/src/components/render-table/columns/operate-column/index.vue b/dbm-ui/frontend/src/components/render-table/columns/operate-column/index.vue index 70a022c21f..f2e840a75e 100644 --- a/dbm-ui/frontend/src/components/render-table/columns/operate-column/index.vue +++ b/dbm-ui/frontend/src/components/render-table/columns/operate-column/index.vue @@ -29,31 +29,45 @@ @click="handleRemove"> +
+ +
diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderHost.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderHost.vue index 39a202213c..9bfe4b9ad2 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderHost.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderHost.vue @@ -74,8 +74,8 @@ :biz-id="bizId" button-text="" :cloud-info="{ - id: clusterData.bk_cloud_id, - name: clusterData.bk_cloud_name, + id: clusterData.bkCloudId, + name: clusterData.bkCloudName, }" :data="localHostList" :os-types="[OSTypes.Linux]" @@ -86,17 +86,23 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderNet.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderNet.vue index 4252fd666e..6dd9ceb9fa 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderNet.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/RenderNet.vue @@ -31,7 +31,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Record<'bk_cloud_id', number>; } const props = defineProps(); @@ -49,9 +49,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - bk_cloud_id: props.clusterData!.bkCloudId, - })); + return editRef.value + .getValue() + .then(() => ({ + bk_cloud_id: props.clusterData!.bkCloudId, + })) + .catch(() => + Promise.reject({ + bk_cloud_id: props.clusterData?.bkCloudId, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/Row.vue index d7b01a74d8..2ec0b24cbe 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/add-mnt/pages/page1/components/RenderData/Row.vue @@ -28,11 +28,13 @@ + :cluster-id="localClusterId" + :ip-list="data.spiderIpList" /> @@ -84,6 +86,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -94,9 +97,9 @@ const emits = defineEmits(); - const clusterRef = ref(); - const netRef = ref(); - const proxyRef = ref(); + const clusterRef = ref>(); + const netRef = ref>(); + const proxyRef = ref>(); const localClusterId = ref(0); const localClusterData = ref(); @@ -125,15 +128,36 @@ emits('remove'); }; - defineExpose({ - getValue() { - return Promise.all([clusterRef.value.getValue(), netRef.value.getValue(), proxyRef.value.getValue()]).then( - ([clusterData, netData, proxyData]) => ({ - ...clusterData, - ...netData, - ...proxyData, + const getRowData = () => [clusterRef.value!.getValue(), netRef.value!.getValue(), proxyRef.value!.getValue()]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [clusterData, netData, proxyData] = rowData.map((item) => + item.status === 'fulfilled' ? item.value : item.reason, + ); + emits( + 'clone', + createRowData({ + clusterData: { + id: clusterData.cluster_id, + domain: '', + bkCloudId: 0, + bkCloudName: '', + }, + bkCloudId: netData.bk_cloud_id, + spiderIpList: proxyData.spider_ip_list, }), ); + }); + }; + + defineExpose({ + getValue() { + return Promise.all(getRowData()).then(([clusterData, netData, proxyData]) => ({ + ...clusterData, + ...netData, + ...proxyData, + })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/Index.vue index 46d214a9f7..18f77ff21c 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/Index.vue @@ -142,8 +142,9 @@ import type { BizItem } from '@services/types'; - import { useApplyBase } from '@hooks'; + import { useApplyBase, useTicketCloneInfo } from '@hooks'; + import { TicketTypes } from '@common/const'; import { nameRegx } from '@common/regex'; import AffinityItem from '@components/apply-items/AffinityItem.vue'; @@ -161,12 +162,55 @@ const router = useRouter(); const { t } = useI18n(); + // 单据克隆 + useTicketCloneInfo({ + type: TicketTypes.TENDBCLUSTER_APPLY, + onSuccess(cloneData) { + const { + bizId, + affinity, + cloudId, + cityCode, + dbModuleId, + remark, + clusterName, + clusterAlias, + spiderPort, + spiderSpecId, + spiderSpecCount, + backendSpecId, + backendSpecCount, + capacity, + futureCapacity, + } = cloneData; + + formdata.bk_biz_id = bizId; + formdata.remark = remark; + formdata.details.bk_cloud_id = cloudId; + formdata.details.cluster_name = clusterName; + formdata.details.cluster_alias = clusterAlias; + formdata.details.city_code = cityCode; + formdata.details.db_module_id = dbModuleId; + // formdata.details.cluster_shard_num: 0, + // formdata.details.remote_shard_num: 0, + formdata.details.disaster_tolerance_level = affinity; + formdata.details.spider_port = spiderPort; + formdata.details.resource_spec.spider.spec_id = spiderSpecId; + formdata.details.resource_spec.spider.count = spiderSpecCount; + formdata.details.resource_spec.backend_group.affinity = affinity; + formdata.details.resource_spec.backend_group.spec_id = backendSpecId; + formdata.details.resource_spec.backend_group.count = backendSpecCount; + formdata.details.resource_spec.backend_group.capacity = capacity; + formdata.details.resource_spec.backend_group.future_capacity = futureCapacity; + }, + }); + const getSmartActionOffsetTarget = () => document.querySelector('.bk-form-content'); const initData = () => ({ bk_biz_id: '' as number | '', remark: '', - ticket_type: 'TENDBCLUSTER_APPLY', + ticket_type: TicketTypes.TENDBCLUSTER_APPLY, details: { bk_cloud_id: 0, db_app_abbr: '', @@ -204,9 +248,10 @@ const formRef = ref(); const specProxyRef = ref(); const specBackendRef = ref>(); - const formdata = ref(initData()); const regionItemRef = ref(); + const formdata = reactive(initData()); + // const isDefaultCity = computed(() => formdata.value.details.city_code === 'default'); const rules = { @@ -247,7 +292,7 @@ content: t('重置后_将会清空当前填写的内容'), cancelText: t('取消'), onConfirm: () => { - formdata.value = initData(); + Object.assign(formdata, initData()); nextTick(() => { window.changeConfirm = false; }); @@ -262,11 +307,11 @@ baseState.isSubmitting = true; const getDetails = () => { - const details: Record = _.cloneDeep(formdata.value.details); + const details: Record = _.cloneDeep(formdata.details); const { cityCode } = regionItemRef.value.getValue(); // 集群容量需求不需要提交 - delete details.resource_spec.backend_group.capacity; - delete details.resource_spec.backend_group.future_capacity; + // delete details.resource_spec.backend_group.capacity; + // delete details.resource_spec.backend_group.future_capacity; const regionAndDisasterParams = { affinity: details.resource_spec.backend_group.affinity, @@ -302,7 +347,7 @@ }; }; const params = { - ...formdata.value, + ...formdata, details: getDetails(), }; diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/components/ModuleItem.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/components/ModuleItem.vue index 4b79166057..44a21a7545 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/components/ModuleItem.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/apply/components/ModuleItem.vue @@ -117,6 +117,10 @@ { immediate: true }, ); + watch(moduleId, () => { + fetchLevelConfig(moduleId.value); + }); + // 获取配置详情 const fetchLevelConfig = (moduleId: number) => { const params = { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/Index.vue index ea44dee0bc..ab5fdd3c5e 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/Index.vue @@ -28,12 +28,26 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + + + + {{ t('本地备份') }} + + + {{ t('远程备份') }} + + + + }>({ [ClusterTypes.TENDBCLUSTER]: [] }); const formData = reactive({ + backup_source: 'local', need_checksum: false, trigger_checksum_type: 'timer', trigger_checksum_time: dayjs().format('YYYY-MM-DD HH:mm:ss'), + remark: '', }); // 集群域名是否已存在表格的映射表 @@ -200,13 +237,23 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ - ticket_type: 'TENDBCLUSTER_NODE_REBALANCE', - remark: '', + ticket_type: TicketTypes.TENDBCLUSTER_NODE_REBALANCE, + remark: formData.remark, details: { ...formData, infos, diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/RenderTargetResourceSpec.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/RenderTargetResourceSpec.vue index f0cc8d0458..246027095a 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/RenderTargetResourceSpec.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/RenderTargetResourceSpec.vue @@ -87,6 +87,8 @@ import { ref, shallowRef, watch } from 'vue'; import { useI18n } from 'vue-i18n'; + import { getResourceSpec } from '@services/source/dbresourceSpec'; + import { useBeforeClose } from '@hooks'; import ClusterSpecPlanSelector, { type TicketSpecInfo } from '@components/cluster-spec-plan-selector/Index.vue'; @@ -96,12 +98,15 @@ interface Props { clusterData?: IDataRow['clusterData']; + rowData: IDataRow; } + interface Exposes { getValue: () => Promise; } const props = defineProps(); + defineOptions({ inheritAttrs: false, }); @@ -151,6 +156,26 @@ }, ); + watch( + () => props.rowData.resource_spec?.backend_group.spec_id, + (newSpecId) => { + if (newSpecId) { + getResourceSpec({ spec_id: newSpecId }).then((specData) => { + const backend = props.rowData.resource_spec?.backend_group; + handlePlanChange(newSpecId, { + spec_id: newSpecId, + spec_name: specData.spec_name, + machine_pair: backend?.count ?? 0, + cluster_capacity: backend?.futureCapacity ?? 0, + }); + }); + } + }, + { + immediate: true, + }, + ); + const handleShowSelector = () => { if (!props.clusterData) { return; @@ -182,21 +207,40 @@ defineExpose({ getValue() { - return inputRef.value.getValue().then(() => { - if (!props.clusterData || !localSpec.value) { - return Promise.reject(); - } - return { - remote_shard_num: Math.ceil(props.clusterData.clusterShardNum / localSpec.value.machine_pair), - resource_spec: { - backend_group: { - spec_id: localSpec.value.spec_id, - count: localSpec.value.machine_pair, - affinity: '', + return inputRef.value + .getValue() + .then(() => { + if (!props.clusterData || !localSpec.value) { + return Promise.reject(); + } + return { + remote_shard_num: Math.ceil(props.clusterData.clusterShardNum / localSpec.value.machine_pair), + resource_spec: { + backend_group: { + spec_id: localSpec.value.spec_id, + count: localSpec.value.machine_pair, + affinity: '', + }, }, - }, - }; - }); + }; + }) + .catch(() => { + if (!props.clusterData || !localSpec.value) { + return Promise.reject({ resource_spec: undefined }); + } + return Promise.reject({ + remote_shard_num: Math.ceil(props.clusterData.clusterShardNum / localSpec.value.machine_pair), + resource_spec: { + backend_group: { + spec_id: localSpec.value.spec_id, + count: localSpec.value.machine_pair, + affinity: '', + futureCapacity: localSpec.value.cluster_capacity, + specName: localSpec.value.spec_name, + }, + }, + }); + }); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/Row.vue index 8540a0d7cf..5a01c8b8ca 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/capacity-change/pages/page1/components/RenderData/Row.vue @@ -41,11 +41,13 @@ + :cluster-data="localClusterData" + :row-data="data" /> @@ -77,7 +79,9 @@ backend_group: { spec_id: number; count: number; - affinity: ''; + affinity: string; + futureCapacity: number; + specName: string; }; }; } @@ -107,6 +111,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -149,16 +154,34 @@ emits('remove'); }; + const getRowData = () => [ + clusterRef.value!.getValue(), + resourceSpecRef.value!.getValue(), + targetResourceSpecRef.value!.getValue(), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [clusterData, resourceSpecData, targetResourceSpecData] = rowData.map((item) => + item.status === 'fulfilled' ? item.value : item.reason, + ); + emits( + 'clone', + createRowData({ + clusterData: localClusterData.value, + resourceSpec: { + id: 0, + name: localClusterData.value?.clusterSpec.spec_name ?? '', + }, + resource_spec: targetResourceSpecData.resource_spec, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - clusterRef.value!.getValue(), - targetResourceSpecRef.value!.getValue(), - shardNumRef.value!.getValue(), - machinePairCntRef.value!.getValue(), - capacityRef.value!.getValue(), - resourceSpecRef.value!.getValue(), - ]).then(([clusterData, targetResourceSpecData]) => ({ + return Promise.all(getRowData()).then(([clusterData, resourceSpecData, targetResourceSpecData]) => ({ ...clusterData, ...targetResourceSpecData, prev_machine_pair: props.data.clusterData!.machinePairCnt, diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/Index.vue index 3ea4717e60..bb5b800a37 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/Index.vue @@ -20,7 +20,7 @@ :title="t('数据校验修复:对集群的主库和从库进行数据一致性校验和修复,其中 MyISAM 引擎库表不会被校验和修复')" /> + >([createRowData({})]); @@ -189,15 +203,21 @@ isShowBatchSelector.value = true; }; - const handleBatchEditScope = (value: string) => { + const handleBatchEditColumn = (value: string | string[], filed: IDataRowBatchKey) => { if (!value || checkListEmpty(tableData.value)) { return; } - tableData.value.forEach((row) => { - Object.assign(row, { - scope: value, + if (filed === 'scope') { + tableData.value.forEach((row) => { + Object.assign(row, { + [filed]: value, + }); }); - }); + } else { + rowRefs.value.map((item: { setLocalBackupInfos: (value: string[], field: IDataRowBatchKey) => void }) => + item.setLocalBackupInfos(value as string[], filed), + ); + } }; // 批量选择 @@ -248,11 +268,11 @@ const handleSubmit = async () => { try { isSubmitting.value = true; - const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); + const infos = await Promise.all(rowRefs.value!.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ - ticket_type: 'TENDBCLUSTER_CHECKSUM', - remark: '', + ticket_type: TicketTypes.TENDBCLUSTER_CHECKSUM, + remark: formData.remark, details: { ...formData, timing: formatDateToUTC(dayjs(formData.timing).format('YYYY-MM-DD HH:mm:ss')), diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/components/RenderData/Index.vue index 8730388a43..d67775e135 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/checksum/pages/page1/components/RenderData/Index.vue @@ -32,14 +32,14 @@ :width="110"> @@ -115,6 +116,10 @@ }[]; } + type BackupInfoKeys = keyof Omit; + type RowKeys = keyof Pick; + export type IDataRowBatchKey = RowKeys | BackupInfoKeys; + const createBackupInfo = (data = {} as Partial) => ({ master: data.master || '', slave: data.slave || '', @@ -155,6 +160,7 @@ } interface Exposes { + setLocalBackupInfos: (value: string[], field: BackupInfoKeys) => void; getValue: () => Promise; } @@ -181,13 +187,23 @@ if (props.data.clusterData) { localClusterId.value = props.data.clusterData.id; } - if (props.data.scope) { - localScope.value = props.data.scope; - } if (props.data.backupInfos) { localBackupInfos.value = props.data.backupInfos; } }, + { + deep: true, + immediate: true, + }, + ); + + watch( + () => props.data.scope, + () => { + if (props.data.scope) { + localScope.value = props.data.scope; + } + }, { immediate: true, }, @@ -240,6 +256,13 @@ }; defineExpose({ + setLocalBackupInfos(value, field) { + localBackupInfos.value.forEach((backInfo) => { + Object.assign(backInfo, { + [field]: value, + }); + }); + }, getValue() { return Promise.all([ Promise.all(clusterRefs.value.map((item: any) => item.getValue())), diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit-field/ClusterName.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit-field/ClusterName.vue index 0dbc9f6f1b..ec2f1bc43c 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit-field/ClusterName.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit-field/ClusterName.vue @@ -145,7 +145,10 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => localValue.value); + return editRef.value + .getValue() + .then(() => localValue.value) + .catch(() => Promise.reject(localValue)); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit/DateTime.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit/DateTime.vue index cda04cd919..e2706f40a9 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit/DateTime.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/common/edit/DateTime.vue @@ -75,6 +75,13 @@ const { message: errorMessage, validator } = useValidtor(props.rules); + watch( + () => props.modelValue, + () => { + localValue.value = props.modelValue; + }, + ); + const handleChange = (value: Required['modelValue']) => { localValue.value = value; validator(localValue.value).then(() => { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/Index.vue index 9531cbbebd..a55215fd7c 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/Index.vue @@ -28,11 +28,13 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @input-cluster-finish="(item: IDataRow) => handleInputCluster(index, item)" @remove="() => handleRemove(index)" /> @@ -68,6 +70,7 @@ + ({ backup_type: 'logical', file_tag: 'DBFILE1M', + remark: '', }); const { t } = useI18n(); const router = useRouter(); const { currentBizId } = useGlobalBizs(); + // 单据克隆 + useTicketCloneInfo({ + type: TicketTypes.TENDBCLUSTER_FULL_BACKUP, + onSuccess(cloneData) { + const { tableDataList, form } = cloneData; + Object.assign(formData, form); + tableData.value = tableDataList; + window.changeConfirm = true; + }, + }); + const formRef = ref(); const rowRefs = ref(); const isShowBatchSelector = ref(false); @@ -210,14 +228,33 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice( + index + 1, + 0, + Object.assign(sourceData, { + clusterData: { + ...sourceData.clusterData, + domain: tableData.value[index].clusterData?.domain ?? '', + }, + }), + ); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const data = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ bk_biz_id: currentBizId, - ticket_type: 'TENDBCLUSTER_FULL_BACKUP', - remark: '', + ticket_type: TicketTypes.TENDBCLUSTER_FULL_BACKUP, + remark: formData.remark, details: { infos: { ...formData, @@ -252,10 +289,5 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Index.vue index a495222dbb..8ca0d4020d 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Index.vue @@ -35,11 +35,11 @@ v-model="isShowBatchEdit" :data-list="selectList" :title="t('备份位置')" - @change="handleBatchEdit"> + @change="handleBatchEditChange"> + @click="handleBatchEditChangeShow"> @@ -89,12 +89,12 @@ }, ]; - const handleShowBatchEdit = () => { + const handleBatchEditChangeShow = () => { isShowBatchEdit.value = !isShowBatchEdit.value; }; - const handleBatchEdit = (value: string) => { - emits('batchEditBackupLocal', value); + const handleBatchEditChange = (value: string | string[]) => { + emits('batchEditBackupLocal', value as string); }; const handleShowBatchSelector = () => { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue index 4ddddf72f4..33bb1751d7 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue @@ -112,9 +112,16 @@ defineExpose({ getValue() { - return editSelectRef.value.getValue().then(() => ({ - backup_local: localValue.value, - })); + return editSelectRef.value + .getValue() + .then(() => ({ + backup_local: localValue.value, + })) + .catch(() => + Promise.reject({ + backup_local: localValue.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderCluster.vue index a465f34432..bdd2b1f0bd 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderCluster.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/RenderCluster.vue @@ -167,9 +167,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - cluster_id: localClusterId.value, - })); + return editRef.value + .getValue() + .then(() => ({ + cluster_id: localClusterId.value, + })) + .catch(() => + Promise.reject({ + cluster_id: localClusterId.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Row.vue index 9d449d3944..59f090b568 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-backup/pages/page1/components/RenderData/Row.vue @@ -29,6 +29,7 @@ @@ -64,6 +65,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; (e: 'inputClusterFinish', value: IDataRow): void; } @@ -115,14 +117,32 @@ emits('remove'); }; - defineExpose({ - getValue() { - return Promise.all([clusterRef.value.getValue(), backupLocalRef.value.getValue()]).then( - ([clusterData, backupLocalData]) => ({ - ...clusterData, - ...backupLocalData, + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [clusterData, backupLocalData] = rowData.map((item) => + item.status === 'fulfilled' ? item.value : item.reason, + ); + emits( + 'clone', + createRowData({ + clusterData: { + id: clusterData.cluster_id, + domain: '', + }, + backupLocal: backupLocalData.backup_local, }), ); + }); + }; + + const getRowData = () => [clusterRef.value.getValue(), backupLocalRef.value.getValue()]; + + defineExpose({ + getValue() { + return Promise.all(getRowData()).then(([clusterData, backupLocalData]) => ({ + ...clusterData, + ...backupLocalData, + })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/Index.vue index f218cdda93..2e32c1d169 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/Index.vue @@ -22,7 +22,7 @@ " />
@@ -43,6 +44,7 @@
+ >([createRowData({})]); + const remark = ref(''); + const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBCLUSTER]: [] }); // 集群域名是否已存在表格的映射表 @@ -123,13 +140,13 @@ isShowBatchSelector.value = true; }; - const handleBatchEditTruncateType = (value: string) => { - if (!value) { + const handleBatchEditColumn = (value: string | string[], filed: IDataRowBatchKey) => { + if (!value || checkListEmpty(tableData.value)) { return; } tableData.value.forEach((row) => { Object.assign(row, { - truncateDataType: value, + [filed]: value, }); }); }; @@ -180,14 +197,33 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice( + index + 1, + 0, + Object.assign(sourceData, { + clusterData: { + ...sourceData.clusterData, + domain: tableData.value[index].clusterData?.domain ?? '', + }, + }), + ); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ - ticket_type: 'TENDBCLUSTER_TRUNCATE_DATABASE', - remark: '', + ticket_type: TicketTypes.TENDBCLUSTER_TRUNCATE_DATABASE, + remark: remark.value, details: { infos: infos.map((item) => Object.assign(item, { @@ -214,6 +250,7 @@ }; const handleReset = () => { + remark.value = ''; tableData.value = [createRowData()]; selectedClusters.value[ClusterTypes.TENDBCLUSTER] = []; domainMemo = {}; diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/components/RenderData/Index.vue index c8c05aa852..d6f5e02a2e 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-clear/pages/page1/components/RenderData/Index.vue @@ -32,14 +32,14 @@ :width="220"> @@ -82,6 +83,8 @@ ignoreTables?: string[]; } + export type IDataRowBatchKey = keyof Omit; + // 创建表格数据 export const createRowData = (data = {} as Partial): IDataRow => ({ rowKey: random(), @@ -107,6 +110,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -188,16 +192,39 @@ emits('remove'); }; + const getRowData = () => [ + clusterRef.value.getValue(), + truncateDataTypeRef.value.getValue(), + dbPatternsRef.value.getValue('db_patterns'), + tablePatternsRef.value.getValue('table_patterns'), + ignoreDbsRef.value.getValue('ignore_dbs'), + ignoreTablesRef.value.getValue('ignore_tables'), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [clusterData, truncateDataTypeData, dbPatternsData, tablePatternsData, ignoreDbsData, ignoreTablesData] = + rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + clusterData: { + id: clusterData.cluster_id, + domain: '', + }, + truncateDataType: truncateDataTypeData.truncate_data_type, + dbPatterns: dbPatternsData.db_patterns, + tablePatterns: tablePatternsData.table_patterns, + ignoreDbs: ignoreDbsData.ignore_dbs, + ignoreTables: ignoreTablesData.ignore_tables, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - clusterRef.value.getValue(), - truncateDataTypeRef.value.getValue(), - dbPatternsRef.value.getValue('db_patterns'), - tablePatternsRef.value.getValue('table_patterns'), - ignoreDbsRef.value.getValue('ignore_dbs'), - ignoreTablesRef.value.getValue('ignore_tables'), - ]).then( + return Promise.all(getRowData()).then( ([clusterData, truncateDataTypeData, dbPatternsData, tablePatternsData, ignoreDbsData, ignoreTablesData]) => ({ ...clusterData, ...truncateDataTypeData, diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/Index.vue index cfa6bbdc56..8f7f97d559 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/Index.vue @@ -20,6 +20,7 @@ :title="t('DB 重命名:database 重命名')" /> @@ -44,6 +46,7 @@ {{ t('忽略业务连接') }} + ({ + remark: '', + }); const { t } = useI18n(); const router = useRouter(); const { currentBizId } = useGlobalBizs(); + // 单据克隆 + useTicketCloneInfo({ + type: TicketTypes.TENDBCLUSTER_RENAME_DATABASE, + onSuccess(cloneData) { + const { tableDataList, force, remark } = cloneData; + tableData.value = tableDataList; + isIgnore.value = force; + formData.remark = remark; + window.changeConfirm = true; + }, + }); + const rowRefs = ref(); const isShowBatchSelector = ref(false); const isSubmitting = ref(false); const isIgnore = ref(false); const tableData = ref>([createRowData({})]); + const formData = reactive(createDefaultData()); + const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBCLUSTER]: [] }); // 集群域名是否已存在表格的映射表 @@ -144,6 +168,17 @@ window.changeConfirm = true; }; + const handleBatchEditColumn = (value: string, filed: IDataRowBatchKey) => { + if (!value || checkListEmpty(tableData.value)) { + return; + } + tableData.value.forEach((row) => { + Object.assign(row, { + [filed]: value, + }); + }); + }; + // 追加一个集群 const handleAppend = (index: number, rowData: IDataRow) => { const dataList = [...tableData.value]; @@ -187,13 +222,32 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice( + index + 1, + 0, + Object.assign(sourceData, { + clusterData: { + ...sourceData.clusterData, + domain: tableData.value[index].clusterData?.domain ?? '', + }, + }), + ); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: TicketTypes.TENDBCLUSTER_RENAME_DATABASE, - remark: '', + remark: formData.remark, details: { force: isIgnore.value, infos, @@ -217,6 +271,7 @@ }; const handleReset = () => { + Object.assign(formData, createDefaultData()); tableData.value = [createRowData()]; selectedClusters.value[ClusterTypes.TENDBCLUSTER] = []; domainMemo = {}; diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/components/RenderData/Index.vue index 05c86713de..b021ca5c68 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/db-rename/pages/page1/components/RenderData/Index.vue @@ -31,11 +31,39 @@ :min-width="100" :width="400"> {{ t('源 DB 名') }} +
{{ t('新 DB 名') }} + import { useI18n } from 'vue-i18n'; + import BatchEditColumn from '@components/batch-edit-column/Index.vue'; import RenderTableHeadColumn from '@components/render-table/HeadColumn.vue'; import RenderTable from '@components/render-table/Index.vue'; + import type { IDataRowBatchKey } from './Row.vue'; + interface Emits { (e: 'batchSelectCluster'): void; + (e: 'batchEdit', value: string, filed: IDataRowBatchKey): void; } const emits = defineEmits(); const { t } = useI18n(); + const batchEditShow = reactive({ + fromDatabase: false, + toDatabase: false, + }); + + const handleBatchEditShow = (key: IDataRowBatchKey) => { + batchEditShow[key] = !batchEditShow[key]; + }; + const handleShowBatchSelector = () => { emits('batchSelectCluster'); }; + + const handleBatchEditChange = (value: string | string[], filed: IDataRowBatchKey) => { + emits('batchEdit', value as string, filed); + }; diff --git a/dbm-ui/frontend/src/views/tickets/common/components/TicketClone.vue b/dbm-ui/frontend/src/views/tickets/common/components/TicketClone.vue index 255f75835f..cbe519b76e 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/TicketClone.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/TicketClone.vue @@ -120,6 +120,28 @@ [TicketTypes.SQLSERVER_IMPORT_SQLFILE]: 'sqlServerExecute', // sqlserver 变更SQL执行 [TicketTypes.SQLSERVER_FULL_MIGRATE]: 'sqlServerDataMigrate', // sqlserver 全库迁移 [TicketTypes.SQLSERVER_INCR_MIGRATE]: 'sqlServerDataMigrate', // sqlserver 增量迁移 + [TicketTypes.TENDBCLUSTER_APPLY]: 'spiderApply', // spider 集群部署 + [TicketTypes.TENDBCLUSTER_SPIDER_ADD_NODES]: 'SpiderProxyScaleUp', // Spider扩容接入层 + [TicketTypes.TENDBCLUSTER_SPIDER_REDUCE_NODES]: 'SpiderProxyScaleDown', // Spider缩容接入层 + [TicketTypes.TENDBCLUSTER_SPIDER_SLAVE_APPLY]: 'SpiderProxySlaveApply', // Spider 部署只读接入层 + [TicketTypes.TENDBCLUSTER_SPIDER_MNT_APPLY]: 'spiderAddMnt', // Spider 添加运维节点 + [TicketTypes.TENDBCLUSTER_MASTER_SLAVE_SWITCH]: 'spiderMasterSlaveSwap', // Spider remote 主从切换 + [TicketTypes.TENDBCLUSTER_RENAME_DATABASE]: 'spiderDbRename', // Spider Tendbcluster 重命名 + [TicketTypes.TENDBCLUSTER_MASTER_FAIL_OVER]: 'spiderMasterFailover', // Spider remote主故障切换 + [TicketTypes.TENDBCLUSTER_DB_TABLE_BACKUP]: 'spiderDbTableBackup', // Spider TenDBCluster 库表备份 + [TicketTypes.TENDBCLUSTER_FULL_BACKUP]: 'spiderDbBackup', // Spider TenDBCluster 全备单据 + [TicketTypes.TENDBCLUSTER_NODE_REBALANCE]: 'spiderCapacityChange', // Spider 集群remote节点扩缩容 + [TicketTypes.TENDBCLUSTER_ROLLBACK_CLUSTER]: 'spiderRollback', // Spider 定点回档 + [TicketTypes.TENDBCLUSTER_FLASHBACK]: 'spiderFlashback', // Spider 闪回 + [TicketTypes.TENDBCLUSTER_TRUNCATE_DATABASE]: 'spiderDbClear', // Spider tendbcluster 清档 + [TicketTypes.TENDBCLUSTER_CHECKSUM]: 'spiderChecksum', // Spider checksum + [TicketTypes.TENDBCLUSTER_CLIENT_CLONE_RULES]: 'spiderPrivilegeCloneClient', // Spider 客户端权限克隆 + [TicketTypes.TENDBCLUSTER_INSTANCE_CLONE_RULES]: 'spiderPrivilegeCloneInst', // Spider DB 实例权限克隆 + [TicketTypes.TENDBCLUSTER_AUTHORIZE_RULES]: 'spiderPermission', + [TicketTypes.TENDBCLUSTER_IMPORT_SQLFILE]: 'spiderSqlExecute', // Spider SQL变更执行 + [TicketTypes.TENDBCLUSTER_MIGRATE_CLUSTER]: 'spiderMasterSlaveClone', // spider 迁移主从 + [TicketTypes.TENDBCLUSTER_RESTORE_LOCAL_SLAVE]: 'spiderSlaveRebuild', // spider 重建从库-原地重建 + [TicketTypes.TENDBCLUSTER_RESTORE_SLAVE]: 'spiderSlaveRebuild', // spider 重建从库-新机重建 }; const isShowTicketClone = computed(() => !!ticketTypeRouteNameMap[props.data.ticket_type]); diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts index dddce5a077..0781dbfef4 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/common/types.ts @@ -127,114 +127,6 @@ export interface DetailsSqlserver { start_mssql_port: number; } -// spider 迁移主从 -export interface SpiderMigrateCluster { - infos: { - cluster_id: number; - new_master: { - bk_biz_id: number; - bk_cloud_id: number; - bk_host_id: number; - ip: string; - }; - new_slave: { - bk_biz_id: number; - bk_cloud_id: number; - bk_host_id: number; - ip: string; - }; - }[]; - clusters: Record< - number, - { - id: number; - tag: string[]; - name: string; - alias: string; - phase: string; - region: string; - status: string; - creator: string; - updater: string; - bk_biz_id: number; - time_zone: string; - bk_cloud_id: number; - cluster_type: string; - db_module_id: number; - immute_domain: string; - major_version: string; - cluster_type_name: string; - disaster_tolerance_level: string; - } - >; - ip_source: string; - backup_source: string; -} - -// spider 迁移主从 -export interface SpiderSlaveRebuid { - infos: { - cluster_id: number; - slave: { - ip: string; - bk_biz_id: number; - bk_host_id: number; - bk_cloud_id: number; - }; - old_slave: SpiderSlaveRebuid['infos'][number]['slave']; - new_slave: SpiderSlaveRebuid['infos'][number]['slave']; - resource_spec: { - new_slave: { - name: string; - cpu: { - max: number; - min: number; - }; - id: number; - mem: { - max: number; - min: number; - }; - qps: { - max: number; - min: number; - }; - count: number; - storage_spec: { - mount_point: string; - size: number; - type: string; - }[]; - }; - }; - }[]; - clusters: Record< - number, - { - id: number; - tag: string[]; - name: string; - alias: string; - phase: string; - region: string; - status: string; - creator: string; - updater: string; - bk_biz_id: number; - time_zone: string; - bk_cloud_id: number; - cluster_type: string; - db_module_id: number; - immute_domain: string; - major_version: string; - cluster_type_name: string; - disaster_tolerance_level: string; - } - >; - ip_source: string; - backup_source: string; -} - export interface RedisHaApply { bk_cloud_id: number; cluster_type: string; @@ -265,3 +157,10 @@ export interface RedisHaApply { backend_group: SpecInfo; }; } + +export type TicketDetailTypes = + | DetailsMongoDBReplicaSet + | DetailsMongoDBSharedCluster + | MongoDBAuthorizeRules + | DetailsSqlserver + | RedisHaApply; diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mysql/Partition.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mysql/Partition.vue index 647b4b0622..d98ac77236 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mysql/Partition.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mysql/Partition.vue @@ -20,10 +20,11 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderCluster.vue index 841ab9a498..3b47e53273 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderCluster.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderCluster.vue @@ -41,6 +41,7 @@ } interface Emits { + (e: 'inputCreate', value: Array): void; (e: 'inputClusterFinish', value: string): void; } @@ -132,10 +133,10 @@ localClusterId, () => { if (!localClusterId.value) { + clusterIdMemo[instanceKey] = {}; return; } - clusterIdMemo[instanceKey] = {}; - clusterIdMemo[instanceKey][localClusterId.value] = true; + clusterIdMemo[instanceKey] = { [localClusterId.value]: true }; }, { immediate: true, @@ -158,9 +159,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - cluster_id: localClusterId.value, - })); + return editRef.value + .getValue() + .then(() => ({ + cluster_id: localClusterId.value, + })) + .catch(() => + Promise.reject({ + cluster_id: localClusterId.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue index be9f36e3b3..e72d614f08 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue @@ -27,7 +27,9 @@ @@ -64,6 +66,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; (e: 'inputClusterFinish', value: IDataRow): void; } @@ -101,14 +104,27 @@ emits('remove'); }; - defineExpose({ - getValue() { - return Promise.all([clusterRef.value.getValue(), backupLocalRef.value.getValue()]).then( - ([clusterData, backupLocalData]) => ({ - ...clusterData, - ...backupLocalData, + const getRowData = () => [clusterRef.value.getValue(), backupLocalRef.value.getValue()]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + clusterData: props.data.clusterData, + backupLocal: rowInfo[1].backup_local, }), ); + }); + }; + + defineExpose({ + getValue() { + return Promise.all(getRowData()).then(([clusterData, backupLocalData]) => ({ + ...clusterData, + ...backupLocalData, + })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/Index.vue index 97232d5925..2551c73302 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/Index.vue @@ -28,7 +28,7 @@ @@ -51,6 +52,7 @@ + @@ -99,10 +101,11 @@ import { ClusterTypes, TicketTypes } from '@common/const'; import ClusterSelector from '@components/cluster-selector/Index.vue'; + import TicketRemark from '@components/ticket-remark/Index.vue'; import BatchInput, { type InputItem } from './components/BatchInput.vue'; import RenderData from './components/RenderData/Index.vue'; - import RenderDataRow, { createRowData, type IDataRow } from './components/RenderData/Row.vue'; + import RenderDataRow, { createRowData, type IDataRow, type IDataRowBatchKey } from './components/RenderData/Row.vue'; const { t } = useI18n(); const router = useRouter(); @@ -115,6 +118,7 @@ const { isSafeStatus, tableDataList } = cloneData; tableData.value = tableDataList; isSafe.value = isSafeStatus; + remark.value = cloneData.remark; window.changeConfirm = true; }, }); @@ -136,6 +140,7 @@ const isSubmitting = ref(false); const isShowBatchInput = ref(false); const tableData = ref>([createRowData({})]); + const remark = ref(''); const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBHA]: [], @@ -209,17 +214,6 @@ isShowBatchSelector.value = true; }; - const handleBatchEditTruncateType = (value: string) => { - if (!value) { - return; - } - tableData.value.forEach((row) => { - Object.assign(row, { - truncateDataType: value, - }); - }); - }; - // 输入集群后查询集群信息并填充到table const handleChangeCluster = async (index: number, clusterId: number) => { if (tableData.value[index].clusterData?.id === clusterId) { @@ -278,6 +272,17 @@ window.changeConfirm = true; }; + const handleBatchEditColumn = (value: string | string[], filed: IDataRowBatchKey) => { + if (!value || checkListEmpty(tableData.value)) { + return; + } + tableData.value.forEach((row) => { + Object.assign(row, { + [filed]: value, + }); + }); + }; + // 追加一个集群 const handleAppend = (index: number, appendList: Array) => { const dataList = [...tableData.value]; @@ -299,6 +304,16 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = () => { isSubmitting.value = true; Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())) @@ -309,7 +324,7 @@ clusterTypes[0] === ClusterTypes.TENDBHA ? TicketTypes.MYSQL_HA_TRUNCATE_DATA : TicketTypes.MYSQL_SINGLE_TRUNCATE_DATA, - remark: '', + remark: remark.value, details: { infos: data.map((item) => Object.assign(item, { @@ -338,6 +353,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; selectedClusters.value[ClusterTypes.TENDBHA] = []; selectedClusters.value[ClusterTypes.TENDBSINGLE] = []; domainMemo = {}; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Index.vue index ad4c4e66ca..4008a95560 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Index.vue @@ -30,14 +30,14 @@ :width="220"> {{ t('清档类型') }} @@ -46,23 +46,71 @@ :min-width="200" :width="250"> {{ t('目标DB名') }} + {{ t('忽略DB名') }} + {{ t('目标表名') }} + {{ t('忽略表名') }} + (); const { t } = useI18n(); - const isShowBatchEdit = ref(false); + const batchEditShow = reactive({ + truncateDataType: false, + dbPatterns: false, + tablePatterns: false, + ignoreDbs: false, + ignoreTables: false, + }); const selectList = [ { @@ -111,12 +167,12 @@ }, ]; - const handleShowBatchEdit = () => { - isShowBatchEdit.value = !isShowBatchEdit.value; + const handleBatchEditShow = (key: IDataRowBatchKey) => { + batchEditShow[key] = !batchEditShow[key]; }; - const handleBatchEdit = (value: string) => { - emits('batchEditTruncateType', value); + const handleBatchEditChange = (value: string | string[], filed: IDataRowBatchKey) => { + emits('batchEdit', value, filed); }; const handleShowBatchSelector = () => { diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/RenderTruncateDataType.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/RenderTruncateDataType.vue index d07f23d903..0ee0efe4da 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/RenderTruncateDataType.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/RenderTruncateDataType.vue @@ -86,9 +86,12 @@ defineExpose({ getValue() { - return editSelectRef.value.getValue().then(() => ({ - truncate_data_type: localValue.value, - })); + return editSelectRef.value + .getValue() + .then(() => ({ + truncate_data_type: localValue.value, + })) + .catch(() => ({ truncate_data_type: localValue.value })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Row.vue index a707ba65cb..d0d7365e72 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-clear/pages/page1/components/RenderData/Row.vue @@ -61,7 +61,9 @@ @@ -94,6 +96,8 @@ ignoreDbs: data.ignoreDbs, ignoreTables: data.ignoreTables, }); + + export type IDataRowBatchKey = keyof Omit; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-rename/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-rename/pages/page1/components/RenderData/Row.vue index a727001f3b..da162364db 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-rename/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-rename/pages/page1/components/RenderData/Row.vue @@ -41,7 +41,9 @@ @@ -66,6 +68,8 @@ fromDatabase: data.fromDatabase, toDatabase: data.toDatabase, }); + + export type IDataRowBatchKey = keyof Omit; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/RenderCluster.vue index b6b31224bd..2c50f31403 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/RenderCluster.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/RenderCluster.vue @@ -143,9 +143,10 @@ localClusterId, () => { if (!localClusterId.value) { + clusterIdMemo[instanceKey] = {}; return; } - clusterIdMemo[instanceKey][localClusterId.value] = true; + clusterIdMemo[instanceKey] = { [localClusterId.value]: true }; }, { immediate: true, @@ -158,9 +159,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - cluster_id: localClusterId.value, - })); + return editRef.value + .getValue() + .then(() => ({ + cluster_id: localClusterId.value, + })) + .catch(() => + Promise.reject({ + cluster_id: localClusterId.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/Row.vue index 0311475d0d..6e6e4eb773 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-table-backup/pages/page1/components/RenderData/Row.vue @@ -50,7 +50,9 @@ @@ -70,6 +72,8 @@ ignoreTables?: string[]; } + export type IDataRowBatchKey = keyof Omit; + // 创建表格数据 export const createRowData = (data = {} as Partial): IDataRow => ({ rowKey: random(), @@ -99,6 +103,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -145,16 +150,35 @@ emits('remove'); }; + const getRowData = () => [ + clusterRef.value.getValue(), + // backupSourceRef.value.getValue('backup_on'), + dbPatternsRef.value.getValue('db_patterns'), + tablePatternsRef.value.getValue('table_patterns'), + ignoreDbsRef.value.getValue('ignore_dbs'), + ignoreTablesRef.value.getValue('ignore_tables'), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + rowKey: random(), + clusterData: props.data.clusterData, + dbPatterns: rowInfo[1].db_patterns, + tablePatterns: rowInfo[2].table_patterns, + ignoreDbs: rowInfo[3].ignore_dbs, + ignoreTables: rowInfo[4].ignore_tables, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - clusterRef.value.getValue(), - // backupSourceRef.value.getValue('backup_on'), - dbPatternsRef.value.getValue('db_patterns'), - tablePatternsRef.value.getValue('table_patterns'), - ignoreDbsRef.value.getValue('ignore_dbs'), - ignoreTablesRef.value.getValue('ignore_tables'), - ]).then( + return Promise.all(getRowData()).then( ([ clusterData, // hostData, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue index 251ae881eb..10db1f1bc5 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/Index.vue @@ -30,6 +30,7 @@ + ) => { @@ -111,6 +115,7 @@ type: TicketTypes.MYSQL_FLASHBACK, onSuccess(cloneData) { tableData.value = cloneData.tableDataList; + remark.value = cloneData.remark; window.changeConfirm = true; }, }); @@ -119,8 +124,9 @@ const isShowBatchSelector = ref(false); const isShowBatchEntry = ref(false); const isSubmitting = ref(false); + const tableData = ref>([createRowData({})]); + const remark = ref(''); - const tableData = shallowRef>([createRowData({})]); const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBHA]: [] }); // 集群域名是否已存在表格的映射表 @@ -146,6 +152,18 @@ isShowBatchSelector.value = true; }; + // 批量选择 + const handleBatchEditColumn = (value: string | string[], filed: IDataRowBatchKey) => { + if (!value || checkListEmpty(tableData.value)) { + return; + } + tableData.value.forEach((row) => { + Object.assign(row, { + [filed]: value, + }); + }); + }; + // 批量选择 const handelClusterChange = (selected: Record>) => { selectedClusters.value = selected; @@ -190,13 +208,23 @@ tableData.value = dataList; }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: 'MYSQL_FLASHBACK', - remark: '', + remark: remark.value, details: { infos, }, @@ -220,6 +248,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; selectedClusters.value[ClusterTypes.TENDBHA] = []; domainMemo = {}; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Index.vue index bba1248169..d8fd1c30fc 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Index.vue @@ -28,33 +28,123 @@ :min-width="170" :width="180"> {{ t('回档时间') }} + {{ t('截止时间') }} + {{ t('目标库') }} + {{ t('忽略库') }} + {{ t('目标表') }} + {{ t('忽略表') }} + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderCluster.vue index fbe37e4bbf..6fbf5a2e9c 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderCluster.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderCluster.vue @@ -136,9 +136,10 @@ localClusterId, () => { if (!localClusterId.value) { + clusterIdMemo[instanceKey] = {}; return; } - clusterIdMemo[instanceKey][localClusterId.value] = true; + clusterIdMemo[instanceKey] = { [localClusterId.value]: true }; }, { immediate: true, @@ -151,9 +152,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - cluster_id: localClusterId.value, - })); + return editRef.value + .getValue() + .then(() => ({ + cluster_id: localClusterId.value, + })) + .catch(() => + Promise.reject({ + cluster_id: localClusterId.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderStartTime.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderStartTime.vue index 672a100da0..33cd691e42 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderStartTime.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/RenderStartTime.vue @@ -30,7 +30,6 @@ interface Exposes { getValue: (field: string) => Promise>; } - const modelValue = defineModel({ required: false, }); @@ -51,9 +50,16 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => ({ - start_time: formatDateToUTC(modelValue.value!), - })); + return editRef.value + .getValue() + .then(() => ({ + start_time: formatDateToUTC(modelValue.value!), + })) + .catch(() => + Promise.reject({ + start_time: modelValue.value ? formatDateToUTC(modelValue.value) : modelValue.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Row.vue index 9c5a585b40..b5ac61af31 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/flashback/pages/page1/components/RenderData/Row.vue @@ -60,7 +60,9 @@ @@ -81,6 +83,8 @@ tablesIgnore?: string[]; } + export type IDataRowBatchKey = keyof Omit; + // 创建表格数据 export const createRowData = (data = {} as Partial) => ({ rowKey: random(), @@ -113,6 +117,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -139,14 +144,21 @@ () => { if (props.data.clusterData) { localClusterId.value = props.data.clusterData.id; - localStartTime.value = props.data.startTime; - localEndTime.value = props.data.endTime; } }, { immediate: true, }, ); + + watchEffect(() => { + localStartTime.value = props.data.startTime; + }); + + watchEffect(() => { + localEndTime.value = props.data.endTime; + }); + const handleClusterIdChange = (id: number) => { localClusterId.value = id; }; @@ -162,6 +174,32 @@ emits('remove'); }; + const getRowData = () => [ + clusterRef.value.getValue(), + startTimeRef.value.getValue(), + endTimeRef.value.getValue(), + databasesRef.value.getValue('databases'), + tablesRef.value.getValue('tables'), + databasesIgnoreRef.value.getValue('databases_ignore'), + tablesIgnoreRef.value.getValue('tables_ignore'), + ]; + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits('clone', { + ...props.data, + rowKey: random(), + clusterData: props.data.clusterData, + startTime: rowInfo[1].start_time, + endTime: rowInfo[2].end_time, + databases: rowInfo[3].databases, + tables: rowInfo[4].tables, + databasesIgnore: rowInfo[5].databases_ignore, + tablesIgnore: rowInfo[6].tables_ignore, + }); + }); + }; + defineExpose({ getValue() { return Promise.all([ diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/Index.vue index 00459fe31e..e6b5b77bbf 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/Index.vue @@ -34,6 +34,7 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" />
@@ -51,6 +52,7 @@ {{ t('检查主从数据校验结果') }}
+ { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: 'MYSQL_MASTER_FAIL_OVER', - remark: '', + remark: formData.remark, details: { ...formData, infos, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderMaster.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderMaster.vue index 4886457e2f..34908b1c0f 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderMaster.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderMaster.vue @@ -92,6 +92,7 @@ if (data.length > 0) { const [currentInstanceData] = data; localProxyData = currentInstanceData; + singleHostSelectMemo[instanceKey] = { [genHostKey(currentInstanceData)]: true }; return true; } return false; @@ -131,6 +132,9 @@ localValue.value = props.modelValue.ip; localProxyData = props.modelValue; oldLocalProxyData = props.modelValue; + singleHostSelectMemo[instanceKey] = { [genHostKey(props.modelValue)]: true }; + } else { + singleHostSelectMemo[instanceKey] = {}; } }, { @@ -138,6 +142,10 @@ }, ); + onBeforeUnmount(() => { + delete singleHostSelectMemo[instanceKey]; + }); + defineExpose({ getValue() { const formatHost = (item: IHostData) => ({ @@ -146,9 +154,16 @@ ip: item.ip, bk_cloud_id: item.bk_cloud_id, }); - return editRef.value.getValue().then(() => ({ - master_ip: formatHost(localProxyData), - })); + return editRef.value + .getValue() + .then(() => ({ + master_ip: formatHost(localProxyData), + })) + .catch(() => + Promise.resolve({ + master_ip: formatHost(localProxyData), + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderSlave.vue index 829612b09e..cfe4b3c4e8 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/RenderSlave.vue @@ -77,22 +77,27 @@ }, ]; + // watch( + // () => props.modelValue, + // () => { + // if (props.modelValue) { + // localValue.value = props.modelValue.ip; + // } + // }, + // { + // immediate: true, + // }, + // ); + watch( - () => props.modelValue, + () => props.clusterList, () => { if (props.modelValue) { - localValue.value = props.modelValue.ip; + localValue.value = genHostKey(props.modelValue); + } else { + localValue.value = ''; } - }, - { - immediate: true, - }, - ); - watch( - () => props.clusterList, - () => { - localValue.value = ''; slaveHostSelectList.value = []; allSlaveHostList = []; @@ -106,6 +111,10 @@ label: hostData.ip, })); allSlaveHostList = data; + setTimeout(() => { + // 行复制后,查询到对应数据后消除验证失败的样式 + editRef.value.getValue(); + }); }); } }, @@ -116,12 +125,19 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => { - const slaveHostData = _.find(allSlaveHostList, (item) => genHostKey(item) === localValue.value); - return { - slave_ip: slaveHostData, - }; - }); + return editRef.value + .getValue() + .then(() => { + const slaveHostData = _.find(allSlaveHostList, (item) => genHostKey(item) === localValue.value); + return { + slave_ip: slaveHostData, + }; + }) + .catch(() => + Promise.reject({ + slave_ip: undefined, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/Row.vue index 3ec97b777b..0299cb1f09 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-failover/pages/page1/components/RenderData/Row.vue @@ -33,7 +33,9 @@ @@ -81,6 +83,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -128,13 +131,28 @@ emits('remove'); }; + const getRowData = () => [ + masterHostRef.value.getValue('master_ip'), + slaveHostRef.value.getValue(), + clusterRef.value.getValue(), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + masterData: props.data.masterData, + slaveData: rowInfo[1].slave_ip, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - masterHostRef.value.getValue('master_ip'), - slaveHostRef.value.getValue(), - clusterRef.value.getValue(), - ]).then(([masterHostData, slaveHostData, clusterData]) => ({ + return Promise.all(getRowData()).then(([masterHostData, slaveHostData, clusterData]) => ({ ...masterHostData, ...slaveHostData, ...clusterData, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/Index.vue index 0c8b6e6ea1..add4346f5e 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/Index.vue @@ -38,10 +38,11 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + >([createRowData({})]); const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBHA]: [] }); @@ -207,13 +212,23 @@ tableData.value = dataList; }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: 'MYSQL_MIGRATE_CLUSTER', - remark: '', + remark: remark.value, details: { infos, backup_source: backupSource.value, @@ -239,6 +254,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; selectedClusters.value[ClusterTypes.TENDBHA] = []; domainMemo = {}; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/RenderMasterSlaveHost.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/RenderMasterSlaveHost.vue index 8a885a7b20..f080a9eece 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/RenderMasterSlaveHost.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/RenderMasterSlaveHost.vue @@ -189,7 +189,12 @@ Promise.resolve({ new_master: formatHost(masterHostMemo), new_slave: formatHost(slaveHostMemo), - }), + }).catch(() => + Promise.reject({ + new_master: formatHost(masterHostMemo), + new_slave: formatHost(slaveHostMemo), + }), + ), ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/Row.vue index 9cc7518198..194e4d3fce 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-clone/pages/page1/components/RenderData/Row.vue @@ -30,7 +30,9 @@ @@ -81,6 +83,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -125,9 +128,25 @@ emits('remove'); }; + const getRowData = () => [clusterRef.value.getValue(), hostRef.value.getValue()]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + clusterData: props.data.clusterData, + masterHostData: rowInfo[1].new_master, + slaveHostData: rowInfo[1].new_slave, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([clusterRef.value.getValue(), hostRef.value.getValue()]).then(([clusterData, hostData]) => ({ + return Promise.all(getRowData()).then(([clusterData, hostData]) => ({ ...clusterData, ...hostData, })); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/Index.vue index 24ac0e3268..bd4782483c 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/Index.vue @@ -34,6 +34,7 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" />
@@ -51,6 +52,7 @@ {{ t('检查主从数据校验结果') }}
+ { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: 'MYSQL_MASTER_SLAVE_SWITCH', - remark: '', + remark: formData.remark, details: { ...formData, infos, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderMaster.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderMaster.vue index 8aa41814c7..2027e62599 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderMaster.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderMaster.vue @@ -63,7 +63,7 @@ const props = defineProps(); const emits = defineEmits(); - const genHostKey = (hostData: InstanceInfos) => `#${hostData.bk_cloud_id}#${hostData.ip}`; + const genHostKey = (hostData: IHostData) => `#${hostData.bk_cloud_id}#${hostData.ip}`; const instanceKey = `render_master_${random()}`; singleHostSelectMemo[instanceKey] = {}; @@ -94,6 +94,7 @@ if (data.length > 0) { const [currentInstanceData] = data; localProxyData = currentInstanceData; + singleHostSelectMemo[instanceKey] = { [genHostKey(currentInstanceData)]: true }; return true; } return false; @@ -126,6 +127,9 @@ () => { if (props.modelValue) { localValue.value = props.modelValue.ip; + singleHostSelectMemo[instanceKey] = { [genHostKey(props.modelValue)]: true }; + } else { + singleHostSelectMemo[instanceKey] = {}; } }, { @@ -133,6 +137,10 @@ }, ); + onBeforeUnmount(() => { + delete singleHostSelectMemo[instanceKey]; + }); + defineExpose({ getValue() { const formatHost = (item: InstanceInfos) => ({ @@ -141,9 +149,16 @@ ip: item.ip, bk_cloud_id: item.bk_cloud_id, }); - return editRef.value.getValue().then(() => ({ - master_ip: formatHost(localProxyData), - })); + return editRef.value + .getValue() + .then(() => ({ + master_ip: formatHost(localProxyData), + })) + .catch(() => + Promise.reject({ + master_ip: formatHost(localProxyData), + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue index e5f76af3c8..9c14232c36 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue @@ -118,12 +118,19 @@ defineExpose({ getValue() { - return editRef.value.getValue().then(() => { - const slaveHostData = _.find(allSlaveHostList, (item) => genHostKey(item) === localValue.value); - return { - slave_ip: slaveHostData, - }; - }); + return editRef.value + .getValue() + .then(() => { + const slaveHostData = _.find(allSlaveHostList, (item) => genHostKey(item) === localValue.value); + return { + slave_ip: slaveHostData, + }; + }) + .catch(() => + Promise.reject({ + slave_ip: undefined, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/Row.vue index 84ad1436c9..bf23e5753b 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/master-slave-swap/pages/page1/components/RenderData/Row.vue @@ -33,7 +33,9 @@ @@ -81,6 +83,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -131,6 +134,25 @@ emits('remove'); }; + const getRowData = () => [ + masterHostRef.value.getValue('master_ip'), + slaveHostRef.value.getValue(), + clusterRef.value.getValue(), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + slaveData: rowInfo[1].slave_ip, + masterData: props.data.masterData, + }), + ); + }); + }; + defineExpose({ getValue() { return Promise.all([ diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/Index.vue index 83b2a21e69..d05cc0e2b4 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/Index.vue @@ -22,6 +22,7 @@ :show-ip-cloumn="showIpCloumn" :variable-list="variableList" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @cluster-input-finish="(value) => handleInputCluster(index, value)" @remove="handleRemove(index)" /> @@ -219,6 +220,16 @@ tableData.value = dataList; }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + defineExpose({ getValue() { return Promise.all(rowRefs.value.map((item) => item.getValue())); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnHost.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnHost.vue index 390fe47038..0edc28c6b5 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnHost.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnHost.vue @@ -196,7 +196,11 @@ getValue() { return Promise.resolve({ authorize_ips: localHostList.value.map(({ ip }) => ip), - }); + }).catch(() => + Promise.reject({ + authorize_ips: localHostList.value.map(({ ip }) => ip), + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnVariable.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnVariable.vue index 74ad82a793..d9c0a264d8 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnVariable.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/ColumnVariable.vue @@ -59,9 +59,16 @@ defineExpose({ getValue() { - return (editRef.value as InstanceType).getValue().then(() => ({ - [props.name]: localValue.value, - })); + return (editRef.value as InstanceType) + .getValue() + .then(() => ({ + [props.name]: localValue.value, + })) + .catch(() => + Promise.reject({ + [props.name]: localValue.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/Row.vue index 000417b42d..a4d5726b76 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/create/components/target-cluster/components/Row.vue @@ -38,7 +38,9 @@ @@ -90,6 +92,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; (e: 'clusterInputFinish', value: TendbhaModel): void; } @@ -132,6 +135,26 @@ emits('remove'); }; + const handleClone = () => { + Promise.allSettled([ + clusterRef.value!.getValue(true), + Promise.allSettled(variableRefs.value.map((item) => item.getValue())), + hostRef.value?.getValue(), + ]).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + clusterData: props.data.clusterData, + vars: (rowInfo[1] as PromiseSettledResult>[]) + .map>((item) => (item.status === 'fulfilled' ? item.value : item.reason)) + .reduce>((result, item) => Object.assign(result, item), {}), + authorizeIps: props.showIpCloumn ? rowInfo[2].authorize_ips : [], + }), + ); + }); + }; + defineExpose({ getValue() { return Promise.all([ diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/Index.vue index 60c0c1ff0b..459c34ccbc 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/Index.vue @@ -18,6 +18,7 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> @@ -100,6 +101,16 @@ tableData.value = dataList; }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + defineExpose({ getValue() { return Promise.all(rowRefs.value.map((item) => item.getValue())); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/RenderSourceDb.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/RenderSourceDb.vue index 46ea6a1ea7..b567a8ce2d 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/RenderSourceDb.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/RenderSourceDb.vue @@ -88,9 +88,16 @@ defineExpose({ getValue() { - return (editRef.value as InstanceType).getValue().then(() => ({ - source_db: modelValue.value, - })); + return (editRef.value as InstanceType) + .getValue() + .then(() => ({ + source_db: modelValue.value, + })) + .catch(() => + Promise.reject({ + source_db: modelValue.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/Row.vue index 27f548d0ab..8c6e45d540 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/openarea/template-create/components/config-rule/components/RenderData/Row.vue @@ -39,7 +39,9 @@ @@ -85,6 +87,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -125,13 +128,30 @@ emits('remove'); }; + const getRowData = () => [ + sourceDbRef.value!.getValue(), + tableDataRef.value!.getValue('data_tblist'), + targetDbPatternRef.value!.getValue(), + ]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [sourceDbData, tableDataData, targetDbPatternData] = rowData.map((item) => + item.status === 'fulfilled' ? item.value : item.reason, + ); + emits('clone', { + ...sourceDbData, + ...tableDataData, + ...targetDbPatternData, + rowKey: random(), + schema_tblist: ['*'], + }); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - sourceDbRef.value!.getValue(), - tableDataRef.value!.getValue('data_tblist'), - targetDbPatternRef.value!.getValue(), - ]).then(([sourceDbData, tableDataData, targetDbPatternData]) => ({ + return Promise.all(getRowData()).then(([sourceDbData, tableDataData, targetDbPatternData]) => ({ ...sourceDbData, ...tableDataData, ...targetDbPatternData, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/Index.vue index 60c7338511..6939453861 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/Index.vue @@ -34,8 +34,10 @@ :data="item" :removeable="tableData.length < 2" @add="(payload) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + @@ -85,6 +87,7 @@ import { OSTypes, TicketTypes } from '@common/const'; import IpSelector from '@components/ip-selector/IpSelector.vue'; + import TicketRemark from '@components/ticket-remark/Index.vue'; import BatchInput from './components/BatchInput.vue'; import RenderData from './components/RenderData/Index.vue'; @@ -100,6 +103,7 @@ onSuccess(cloneData) { const { tableDataList } = cloneData; tableData.value = tableDataList; + remark.value = cloneData.remark; window.changeConfirm = true; }, }); @@ -109,6 +113,7 @@ const isShowBatchInput = ref(false); const isSubmitting = ref(false); const tableData = ref>([createRowData({})]); + const remark = ref(''); const selectedIps = shallowRef([]); @@ -188,6 +193,16 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = () => { isSubmitting.value = true; Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())) @@ -204,7 +219,7 @@ return createTicket({ ticket_type: TicketTypes.MYSQL_CLIENT_CLONE_RULES, bk_biz_id: currentBizId, - remark: '', + remark: remark.value, details: { ...precheckResult, clone_type: 'client', @@ -231,6 +246,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; ipMemo = {}; selectedIps.value = []; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/RenderTarget.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/RenderTarget.vue index a02efddd77..772d85cbac 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/RenderTarget.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/RenderTarget.vue @@ -109,9 +109,14 @@ defineExpose({ getValue() { - return inputRef.value.getValue().then(() => ({ - target: localIpText.value.split(splitReg).join('\n'), - })); + return inputRef.value + .getValue() + .then(() => ({ + target: localIpText.value.split(splitReg).join('\n'), + })) + .catch(() => ({ + target: '', + })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/Row.vue index a908543815..f7fdffd1e5 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-client/pages/page1/components/RenderData/Row.vue @@ -32,7 +32,9 @@ @@ -73,6 +75,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -111,6 +114,22 @@ emits('remove'); }; + const handleClone = () => { + Promise.allSettled([sourceRef.value!.getValue(), moduleRef.value!.getValue(), targetRef.value!.getValue()]).then( + (rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + rowKey: random(), + source: props.data.source, + target: rowInfo[2].target.split(','), + }), + ); + }, + ); + }; + defineExpose({ getValue() { return Promise.all([sourceRef.value!.getValue(), moduleRef.value!.getValue(), targetRef.value!.getValue()]).then( diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/Index.vue index 2aefaacb6d..b598c0730a 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/Index.vue @@ -34,8 +34,10 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + @@ -88,6 +90,7 @@ type InstanceSelectorValues, type PanelListType, } from '@components/instance-selector/Index.vue'; + import TicketRemark from '@components/ticket-remark/Index.vue'; import BatchInput from './components/BatchInput.vue'; import RenderData from './components/RenderData/Index.vue'; @@ -104,6 +107,7 @@ type: TicketTypes.MYSQL_INSTANCE_CLONE_RULES, onSuccess(cloneData) { tableData.value = cloneData.tableDataList; + remark.value = cloneData.remark; window.changeConfirm = true; }, }); @@ -113,6 +117,7 @@ const isSubmitting = ref(false); const isShowBatchInput = ref(false); const tableData = ref>([createRowData({})]); + const remark = ref(''); const selectedIps = shallowRef>({ tendbha: [], @@ -269,6 +274,16 @@ } }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = () => { isSubmitting.value = true; Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())) @@ -285,7 +300,7 @@ const params = { ticket_type: TicketTypes.MYSQL_INSTANCE_CLONE_RULES, - remark: '', + remark: remark.value, details: { ...precheckResult, clone_type: 'instance', @@ -314,6 +329,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; instanceMemo = {}; selectedIps.value.tendbha = []; selectedIps.value.tendbsingle = []; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderSource.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderSource.vue index 03f883eeb2..cde71fdda1 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderSource.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderSource.vue @@ -82,7 +82,7 @@ if (data.length < 1) { return false; } - instanceAddreddMemo[instanceKey][value] = true; + instanceAddreddMemo[instanceKey] = { [value]: true }; const [currentInstanceData] = data; @@ -132,7 +132,9 @@ if (modelValue.value) { localInstanceAddress.value = modelValue.value.instanceAddress; - instanceAddreddMemo[instanceKey][localInstanceAddress.value] = true; + instanceAddreddMemo[instanceKey] = { [localInstanceAddress.value]: true }; + } else { + instanceAddreddMemo[instanceKey] = {}; } }, { diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderTarget.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderTarget.vue index 0b331bd2ea..e6c63b6603 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderTarget.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/RenderTarget.vue @@ -73,7 +73,7 @@ return false; } [localInstanceData] = data; - instanceAddreddMemo[instanceKey][localInstanceAddress.value] = true; + instanceAddreddMemo[instanceKey] = { [localInstanceAddress.value]: true }; return true; }), @@ -116,7 +116,9 @@ if (props.modelValue) { localInstanceAddress.value = props.modelValue.instance_address; - instanceAddreddMemo[instanceKey][localInstanceAddress.value] = true; + instanceAddreddMemo[instanceKey] = { [localInstanceAddress.value]: true }; + } else { + instanceAddreddMemo[instanceKey] = {}; } }, { @@ -131,9 +133,16 @@ defineExpose({ getValue() { // 用户输入未完成验证 - return editRef.value.getValue().then(() => ({ - target: localInstanceAddress.value, - })); + return editRef.value + .getValue() + .then(() => ({ + target: localInstanceAddress.value, + })) + .catch(() => + Promise.reject({ + target: localInstanceAddress.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/Row.vue index 0760573d41..e723a36e53 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/privilege-clone-inst/pages/page1/components/RenderData/Row.vue @@ -31,7 +31,9 @@ @@ -85,6 +87,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -125,6 +128,27 @@ emits('remove'); }; + const handleClone = () => { + Promise.allSettled([sourceRef.value!.getValue(), targetRef.value!.getValue()]).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + rowKey: random(), + source: props.data.source, + target: { + cluster_id: 0, + bk_host_id: 0, + bk_cloud_id: 0, + port: 0, + ip: '', + instance_address: rowInfo[1].target, + }, + }), + ); + }); + }; + defineExpose({ getValue() { return Promise.all([sourceRef.value!.getValue(), targetRef.value!.getValue()]).then( diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/Index.vue index 6dec5165b7..bbd4cfeda2 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/Index.vue @@ -34,8 +34,10 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + >([createRowData({})]); const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBHA]: [] }); @@ -184,13 +189,23 @@ tableData.value = dataList; }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value[rowRefs.value.length - 1].getValue(); + }); + }; + const handleSubmit = async () => { try { isSubmitting.value = true; const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: 'MYSQL_PROXY_ADD', - remark: '', + remark: remark.value, details: { infos, }, @@ -215,6 +230,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + remark.value = ''; selectedClusters.value[ClusterTypes.TENDBHA] = []; domainMemo = {}; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/RenderProxy.vue b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/RenderProxy.vue index 3fe905a8d3..eba10945f5 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/RenderProxy.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/RenderProxy.vue @@ -113,11 +113,18 @@ ip: item.ip, bk_cloud_id: item.bk_cloud_id, }); - return inputRef.value.getValue().then(() => - Promise.resolve({ - new_proxy: formatHost(localHostData), - }), - ); + return inputRef.value + .getValue() + .then(() => + Promise.resolve({ + new_proxy: formatHost(localHostData), + }), + ) + .catch(() => + Promise.reject({ + new_proxy: formatHost(localHostData), + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/Row.vue index 71302129fe..0351d161a1 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/proxy-add/pages/page1/components/RenderData/Row.vue @@ -17,7 +17,7 @@ @@ -30,7 +30,9 @@ @@ -62,6 +64,7 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/common/RenderBackup.vue b/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/common/RenderBackup.vue index 333a92251f..91a374ec00 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/common/RenderBackup.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/common/RenderBackup.vue @@ -76,9 +76,16 @@ defineExpose({ getValue() { - return editSelectRef.value!.getValue().then(() => ({ - backup_source: localValue.value, - })); + return editSelectRef + .value!.getValue() + .then(() => ({ + backup_source: localValue.value, + })) + .catch(() => + Promise.reject({ + backup_source: localValue.value, + }), + ); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/render-data/exist-cluster/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/render-data/exist-cluster/Row.vue index f5727e666a..75d8ced9c8 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/render-data/exist-cluster/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/rollback/pages/page1/components/render-data/exist-cluster/Row.vue @@ -73,6 +73,7 @@ @@ -99,6 +100,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -144,6 +146,8 @@ emits('remove'); }; + const handleClone = () => {}; + watch( () => props.data, () => { diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/Index.vue index abacef8f92..dfee4402f1 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/Index.vue @@ -33,6 +33,7 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> @@ -218,6 +219,16 @@ tableData.value.splice(index, 1); }; + // 复制行数据 + const handleClone = (index: number, sourceData: IDataRow) => { + const dataList = [...tableData.value]; + dataList.splice(index + 1, 0, sourceData); + tableData.value = dataList; + setTimeout(() => { + rowRefs.value![rowRefs.value!.length - 1].getValue(); + }); + }; + const handleReset = () => { tableData.value = [createRowData()]; selectedClusters.value[ClusterTypes.TENDBHA] = []; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/RenderSlaveHost.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/RenderSlaveHost.vue index 094ff6834d..5a69a783f3 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/RenderSlaveHost.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/RenderSlaveHost.vue @@ -153,11 +153,16 @@ ip: item.ip, }); - return inputRef.value.getValue().then(() => - Promise.resolve({ - new_slave: formatHost(hostMemo), - }), - ); + return inputRef.value + .getValue() + .then(() => + Promise.resolve({ + new_slave: formatHost(hostMemo), + }), + ) + .catch(() => { + Promise.reject(''); + }); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/Row.vue index 7b5ea44b7f..f625ab9c2d 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-add/pages/page1/components/RenderData/Row.vue @@ -16,7 +16,8 @@ @@ -29,7 +30,9 @@ @@ -69,7 +72,10 @@ }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/Index.vue index b04f6400ea..3e8d828a17 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/Index.vue @@ -24,10 +24,11 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue index c8ab980771..01b3b84d49 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue @@ -31,7 +31,9 @@ @@ -62,7 +64,7 @@ bkCloudId: number; bkHostId: number; ip: string; - port: number; + // port: number; }; } @@ -82,6 +84,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -123,15 +126,34 @@ emits('remove'); }; + const getRowData = () => [slaveRef.value!.getValue(), clusterRef.value!.getValue(), newSlaveRef.value!.getValue()]; + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const rowInfo = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + const newSlaveData = rowInfo[2]; + emits( + 'clone', + createRowData({ + oldSlave: localOldSlave.value, + clusterId: rowInfo[0]?.old_slave.cluster_id, + newSlave: newSlaveData + ? { + bkBizId: newSlaveData.new_slave.bk_biz_id, + bkCloudId: newSlaveData.new_slave.bk_cloud_id, + bkHostId: newSlaveData.new_slave.bk_host_id, + ip: newSlaveData.new_slave.ip, + } + : undefined, + }), + ); + }); + }; + defineExpose({ getValue() { - return Promise.all([ - slaveRef.value!.getValue(), - clusterRef.value!.getValue(), - newSlaveRef.value!.getValue(), - ]).then(([sourceData, moduleData, newSlaveData]) => ({ + return Promise.all(getRowData()).then(([sourceData, clusterData, newSlaveData]) => ({ ...sourceData, - ...moduleData, + ...clusterData, ...newSlaveData, })); }, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/Index.vue index 70b0863ede..bf2fe0e4a3 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/Index.vue @@ -24,10 +24,11 @@ :data="item" :removeable="tableData.length < 2" @add="(payload: Array) => handleAppend(index, payload)" + @clone="(payload: IDataRow) => handleClone(index, payload)" @remove="handleRemove(index)" /> + + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/components/RenderData/Row.vue index 8b139299b0..7c18bd4168 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/slave-rebuild/pages/page1/components/original-host/components/RenderData/Row.vue @@ -25,7 +25,9 @@ @@ -66,6 +68,7 @@ interface Emits { (e: 'add', params: Array): void; (e: 'remove'): void; + (e: 'clone', value: IDataRow): void; } interface Exposes { @@ -104,14 +107,36 @@ emits('remove'); }; - defineExpose({ - getValue() { - return Promise.all([slaveRef.value.getValue('master_ip'), clusterRef.value.getValue()]).then( - ([sourceData, moduleData]) => ({ - ...sourceData, - ...moduleData, + const getRowData = () => [slaveRef.value.getValue('master_ip'), clusterRef.value.getValue()]; + + const handleClone = () => { + Promise.allSettled(getRowData()).then((rowData) => { + const [sourceData, clusterData] = rowData.map((item) => (item.status === 'fulfilled' ? item.value : item.reason)); + emits( + 'clone', + createRowData({ + slave: sourceData + ? { + bkCloudId: sourceData.slave.bk_cloud_id, + bkHostId: sourceData.slave.bk_host_id, + ip: sourceData.slave.ip, + port: sourceData.slave.port, + instanceAddress: sourceData.slave.instance_address, + clusterId: clusterData.cluster_id, + } + : undefined, + clusterId: clusterData.cluster_id, }), ); + }); + }; + + defineExpose({ + getValue() { + return Promise.all(getRowData()).then(([sourceData, clusterData]) => ({ + ...sourceData, + ...clusterData, + })); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/sql-execute/steps/step1/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/sql-execute/steps/step1/Index.vue index 0147ec7b21..3d3e5710a4 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/sql-execute/steps/step1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/sql-execute/steps/step1/Index.vue @@ -23,7 +23,7 @@ :model="formData"> + @@ -96,6 +97,7 @@ type: TicketTypes.MYSQL_PROXY_UPGRADE, onSuccess(cloneData) { tableList.value = cloneData.tableList; + remark.value = cloneData.remark; window.changeConfirm = true; formData.roleType = 'haAccessLayer'; }, @@ -106,6 +108,7 @@ type: TicketTypes.MYSQL_LOCAL_UPGRADE, onSuccess(cloneData) { tableList.value = cloneData.tableList; + remark.value = cloneData.remark; window.changeConfirm = true; const isSingle = cloneData.tableList[0].clusterData.clusterType === ClusterTypes.TENDBSINGLE; @@ -119,6 +122,7 @@ type: TicketTypes.MYSQL_MIGRATE_UPGRADE, onSuccess(cloneData) { backupSource.value = cloneData.backupSource; + remark.value = cloneData.remark; window.changeConfirm = true; formData.roleType = 'haStorageLayer'; @@ -152,6 +156,7 @@ ]; const backupSource = ref(''); + const remark = ref(''); const tableList = shallowRef< HaAccessLayerRow[] | HaStorageLayerLocalRow[] | HaStorageLayerRemoteRow[] | SingleStorageRow[] @@ -184,6 +189,7 @@ () => formData.updateType, () => { tableList.value = []; + remark.value = ''; if (formData.updateType === '') { formData.updateType = 'local'; } @@ -191,6 +197,7 @@ ); const handleRoleTypeChange = () => { + remark.value = ''; tableList.value = []; }; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-access-layer/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-access-layer/Index.vue index ff706836cd..8702b68815 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-access-layer/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-access-layer/Index.vue @@ -56,6 +56,7 @@ @remove="handleRemove(index)" /> + }>({ [ClusterTypes.TENDBHA]: [] }); @@ -138,6 +141,16 @@ }, ); + watch( + () => props.remark, + () => { + localRemark.value = props.remark; + }, + { + immediate: true, + }, + ); + const handleShowMasterBatchSelector = () => { isShowClusterSelector.value = true; }; @@ -237,7 +250,7 @@ const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: TicketTypes.MYSQL_PROXY_UPGRADE, - remark: '', + remark: localRemark.value, details: { infos, }, @@ -262,6 +275,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + localRemark.value = ''; domainMemo = {}; selectedClusters.value[ClusterTypes.TENDBHA] = []; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-local/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-local/Index.vue index ec95d76ba2..f1e2f52484 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-local/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-local/Index.vue @@ -52,6 +52,7 @@ @remove="handleRemove(index)" /> + }>({ [ClusterTypes.TENDBHA]: [] }); @@ -130,6 +134,16 @@ }, ); + watch( + () => props.remark, + () => { + localRemark.value = props.remark; + }, + { + immediate: true, + }, + ); + // 集群域名是否已存在表格的映射表 let domainMemo: Record = {}; @@ -234,7 +248,7 @@ const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: TicketTypes.MYSQL_LOCAL_UPGRADE, - remark: '', + remark: localRemark.value, details: { infos, }, @@ -259,6 +273,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + localRemark.value = ''; domainMemo = {}; selectedClusters.value[ClusterTypes.TENDBHA] = []; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-remote/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-remote/Index.vue index 5b0409faa4..f21a9ab826 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-remote/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/ha-storage-layer-remote/Index.vue @@ -73,6 +73,7 @@ + }>({ [ClusterTypes.TENDBHA]: [] }); @@ -163,6 +167,16 @@ }, ); + watch( + () => props.remark, + () => { + localRemark.value = props.remark; + }, + { + immediate: true, + }, + ); + // 集群域名是否已存在表格的映射表 let domainMemo: Record = {}; @@ -267,7 +281,7 @@ const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: TicketTypes.MYSQL_MIGRATE_UPGRADE, - remark: '', + remark: localRemark.value, details: { ip_source: 'manual_input', backup_source: localBackupSource.value, @@ -294,6 +308,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + localRemark.value = ''; domainMemo = {}; selectedClusters.value[ClusterTypes.TENDBHA] = []; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Index.vue index dfa4c0244e..d1f99c2fa5 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Index.vue @@ -52,6 +52,7 @@ @remove="handleRemove(index)" /> + }>({ [ClusterTypes.TENDBSINGLE]: [] }); @@ -130,6 +134,16 @@ }, ); + watch( + () => props.remark, + () => { + localRemark.value = props.remark; + }, + { + immediate: true, + }, + ); + // 集群域名是否已存在表格的映射表 let domainMemo: Record = {}; @@ -214,7 +228,7 @@ const infos = await Promise.all(rowRefs.value.map((item: { getValue: () => Promise }) => item.getValue())); await createTicket({ ticket_type: TicketTypes.MYSQL_LOCAL_UPGRADE, - remark: '', + remark: localRemark.value, details: { infos, }, @@ -239,6 +253,7 @@ const handleReset = () => { tableData.value = [createRowData()]; + localRemark.value = ''; domainMemo = {}; selectedClusters.value[ClusterTypes.TENDBHA] = []; window.changeConfirm = false; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Row.vue index 5b789f50c2..89b72c6b22 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/version-upgrade/pages/page1/components/single-storage-layer/Row.vue @@ -30,6 +30,7 @@ ref="targetVersionRef" :data="data.clusterData" :is-loading="data.isLoading" + :target-package="data.targetPackage" @module-change="handleModuleChange" /> + diff --git a/dbm-ui/frontend/src/components/cluster-entry-config/MultipleInput.vue b/dbm-ui/frontend/src/components/cluster-entry-config/MultipleInput.vue deleted file mode 100644 index 740f316609..0000000000 --- a/dbm-ui/frontend/src/components/cluster-entry-config/MultipleInput.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - diff --git a/dbm-ui/frontend/src/components/cluster-entry-config/RenderBindIps.vue b/dbm-ui/frontend/src/components/cluster-entry-config/RenderBindIps.vue new file mode 100644 index 0000000000..e13f1b5db4 --- /dev/null +++ b/dbm-ui/frontend/src/components/cluster-entry-config/RenderBindIps.vue @@ -0,0 +1,228 @@ + + + + diff --git a/dbm-ui/frontend/src/components/render-instances/RenderInstances.vue b/dbm-ui/frontend/src/components/render-instances/RenderInstances.vue index c98879269e..742d6ed421 100644 --- a/dbm-ui/frontend/src/components/render-instances/RenderInstances.vue +++ b/dbm-ui/frontend/src/components/render-instances/RenderInstances.vue @@ -35,6 +35,9 @@ size="small"> {{ t('不可用') }} + - - + + diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/ha-instance-list/components/List.vue b/dbm-ui/frontend/src/views/db-manage/mysql/ha-instance-list/components/List.vue index 09ee42de1f..f32fde52d6 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/ha-instance-list/components/List.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/ha-instance-list/components/List.vue @@ -176,7 +176,7 @@ label: t('实例'), field: 'instance_address', fixed: 'left', - minWidth: 200, + width: 200, showOverflowTooltip: false, render: ({ cell, data }: ColumnData) => ( @@ -198,36 +198,6 @@ ), }, - { - label: t('集群名称'), - field: 'cluster_name', - minWidth: 200, - showOverflowTooltip: false, - render: ({ cell, data }: ColumnData) => ( - - {{ - default: () => ( - handleToClusterDetails(data)}> - {cell} - - ), - append: () => ( - copy(cell)} /> - ), - }} - - ), - }, { label: t('状态'), field: 'status', @@ -255,9 +225,18 @@ }, }, { - label: t('主访问入口'), + label: t('部署角色'), + field: 'role', + width: 140, + filter: { + list: columnAttrs.value.role, + checked: columnCheckedMap.value.role, + }, + }, + { + label: t('所属集群'), field: 'master_domain', - minWidth: 200, + width: 260, showOverflowTooltip: false, render: ({ cell }: ColumnData) => ( @@ -265,7 +244,7 @@ default: () => cell, append: () => ( copy(cell)} /> @@ -275,17 +254,27 @@ ), }, { - label: t('从访问入口'), - field: 'slave_domain', - minWidth: 200, + label: t('集群名称'), + field: 'cluster_name', + width: 180, showOverflowTooltip: false, - render: ({ cell }: ColumnData) => ( + render: ({ cell, data }: ColumnData) => ( {{ - default: () => cell, + default: () => ( + handleToClusterDetails(data)}> + {cell} + + ), append: () => ( copy(cell)} /> @@ -294,19 +283,10 @@ ), }, - { - label: t('部署角色'), - field: 'role', - width: 100, - filter: { - list: columnAttrs.value.role, - checked: columnCheckedMap.value.role, - }, - }, { label: t('部署时间'), field: 'create_at', - width: 250, + width: 240, sort: true, render: ({ data }: { data: TendbhaInstanceModel }) => data.createAtDisplay || '--', }, diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/single-cluster-list/components/List.vue b/dbm-ui/frontend/src/views/db-manage/mysql/single-cluster-list/components/List.vue index efbfd46c33..e88f3070f3 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/single-cluster-list/components/List.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/single-cluster-list/components/List.vue @@ -86,10 +86,6 @@ - >(); const isShowExcelAuthorize = ref(false); const showDataExportSlider = ref(false) - const showEditEntryConfig = ref(false); const selected = ref([]) - const currentData = ref() + const currentData = ref(); const authorizeState = reactive({ isShow: false, @@ -359,17 +355,14 @@ } ] } /> - handleOpenEntryConfig(data)}> - - + + + ), }} @@ -807,11 +800,6 @@ isShowExcelAuthorize.value = true; }; - const handleOpenEntryConfig = (row: TendbsingleModel) => { - showEditEntryConfig.value = true; - clusterId.value = row.id; - }; - const handleShowDataExportSlider = (data: TendbsingleModel) => { currentData.value = data showDataExportSlider.value = true; @@ -975,7 +963,7 @@ } .db-icon-copy, - .db-icon-edit { + .db-icon-visible1 { display: none; margin-top: 1px; margin-left: 4px; @@ -1007,7 +995,7 @@ :deep(td:hover) { .db-icon-copy, - .db-icon-edit { + .db-icon-visible1 { display: inline-block !important; } } diff --git a/dbm-ui/frontend/src/views/db-manage/pulsar/list/components/list/Index.vue b/dbm-ui/frontend/src/views/db-manage/pulsar/list/components/list/Index.vue index 0bef32bc71..37c26e6d67 100644 --- a/dbm-ui/frontend/src/views/db-manage/pulsar/list/components/list/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/pulsar/list/components/list/Index.vue @@ -93,10 +93,6 @@ - diff --git a/dbm-ui/frontend/src/components/db-table/OriginalTable.vue b/dbm-ui/frontend/src/components/db-table/OriginalTable.vue index 9f67cf7414..d8b2321882 100644 --- a/dbm-ui/frontend/src/components/db-table/OriginalTable.vue +++ b/dbm-ui/frontend/src/components/db-table/OriginalTable.vue @@ -41,9 +41,9 @@ (e: 'clearSearch'): void; } interface Props { - columns: InstanceType['$props']['columns'], - isAnomalies?: boolean, - isSearching?: boolean, + columns: InstanceType['$props']['columns']; + isAnomalies?: boolean; + isSearching?: boolean; } const props = withDefaults(defineProps(), { @@ -55,9 +55,12 @@ const tableKey = ref(Date.now().toString()); - watch(() => props.columns, () => { - tableKey.value = Date.now().toString(); - }); + watch( + () => props.columns, + () => { + tableKey.value = Date.now().toString(); + }, + ); const handleRefresh = () => emits('refresh'); const handleClearSearch = () => emits('clearSearch'); diff --git a/dbm-ui/frontend/src/components/editable-info/index.vue b/dbm-ui/frontend/src/components/editable-info/index.vue index eee90a1d03..408a20cfc5 100644 --- a/dbm-ui/frontend/src/components/editable-info/index.vue +++ b/dbm-ui/frontend/src/components/editable-info/index.vue @@ -149,14 +149,14 @@ diff --git a/dbm-ui/frontend/src/components/mysql-toolbox/common/const.ts b/dbm-ui/frontend/src/components/mysql-toolbox/common/const.ts deleted file mode 100644 index d671ba5564..0000000000 --- a/dbm-ui/frontend/src/components/mysql-toolbox/common/const.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. - * - * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at https://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on 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 { t } from '@locales/index'; - -/** - * 备份(源)列表 - */ -export const backupList = [ - { - value: 'local', - label: t('本地备份'), - }, -]; diff --git a/dbm-ui/frontend/src/components/router-back/Index.vue b/dbm-ui/frontend/src/components/router-back/Index.vue index b1fcad080c..35cd263b6d 100644 --- a/dbm-ui/frontend/src/components/router-back/Index.vue +++ b/dbm-ui/frontend/src/components/router-back/Index.vue @@ -9,13 +9,8 @@ - - diff --git a/dbm-ui/frontend/src/components/vue2/search-select/index.vue b/dbm-ui/frontend/src/components/vue2/search-select/index.vue index 4dce963b81..410929a50d 100644 --- a/dbm-ui/frontend/src/components/vue2/search-select/index.vue +++ b/dbm-ui/frontend/src/components/vue2/search-select/index.vue @@ -41,26 +41,25 @@ + + diff --git a/dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue b/dbm-ui/frontend/src/views/db-manage/common/ExcelAuthorize.vue similarity index 100% rename from dbm-ui/frontend/src/components/cluster-common/ExcelAuthorize.vue rename to dbm-ui/frontend/src/views/db-manage/common/ExcelAuthorize.vue diff --git a/dbm-ui/frontend/src/components/cluster-common/OperationBtnStatusTips.vue b/dbm-ui/frontend/src/views/db-manage/common/OperationBtnStatusTips.vue similarity index 96% rename from dbm-ui/frontend/src/components/cluster-common/OperationBtnStatusTips.vue rename to dbm-ui/frontend/src/views/db-manage/common/OperationBtnStatusTips.vue index 023c86ba5e..ec57b828b6 100644 --- a/dbm-ui/frontend/src/components/cluster-common/OperationBtnStatusTips.vue +++ b/dbm-ui/frontend/src/views/db-manage/common/OperationBtnStatusTips.vue @@ -121,11 +121,11 @@ }); diff --git a/dbm-ui/frontend/src/components/cluster-common/RenderBaseInfo.vue b/dbm-ui/frontend/src/views/db-manage/common/RenderBaseInfo.vue similarity index 96% rename from dbm-ui/frontend/src/components/cluster-common/RenderBaseInfo.vue rename to dbm-ui/frontend/src/views/db-manage/common/RenderBaseInfo.vue index e4c58b5799..5018e374d1 100644 --- a/dbm-ui/frontend/src/components/cluster-common/RenderBaseInfo.vue +++ b/dbm-ui/frontend/src/views/db-manage/common/RenderBaseInfo.vue @@ -53,7 +53,7 @@ + + diff --git a/dbm-ui/frontend/src/components/cluster-entry-config/RenderBindIps.vue b/dbm-ui/frontend/src/views/db-manage/common/cluster-entry-config/RenderBindIps.vue similarity index 100% rename from dbm-ui/frontend/src/components/cluster-entry-config/RenderBindIps.vue rename to dbm-ui/frontend/src/views/db-manage/common/cluster-entry-config/RenderBindIps.vue diff --git a/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue b/dbm-ui/frontend/src/views/db-manage/common/cluster-event-change/EventChange.vue similarity index 99% rename from dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue rename to dbm-ui/frontend/src/views/db-manage/common/cluster-event-change/EventChange.vue index d6a9b8eea6..06822db88b 100644 --- a/dbm-ui/frontend/src/components/cluster-event-change/EventChange.vue +++ b/dbm-ui/frontend/src/views/db-manage/common/cluster-event-change/EventChange.vue @@ -151,7 +151,6 @@ state.daterange = ['', '']; fetchData(); } - diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/TargetClusterPreview.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/TargetClusterPreview.vue index 0ae1daa6b3..f1e0eda51c 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/TargetClusterPreview.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/TargetClusterPreview.vue @@ -57,7 +57,7 @@ import { useDefaultPagination } from '@hooks'; - import RenderClusterStatus from '@components/cluster-common/RenderStatus.vue'; + import RenderClusterStatus from '@components/cluster-status/Index.vue'; import { getSearchSelectorParams } from '@utils'; diff --git a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/script-execute/components/RenderFileContent.vue b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/script-execute/components/RenderFileContent.vue index 5b50f2d0a8..9e2a4a1e11 100644 --- a/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/script-execute/components/RenderFileContent.vue +++ b/dbm-ui/frontend/src/views/tickets/common/components/demand-factory/mongodb/script-execute/components/RenderFileContent.vue @@ -39,24 +39,19 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/AccountDialog.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/AccountDialog.vue index 68992d9ab7..be531bb09e 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/AccountDialog.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/permission/components/AccountDialog.vue @@ -6,7 +6,7 @@ :is-show="accountDialogIsShow" :quick-close="false" :title="t('新建账号')" - :width="480" + :width="580" @closed="handleClose"> + :maxlength="32" + :placeholder="userPlaceholder" + show-word-limit />

{{ t('账号创建后,不支持修改。') }}

@@ -185,7 +187,7 @@ { trigger: 'change', message: userPlaceholder, - validator: (value: string) => /^[a-z0-9][a-z0-9-_.]*$/g.test(value), + validator: (value: string) => /^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,31}$/.test(value), }, ], password: [ diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/AddAccountDialog.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/AddAccountDialog.vue index 83edae3ad0..8865f287e2 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/AddAccountDialog.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/permission/components/AddAccountDialog.vue @@ -19,7 +19,7 @@ :is-show="isShow" :quick-close="false" :title="t('新建账号')" - :width="480" + :width="580" @closed="handleClose"> + :maxlength="32" + :placeholder="userPlaceholder" + show-word-limit />

{{ t('账号创建后,不支持修改。') }}

@@ -208,7 +210,7 @@ { trigger: 'change', message: userPlaceholder, - validator: (value: string) => /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,31}$/g.test(value), + validator: (value: string) => /^[a-zA-Z0-9][a-zA-Z0-9-_.]{0,31}$/.test(value), }, ], password: [ From 29b1cb1992a04ae1d581f2452af4c8106e9351fc Mon Sep 17 00:00:00 2001 From: yuanruji Date: Fri, 27 Sep 2024 10:47:53 +0800 Subject: [PATCH 072/164] =?UTF-8?q?fix(dbm-services):=20tendbcluster=20sql?= =?UTF-8?q?=20=E5=8F=98=E6=9B=B4test=E7=9A=84=E5=A4=84=E7=90=86=20#7163?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/components/mysql/semantic_dump_schema.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go index 5171362327..de0a00f261 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/semantic_dump_schema.go @@ -71,8 +71,9 @@ type DumpSchemaRunTimeCtx struct { dbs []string // 需要备份的表结构的数据库名称集合 charset string // 当前实例的字符集 dumpCmd string - useTmysqldump bool // 使用自研的mysqldump 并发导出 - isSpider bool // 是否spider中控 + useTmysqldump bool // 使用自研的mysqldump 并发导出 + isSpider bool // 是否spider中控 + ignoreTables []string // 忽略的表集合 } // Example godoc @@ -136,7 +137,8 @@ func (c *SemanticDumpSchemaComp) Init() (err error) { reg := regexp.MustCompile(`^bak_cbs`) ignoreDBs := computil.GetGcsSystemDatabasesIgnoreTest(version) if c.isSpider { - ignoreDBs = computil.GetGcsSystemDatabases(version) + // test 库里面的这些表没有主键,导入中控会失败 + c.ignoreTables = []string{"test.conn_log", "test.free_space"} } for _, db := range util.FilterOutStringSlice(alldbs, ignoreDBs) { if reg.MatchString(db) { @@ -200,6 +202,7 @@ func (c *SemanticDumpSchemaComp) DumpSchema() (err error) { DbBackupUser: c.GeneralParam.RuntimeAccountParam.AdminUser, DbBackupPwd: c.GeneralParam.RuntimeAccountParam.AdminPwd, DbNames: c.dbs, + IgnoreTables: c.ignoreTables, DumpCmdFile: c.dumpCmd, Charset: c.charset, MySQLDumpOption: dumpOption, @@ -261,7 +264,7 @@ func (c UploadBkRepoParam) Upload() (err error) { resp.RequestId, ) logger.Error(errMsg) - return fmt.Errorf(errMsg) + return fmt.Errorf("%s", errMsg) } logger.Info("resp: code:%d,msg:%s,traceid:%s", resp.Code, resp.Message, resp.RequestId) var uploadRespdata bkrepo.UploadRespData From df867196e987fe4264a5e3415df86171977a9124 Mon Sep 17 00:00:00 2001 From: yuanruji Date: Thu, 26 Sep 2024 10:54:15 +0800 Subject: [PATCH 073/164] =?UTF-8?q?refactor(dbm-services):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A8=A1=E6=8B=9F=E6=89=A7=E8=A1=8C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=20#7140?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-services/mysql/db-simulation/app/service/simulation_task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-services/mysql/db-simulation/app/service/simulation_task.go b/dbm-services/mysql/db-simulation/app/service/simulation_task.go index b68cf6e3a4..ad1c88f3ce 100644 --- a/dbm-services/mysql/db-simulation/app/service/simulation_task.go +++ b/dbm-services/mysql/db-simulation/app/service/simulation_task.go @@ -313,7 +313,7 @@ func (t *SimulationTask) executeOneObject(e ExcuteSQLFileObj, containerName stri } realexcutedbs = util.FilterOutStringSlice(intentionDbs, ignoreDbs) if len(realexcutedbs) == 0 { - return "", "", fmt.Errorf("the changed db does not exist") + return "", "", fmt.Errorf("需要执行的db:%v,需要忽略的db:%v,查询线上存在的db,计算后没有找到任何变更的目标db,请检查你的输入是否正确", e.DbNames, e.IgnoreDbNames) } for idx, cmd := range t.getLoadSQLCmd(t.Path, e.SQLFile, realexcutedbs) { sstdout += util.RemovePassword(cmd) + "\n" From 4bc6ee045ab2dfbecda9434c4a2611a21e5d12fb Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 27 Sep 2024 11:34:22 +0800 Subject: [PATCH 074/164] =?UTF-8?q?fix(backend):=20=E5=8F=98=E6=9B=B4SQL?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=87=E6=B3=A8=20#7167?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/bk_web/constants.py | 3 +++ dbm-ui/backend/db_services/mysql/sql_import/serializers.py | 2 +- .../backend/ticket/builders/mysql/mysql_import_sqlfile.py | 3 ++- .../ticket/builders/tendbcluster/tendb_import_sqlfile.py | 7 ------- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/dbm-ui/backend/bk_web/constants.py b/dbm-ui/backend/bk_web/constants.py index 90506daa5d..5bba47b9b3 100644 --- a/dbm-ui/backend/bk_web/constants.py +++ b/dbm-ui/backend/bk_web/constants.py @@ -75,6 +75,9 @@ "/apis/conf/function_controller/", # 环境变量 "/apis/conf/system_settings/environ/", + # django + "/swagger/", + "/admin/", ] # 外部请求允许的白名单单据类型 diff --git a/dbm-ui/backend/db_services/mysql/sql_import/serializers.py b/dbm-ui/backend/db_services/mysql/sql_import/serializers.py index e4b68fec1a..684daa8664 100644 --- a/dbm-ui/backend/db_services/mysql/sql_import/serializers.py +++ b/dbm-ui/backend/db_services/mysql/sql_import/serializers.py @@ -98,7 +98,7 @@ class SQLImportBackUpSerializer(serializers.Serializer): help_text=_("集群类型,默认为mysql"), choices=DBType.get_choices(), required=False, default=DBType.MySQL ) is_auto_commit = serializers.BooleanField(help_text=_("模拟执行成功后是否自动提单"), required=False, default=True) - remark = serializers.CharField(help_text=_("提单备注"), required=False, default="") + remark = serializers.CharField(help_text=_("提单备注"), required=False, default="", allow_blank=True) class Meta: swagger_schema_fields = {"example": mock_data.SQL_SEMANTIC_CHECK_REQUEST_DATA} diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py b/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py index 9bfb2960b7..9066919938 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_import_sqlfile.py @@ -232,5 +232,6 @@ def init_ticket_flows(self): @classmethod def describe_ticket_flows(cls, flow_config_map): - flow_desc = [_("SQL模拟执行状态查询"), _("单据审批"), _("库表备份(可选)"), _("变更SQL执行")] + flow_desc = cls._add_itsm_pause_describe(flow_desc=[], flow_config_map=flow_config_map) + flow_desc = [_("SQL模拟执行状态查询")] + flow_desc + [_("库表备份(可选)"), _("变更SQL执行")] return flow_desc diff --git a/dbm-ui/backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py b/dbm-ui/backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py index 3e94888ccd..fd174f8f46 100644 --- a/dbm-ui/backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py +++ b/dbm-ui/backend/ticket/builders/tendbcluster/tendb_import_sqlfile.py @@ -11,8 +11,6 @@ import logging -from django.utils.translation import ugettext as _ - from backend.configuration.constants import DBType from backend.flow.engine.controller.spider import SpiderController from backend.ticket import builders @@ -70,8 +68,3 @@ def patch_ticket_detail(self): def init_ticket_flows(self): super().init_ticket_flows() - - @classmethod - def describe_ticket_flows(cls, flow_config_map): - flow_desc = [_("SQL模拟执行状态查询"), _("单据审批"), _("库表备份(可选)"), _("变更SQL执行")] - return flow_desc From 0928ab10029257cb56fb6ecfaa5e4970f20b3664 Mon Sep 17 00:00:00 2001 From: xfan0805 Date: Fri, 27 Sep 2024 10:49:42 +0800 Subject: [PATCH 075/164] fix: fix_dbbackup_tool_cmd #7165 --- .../db-tools/dbactuator/pkg/util/mysqlutil/mysql_dumper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_dumper.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_dumper.go index da2863d0fb..b12da7e49e 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_dumper.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_dumper.go @@ -664,7 +664,7 @@ func (d *DbMigrateDumper) getBackupCmd() (backupCmd string) { // getBackupCmdOption 拼接数据备份参数选项 func (d *DbMigrateDumper) getBackupCmdOption() (opt string) { - opt = fmt.Sprintf(" --data-schema-grant=%s --backup-dir=%s --cluster-domain=xx.xx --databases %s", + opt = fmt.Sprintf(" --data-schema-grant=%s --backup-dir=%s --cluster-domain=xx.xx --databases %s --tables \\*", d.DataSchemaGrant, d.DumpDir, d.DbNames) return opt } From 645ed1ce1f458ce1ff0137aee9a904b5cab7c6ed Mon Sep 17 00:00:00 2001 From: lukemakeit <2302063437@qq.com> Date: Mon, 23 Sep 2024 10:03:22 +0800 Subject: [PATCH 076/164] =?UTF-8?q?fix(redis):=20=E4=BF=AE=E5=A4=8Ddbmon?= =?UTF-8?q?=E4=B8=AD=E4=B8=80=E4=BA=9B=E5=A4=87=E4=BB=BDbug=20#7026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/db-tools/dbactuator/pkg/common/predixy_conf.go | 2 +- .../redis/db-tools/dbmon/pkg/redisbinlogbackup/job.go | 7 +++++-- .../redis/db-tools/dbmon/pkg/redisbinlogbackup/task.go | 2 +- .../redis/db-tools/dbmon/pkg/redisfullbackup/backupjob.go | 7 +++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/common/predixy_conf.go b/dbm-services/redis/db-tools/dbactuator/pkg/common/predixy_conf.go index 9070e69e51..e1179a6f4b 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/common/predixy_conf.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/common/predixy_conf.go @@ -17,7 +17,7 @@ Authority { Log {{log_path}} LogRotate 1d ClusterServerPool { - Password {{redis_password}} + Password "{{redis_password}}" RefreshInterval {{refresh_interval}} ServerFailureLimit {{server_failure_limit}} ServerRetryTimeout {{server_retry_timeout}} diff --git a/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/job.go b/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/job.go index 568633b8dd..74f33fa55b 100644 --- a/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/job.go +++ b/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/job.go @@ -233,10 +233,13 @@ func (job *Job) CheckOldBinlogBackupStatus(port int) { // taskStatus==4,上传成功; // taskStatus<4,上传中; if taskStatus > 4 { - if row.Status != consts.BackupStatusToBakSystemFailed { // 失败状态不重复上报 + if row.Status != consts.BackupStatusToBakSystemFailed && + time.Now().Local().Sub(row.StartTime) > 1*time.Hour { + // 如果上传失败,且距离文件生成时间超过1小时,则上报 row.Status = consts.BackupStatusToBakSystemFailed - row.Message = fmt.Sprintf("上传失败,err:%s", statusMsg) + row.Message = fmt.Sprintf("上传失败,statusCode:%d,err:%s", taskStatus, statusMsg) row.BackupRecordReport(job.Reporter) + mylog.Logger.Error(fmt.Sprintf("%s %s", row.BackupFile, row.Message)) } } else if taskStatus < 4 { // 上传中,下次继续探测 diff --git a/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/task.go b/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/task.go index 1b95734632..6bd9e4d2f7 100644 --- a/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/task.go +++ b/dbm-services/redis/db-tools/dbmon/pkg/redisbinlogbackup/task.go @@ -391,7 +391,7 @@ func (task *Task) mvBinlogToBackupDir() { filename := filepath.Base(task.BackupFile) var mvCmd string var targetName, targetFullPath string - if strings.Contains(filename, strconv.Itoa(task.ServerPort)) { + if strings.Contains(filename, "-"+strconv.Itoa(task.ServerPort)+"-") { // binlog-30012-0007515-20221110084710.log => binlog-1.1.1.1-30012-0007515-20221110084710.log targetName = strings.Replace(filename, "binlog-", "binlog-"+task.ServerIP+"-", -1) targetFullPath = filepath.Join(task.BackupDir, targetName) diff --git a/dbm-services/redis/db-tools/dbmon/pkg/redisfullbackup/backupjob.go b/dbm-services/redis/db-tools/dbmon/pkg/redisfullbackup/backupjob.go index c11da0ce5a..84ae5fd97a 100644 --- a/dbm-services/redis/db-tools/dbmon/pkg/redisfullbackup/backupjob.go +++ b/dbm-services/redis/db-tools/dbmon/pkg/redisfullbackup/backupjob.go @@ -231,10 +231,13 @@ func (job *Job) CheckOldFullbackupStatus(port int) { // taskStatus==4,上传成功; // taskStatus<4,上传中; if taskStatus > 4 { - if row.Status != consts.BackupStatusToBakSystemFailed { // 失败状态不重复上报 + if row.Status != consts.BackupStatusToBakSystemFailed && + time.Now().Local().Sub(row.StartTime) > 1*time.Hour { + // 如果上传失败,且距离文件生成时间超过1小时,则上报 row.Status = consts.BackupStatusToBakSystemFailed - row.Message = fmt.Sprintf("上传失败,err:%s", statusMsg) + row.Message = fmt.Sprintf("上传失败,statusCode:%d,err:%s", taskStatus, statusMsg) row.BackupRecordReport(job.Reporter) + mylog.Logger.Error(fmt.Sprintf("%s %s", row.BackupFile, row.Message)) } } else if taskStatus < 4 { // 上传中,下次继续探测 From 85fea4830b8cf88a1fec204de27c1f31c436e1dc Mon Sep 17 00:00:00 2001 From: zfrendo <842557664@qq.com> Date: Fri, 27 Sep 2024 14:58:06 +0800 Subject: [PATCH 077/164] =?UTF-8?q?fix:=20=E5=8E=9F=E5=9C=B0=E9=87=8D?= =?UTF-8?q?=E5=BB=BA=E9=87=8D=E7=BD=AEserverId=E4=B8=BB=E4=BB=8E=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=87=E6=8D=A2=E5=90=8E=E6=8F=90=E5=89=8D=E5=8D=B8?= =?UTF-8?q?=E8=BD=BD=E5=91=A8=E8=BE=B9=20#7171?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/flow/consts.py | 1 + .../mysql/mysql_migrate_cluster_remote_flow.py | 11 +++++++++-- .../mysql/mysql_restore_slave_remote_flow.py | 7 +++++++ .../scene/spider/remote_local_slave_recover.py | 8 ++++++++ .../flow/utils/mysql/mysql_act_playload.py | 16 ++++++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index ce22202c65..b84acdbf83 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -436,6 +436,7 @@ class DBActuatorActionEnum(str, StructuredEnum): PushChecksumConfig = EnumField("push-checksum-config", _("推送mysql-table-checksum配置")) PushNewDbBackupConfig = EnumField("push-new-db-backup-config", _("推送备份配置")) PushMySQLRotatebinlogConfig = EnumField("push-mysql-rotatebinlog-config", _("推送rotatebinlog配置")) + ChangeServerId = EnumField("change-server-id", _("change-server-id")) class RedisActuatorActionEnum(str, StructuredEnum): diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py index 329da94339..c3b9834674 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py @@ -344,7 +344,9 @@ def migrate_cluster_flow(self, use_for_upgrade=False): ) # 第四步 卸载实例 uninstall_svr_sub_pipeline_list = [] + uninstall_surrounding_sub_pipeline_list = [] for ip in [self.data["slave_ip"], self.data["master_ip"]]: + uninstall_surrounding_sub_pipeline = SubBuilder(root_id=self.root_id, data=copy.deepcopy(self.data)) uninstall_svr_sub_pipeline = SubBuilder(root_id=self.root_id, data=copy.deepcopy(self.data)) # 考虑到部分实例成对迁移的情况(即拆分) cluster = { @@ -354,7 +356,7 @@ def migrate_cluster_flow(self, use_for_upgrade=False): "bk_cloud_id": cluster_class.bk_cloud_id, } - uninstall_svr_sub_pipeline.add_act( + uninstall_surrounding_sub_pipeline.add_act( act_name=_("下发db-actor到节点{}".format(ip)), act_component_code=TransFileComponent.code, kwargs=asdict( @@ -366,7 +368,7 @@ def migrate_cluster_flow(self, use_for_upgrade=False): ), ) - uninstall_svr_sub_pipeline.add_act( + uninstall_surrounding_sub_pipeline.add_act( act_name=_("清理实例级别周边配置"), act_component_code=ExecuteDBActuatorScriptComponent.code, kwargs=asdict( @@ -413,6 +415,10 @@ def migrate_cluster_flow(self, use_for_upgrade=False): root_id=self.root_id, ticket_data=copy.deepcopy(self.data), ip=ip, ports=self.data["ports"] ) ) + + uninstall_surrounding_sub_pipeline_list.append( + uninstall_surrounding_sub_pipeline.build_sub_process(sub_name=_("卸载remote节点周边{}".format(ip))) + ) uninstall_svr_sub_pipeline_list.append( uninstall_svr_sub_pipeline.build_sub_process(sub_name=_("卸载remote节点{}".format(ip))) ) @@ -494,6 +500,7 @@ def migrate_cluster_flow(self, use_for_upgrade=False): ) ), ) + tendb_migrate_pipeline.add_parallel_sub_pipeline(sub_flow_list=uninstall_surrounding_sub_pipeline_list) # 卸载流程人工确认 tendb_migrate_pipeline.add_act(act_name=_("人工确认卸载实例"), act_component_code=PauseComponent.code, kwargs={}) # 卸载remote节点 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py index 569900870f..17fb0cfa8a 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_restore_slave_remote_flow.py @@ -506,6 +506,13 @@ def restore_local_slave_flow(self): kwargs=asdict(exec_act_kwargs), ) + exec_act_kwargs.get_mysql_payload_func = MysqlActPayload.mysql_change_server_id.__name__ + tendb_migrate_pipeline.add_act( + act_name=_("重置server_id {}".format(exec_act_kwargs.exec_ip)), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(exec_act_kwargs), + ) + cluster = { "cluster_id": cluster_model.id, "master_ip": master.machine.ip, diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py b/dbm-ui/backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py index d042736646..08519986f6 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/spider/remote_local_slave_recover.py @@ -177,6 +177,14 @@ def tendb_remote_slave_local_recover(self): act_component_code=ExecuteDBActuatorScriptComponent.code, kwargs=asdict(exec_act_kwargs), ) + + exec_act_kwargs.get_mysql_payload_func = MysqlActPayload.mysql_change_server_id.__name__ + tendb_migrate_pipeline.add_act( + act_name=_("重置server_id {}".format(exec_act_kwargs.exec_ip)), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(exec_act_kwargs), + ) + cluster = { "cluster_id": cluster_class.id, "master_ip": master.machine.ip, diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py index a5010084b9..0a95b2572c 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py @@ -2686,3 +2686,19 @@ def truncate_pre_drop_stage_on_remote(self, **kwargs) -> dict: }, }, } + + def mysql_change_server_id(self, **kwargs): + payload = { + "db_type": DBActuatorTypeEnum.MySQL.value, + "action": DBActuatorActionEnum.ChangeServerId.value, + "payload": { + "general": {"runtime_account": self.account}, + "extend": [ + { + "host": self.cluster["new_slave_ip"], + "port": self.cluster["new_slave_port"], + } + ], + }, + } + return payload From 1e5e541c86391ecd55ab12601048d9fa3ba19bcd Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Fri, 27 Sep 2024 18:41:49 +0800 Subject: [PATCH 078/164] =?UTF-8?q?fix(backend):=20=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6=E6=94=AF=E6=8C=81=E8=A7=A3=E6=9E=90?= =?UTF-8?q?formdata=20#7180?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/bk_web/viewsets.py | 9 +++++---- dbm-ui/backend/components/proxy_api.py | 11 ++++------- dbm-ui/backend/urls.py | 1 + 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dbm-ui/backend/bk_web/viewsets.py b/dbm-ui/backend/bk_web/viewsets.py index f3284e3541..d3c68495bf 100644 --- a/dbm-ui/backend/bk_web/viewsets.py +++ b/dbm-ui/backend/bk_web/viewsets.py @@ -15,7 +15,7 @@ from blueapps.account.decorators import login_exempt from django.conf import settings -from django.http import HttpResponse, StreamingHttpResponse +from django.http import HttpResponse, QueryDict, StreamingHttpResponse from django.utils.decorators import classonlymethod from rest_framework import permissions, serializers, status, viewsets from rest_framework.response import Response @@ -249,8 +249,9 @@ def after_response(self, request, response, *args, **kwargs): return HttpResponse(response) def external_proxy(self, request, *args, **kwargs): - params = dict(request.data or request.query_params) - params.update(_url_path=kwargs["path"]) + params = request.data or request.query_params + if isinstance(params, QueryDict): + params._mutable = True headers = self.fill_request_headers(request, *args, **kwargs) - resp = getattr(DBConsoleApi, request.method.lower())(params=params, headers=headers) + resp = getattr(DBConsoleApi, request.method.lower())(url_path=kwargs["path"], params=params, headers=headers) return self.after_response(request, resp, *args, **kwargs) diff --git a/dbm-ui/backend/components/proxy_api.py b/dbm-ui/backend/components/proxy_api.py index c07a2c39c8..7867a81b88 100644 --- a/dbm-ui/backend/components/proxy_api.py +++ b/dbm-ui/backend/components/proxy_api.py @@ -8,7 +8,7 @@ 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. """ - +from django.http import QueryDict from django.utils.translation import gettext as _ from backend import env @@ -53,6 +53,7 @@ class ExternalProxyAPI(DataAPI): def __call__( self, + url_path, params=None, data=None, raw=False, @@ -62,13 +63,9 @@ def __call__( headers=None, current_retry_times=0, ): + params = params or QueryDict(mutable=True) # 解析url - params = params or None - if "_url_path" not in params and not self.url: - raise DataAPIException(_("必须在请求体中传入 url 参数")) - - self.url = f'{self.base.rstrip("/")}/{params["_url_path"].lstrip("/")}' - + self.url = f'{self.base.rstrip("/")}/{url_path.lstrip("/")}' # 添加自定义headers headers = headers or {} headers.update({"IS-EXTERNAL": "true"}) diff --git a/dbm-ui/backend/urls.py b/dbm-ui/backend/urls.py index 4c97af35cd..a87e388651 100644 --- a/dbm-ui/backend/urls.py +++ b/dbm-ui/backend/urls.py @@ -87,6 +87,7 @@ # 外部路由转发仅提供给外部环境使用 if env.ENABLE_EXTERNAL_PROXY or env.ENABLE_OPEN_EXTERNAL_PROXY: methods_map = {method: "external_proxy" for method in views.APIView.http_method_names} + methods_map.pop("trace") urlpatterns.append( re_path( "^external/(?P.*)$", From ccffd339d50f930736a01235b774088ad624de07 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Sun, 29 Sep 2024 17:52:00 +0800 Subject: [PATCH 079/164] =?UTF-8?q?fix(backend):=20=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E7=BD=AE=E7=A9=BA=EF=BC=8C=E9=80=82=E9=85=8D?= =?UTF-8?q?SCR=E5=8F=96user=E9=80=BB=E8=BE=91=20#7192?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/components/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/components/base.py b/dbm-ui/backend/components/base.py index 3cb1f33eb4..a49dd91a67 100644 --- a/dbm-ui/backend/components/base.py +++ b/dbm-ui/backend/components/base.py @@ -420,8 +420,8 @@ def _set_session_headers(self, session, local_request, headers: Dict, params: Di bkapi_auth_headers = { "bk_app_code": params.pop("bk_app_code", env.APP_CODE), "bk_app_secret": params.pop("bk_app_secret", env.SECRET_KEY), - # 如果既不是use_admin,也非local_request请求,则用户先置为匿名 - "bk_username": "Anonymous", + # 如果既不是use_admin,也非local_request请求,则用户先置为空 + "bk_username": "", } if use_admin or self.is_backend_request(): # 使用管理员/平台身份调用接口 From 9ec2e09281c2a10bcf6409f0cae5d6af7274df88 Mon Sep 17 00:00:00 2001 From: fanfanyangyang Date: Thu, 26 Sep 2024 20:51:49 +0800 Subject: [PATCH 080/164] =?UTF-8?q?fix:=20=E9=99=8D=E4=BD=8E=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AE=9E=E4=BE=8B=E5=86=85=E5=AF=BC=E5=85=A5=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=9A=84=E5=B9=B6=E5=8F=91=E5=BA=A6=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=8E=92=E9=98=9F=E7=AD=89metadata=5Flock=20#7159?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/clone_instance_priv_base_func.go | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/dbm-services/mysql/db-priv/service/clone_instance_priv_base_func.go b/dbm-services/mysql/db-priv/service/clone_instance_priv_base_func.go index 65a275c261..b5d2494dc3 100644 --- a/dbm-services/mysql/db-priv/service/clone_instance_priv_base_func.go +++ b/dbm-services/mysql/db-priv/service/clone_instance_priv_base_func.go @@ -133,47 +133,30 @@ func GetUserGantSql(needShowCreateUser bool, userHost, address string, bkCloudId sql string grants []string ) + var sqls []string if needShowCreateUser { sql = fmt.Sprintf("show create user %s;", userHost) - res, err := GetGrantResponse(sql, address, bkCloudId) - if err != nil { - return grants, err - } - grants = append(grants, res...) + sqls = append(sqls, sql) } - sql = fmt.Sprintf("show grants for %s ", userHost) - res, err := GetGrantResponse(sql, address, bkCloudId) - if err != nil { - return grants, err - } - grants = append(grants, res...) - if len(grants) == 0 { - return grants, fmt.Errorf("show grants in %s fail,query return nothing", userHost) - } - return grants, nil -} - -// GetGrantResponse 执行sql语句,获取结果 -func GetGrantResponse(sql, address string, bkCloudId int64) ([]string, error) { - var grants []string - queryRequest := QueryRequest{[]string{address}, []string{sql}, true, 60, bkCloudId} + sqls = append(sqls, fmt.Sprintf("show grants for %s ", userHost)) + queryRequest := QueryRequest{[]string{address}, sqls, true, 60, bkCloudId} reps, err := OneAddressExecuteSql(queryRequest) if err != nil { - return grants, fmt.Errorf("execute (%s) fail, error:%s", sql, err.Error()) + return grants, fmt.Errorf("execute (%s) fail, error:%s", sqls, err.Error()) } - - if len(reps.CmdResults[0].TableData) > 0 { - for _, item := range reps.CmdResults[0].TableData { + for _, data := range reps.CmdResults { + for _, item := range data.TableData { for _, grant := range item { if grant != nil { grants = append(grants, grant.(string)) } else { - return grants, fmt.Errorf("execute (%s), content of return is null", sql) + return grants, fmt.Errorf("execute (%s), content of return is null", sqls) } } } - } else { - return grants, nil + } + if len(grants) == 0 { + return grants, fmt.Errorf("show grants in %s fail,query return nothing", userHost) } return grants, nil } @@ -577,8 +560,8 @@ func ImportMysqlPrivileges(userGrants []UserGrant, address string, bkCloudId int var errMsg Err var grantRetry NewUserGrants wg := sync.WaitGroup{} - limit := rate.Every(time.Millisecond * 20) // QPS:50 - burst := 50 // 桶容量 50 + limit := rate.Every(time.Millisecond * 50) // QPS:20 + burst := 20 // 桶容量 20 limiter := rate.NewLimiter(limit, burst) for _, row := range userGrants { errLimiter := limiter.Wait(context.Background()) From fe3afcd4a2c0fe48fb5dff6a928a721b7dcd5f7b Mon Sep 17 00:00:00 2001 From: 3octaves <873551943@qq.com> Date: Fri, 27 Sep 2024 18:34:52 +0800 Subject: [PATCH 081/164] =?UTF-8?q?fix(frontend):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BB=A5=E6=9E=84=E9=80=A0=E5=AE=9E=E4=BE=8B=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=8F=90=E5=8D=95=E5=8F=82=E6=95=B0=E7=BC=BA=E5=B0=91=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20#7178?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/recover-from-instance/pages/page1/Index.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dbm-ui/frontend/src/views/db-manage/redis/recover-from-instance/pages/page1/Index.vue b/dbm-ui/frontend/src/views/db-manage/redis/recover-from-instance/pages/page1/Index.vue index b04e687a4e..fef1cf6463 100644 --- a/dbm-ui/frontend/src/views/db-manage/redis/recover-from-instance/pages/page1/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/redis/recover-from-instance/pages/page1/Index.vue @@ -88,6 +88,8 @@ import { useTicketCloneInfo } from '@hooks'; + import { useGlobalBizs } from '@stores'; + import { ClusterTypes, LocalStorageKeys, TicketTypes } from '@common/const'; import VisitEntrySelector from '@components/cluster-selector/Index.vue'; @@ -98,6 +100,7 @@ const { t } = useI18n(); const router = useRouter(); + const { currentBizId } = useGlobalBizs(); // 单据克隆 useTicketCloneInfo({ From 5a5af3de863dfec35336f04fae7a2febc883f4fb Mon Sep 17 00:00:00 2001 From: hLinx <327159425@qq.com> Date: Sun, 29 Sep 2024 22:50:54 +0800 Subject: [PATCH 082/164] =?UTF-8?q?fix(frontend):=20=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E8=BD=AE=E5=80=BC=E7=AD=96=E7=95=A5=E4=BA=BA=E5=91=98=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=97=A0=E6=95=88=20#7193?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/frontend/package.json | 2 +- .../components/db-member-selector/index.vue | 199 +++++++++++------ .../sql-execute/common/RenderSql/Index.vue | 4 +- .../views/duty-rule-manage/index/Index.vue | 4 +- .../components/edit-rule/CustomRotate.vue | 211 +++++------------- .../components/edit-rule/CycleRotate.vue | 81 +++---- .../index/components/edit-rule/Index.vue | 166 ++++---------- .../frontend/src/views/staff-manage/Index.vue | 2 +- .../components/MemberSelector.vue | 172 -------------- 9 files changed, 270 insertions(+), 571 deletions(-) delete mode 100644 dbm-ui/frontend/src/views/staff-manage/components/MemberSelector.vue diff --git a/dbm-ui/frontend/package.json b/dbm-ui/frontend/package.json index fd63b014ad..396751294d 100644 --- a/dbm-ui/frontend/package.json +++ b/dbm-ui/frontend/package.json @@ -27,7 +27,7 @@ "@icon-cool/bk-icon-bk-biz-components": "0.0.4", "@vueuse/core": "^11.0.3", "axios": "^1.7.7", - "bkui-vue": "2.0.1-beta.72", + "bkui-vue": "2.0.1-beta.74", "date-fns": "3.6.0", "dayjs": "^1.11.13", "html-to-image": "1.11.11", diff --git a/dbm-ui/frontend/src/components/db-member-selector/index.vue b/dbm-ui/frontend/src/components/db-member-selector/index.vue index 23f000c555..b4fe4867c1 100644 --- a/dbm-ui/frontend/src/components/db-member-selector/index.vue +++ b/dbm-ui/frontend/src/components/db-member-selector/index.vue @@ -13,75 +13,124 @@ - diff --git a/dbm-ui/frontend/src/views/db-manage/common/sql-execute/common/RenderSql/Index.vue b/dbm-ui/frontend/src/views/db-manage/common/sql-execute/common/RenderSql/Index.vue index 0d5a4d6c01..9b2dacbf0f 100644 --- a/dbm-ui/frontend/src/views/db-manage/common/sql-execute/common/RenderSql/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/common/sql-execute/common/RenderSql/Index.vue @@ -12,7 +12,9 @@ text theme="primary" @click="handleShowSql"> - {{ modelValue.length < 1 ? t('点击添加') : t('n 个 SQL 文件', { n: modelValue.length }) }} + {{ t('点击添加') }} + {{ modelValue[0] }} + {{ t('n 个 SQL 文件', { n: modelValue.length }) }} diff --git a/dbm-ui/frontend/src/views/duty-rule-manage/index/Index.vue b/dbm-ui/frontend/src/views/duty-rule-manage/index/Index.vue index 9657e5880b..3ab2606b17 100644 --- a/dbm-ui/frontend/src/views/duty-rule-manage/index/Index.vue +++ b/dbm-ui/frontend/src/views/duty-rule-manage/index/Index.vue @@ -20,13 +20,15 @@ From fce845411bdebfb6d4cfd47826191272e431605d Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Mon, 30 Sep 2024 11:24:38 +0800 Subject: [PATCH 083/164] =?UTF-8?q?fix(backend):=20=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=BB=98=E8=AE=A4=E4=BB=8Eparams=E5=8F=96(?= =?UTF-8?q?=E5=85=BC=E5=AE=B9SCR=E6=8E=88=E6=9D=83)=20#7197?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/components/base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dbm-ui/backend/components/base.py b/dbm-ui/backend/components/base.py index a49dd91a67..2598fb6a08 100644 --- a/dbm-ui/backend/components/base.py +++ b/dbm-ui/backend/components/base.py @@ -420,8 +420,7 @@ def _set_session_headers(self, session, local_request, headers: Dict, params: Di bkapi_auth_headers = { "bk_app_code": params.pop("bk_app_code", env.APP_CODE), "bk_app_secret": params.pop("bk_app_secret", env.SECRET_KEY), - # 如果既不是use_admin,也非local_request请求,则用户先置为空 - "bk_username": "", + "bk_username": params.pop("bk_username", "Anonymous"), } if use_admin or self.is_backend_request(): # 使用管理员/平台身份调用接口 From 72f4a3832549a88232900413f0aa8e17d6af2cee Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Mon, 30 Sep 2024 15:16:15 +0800 Subject: [PATCH 084/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=97=B6=E6=95=B0=E6=8D=AE=E5=BA=93=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E7=89=B9=E6=AE=8A=E5=AD=97=E7=AC=A6=E5=A4=B1=E8=B4=A5=20#7200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/add_priv_base_func_for_sqlserver.go | 4 ++-- .../dbactuator/pkg/components/sqlserver/rename_dbs.go | 4 ++-- .../dbactuator/pkg/core/staticembed/monitor_dbm.sql | 10 +++++----- .../db_meta/api/cluster/sqlserverha/create_cluster.py | 4 ++-- .../backend/db_meta/api/cluster/sqlserverha/handler.py | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dbm-services/mysql/db-priv/service/add_priv_base_func_for_sqlserver.go b/dbm-services/mysql/db-priv/service/add_priv_base_func_for_sqlserver.go index c7a9898ffd..7886ab9fca 100644 --- a/dbm-services/mysql/db-priv/service/add_priv_base_func_for_sqlserver.go +++ b/dbm-services/mysql/db-priv/service/add_priv_base_func_for_sqlserver.go @@ -135,7 +135,7 @@ func GenerateSqlserverSQL(account TbAccounts, rules []TbAccountRules, address st } // 拼接db级别的授权语句 for _, dbName := range realDBS { - sqls = append(sqls, fmt.Sprintf(`USE %s + sqls = append(sqls, fmt.Sprintf(`USE [%s] ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo; IF EXISTS (SELECT 1 FROM [%s].sys.database_principals WHERE name = N'%s') BEGIN @@ -148,7 +148,7 @@ func GenerateSqlserverSQL(account TbAccounts, rules []TbAccountRules, address st `, dbName, dbName, account.User, dbName, account.User, account.User, account.User, )) - sqls = append(sqls, fmt.Sprintf("USE %s", dbName)) + sqls = append(sqls, fmt.Sprintf("USE [%s]", dbName)) for _, p := range strings.Split(rule.Priv, ",") { sqls = append(sqls, fmt.Sprintf("EXEC SP_ADDROLEMEMBER N'%s', N'%s';", p, account.User)) } diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go index 863e8ca435..f4b48bd081 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go @@ -159,7 +159,7 @@ func (r *RenameDBSComp) DoRenameDBWithMirroring() error { if cnt != 0 { execDBSQLs = append(execDBSQLs, fmt.Sprintf("ALTER DATABASE [%s] SET PARTNER OFF;", i.DBName)) } - execDBSQLs = append(execDBSQLs, fmt.Sprintf("ALTER DATABASE [%s] MODIFY NAME = %s", i.DBName, i.TargetDBName)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("ALTER DATABASE [%s] MODIFY NAME = [%s]", i.DBName, i.TargetDBName)) // 执行rename 命令 if _, err := r.DB.ExecMore(execDBSQLs); err != nil { logger.Error( @@ -209,7 +209,7 @@ func (r *RenameDBSComp) DoRenameDBWithAlwayson() error { } execDBSQLs = append( execDBSQLs, - fmt.Sprintf("ALTER DATABASE [%s] MODIFY NAME = %s;", i.DBName, i.TargetDBName), + fmt.Sprintf("ALTER DATABASE [%s] MODIFY NAME = [%s];", i.DBName, i.TargetDBName), ) // 执行rename 命令 if _, err := r.DB.ExecMore(execDBSQLs); err != nil { diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql index 39401b2ad7..1f84a0dbd2 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql @@ -960,14 +960,14 @@ BEGIN BEGIN IF EXISTS (SELECT name FROM sys.databases WHERE name = @dr) BEGIN - SET @cmd='DROP DATABASE '+@dr + SET @cmd='DROP DATABASE ['+@dr+']' EXEC (@cmd) SET @cmd2='EXEC MASTER.DBO.xp_cmdshell ''del /q d:\gamedb\'+@dr+'.'+@port+'.*.spst'';' EXEC (@cmd2) END - select @filename=null,@cmd='',@fileid=0,@cmd='CREATE DATABASE '+@dr+' ON ' + select @filename=null,@cmd='',@fileid=0,@cmd='CREATE DATABASE ['+@dr+'] ON ' declare cur1 cursor for select name from sys.master_files where database_id=@dbid and type_desc='ROWS' and state_desc='ONLINE' open cur1 while 1=1 @@ -981,7 +981,7 @@ BEGIN close cur1 deallocate cur1 - set @cmd=left(@cmd,len(@cmd)-1)+' AS SNAPSHOT OF '+@db + set @cmd=left(@cmd,len(@cmd)-1)+' AS SNAPSHOT OF ['+@db+']' BEGIN TRY EXEC (@cmd) @@ -2728,7 +2728,7 @@ BEGIN TRY WHILE @@FETCH_STATUS = 0 BEGIN --强制故障切换 - set @strsql='Use master alter database '+@dbname+' set partner FORCE_SERVICE_ALLOW_DATA_LOSS;' + set @strsql='Use master alter database ['+@dbname+'] set partner FORCE_SERVICE_ALLOW_DATA_LOSS;' exec(@strsql) if @@error>0 begin @@ -2936,7 +2936,7 @@ BEGIN TRY WHILE @@FETCH_STATUS = 0 BEGIN --强制故障切换 - set @strsql='Use master alter database '+@dbname+' set partner FORCE_SERVICE_ALLOW_DATA_LOSS;' + set @strsql='Use master alter database ['+@dbname+'] set partner FORCE_SERVICE_ALLOW_DATA_LOSS;' exec(@strsql) if @@error>0 begin diff --git a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/create_cluster.py b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/create_cluster.py index 600678df06..a476f55450 100644 --- a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/create_cluster.py +++ b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/create_cluster.py @@ -146,7 +146,7 @@ def create( m.db_module_id = db_module_id # 保存最新的time_zone ins.time_zone = get_instance_time_zone(ins) - ins.save(update_fields=["db_module_id"]) - m.save(update_fields=["db_module_id"]) + ins.save() + m.save() return cluster diff --git a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py index 435527633f..8179728fa9 100644 --- a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py @@ -305,8 +305,8 @@ def switch_slave( )[0] new_slave_obj.db_module_id = cluster.db_module_id new_slave_obj.machine.db_module_id = cluster.db_module_id - new_slave_obj.save(update_fields=["db_module_id"]) - new_slave_obj.machine.save(update_fields=["db_module_id"]) + new_slave_obj.save() + new_slave_obj.machine.save() cluster.storageinstance_set.add(new_slave_obj) # 切换slave域名信息 From 35fddfbccb51e4116ed53dd99a75e9840d830184 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Thu, 26 Sep 2024 15:27:12 +0800 Subject: [PATCH 085/164] =?UTF-8?q?feat(backend):=20=E6=9B=B4=E6=96=B0=20M?= =?UTF-8?q?ySQL=20=E4=BB=AA=E8=A1=A8=E7=9B=98=20#7137?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboards/json/sqlserver.json | 136 +- .../dashboards/json/tendbcluster.json | 8971 +++++++++-------- .../bk_dataview/dashboards/json/tendbha.json | 5169 ++++++---- .../backend/bk_dataview/dashboards/readme.md | 2 + 4 files changed, 7924 insertions(+), 6354 deletions(-) diff --git a/dbm-ui/backend/bk_dataview/dashboards/json/sqlserver.json b/dbm-ui/backend/bk_dataview/dashboards/json/sqlserver.json index da90a3673e..7b67b452cd 100644 --- a/dbm-ui/backend/bk_dataview/dashboards/json/sqlserver.json +++ b/dbm-ui/backend/bk_dataview/dashboards/json/sqlserver.json @@ -46,7 +46,7 @@ "x": 0, "y": 0 }, - "id": 4, + "id": null, "panels": [], "title": "核心指标", "type": "row" @@ -115,7 +115,7 @@ "x": 0, "y": 1 }, - "id": 2, + "id": null, "options": { "legend": { "calcs": [], @@ -245,7 +245,7 @@ "x": 12, "y": 1 }, - "id": 6, + "id": null, "options": { "legend": { "calcs": [], @@ -385,7 +385,7 @@ "x": 0, "y": 9 }, - "id": 8, + "id": null, "options": { "legend": { "calcs": [], @@ -515,7 +515,7 @@ "x": 12, "y": 9 }, - "id": 140, + "id": null, "options": { "legend": { "calcs": [], @@ -646,7 +646,7 @@ "x": 0, "y": 17 }, - "id": 142, + "id": null, "options": { "legend": { "calcs": [], @@ -813,7 +813,7 @@ "x": 12, "y": 17 }, - "id": 144, + "id": null, "options": { "legend": { "calcs": [], @@ -953,7 +953,7 @@ "x": 0, "y": 25 }, - "id": 146, + "id": null, "options": { "legend": { "calcs": [], @@ -1093,7 +1093,7 @@ "x": 12, "y": 25 }, - "id": 148, + "id": null, "options": { "legend": { "calcs": [], @@ -1232,7 +1232,7 @@ "x": 0, "y": 33 }, - "id": 176, + "id": null, "options": { "legend": { "calcs": [], @@ -1307,7 +1307,7 @@ "x": 0, "y": 41 }, - "id": 138, + "id": null, "panels": [ { "datasource": { @@ -1371,7 +1371,7 @@ "x": 0, "y": 2 }, - "id": 48, + "id": null, "options": { "legend": { "calcs": [], @@ -1511,7 +1511,7 @@ "x": 12, "y": 2 }, - "id": 50, + "id": null, "options": { "legend": { "calcs": [], @@ -1640,7 +1640,7 @@ "x": 0, "y": 12 }, - "id": 30, + "id": null, "options": { "legend": { "calcs": [], @@ -1769,7 +1769,7 @@ "x": 12, "y": 12 }, - "id": 54, + "id": null, "options": { "legend": { "calcs": [], @@ -1859,7 +1859,7 @@ "x": 0, "y": 42 }, - "id": 114, + "id": null, "panels": [ { "datasource": { @@ -1923,7 +1923,7 @@ "x": 0, "y": 3 }, - "id": 64, + "id": null, "options": { "legend": { "calcs": [], @@ -2063,7 +2063,7 @@ "x": 8, "y": 3 }, - "id": 62, + "id": null, "options": { "legend": { "calcs": [], @@ -2203,7 +2203,7 @@ "x": 16, "y": 3 }, - "id": 52, + "id": null, "options": { "legend": { "calcs": [], @@ -2343,7 +2343,7 @@ "x": 0, "y": 12 }, - "id": 32, + "id": null, "options": { "legend": { "calcs": [], @@ -2472,7 +2472,7 @@ "x": 12, "y": 12 }, - "id": 56, + "id": null, "options": { "legend": { "calcs": [], @@ -2612,7 +2612,7 @@ "x": 0, "y": 20 }, - "id": 58, + "id": null, "options": { "legend": { "calcs": [], @@ -2752,7 +2752,7 @@ "x": 12, "y": 20 }, - "id": 22, + "id": null, "options": { "legend": { "calcs": [], @@ -2868,7 +2868,7 @@ "x": 0, "y": 43 }, - "id": 126, + "id": null, "panels": [ { "datasource": { @@ -2932,7 +2932,7 @@ "x": 0, "y": 4 }, - "id": 128, + "id": null, "options": { "legend": { "calcs": [], @@ -3061,7 +3061,7 @@ "x": 12, "y": 4 }, - "id": 36, + "id": null, "options": { "legend": { "calcs": [], @@ -3190,7 +3190,7 @@ "x": 0, "y": 13 }, - "id": 42, + "id": null, "options": { "legend": { "calcs": [], @@ -3330,7 +3330,7 @@ "x": 12, "y": 13 }, - "id": 44, + "id": null, "options": { "legend": { "calcs": [], @@ -3470,7 +3470,7 @@ "x": 0, "y": 22 }, - "id": 26, + "id": null, "options": { "legend": { "calcs": [], @@ -3606,7 +3606,7 @@ "x": 12, "y": 22 }, - "id": 28, + "id": null, "options": { "legend": { "calcs": [], @@ -3692,7 +3692,7 @@ "x": 0, "y": 44 }, - "id": 120, + "id": null, "panels": [ { "datasource": { @@ -3756,7 +3756,7 @@ "x": 0, "y": 5 }, - "id": 112, + "id": null, "options": { "legend": { "calcs": [], @@ -3896,7 +3896,7 @@ "x": 12, "y": 5 }, - "id": 104, + "id": null, "options": { "legend": { "calcs": [], @@ -4036,7 +4036,7 @@ "x": 0, "y": 13 }, - "id": 108, + "id": null, "options": { "legend": { "calcs": [], @@ -4175,7 +4175,7 @@ "x": 12, "y": 13 }, - "id": 110, + "id": null, "options": { "legend": { "calcs": [], @@ -4314,7 +4314,7 @@ "x": 0, "y": 21 }, - "id": 38, + "id": null, "options": { "legend": { "calcs": [], @@ -4480,7 +4480,7 @@ "x": 12, "y": 21 }, - "id": 46, + "id": null, "options": { "legend": { "calcs": [], @@ -4559,7 +4559,7 @@ "x": 0, "y": 45 }, - "id": 174, + "id": null, "panels": [ { "datasource": { @@ -4623,7 +4623,7 @@ "x": 0, "y": 6 }, - "id": 84, + "id": null, "options": { "legend": { "calcs": [], @@ -4752,7 +4752,7 @@ "x": 12, "y": 6 }, - "id": 86, + "id": null, "options": { "legend": { "calcs": [], @@ -4881,7 +4881,7 @@ "x": 0, "y": 14 }, - "id": 170, + "id": null, "options": { "legend": { "calcs": [], @@ -5010,7 +5010,7 @@ "x": 8, "y": 14 }, - "id": 166, + "id": null, "options": { "legend": { "calcs": [], @@ -5139,7 +5139,7 @@ "x": 16, "y": 14 }, - "id": 172, + "id": null, "options": { "legend": { "calcs": [], @@ -5255,7 +5255,7 @@ "x": 0, "y": 46 }, - "id": 122, + "id": null, "panels": [ { "datasource": { @@ -5319,7 +5319,7 @@ "x": 0, "y": 7 }, - "id": 82, + "id": null, "options": { "legend": { "calcs": [], @@ -5448,7 +5448,7 @@ "x": 10, "y": 7 }, - "id": 80, + "id": null, "options": { "legend": { "calcs": [], @@ -5577,7 +5577,7 @@ "x": 0, "y": 15 }, - "id": 76, + "id": null, "options": { "legend": { "calcs": [], @@ -5706,7 +5706,7 @@ "x": 10, "y": 15 }, - "id": 78, + "id": null, "options": { "legend": { "calcs": [], @@ -5835,7 +5835,7 @@ "x": 0, "y": 23 }, - "id": 74, + "id": null, "options": { "legend": { "calcs": [], @@ -5964,7 +5964,7 @@ "x": 10, "y": 23 }, - "id": 72, + "id": null, "options": { "legend": { "calcs": [], @@ -6093,7 +6093,7 @@ "x": 0, "y": 31 }, - "id": 70, + "id": null, "options": { "legend": { "calcs": [], @@ -6172,7 +6172,7 @@ "x": 0, "y": 47 }, - "id": 152, + "id": null, "panels": [ { "datasource": { @@ -6237,7 +6237,7 @@ "x": 0, "y": 8 }, - "id": 158, + "id": null, "options": { "legend": { "calcs": [], @@ -6367,7 +6367,7 @@ "x": 8, "y": 8 }, - "id": 150, + "id": null, "options": { "legend": { "calcs": [], @@ -6497,7 +6497,7 @@ "x": 16, "y": 8 }, - "id": 160, + "id": null, "options": { "legend": { "calcs": [], @@ -6627,7 +6627,7 @@ "x": 0, "y": 16 }, - "id": 156, + "id": null, "options": { "legend": { "calcs": [], @@ -6757,7 +6757,7 @@ "x": 8, "y": 16 }, - "id": 154, + "id": null, "options": { "legend": { "calcs": [], @@ -6887,7 +6887,7 @@ "x": 16, "y": 16 }, - "id": 162, + "id": null, "options": { "legend": { "calcs": [], @@ -6966,7 +6966,7 @@ "x": 0, "y": 48 }, - "id": 124, + "id": null, "panels": [ { "datasource": { @@ -7000,7 +7000,7 @@ "x": 0, "y": 33 }, - "id": 130, + "id": null, "options": { "colorMode": "background", "graphMode": "none", @@ -7141,7 +7141,7 @@ "x": 12, "y": 33 }, - "id": 132, + "id": null, "options": { "legend": { "calcs": [], @@ -7241,7 +7241,7 @@ "x": 0, "y": 41 }, - "id": 134, + "id": null, "options": { "colorMode": "background", "graphMode": "none", @@ -7374,7 +7374,7 @@ "x": 12, "y": 41 }, - "id": 136, + "id": null, "options": { "legend": { "calcs": [], @@ -7453,7 +7453,7 @@ "x": 0, "y": 49 }, - "id": 118, + "id": null, "panels": [ { "datasource": { @@ -7517,7 +7517,7 @@ "x": 0, "y": 121 }, - "id": 100, + "id": null, "options": { "legend": { "calcs": [], @@ -7646,7 +7646,7 @@ "x": 6, "y": 121 }, - "id": 102, + "id": null, "options": { "legend": { "calcs": [], @@ -7775,7 +7775,7 @@ "x": 12, "y": 121 }, - "id": 96, + "id": null, "options": { "legend": { "calcs": [], @@ -7904,7 +7904,7 @@ "x": 18, "y": 121 }, - "id": 98, + "id": null, "options": { "legend": { "calcs": [], diff --git a/dbm-ui/backend/bk_dataview/dashboards/json/tendbcluster.json b/dbm-ui/backend/bk_dataview/dashboards/json/tendbcluster.json index cff559ec4b..7477176346 100644 --- a/dbm-ui/backend/bk_dataview/dashboards/json/tendbcluster.json +++ b/dbm-ui/backend/bk_dataview/dashboards/json/tendbcluster.json @@ -88,7 +88,7 @@ }, "gridPos": { "h": 6, - "w": 4, + "w": 8, "x": 0, "y": 1 }, @@ -180,7 +180,6 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -193,34 +192,38 @@ { "color": "green", "value": null + }, + { + "color": "red", + "value": 80 } ] }, - "unit": "s" + "unit": "percentunit" }, "overrides": [] }, "gridPos": { - "h": 2, + "h": 6, "w": 4, - "x": 4, + "x": 8, "y": 1 }, + "hideTimeOverride": true, "id": null, + "interval": "6h", "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", + "limit": 1, "values": false }, - "text": {}, - "textMode": "auto" + "showThresholdLabels": false, + "showThresholdMarkers": true }, "pluginVersion": "9.1.0", "targets": [ @@ -228,10 +231,10 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], - "format": "time_series", + "format": "table", "host": [], "mode": "ui", "module": [], @@ -248,8 +251,8 @@ "group_by": [], "interval": "auto", "interval_unit": "s", - "method": "MIN", - "metric_field": "mysql_global_status_uptime", + "method": "MAX", + "metric_field": "mysql_datadir_df_usage", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -267,7 +270,7 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "remote_master" ] } ] @@ -276,52 +279,22 @@ "refId": "A", "source": "", "step": "", - "type": "instant" + "type": "range" } ], - "title": "Uptime", - "type": "stat" + "timeFrom": "24h", + "title": "Capacity Used (remote_master)", + "type": "gauge" }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "select|insert|update|delete|replace|commit", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "mode": "thresholds" }, "mappings": [], "thresholds": { @@ -337,46 +310,45 @@ } ] }, - "unit": "ops" + "unit": "decmbytes" }, "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 8, + "w": 4, + "x": 12, "y": 1 }, + "hideTimeOverride": true, "id": null, + "interval": "2h", "options": { - "legend": { + "orientation": "auto", + "reduceOptions": { "calcs": [ - "last", - "max" + "lastNotNull" ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "fields": "", + "values": false }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } + "showThresholdLabels": false, + "showThresholdMarkers": true }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "", "query_configs": [ { "alias": "", @@ -385,28 +357,18 @@ "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [ - "command" + "cluster_domain" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_commands_total", + "method": "SUM", + "metric_field": "mysql_datadir_du_used_mb", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -420,52 +382,21 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" - ] - }, - { - "condition": "and", - "key": "command", - "method": "reg", - "value": [ - "select|insert|update|delete" + "remote_master" ] } ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "refId": "A", + "source": "sum by (cluster_domain) (sum_over_time(bkmonitor:exporter_dbm_mysqld_exporter:mysql_datadir_du_used_mb{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2h]))", "step": "", "type": "range" } ], - "title": "QPS (spider total)", - "transformations": [ - { - "id": "calculateField", - "options": { - "mode": "reduceRow", - "reduce": { - "include": [ - "commit", - "delete", - "delete_multi", - "insert", - "insert_select", - "replace", - "replace_select", - "select", - "update", - "update_multi", - "xa_commit" - ], - "reducer": "sum" - } - } - } - ], - "type": "timeseries" + "timeFrom": "24h", + "title": "Datasize (remote_master)", + "type": "gauge" }, { "datasource": { @@ -550,7 +481,7 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], "format": "time_series", @@ -609,10 +540,41 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "select|insert|update|delete|replace|commit", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -628,46 +590,46 @@ } ] }, - "unit": "percentunit" + "unit": "ops" }, "overrides": [] }, "gridPos": { - "h": 4, - "w": 2, - "x": 4, - "y": 3 + "h": 8, + "w": 8, + "x": 0, + "y": 7 }, - "hideTimeOverride": true, "id": null, - "interval": "6h", "options": { - "orientation": "auto", - "reduceOptions": { + "legend": { "calcs": [ + "last", "max" ], - "fields": "", - "limit": 2, - "values": true + "displayMode": "table", + "placement": "right", + "showLegend": true }, - "showThresholdLabels": false, - "showThresholdMarkers": true + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], - "format": "table", + "format": "time_series", + "hide": false, "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "", + "promqlAlias": "$tag_command", "query_configs": [ { "alias": "", @@ -676,20 +638,38 @@ "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], "group_by": [ - "mount_point" + "command" ], - "interval": 86400, + "interval": 60, "interval_unit": "s", - "method": "MAX", - "metric_field": "mysql_datadir_df_usage", + "method": "AVG", + "metric_field": "mysql_global_status_commands_total", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", "result_table_label": "component", - "time_field": "time", + "time_field": "", "where": [ { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", "key": "instance_role", "method": "eq", "value": [ @@ -698,24 +678,47 @@ }, { "condition": "and", - "key": "cluster_domain", - "method": "eq", + "key": "command", + "method": "reg", "value": [ - "$cluster_domain" + "select|insert|update|delete" ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", "step": "", "type": "range" } ], - "timeFrom": "24h", - "title": "Capacity Used", - "type": "gauge" + "title": "QPS (spider total)", + "transformations": [ + { + "id": "calculateField", + "options": { + "mode": "reduceRow", + "reduce": { + "include": [ + "commit", + "delete", + "delete_multi", + "insert", + "insert_select", + "replace", + "replace_select", + "select", + "update", + "update_multi", + "xa_commit" + ], + "reducer": "sum" + } + } + } + ], + "type": "timeseries" }, { "datasource": { @@ -725,7 +728,37 @@ "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -740,62 +773,79 @@ "value": 80 } ] - }, - "unit": "decmbytes" + } }, "overrides": [] }, "gridPos": { - "h": 4, - "w": 2, - "x": 6, - "y": 3 + "h": 8, + "w": 8, + "x": 8, + "y": 7 }, - "hideTimeOverride": true, "id": null, - "interval": "2h", + "interval": "1m", "options": { - "orientation": "auto", - "reduceOptions": { + "legend": { "calcs": [ - "lastNotNull" + "last" ], - "fields": "", - "values": false + "displayMode": "table", + "placement": "right", + "showLegend": true }, - "showThresholdLabels": false, - "showThresholdMarkers": true + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "", + "expression": "", + "functions": [] + } + ], "format": "time_series", + "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "", + "alias": "$tag_instance_role", "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], + "functions": [ + { + "id": "increase", + "params": [ + { + "id": "window", + "value": "1m" + } + ] + } + ], "group_by": [ - "cluster_domain" + "instance_role" ], - "interval": 7200, + "interval": "auto", "interval_unit": "s", "method": "SUM", - "metric_field": "mysql_datadir_du_used_mb", + "metric_field": "mysql_global_status_slow_queries", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -807,34 +857,24 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "A", - "source": "sum by (cluster_domain) (sum_over_time(bkmonitor:exporter_dbm_mysqld_exporter:mysql_datadir_du_used_mb{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2h]))", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", "step": "", "type": "range" } ], - "timeFrom": "24h", - "title": "Data Size", - "type": "gauge" + "title": "Slow Queries 1m", + "type": "timeseries" }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -884,30 +924,30 @@ } ] }, - "unit": "ms" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 5, + "h": 8, "w": 8, - "x": 0, + "x": 16, "y": 7 }, "id": null, + "interval": "1m", "options": { "legend": { "calcs": [ - "last", - "max" + "lastNotNull" ], "displayMode": "table", - "placement": "right", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -915,95 +955,36 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, - "expressionList": [ - { - "active": true, - "alias": "Time", - "expression": "(a / b) * 1000", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "", + "alias": "$tag_command, $tag_state", "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "command", + "state" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_query_response_time_seconds_sum", + "method": "SUM", + "metric_field": "mysql_info_schema_processlist_threads", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - }, - { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_query_response_time_seconds_count", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_id": "exporter_dbm_mysqld_exporter.plist", "result_table_label": "component", - "time_field": "time", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -1023,14 +1004,13 @@ ] } ], - "refId": "B", - "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "Average Query Response Time", - "transformations": [], + "title": "Processlist State ($dbrole)", "type": "timeseries" }, { @@ -1091,10 +1071,10 @@ "overrides": [] }, "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 7 + "h": 8, + "w": 6, + "x": 0, + "y": 15 }, "id": null, "options": { @@ -1103,7 +1083,7 @@ "last", "max" ], - "displayMode": "list", + "displayMode": "table", "placement": "bottom", "showLegend": true }, @@ -1117,7 +1097,7 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [ { @@ -1130,13 +1110,12 @@ "format": "time_series", "hide": false, "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "$tag_handler", "query_configs": [ { - "alias": "slow_queries", - "data_label": "exporter_dbm_mysqld_exporter", + "alias": "$tag_handler", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, @@ -1152,11 +1131,13 @@ ] } ], - "group_by": [], + "group_by": [ + "handler" + ], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_slow_queries", + "method": "sum_without_time", + "metric_field": "mysql_global_status_handlers_total", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", "result_table_label": "component", @@ -1181,19 +1162,16 @@ } ], "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", + "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler!~\"commit|rollback|savepoint.*|prepare\"}[2m]))", "step": "", "type": "range" } ], - "title": "Slow Queries", + "title": "MySQL Handlers($dbrole)", "type": "timeseries" }, { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, + "datasource": {}, "fieldConfig": { "defaults": { "color": { @@ -1242,28 +1220,29 @@ "value": 80 } ] - }, - "unit": "dtdurations" + } }, "overrides": [] }, "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 7 + "h": 8, + "w": 6, + "x": 6, + "y": 15 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "lastNotNull" + ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -1271,36 +1250,44 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], "format": "time_series", + "hide": false, "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "slave=$tag_instance, master_uuid=$tag_master_uuid", - "data_label": "exporter_dbm_mysqld_exporter", + "alias": "Com_$tag_command", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], "group_by": [ - "instance", - "channel_name", - "master_uuid" + "command" ], - "interval": "auto", + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_slave_status_seconds_behind_master", + "method": "sum_without_time", + "metric_field": "mysql_global_status_commands_total", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", "result_table_label": "component", - "time_field": "time", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -1308,17 +1295,25 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", "step": "", "type": "range" } ], - "title": "Seconds Behind Master", + "title": "Top Command Counters ($dbrole)", "type": "timeseries" }, { @@ -1362,6 +1357,7 @@ } }, "mappings": [], + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -1374,22 +1370,23 @@ "value": 80 } ] - } + }, + "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 8, - "w": 6, - "x": 0, - "y": 12 + "w": 5, + "x": 12, + "y": 15 }, "id": null, "options": { "legend": { "calcs": [ "last", - "max" + "min" ], "displayMode": "table", "placement": "bottom", @@ -1410,23 +1407,24 @@ "expressionList": [ { "active": true, - "alias": "", - "expression": "", + "alias": "Hits", + "expression": "min(a / ( b + c)) * 100", "functions": [] } ], "format": "time_series", "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "$tag_handler", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "$tag_handler", + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, "functions": [ { @@ -1439,17 +1437,105 @@ ] } ], - "group_by": [ - "handler" - ], + "group_by": [], "interval": 60, "interval_unit": "s", - "method": "sum_without_time", - "metric_field": "mysql_global_status_handlers_total", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_hits", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_hits", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_misses", + "refId": "c", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -1470,16 +1556,19 @@ } ], "refId": "B", - "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler!~\"commit|rollback|savepoint.*|prepare\"}[2m]))", + "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", "step": "", "type": "range" } ], - "title": "MySQL Handlers($dbrole)", + "title": "Table Cache Hits($dbrole)", "type": "timeseries" }, { - "datasource": {}, + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, "fieldConfig": { "defaults": { "color": { @@ -1528,29 +1617,28 @@ "value": 80 } ] - } + }, + "unit": "dtdurations" }, "overrides": [] }, "gridPos": { "h": 8, - "w": 6, - "x": 6, - "y": 12 + "w": 7, + "x": 17, + "y": 15 }, "id": null, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": [], "displayMode": "table", - "placement": "right", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, "targets": [ @@ -1558,44 +1646,36 @@ "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "uid": "HVlyYOe4z" }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "Com_$tag_command", + "alias": "slave=$tag_instance, master_uuid=$tag_master_uuid", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [ - "command" + "instance", + "channel_name", + "master_uuid" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "sum_without_time", - "metric_field": "mysql_global_status_commands_total", + "method": "AVG", + "metric_field": "mysql_slave_status_seconds_behind_master", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -1603,4077 +1683,4210 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "Top Command Counters ($dbrole)", + "title": "Seconds Behind Master", "type": "timeseries" }, { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "id": null, + "panels": [ + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "description": "Click link to get details for this instance", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": true, + "inspect": false + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "overrides": [ { - "color": "green", - "value": null + "matcher": { + "id": "byName", + "options": "cluster_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 144 + }, + { + "id": "custom.inspect", + "value": false + } + ] }, { - "color": "red", - "value": 80 + "matcher": { + "id": "byName", + "options": "instance" + }, + "properties": [ + { + "id": "custom.width", + "value": 188 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Show details", + "url": "{BK_SAAS_HOST}/grafana/d/Gq771PmIk/mysql-instance?orgId=4945&var-app=$app&var-cluster_domain=$cluster_domain&var-instance=${__value.raw}" + } + ] + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instance_role" + }, + "properties": [ + { + "id": "custom.width", + "value": 186 + } + ] } ] }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 12, - "y": 12 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last", - "lastNotNull" + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 2 + }, + "id": null, + "interval": "6h", + "links": [], + "options": { + "footer": { + "enablePagination": true, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "table", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance_role", + "instance", + "cluster_name", + "version" + ], + "interval": 86400, + "interval_unit": "s", + "method": "MAX", + "metric_field": "mysql_version_info", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } + ] + } + ], + "refId": "B", + "source": "", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "timeFrom": "24h", + "title": "Instance List", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "cluster_name", + "instance", + "instance_role", + "version" + ] + } + } + } + ], + "type": "table" }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "$tag_command, $tag_state", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "command", - "state" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_info_schema_processlist_threads", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.plist", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 2 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": true, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Connected $tag_instance", + "query_configs": [ { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "Peak Threads Connected", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "mysql_global_status_threads_connected", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "Processlist State ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + ], + "refId": "A", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", + "step": "", + "type": "range" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "MaxUsed $tag_instance", + "query_configs": [], + "refId": "B", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_max_used_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", + "step": "", + "type": "range" }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 18, - "y": 12 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last", - "min" + "expressionList": [], + "format": "time_series", + "hide": true, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Max Conn", + "query_configs": [], + "refId": "C", + "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_max_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "title": "MySQL Connections ($dbrole)", + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "Hits", - "expression": "min(a / ( b + c)) * 100", - "functions": [] + "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 7 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" } - ], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "Com_$tag_command", - "query_configs": [ + }, + "targets": [ { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "id": "rate", - "params": [ + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_connection_used_percent", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ { - "id": "window", - "value": "2m" + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_hits", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "MySQL Connections Usage ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "The number of statements executed by the server. This includes\nonly statements sent to the server by clients and not statements executed\nwithin stored programs, unlike the Queries variable. This variable does\nnot count COM_PING, COM_STATISTICS, COM_STMT_PREPARE, COM_STMT_CLOSE, or\nCOM_STMT_RESET commands", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 12 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "Questions", + "query_configs": [ { - "id": "rate", - "params": [ + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ { - "id": "window", - "value": "2m" + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "instance" + ], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_questions", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_hits", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] + "refId": "B", + "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "step": "", + "type": "range" + } + ], + "title": "Questions ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "select|insert|update|delete|replace|commit", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 12 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "$tag_instance", + "query_configs": [ { - "id": "rate", - "params": [ + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ { - "id": "window", - "value": "2m" + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "command" + ], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_commands_total", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + }, + { + "condition": "and", + "key": "command", + "method": "reg", + "value": [ + "select|insert|update|delete" + ] } ] } ], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_misses", - "refId": "c", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] + "refId": "B", + "source": "sum by(instance) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit|prepare.*\",instance_role=\"$dbrole\"}[2m])) >0", + "step": "", + "type": "range" } ], - "refId": "B", - "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", - "step": "", - "type": "range" - } - ], - "title": "Table Cache Hits($dbrole)", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 20 - }, - "id": null, - "panels": [], - "title": "Instance Detail ($dbrole)", - "type": "row" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "Click link to get details for this instance", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto", - "filterable": true, - "inspect": false - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 + "title": "QPS ($dbrole)", + "transformations": [ + { + "id": "calculateField", + "options": { + "mode": "reduceRow", + "reduce": { + "include": [ + "commit", + "delete", + "delete_multi", + "insert", + "insert_select", + "replace", + "replace_select", + "select", + "update", + "update_multi", + "xa_commit" + ], + "reducer": "sum" + } } - ] - } + } + ], + "type": "timeseries" }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "cluster_name" - }, - "properties": [ - { - "id": "custom.width", - "value": 144 - }, - { - "id": "custom.inspect", - "value": false - } - ] + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "custom.width", - "value": 188 + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - { - "id": "links", - "value": [ + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ { - "targetBlank": true, - "title": "Show details", - "url": "{BK_SAAS_HOST}/grafana/d/Gq771PmIk/mysql-instance?orgName=dbm&var-app=$app&var-cluster_domain=$cluster_domain&var-instance=${__value.raw}" + "color": "green" + }, + { + "color": "red", + "value": 80 } ] - }, - { - "id": "custom.displayMode", - "value": "color-text" } - ] + }, + "overrides": [] }, - { - "matcher": { - "id": "byName", - "options": "instance_role" + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 17 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "properties": [ - { - "id": "custom.width", - "value": 186 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 21 - }, - "id": null, - "interval": "6h", - "links": [], - "options": { - "footer": { - "enablePagination": true, - "fields": "", - "reducer": [ - "sum" + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [ + { + "active": true, + "alias": "", + "expression": "", + "functions": [] + } + ], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "Com_$tag_command", + "query_configs": [ + { + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "increase", + "params": [ + { + "id": "window", + "value": "1m" + } + ] + } + ], + "group_by": [ + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_slow_queries", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", + "step": "", + "type": "range" + } ], - "show": false + "title": "Slow Queries 1m ($dbrole)", + "type": "timeseries" }, - "frameIndex": 0, - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "9.1.0", - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "table", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "instance_role", - "instance", - "cluster_name", - "version" - ], - "interval": 86400, - "interval_unit": "s", - "method": "MAX", - "metric_field": "mysql_version_info", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - } - ] - } - ], - "refId": "B", - "source": "", - "step": "", - "type": "range" - } - ], - "timeFrom": "24h", - "title": "Instance List", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "cluster_name", - "instance", - "instance_role", - "version" - ] - } - } - } - ], - "type": "table" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 21 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.1.0", - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "$tag_bk_target_ip", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "usage", - "refId": "a", - "result_table_id": "dbm_system.cpu_summary", - "result_table_label": "os", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "max(max_over_time(bkmonitor:dbm_system:cpu_summary:usage{cluster_domain=\"$cluster_domain\",instance_role=\"$spider_master\"}[1m])) by (instance)", - "step": "", - "type": "range" - } - ], - "title": "CPU Usage ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 26 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.1.0", - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "ioutil", - "query_configs": [ - { - "alias": "$tag_bk_target_ip: writes", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "w_s", - "refId": "a", - "result_table_id": "dbm_system.io", - "result_table_label": "os", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - }, - { - "alias": "$tag_bk_target_ip: reads", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "r_s", - "refId": "b", - "result_table_id": "dbm_system.io", - "result_table_label": "os", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", - "step": "", - "type": "range" - } - ], - "title": "Disk IOs per Device($dbrole)", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "The number of statements executed by the server. This includes\nonly statements sent to the server by clients and not statements executed\nwithin stored programs, unlike the Queries variable. This variable does\nnot count COM_PING, COM_STATISTICS, COM_STMT_PREPARE, COM_STMT_CLOSE, or\nCOM_STMT_RESET commands", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 31 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "Questions", - "query_configs": [ - { - "alias": "$tag_instance", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "instance" - ], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_questions", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", - "step": "", - "type": "range" - } - ], - "title": "Questions ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "The number of statements executed by the server. This variable\nincludes statements executed within stored programs, unlike the Questions\nvariable. It does not count COM_PING or COM_STATISTICS commands", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 31 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "Questions", - "query_configs": [ - { - "alias": "$tag_instance", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "instance" - ], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_queries", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", - "step": "", - "type": "range" - } - ], - "title": "Queries ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "select|insert|update|delete|replace|commit", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 31 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "$tag_instance", - "query_configs": [ - { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "command" - ], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_commands_total", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - }, - { - "condition": "and", - "key": "command", - "method": "reg", - "value": [ - "select|insert|update|delete" - ] - } - ] - } - ], - "refId": "B", - "source": "sum by(instance) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit|prepare.*\",instance_role=\"$dbrole\"}[2m])) >0", - "step": "", - "type": "range" - } - ], - "title": "QPS ($dbrole)", - "transformations": [ - { - "id": "calculateField", - "options": { - "mode": "reduceRow", - "reduce": { - "include": [ - "commit", - "delete", - "delete_multi", - "insert", - "insert_select", - "replace", - "replace_select", - "select", - "update", - "update_multi", - "xa_commit" - ], - "reducer": "sum" - } - } - } - ], - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 36 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "$tag_command", - "query_configs": [ - { - "alias": "$tag_instance, Open Tables", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "instance" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_open_tables", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", - "step": "", - "type": "range" - } - ], - "title": "Open Tables ($dbrole)", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 36 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "$tag_command", - "query_configs": [ - { - "alias": "$tag_instance, Openings files", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "instance" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_opened_files", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", - "step": "", - "type": "range" - } - ], - "title": "File Openings($dbrole)", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "dtdurations" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 36 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "$tag_instance, $tag_mount_point", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "mount_point", - "instance", - "path" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_df_usage", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.datasize", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "datadir usage ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 41 - }, - "id": null, - "options": { - "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": true, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Connected $tag_instance", - "query_configs": [ - { - "alias": "Peak Threads Connected", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "mysql_global_status_threads_connected", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "A", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "MaxUsed $tag_instance", - "query_configs": [], - "refId": "B", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_max_used_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": true, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Max Conn", - "query_configs": [], - "refId": "C", - "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_max_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])) by (instance)", - "step": "", - "type": "range" - } - ], - "title": "MySQL Connections ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "mbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 41 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "$tag_instance $tag_mount_point", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "instance", - "mount_point" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_du_used_mb", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.datasize", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "datadir used size ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 46 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [ - { - "active": true, - "alias": "", - "expression": "", - "functions": [] - } - ], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "Com_$tag_command", - "query_configs": [ - { - "alias": "$tag_instance", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [ - "instance" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_slow_queries", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", - "step": "", - "type": "range" - } - ], - "title": "Slow Queries ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "磁盘空间使用率", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 46 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.1.0", - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "$tag_bk_target_ip, $tag_mount_point", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "mount_point", - "bk_target_ip" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "used", - "refId": "a", - "result_table_id": "dbm_system.disk", - "result_table_label": "os", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "C", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "Disk Size Used", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "dtdurations" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 51 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "slave=$tag_instance, $tag_channel_name, master_uuid=$tag_master_uuid", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "instance", - "master_uuid", - "channel_name" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_slave_status_seconds_behind_master", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "description": "The number of statements executed by the server. This variable\nincludes statements executed within stored programs, unlike the Questions\nvariable. It does not count COM_PING or COM_STATISTICS commands", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "Seconds Behind Master (slave)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" }, - { - "color": "red", - "value": 80 + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] } - ] + }, + "overrides": [] }, - "unit": "dtdurations" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 51 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 17 }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "delay_sec: $tag_instance", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "instance" + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_infodba_schema_heartbeat_delay_sec", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - } - ] + "displayMode": "table", + "placement": "right", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ { - "alias": "beat_sec: $tag_instance", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "instance" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_infodba_schema_heartbeat_beat_sec", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", - "result_table_label": "component", - "time_field": "", - "where": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "Questions", + "query_configs": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "instance" + ], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_queries", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] + ], + "refId": "B", + "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "Master Slave Heartbeat Delay (slave)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "title": "Queries ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurations" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "none" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 51 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "right", - "showLegend": true + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "slave=$tag_instance, $tag_channel_name, master_uuid=$tag_master_uuid", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance", + "master_uuid", + "channel_name" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_slave_status_seconds_behind_master", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "Seconds Behind Master (slave)", + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.1.0", - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "ioutil", - "query_configs": [ - { - "alias": "$tag_bk_target_ip, timewait", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip", - "instance_role" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "cur_tcp_timewait", - "refId": "a", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurations" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ { - "alias": "$tag_bk_target_ip, closewait", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip", - "instance_role" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "cur_tcp_closewait", - "refId": "b", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", - "time_field": "", - "where": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "delay_sec: $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_infodba_schema_heartbeat_delay_sec", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } ] }, { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "beat_sec: $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_infodba_schema_heartbeat_beat_sec", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.slavestat", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } ] } - ] - }, - { - "alias": "$tag_bk_target_ip, estab", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip", - "instance_role" ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "cur_tcp_estab", - "refId": "c", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "Master Slave Heartbeat Delay (slave)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 12, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "$tag_instance, Open Tables", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "instance" + ], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_open_tables", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] + ], + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "step": "", + "type": "range" } ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", - "step": "", - "type": "range" - } - ], - "title": "TCP Connection ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "title": "Open Tables ($dbrole)", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "desc" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 51 - }, - "id": null, - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "right", - "showLegend": true + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ + { + "alias": "$tag_instance, Openings files", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "instance" + ], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_opened_files", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "step": "", + "type": "range" + } + ], + "title": "File Openings($dbrole)", + "transformations": [], + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.1.0", - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "ioutil", - "query_configs": [ - { - "alias": "In: $tag_bk_target_ip $tag_device_name", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "device_name", - "bk_target_ip" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "speed_recv", - "refId": "a", - "result_table_id": "dbm_system.net", - "result_table_label": "os", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "condition": "and", - "key": "device_name", - "method": "reg", - "value": [ - "eth.*" - ] + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" }, - { - "alias": "Out: $tag_bk_target_ip $tag_device_name", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "device_name", - "bk_target_ip" + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 18, + "x": 0, + "y": 27 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "speed_sent", - "refId": "b", - "result_table_id": "dbm_system.net", - "result_table_label": "os", - "time_field": "time", - "where": [ + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, + "active": true, + "alias": "Time", + "expression": "(a / b) * 1000", + "functions": [] + } + ], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ { - "condition": "and", - "key": "device_name", - "method": "reg", - "value": [ - "eth.*" + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_info_schema_query_response_time_seconds_sum", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] }, { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_info_schema_query_response_time_seconds_count", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] - } - ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", - "step": "", - "type": "range" + ], + "refId": "B", + "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "step": "", + "type": "range" + } + ], + "title": "Average Query Response Time", + "transformations": [], + "type": "timeseries" } ], - "title": "MySQL Network Traffic ($dbrole)", - "type": "timeseries" + "title": "Instance Detail ($dbrole)", + "type": "row" }, { - "collapsed": false, + "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 56 + "y": 24 }, "id": null, - "panels": [], - "title": "Table Capacity", - "type": "row" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "panels": [ + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 3 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_bk_target_ip", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "usage", + "refId": "a", + "result_table_id": "dbm_system.cpu_summary", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "max(max_over_time(bkmonitor:dbm_system:cpu_summary:usage{cluster_domain=\"$cluster_domain\",instance_role=\"$spider_master\"}[1m])) by (instance)", + "step": "", + "type": "range" + } + ], + "title": "CPU Usage ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 3 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "none" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_bk_target_ip", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "pct_used", + "refId": "a", + "result_table_id": "dbm_system.mem", + "result_table_label": "os", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "max(max_over_time(bkmonitor:dbm_system:cpu_summary:usage{cluster_domain=\"$cluster_domain\",instance_role=\"$spider_master\"}[1m])) by (instance)", + "step": "", + "type": "range" + } + ], + "title": "Memory Usage ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "磁盘空间使用率", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] } - ] + }, + "overrides": [] }, - "unit": "mbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 9, - "x": 0, - "y": 57 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 8 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_bk_target_ip, $tag_mount_point", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "mount_point", + "bk_target_ip" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "used", + "refId": "a", + "result_table_id": "dbm_system.disk", + "result_table_label": "os", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "C", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "Disk Size Used", + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 8 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.0", + "targets": [ { - "alias": "$tag_instance,$tag_path", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "path", - "instance" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_du_used_mb", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "ioutil", + "query_configs": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "$tag_bk_target_ip, timewait", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "cur_tcp_timewait", + "refId": "a", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] }, { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "$tag_bk_target_ip, closewait", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "cur_tcp_closewait", + "refId": "b", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "$tag_bk_target_ip, estab", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "cur_tcp_estab", + "refId": "c", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] + ], + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "DataSize by datadir ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "title": "TCP Connection ($dbrole)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 13 + }, + "id": null, + "interval": "1h", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "none" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "kbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 7, - "x": 9, - "y": 57 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [ - "lastNotNull" + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance, $tag_mount_point", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "mount_point", + "instance", + "path" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_df_usage", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.datasize", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "title": "datadir fs usage ($dbrole)", + "type": "timeseries" }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 13 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.1.0", + "targets": [ { - "alias": "$tag_schema", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "schema" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_total_size", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.tablesize", - "result_table_label": "component", - "time_field": "", - "where": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "ioutil", + "query_configs": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "$tag_bk_target_ip: writes", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "w_s", + "refId": "a", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "$tag_bk_target_ip: reads", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "r_s", + "refId": "b", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] + ], + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "DataSize by schema", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "title": "Disk IOs per Device($dbrole)", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "mbytes" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 18 + }, + "id": null, + "interval": "2h", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "none" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 8, - "x": 16, - "y": 57 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [ - "lastNotNull" + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance $tag_path", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance", + "path" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_du_used_mb", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "title": "datadir used size ($dbrole)", + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 23 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.0", + "targets": [ { - "alias": "{$tag_schema}.$tag_table", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "ioutil", + "query_configs": [ { - "id": "topk", - "params": [ + "alias": "In: $tag_bk_target_ip $tag_device_name", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "device_name", + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "speed_recv", + "refId": "a", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", + "where": [ { - "id": "k", - "value": "20" + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "device_name", + "method": "reg", + "value": [ + "eth.*" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] - } - ], - "group_by": [ - "schema", - "table" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_info_schema_table_rows", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.tablesize", - "result_table_label": "component", - "time_field": "time", - "where": [ + }, { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "Out: $tag_bk_target_ip $tag_device_name", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "device_name", + "bk_target_ip" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "speed_sent", + "refId": "b", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "device_name", + "method": "reg", + "value": [ + "eth.*" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } ] } - ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "TableRows by table", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" + ], + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "step": "", + "type": "range" } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "mbytes" - }, - "overrides": [] - }, + ], + "title": "MySQL Network Traffic ($dbrole)", + "type": "timeseries" + } + ], + "title": "Host OS ($dbrole)", + "type": "row" + }, + { + "collapsed": true, "gridPos": { - "h": 5, - "w": 9, + "h": 1, + "w": 24, "x": 0, - "y": 62 + "y": 25 }, "id": null, - "interval": "2h", - "options": { - "legend": { - "calcs": [], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ + "panels": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "used $tag_instance_host $tag_mount_point", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "mount_point", - "instance_host" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_df_used_mb", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ] + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" }, - { - "alias": "total $tag_instance_host $tag_mount_point", - "data_label": "exporter_dbm_mysqld_exporter", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "mount_point", - "instance_host" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": null, + "interval": "24h", + "options": { + "legend": { + "calcs": [ + "lastNotNull" ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_df_total_mb", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "$tag_database_name", + "data_label": "dbm_report_channel", + "data_source_label": "custom", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "database_name" + ], + "interval": "auto", + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_database_size", + "refId": "a", + "result_table_id": "bkmonitor_time_series_553410.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "slave" + ] + } ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "timeFrom": "7d", + "title": "Database Size (ibd)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": null, + "interval": "24", + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "alias": "$tag_database_name.$tag_table_name", + "data_label": "dbm_report_channel", + "data_source_label": "custom", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "topk", + "params": [ + { + "id": "k", + "value": "30" + } + ] + } + ], + "group_by": [ + "database_name", + "table_name" + ], + "interval": "auto", + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_table_size", + "refId": "a", + "result_table_id": "bkmonitor_time_series_553410.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } ] } - ] + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "host disk space ($dbrole)", - "type": "timeseries" - }, - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "timeFrom": "7d", + "title": "Table Size Top30(ibd)", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "mbytes" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 32 + }, + "id": null, + "interval": "24h", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "desc" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "kbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 67 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [ - "lastNotNull" + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance,$tag_path", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "path", + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_du_used_mb", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "remote_master" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "title": "datadir Size by Shard Instance", + "type": "timeseries" }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "mbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 32 + }, + "id": null, + "interval": "2h", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ { - "alias": "$tag_database_name", - "data_label": "bk_dba_custom_metrics", - "data_source_label": "custom", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "database_name" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_database_size", - "refId": "a", - "result_table_id": "bkmonitor_time_series_543957.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "key": "immute_domain", - "method": "eq", - "value": [ - "$cluster_domain" + "alias": "used $tag_instance_host $tag_mount_point", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "mount_point", + "instance_host" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_df_used_mb", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "remote_master" + ] + } + ] + }, + { + "alias": "total $tag_instance_host $tag_mount_point", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "mount_point", + "instance_host" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_df_total_mb", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "remote_master" + ] + } ] } - ] + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" + "title": "disk partition space by host", + "type": "timeseries" } ], - "title": "ibd database size", - "type": "timeseries" + "title": "Table Capacity", + "type": "row" }, { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "id": null, + "panels": [ + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "description": "The number of statements executed by the server. This includes\nonly statements sent to the server by clients and not statements executed\nwithin stored programs, unlike the Queries variable. This variable does\nnot count COM_PING, COM_STATISTICS, COM_STMT_PREPARE, COM_STMT_CLOSE, or\nCOM_STMT_RESET commands", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "multi", + "sort": "desc" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "kbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 67 - }, - "id": null, - "interval": "1h", - "options": { - "legend": { - "calcs": [ - "lastNotNull" + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "Questions", + "query_configs": [ + { + "alias": "$tag_instance_role,$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "instance", + "instance_role" + ], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_questions", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } + ] + } + ], + "refId": "B", + "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:gstatus:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "step": "", + "type": "range" + } ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "title": "Questions ", + "type": "timeseries" }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ { - "cluster": [], "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], - "format": "time_series", - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 22 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.1.0", + "targets": [ { - "alias": "{$tag_database_name}.$tag_table_name", - "data_label": "dbm_report_channel", - "data_source_label": "custom", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "HVlyYOe4z" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "id": "topk", - "params": [ + "alias": "", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance_role", + "bk_target_ip" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "usage", + "refId": "a", + "result_table_id": "dbm_system.cpu_summary", + "result_table_label": "os", + "time_field": "time", + "where": [ { - "id": "k", - "value": "50" + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] } ] } ], - "group_by": [ - "database_name", - "table_name" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_table_size", - "refId": "a", - "result_table_id": "bkmonitor_time_series_1572876.__default__", - "result_table_label": "component", - "time_field": "time", - "where": [ - { - "key": "immute_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - } - ] + "refId": "C", + "source": "", + "step": "", + "type": "range" } ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "ibd table size", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 75 - }, - "id": null, - "panels": [ + "title": "CPU Usage", + "type": "timeseries" + }, { "datasource": { - "type": "bk_log_datasource", - "uid": "NdlyLO64k" + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, + "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "displayMode": "auto", - "inspect": false + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -5692,69 +5905,455 @@ "overrides": [] }, "gridPos": { - "h": 8, + "h": 5, "w": 12, "x": 0, - "y": 21 + "y": 28 }, "id": null, "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "legend": { + "calcs": [ + "last" ], - "show": false + "displayMode": "table", + "placement": "right", + "showLegend": true }, - "showHeader": true + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "pluginVersion": "9.1.0", "targets": [ { - "data": { - "alias": "", - "conditions": [], - "dimensions": [], - "index": { - "id": [ - "host_process", - 38 + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance_role, $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance_role", + "instance" ], - "labels": [ - "进程", - "[采集项]mysql_slowlog" + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_threads_connected", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "MySQL Connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "method": "logs", - "metric": "bk_host_id", - "period": 60, - "periodUnitSet": { - "periodUnit": "min", - "timeNum": 1 + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 33 + }, + "id": null, + "interval": "1m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance_role $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance", + "instance_role" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_up", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "spider_master" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "MySQL Up (spider_master)", + "type": "heatmap" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "queryString": "", - "size": 50, - "target": { - "expandKeys": [], - "realValues": [], - "treeData": [], - "values": [] + "scaleDistribution": { + "type": "linear" } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 20, + "w": 12, + "x": 12, + "y": 33 + }, + "id": null, + "interval": "1m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance_role $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance", + "instance_role" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_up", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "remote_master" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" + } + ], + "title": "MySQL Up (remote master)", + "type": "heatmap" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 43 + }, + "id": null, + "interval": "1m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], "datasource": { - "type": "bk_log_datasource", - "uid": "NdlyLO64k" + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "datasourceId": "bk_log_datasource", - "name": "BlueKing Log TimeSeries", - "refId": "A" + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ + { + "alias": "$tag_instance_role $tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance", + "instance_role" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_up", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "remote_slave" + ] + } + ] + } + ], + "refId": "A", + "source": "", + "step": "", + "type": "range" } ], - "title": "Panel Title", - "type": "table" + "title": "MySQL Up (remote_slave)", + "type": "heatmap" } ], - "title": "Slow Logs", + "title": "Cluster Instance Overview", "type": "row" } ], @@ -5762,7 +6361,7 @@ "schemaVersion": 37, "style": "dark", "tags": [ - "tendbha" + "tendbcluster" ], "templating": { "list": [ @@ -5964,6 +6563,6 @@ "timezone": "default", "title": "TenDBCluster", "uid": "8303483841", - "version": 8, + "version": 15, "weekStart": "" -} \ No newline at end of file +} diff --git a/dbm-ui/backend/bk_dataview/dashboards/json/tendbha.json b/dbm-ui/backend/bk_dataview/dashboards/json/tendbha.json index e56517f697..a7ccee0241 100644 --- a/dbm-ui/backend/bk_dataview/dashboards/json/tendbha.json +++ b/dbm-ui/backend/bk_dataview/dashboards/json/tendbha.json @@ -38,7 +38,7 @@ }, "id": null, "panels": [], - "title": "Summary", + "title": "Summary ($dbrole)", "type": "row" }, { @@ -75,6 +75,7 @@ "x": 0, "y": 1 }, + "hideTimeOverride": true, "id": null, "interval": "1h", "options": { @@ -146,6 +147,7 @@ "type": "range" } ], + "timeFrom": "2h", "title": "Capacity Used Percent", "type": "gauge" }, @@ -530,7 +532,7 @@ "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 7, "x": 17, "y": 1 @@ -543,7 +545,7 @@ "max" ], "displayMode": "table", - "placement": "right", + "placement": "bottom", "showLegend": true }, "tooltip": { @@ -1063,28 +1065,30 @@ "value": 80 } ] - }, - "unit": "dtdurations" + } }, "overrides": [] }, "gridPos": { "h": 6, - "w": 7, - "x": 17, - "y": 6 + "w": 8, + "x": 9, + "y": 7 }, "id": null, "options": { "legend": { - "calcs": [], - "displayMode": "table", + "calcs": [ + "last", + "max" + ], + "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -1094,35 +1098,47 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "", + "expression": "", + "functions": [] + } + ], "format": "time_series", + "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "slave=$tag_instance, $tag_channel_name, master_uuid=$tag_master_uuid", - "data_label": "exporter_dbm_mysqld_exporter", + "alias": "slow_queries", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], - "group_by": [ - "instance", - "master_uuid", - "channel_name", - "master_server_id" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_slave_status_seconds_behind_master", + "method": "SUM", + "metric_field": "mysql_global_status_slow_queries", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "time", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -1130,17 +1146,25 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", "step": "", "type": "range" } ], - "title": "Seconds Behind Master", + "title": "Slow Queries", "type": "timeseries" }, { @@ -1196,30 +1220,28 @@ "value": 80 } ] - } + }, + "unit": "dtdurations" }, "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 9, + "w": 7, + "x": 17, "y": 7 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "list", + "calcs": [], + "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, "targets": [ @@ -1229,47 +1251,35 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "", - "expression": "", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", - "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "slow_queries", + "alias": "slave=$tag_instance, master_serverid=$tag_master_server_id", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "instance", + "master_uuid", + "channel_name", + "master_server_id" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_slow_queries", + "method": "AVG", + "metric_field": "mysql_slave_status_seconds_behind_master", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -1277,25 +1287,17 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "Slow Queries", + "title": "Seconds Behind Master", "type": "timeseries" }, { @@ -1510,21 +1512,22 @@ ], "timeFrom": "24h", "title": "MySQL Version", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "instance", + "instance_role", + "version" + ] + } + } + } + ], "type": "table" }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 13 - }, - "id": null, - "panels": [], - "title": "Command, Handlers", - "type": "row" - }, { "datasource": { "type": "bkmonitor-timeseries-datasource", @@ -1532,78 +1535,59 @@ }, "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, "scaleDistribution": { "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] } }, "overrides": [] }, "gridPos": { - "h": 8, - "w": 12, + "h": 6, + "w": 17, "x": 0, - "y": 14 + "y": 13 }, "id": null, "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "scale": "exponential", + "scheme": "Oranges", + "steps": 30 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true + "show": true + }, + "rowsFrame": { + "layout": "auto" }, "tooltip": { - "mode": "multi", - "sort": "desc" + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -1613,40 +1597,59 @@ }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "Com_$tag_command", + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [ - "command" + "instance" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "sum_without_time", - "metric_field": "mysql_global_status_commands_total", + "method": "AVG", + "metric_field": "mysql_up", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } + ] + }, + { + "alias": "$tag_instance", + "data_label": "exporter_dbm_mysqlproxy_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysqlproxy_up", + "refId": "b", + "result_table_id": "exporter_dbm_mysqlproxy_exporter.__default__", + "result_table_label": "component", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -1654,32 +1657,25 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "Top Command Counters", - "type": "timeseries" + "title": "MySQL Up", + "type": "heatmap" }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", "fieldConfig": { "defaults": { "color": { @@ -1733,10 +1729,10 @@ "overrides": [] }, "gridPos": { - "h": 8, - "w": 6, - "x": 12, - "y": 14 + "h": 6, + "w": 7, + "x": 17, + "y": 13 }, "id": null, "options": { @@ -1761,23 +1757,205 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ + "expressionList": [], + "format": "time_series", + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Peak Threads Connected", + "query_configs": [ { - "active": true, - "alias": "", - "expression": "", - "functions": [] + "alias": "Peak Threads Connected", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "mysql_global_status_threads_connected", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] } ], + "refId": "A", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "code", "module": [], - "promqlAlias": "$tag_handler", + "promqlAlias": "Max Ever Used", + "query_configs": [], + "refId": "B", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_max_used_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Max Conn Limited", + "query_configs": [], + "refId": "C", + "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_max_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + } + ], + "title": "MySQL Connections", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": null, + "panels": [], + "title": "Command, Handlers", + "type": "row" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 20 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "$tag_handler", + "alias": "Com_$tag_command", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, @@ -1794,12 +1972,12 @@ } ], "group_by": [ - "handler" + "command" ], "interval": 60, "interval_unit": "s", "method": "sum_without_time", - "metric_field": "mysql_global_status_handlers_total", + "metric_field": "mysql_global_status_commands_total", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -1824,12 +2002,12 @@ } ], "refId": "B", - "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler!~\"commit|rollback|savepoint.*|prepare\"}[2m]))", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]) > 0)", "step": "", "type": "range" } ], - "title": "MySQL Handlers", + "title": "Top Command Counters", "type": "timeseries" }, { @@ -1892,8 +2070,8 @@ "gridPos": { "h": 8, "w": 6, - "x": 18, - "y": 14 + "x": 12, + "y": 20 }, "id": null, "options": { @@ -1981,33 +2159,190 @@ } ], "refId": "B", - "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler=~\"commit|rollback|savepoint.*|prepare\"}[2m]))", + "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler!~\"commit|rollback|savepoint.*|prepare\"}[2m]))", "step": "", "type": "range" } ], - "title": "MySQL Transaction Handlers", + "title": "MySQL Handlers", "type": "timeseries" }, { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 22 + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" }, - "id": null, - "panels": [ - { - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 20 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [ + { + "active": true, + "alias": "", + "expression": "", + "functions": [] + } + ], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "$tag_handler", + "query_configs": [ + { + "alias": "$tag_handler", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "handler" + ], + "interval": 60, + "interval_unit": "s", + "method": "sum_without_time", + "metric_field": "mysql_global_status_handlers_total", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum by(handler) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_handlers_total{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\",handler=~\"commit|rollback|savepoint.*|prepare\"}[2m]))", + "step": "", + "type": "range" + } + ], + "title": "MySQL Transaction Handlers", + "type": "timeseries" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 28 + }, + "id": null, + "panels": [ + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, @@ -2051,8 +2386,7 @@ "value": 80 } ] - }, - "unit": "dtdurations" + } }, "overrides": [] }, @@ -2060,19 +2394,22 @@ "h": 8, "w": 12, "x": 0, - "y": 11 + "y": 3 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "max" + ], "displayMode": "table", - "placement": "bottom", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -2084,27 +2421,34 @@ }, "expressionList": [], "format": "time_series", + "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "Questions", "query_configs": [ { - "alias": "slave=$tag_instance, $tag_channel_name, master_uuid=$tag_master_uuid", + "alias": "Questions", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], - "group_by": [ - "instance", - "master_uuid", - "channel_name" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_slave_status_seconds_behind_master", + "metric_field": "mysql_global_status_questions", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -2116,17 +2460,25 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", "step": "", "type": "range" } ], - "title": "Seconds Behind Master", + "title": "Questions", "type": "timeseries" }, { @@ -2134,6 +2486,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "**Peak Threads Connected** is number of peak number of connections MySQL had in the period of time\n\n**Peak Threads Running** is the peak number of threads considered \"Running\" by MySQL, not Sleeping or Waiting on Table level locks which can be indicative for workload spikes\n\n**Avg Threads Running** is the average number of Threads running over interval which can be indicative of sustained load", "fieldConfig": { "defaults": { "color": { @@ -2181,8 +2534,7 @@ "value": 80 } ] - }, - "unit": "dtdurations" + } }, "overrides": [] }, @@ -2190,19 +2542,22 @@ "h": 8, "w": 12, "x": 12, - "y": 11 + "y": 3 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "max" + ], "displayMode": "table", - "placement": "bottom", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -2215,24 +2570,22 @@ "expressionList": [], "format": "time_series", "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "", + "promqlAlias": "Peak Threads Connected", "query_configs": [ { - "alias": "heartbeat_delay_sec, master_uuid=$tag_master_uuid", + "alias": "Peak Threads Connected", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [ - "master_uuid" - ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_infodba_schema_heartbeat_delay_sec", + "method": "MAX", + "metric_field": "mysql_global_status_threads_connected", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -2243,68 +2596,72 @@ "method": "eq", "value": [ "$cluster_domain" - ] - } - ] - }, - { - "alias": "heartbeat_beat_sec, master_uuid=$tag_master_uuid", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "master_uuid" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_infodba_schema_heartbeat_beat_sec", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" ] } ] } ], "refId": "A", - "source": "", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Peak Threads Running", + "query_configs": [], + "refId": "B", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_running{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Avg Threads Running", + "query_configs": [], + "refId": "C", + "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_running{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", "step": "", "type": "range" } ], - "title": "Master Slave Heartbeat Delay", + "title": "MySQL Client Thread Activity", "type": "timeseries" - } - ], - "title": "Replication", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 23 - }, - "id": null, - "panels": [ + }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", + "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", "fieldConfig": { "defaults": { "color": { @@ -2352,16 +2709,15 @@ "value": 80 } ] - }, - "unit": "short" + } }, "overrides": [] }, "gridPos": { - "h": 4, - "w": 11, + "h": 8, + "w": 12, "x": 0, - "y": 12 + "y": 11 }, "id": null, "options": { @@ -2388,28 +2744,25 @@ }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "Peak Threads Connected", "query_configs": [ { - "alias": "", + "alias": "Peak Threads Connected", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [ - "instance" - ], + "group_by": [], "interval": 60, "interval_unit": "s", "method": "MAX", - "metric_field": "mysqlproxy_process_total", + "metric_field": "mysql_global_status_threads_connected", "refId": "a", - "result_table_id": "exporter_dbm_mysqlproxy_exporter.__default__", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", "time_field": "", "where": [ @@ -2419,18 +2772,63 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], + "refId": "A", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Max Ever Used", + "query_configs": [], "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_max_used_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Max Conn", + "query_configs": [], + "refId": "C", + "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_max_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", "step": "", "type": "range" } ], - "title": "Proxy Conn", - "transformations": [], + "title": "MySQL Connections", "type": "timeseries" }, { @@ -2438,7 +2836,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", + "description": "**Thread Cache Size** is the value of the [thread_cache_size](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_thread_cache_size) system variable that defines how many threads the server should cache for reuse. When a client disconnects, the client's threads are put in the cache (unless it is full). As of MySQL 5.6.8, default thread cache size depends on the value of [max_connections](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_connections) and is capped at 100 threads. Requests for threads are satisfied by reusing threads taken from the cache if possible, and only when the cache is empty is a new thread created.\n", "fieldConfig": { "defaults": { "color": { @@ -2491,25 +2889,27 @@ "overrides": [] }, "gridPos": { - "h": 4, - "w": 13, - "x": 11, - "y": 12 + "h": 8, + "w": 12, + "x": 12, + "y": 11 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "max" + ], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -2519,30 +2919,27 @@ }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], - "mode": "ui", + "mode": "code", "module": [], - "promqlAlias": "", + "promqlAlias": "Thread Cache Size", "query_configs": [ { - "alias": "", + "alias": "Peak Threads Connected", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [ - "bk_target_ip" - ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "usage", + "method": "MAX", + "metric_field": "mysql_global_status_threads_connected", "refId": "a", - "result_table_id": "dbm_system.cpu_summary", - "result_table_label": "os", - "time_field": "time", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -2556,23 +2953,61 @@ "key": "instance_role", "method": "eq", "value": [ - "proxy" + "$dbrole" ] } ] } ], + "refId": "A", + "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_thread_cache_size{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Threads Created", + "query_configs": [], + "refId": "B", + "source": "rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_created{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "code", + "module": [], + "promqlAlias": "Threads Cached", + "query_configs": [], "refId": "C", - "source": "", + "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_cached{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", "step": "", "type": "range" } ], - "title": "CPU Usage", + "title": "MySQL Thread Cache", "type": "timeseries" } ], - "title": "Proxy", + "title": "Common", "type": "row" }, { @@ -2581,7 +3016,7 @@ "h": 1, "w": 24, "x": 0, - "y": 24 + "y": 29 }, "id": null, "panels": [ @@ -2637,7 +3072,8 @@ "value": 80 } ] - } + }, + "unit": "dtdurations" }, "overrides": [] }, @@ -2645,22 +3081,19 @@ "h": 8, "w": 12, "x": 0, - "y": 13 + "y": 4 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", - "placement": "right", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, "targets": [ @@ -2672,38 +3105,33 @@ }, "expressionList": [], "format": "time_series", - "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "Questions", + "promqlAlias": "", "query_configs": [ { - "alias": "Questions", + "alias": "slave=$tag_instance, master_serverid=$tag_master_server_id, $tag_channel_name", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "instance", + "master_uuid", + "channel_name", + "master_server_id" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_global_status_questions", + "metric_field": "mysql_slave_status_seconds_behind_master", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -2711,25 +3139,17 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "B", - "source": "avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_questions{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "Questions", + "title": "Seconds Behind Master", "type": "timeseries" }, { @@ -2737,7 +3157,6 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "**Peak Threads Connected** is number of peak number of connections MySQL had in the period of time\n\n**Peak Threads Running** is the peak number of threads considered \"Running\" by MySQL, not Sleeping or Waiting on Table level locks which can be indicative for workload spikes\n\n**Avg Threads Running** is the average number of Threads running over interval which can be indicative of sustained load", "fieldConfig": { "defaults": { "color": { @@ -2785,7 +3204,8 @@ "value": 80 } ] - } + }, + "unit": "dtdurations" }, "overrides": [] }, @@ -2793,22 +3213,19 @@ "h": 8, "w": 12, "x": 12, - "y": 13 + "y": 4 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", - "placement": "right", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, "targets": [ @@ -2821,26 +3238,30 @@ "expressionList": [], "format": "time_series", "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "Peak Threads Connected", + "promqlAlias": "", "query_configs": [ { - "alias": "Peak Threads Connected", + "alias": "heartbeat_delay_sec, master=$tag_master_server_id", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [], - "interval": 60, + "group_by": [ + "master_uuid", + "master_server_id" + ], + "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "mysql_global_status_threads_connected", + "method": "AVG", + "metric_field": "mysql_infodba_schema_heartbeat_delay_sec", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -2848,71 +3269,69 @@ "value": [ "$cluster_domain" ] - }, + } + ] + }, + { + "alias": "heartbeat_beat_sec, master=$tag_master_server_id", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "master_uuid", + "master_server_id" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_infodba_schema_heartbeat_beat_sec", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", + "where": [ { - "condition": "and", - "key": "instance_role", + "key": "cluster_domain", "method": "eq", "value": [ - "$dbrole" + "$cluster_domain" ] } ] } ], "refId": "A", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Peak Threads Running", - "query_configs": [], - "refId": "B", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_running{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Avg Threads Running", - "query_configs": [], - "refId": "C", - "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_running{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "source": "", "step": "", "type": "range" } ], - "title": "MySQL Client Thread Activity", + "title": "Master Slave Heartbeat Delay", "type": "timeseries" - }, + } + ], + "title": "Replication", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 30 + }, + "id": null, + "panels": [ { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "**Max Connections** is the maximum permitted number of simultaneous client connections. This is the value of the ``max_connections`` variable.\n\n**Max Used Connections** is the maximum number of connections that have been in use simultaneously since the server was started.\n\n**Connections** is the number of connection attempts (successful or not) to the MySQL server.", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -2960,15 +3379,16 @@ "value": 80 } ] - } + }, + "unit": "short" }, "overrides": [] }, "gridPos": { - "h": 8, + "h": 6, "w": 12, "x": 0, - "y": 21 + "y": 5 }, "id": null, "options": { @@ -2995,27 +3415,31 @@ }, "expressionList": [], "format": "time_series", + "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "Peak Threads Connected", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "Peak Threads Connected", + "alias": "process_total: $tag_instance", + "data_label": "exporter_dbm_mysqlproxy_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [], + "group_by": [ + "instance" + ], "interval": 60, "interval_unit": "s", "method": "MAX", - "metric_field": "mysql_global_status_threads_connected", + "metric_field": "mysqlproxy_process_total", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_id": "exporter_dbm_mysqlproxy_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -3023,63 +3447,18 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] } ], - "refId": "A", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_connected{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Max Ever Used", - "query_configs": [], "refId": "B", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_max_used_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Max Conn", - "query_configs": [], - "refId": "C", - "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_max_connections{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", "step": "", "type": "range" } ], - "title": "MySQL Connections", + "title": "Proxy Conn", + "transformations": [], "type": "timeseries" }, { @@ -3087,7 +3466,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "**Thread Cache Size** is the value of the [thread_cache_size](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_thread_cache_size) system variable that defines how many threads the server should cache for reuse. When a client disconnects, the client's threads are put in the cache (unless it is full). As of MySQL 5.6.8, default thread cache size depends on the value of [max_connections](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_connections) and is capped at 100 threads. Requests for threads are satisfied by reusing threads taken from the cache if possible, and only when the cache is empty is a new thread created.\n", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -3140,27 +3519,25 @@ "overrides": [] }, "gridPos": { - "h": 8, + "h": 6, "w": 12, "x": 12, - "y": 21 + "y": 5 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -3170,28 +3547,31 @@ }, "expressionList": [], "format": "time_series", + "hide": false, "host": [], - "mode": "code", + "mode": "ui", "module": [], - "promqlAlias": "Thread Cache Size", + "promqlAlias": "", "query_configs": [ { - "alias": "Peak Threads Connected", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [], - "interval": 60, + "group_by": [ + "bk_target_ip" + ], + "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "mysql_global_status_threads_connected", + "method": "AVG", + "metric_field": "usage", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ + "result_table_id": "dbm_system.cpu_summary", + "result_table_label": "os", + "time_field": "time", + "where": [ { "key": "cluster_domain", "method": "eq", @@ -3204,78 +3584,27 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "proxy" ] } ] } ], - "refId": "A", - "source": "max(max_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_variables_thread_cache_size{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Threads Created", - "query_configs": [], - "refId": "B", - "source": "rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_created{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m])", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "code", - "module": [], - "promqlAlias": "Threads Cached", - "query_configs": [], "refId": "C", - "source": "avg(avg_over_time(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_threads_cached{cluster_domain=~\"$cluster_domain\",instance_role=~\"$dbrole\"}[1m]))", + "source": "", "step": "", "type": "range" } ], - "title": "MySQL Thread Cache", + "title": "CPU Usage", "type": "timeseries" - } - ], - "title": "Common", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 25 - }, - "id": null, - "panels": [ + }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -3312,7 +3641,6 @@ } }, "mappings": [], - "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -3325,25 +3653,22 @@ } ] }, - "unit": "percent" + "unit": "binBps" }, "overrides": [] }, "gridPos": { - "h": 7, + "h": 6, "w": 12, "x": 0, - "y": 14 + "y": 11 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "list", - "placement": "bottom", + "calcs": [], + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { @@ -3351,6 +3676,7 @@ "sort": "desc" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -3358,46 +3684,32 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "Hits", - "expression": "avg((a - b) / c) * 100", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "", + "alias": "$tag_instance_role, $tag_bk_target_ip, timewait", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_innodb_buffer_pool_read_requests", + "method": "MAX", + "metric_field": "cur_tcp_timewait", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", "time_field": "", "where": [ { @@ -3406,42 +3718,27 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] }, { - "alias": "", + "alias": "$tag_instance_role, $tag_bk_target_ip, closewait", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_innodb_buffer_pool_reads", + "method": "MAX", + "metric_field": "cur_tcp_closewait", "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", "time_field": "", "where": [ { @@ -3450,43 +3747,28 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] } ] }, { - "alias": "", + "alias": "$tag_instance_role, $tag_bk_target_ip, estab", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_global_status_innodb_buffer_pool_read_requests", + "metric_field": "cur_tcp_estab", "refId": "c", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -3500,19 +3782,19 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "proxy" ] } ] } ], - "refId": "B", - "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" } ], - "title": "Innodb Buffer Pool Hits", + "title": "TCP Connection", "type": "timeseries" }, { @@ -3520,6 +3802,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -3556,7 +3839,6 @@ } }, "mappings": [], - "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -3569,32 +3851,30 @@ } ] }, - "unit": "percent" + "unit": "binBps" }, "overrides": [] }, "gridPos": { - "h": 7, + "h": 6, "w": 12, "x": 12, - "y": 14 + "y": 11 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "list", - "placement": "bottom", + "calcs": [], + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -3602,47 +3882,33 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "Hits", - "expression": "avg(a / ( b + c)) * 100", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "Com_$tag_command", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "", + "alias": "Inbound $tag_bk_target_ip", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name", + "bk_target_ip" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_hits", + "method": "MAX", + "metric_field": "speed_recv", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -3656,81 +3922,30 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "proxy" ] } ] }, { - "alias": "", + "alias": "Outbound $tag_bk_target_ip", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name", + "bk_target_ip" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_hits", + "method": "MAX", + "metric_field": "speed_sent", "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - }, - { - "alias": "", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_status_table_open_cache_misses", - "refId": "c", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -3744,41 +3959,28 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "proxy" ] } ] } ], - "refId": "B", - "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" } ], - "title": "Table Cache Hits", + "title": "MySQL Network Traffic", + "transformations": [], "type": "timeseries" - } - ], - "title": "InnoDB", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": null, - "panels": [ + }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", + "description": "磁盘空间使用率", "fieldConfig": { "defaults": { "color": { @@ -3832,19 +4034,16 @@ }, "gridPos": { "h": 6, - "w": 16, + "w": 12, "x": 0, - "y": 15 + "y": 17 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { @@ -3852,6 +4051,7 @@ "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -3865,36 +4065,27 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "Usage $tag_mount_point", "query_configs": [ { - "alias": "le=$tag_le s", + "alias": "$tag_bk_target_ip : $tag_mount_point", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [ - "le" + "mount_point", + "bk_target_ip" ], "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_query_response_time_seconds_bucket", + "method": "max_without_time", + "metric_field": "in_use", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.disk", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -3903,25 +4094,32 @@ "$cluster_domain" ] }, + { + "condition": "and", + "key": "mount_point", + "method": "reg", + "value": [ + "/data.*|" + ] + }, { "condition": "and", "key": "instance_role", "method": "eq", "value": [ - "$dbrole" + "proxy" ] } ] } ], - "refId": "B", - "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "A", + "source": "max by(mount_point) (bkmonitor:dbm_system:disk:in_use{bk_target_ip=\"$host\",mount_point=~\"/data.*\"})", "step": "", "type": "range" } ], - "title": "Query Response Time Distribution Detail", - "transformations": [], + "title": "Disk Size Usage", "type": "timeseries" }, { @@ -3929,7 +4127,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", + "description": "磁盘io使用率", "fieldConfig": { "defaults": { "color": { @@ -3977,26 +4175,22 @@ "value": 80 } ] - }, - "unit": "ms" + } }, "overrides": [] }, "gridPos": { "h": 6, - "w": 8, - "x": 16, - "y": 15 + "w": 12, + "x": 12, + "y": 17 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { @@ -4004,6 +4198,7 @@ "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -4011,47 +4206,32 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "Time", - "expression": "(a / b) * 1000", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "", + "alias": "ioutil $tag_bk_target_ip", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "bk_target_ip" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_query_response_time_seconds_sum", + "method": "MAX", + "metric_field": "util", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4065,68 +4245,23 @@ "key": "instance_role", "method": "eq", "value": [ - "$dbrole" - ] - } - ] - }, - { - "alias": "", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_query_response_time_seconds_count", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" + "proxy" ] } ] } ], - "refId": "B", - "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "C", + "source": "", "step": "", "type": "range" } ], - "title": "Average Query Response Time", - "transformations": [], + "title": "IO util max", "type": "timeseries" } ], - "title": "ResponseTime", + "title": "Proxy", "type": "row" }, { @@ -4135,7 +4270,7 @@ "h": 1, "w": 24, "x": 0, - "y": 27 + "y": 31 }, "id": null, "panels": [ @@ -4198,26 +4333,24 @@ }, "gridPos": { "h": 5, - "w": 12, + "w": 8, "x": 0, - "y": 16 + "y": 6 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -4231,34 +4364,26 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "Openings", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "bk_target_ip" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_opened_files", + "method": "AVG", + "metric_field": "usage", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.cpu_summary", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4278,14 +4403,13 @@ ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "refId": "C", + "source": "", "step": "", "type": "range" } ], - "title": "MySQL File Opened", - "transformations": [], + "title": "CPU Usage", "type": "timeseries" }, { @@ -4348,26 +4472,24 @@ }, "gridPos": { "h": 5, - "w": 12, - "x": 12, - "y": 16 + "w": 8, + "x": 8, + "y": 6 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -4381,34 +4503,26 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "Open Files", + "alias": "$tag_device_name : writes", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_open_files", + "method": "MAX", + "metric_field": "w_s", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.gstatus ", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4428,85 +4542,23 @@ ] }, { - "alias": "InnoDB Open Files", + "alias": "$tag_device_name : reads", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_innodb_num_open_files", + "method": "MAX", + "metric_field": "r_s", "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - } - ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": false, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ - { - "alias": "Open Files Limit", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_global_variables_open_files_limit", - "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4526,14 +4578,13 @@ ] } ], - "refId": "A", - "source": "", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" } ], - "title": "MySQL File Openings", - "transformations": [], + "title": "Disk IOs per Device", "type": "timeseries" }, { @@ -4596,26 +4647,24 @@ }, "gridPos": { "h": 5, - "w": 12, - "x": 0, - "y": 21 + "w": 8, + "x": 16, + "y": 6 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -4629,34 +4678,24 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "Open Table Definitions", + "alias": "mem_usage", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_open_table_definitions", + "method": "MAX", + "metric_field": "pct_used", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.mem", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4676,31 +4715,21 @@ ] }, { - "alias": "Opened Table Definitions", + "alias": "mem_total", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_opened_table_definitions", + "method": "MAX", + "metric_field": "total", "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.mem", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4720,8 +4749,8 @@ ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" }, @@ -4733,14 +4762,14 @@ }, "expressionList": [], "format": "time_series", - "hide": false, + "hide": true, "host": [], "mode": "ui", "module": [], "promqlAlias": "", "query_configs": [ { - "alias": "Table Definitions Cache Size", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, @@ -4750,11 +4779,11 @@ "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_global_variables_table_definition_cache", + "metric_field": "used", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.swap", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4780,8 +4809,7 @@ "type": "range" } ], - "title": "MySQL Table Definition Cache", - "transformations": [], + "title": "Host Memory", "type": "timeseries" }, { @@ -4789,7 +4817,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", + "description": "磁盘空间使用率", "fieldConfig": { "defaults": { "color": { @@ -4837,33 +4865,30 @@ "value": 80 } ] - }, - "unit": "short" + } }, "overrides": [] }, "gridPos": { "h": 5, - "w": 12, - "x": 12, - "y": 21 + "w": 8, + "x": 0, + "y": 11 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -4877,34 +4902,26 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "Usage $tag_mount_point", "query_configs": [ { - "alias": "Open Tables", + "alias": "Usage $tag_mount_point", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "mount_point" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_open_tables", + "method": "max_without_time", + "metric_field": "in_use", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.disk", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4913,6 +4930,14 @@ "$cluster_domain" ] }, + { + "condition": "and", + "key": "mount_point", + "method": "reg", + "value": [ + "/data.*|" + ] + }, { "condition": "and", "key": "instance_role", @@ -4922,33 +4947,125 @@ ] } ] + } + ], + "refId": "A", + "source": "max by(mount_point) (bkmonitor:dbm_system:disk:in_use{bk_target_ip=\"$host\",mount_point=~\"/data.*\"})", + "step": "", + "type": "range" + } + ], + "title": "Disk Size Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "磁盘空间使用率", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 8, + "y": 11 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.0", + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "alias": "Table Open Cache", + "alias": "ioutil", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], + "functions": [], "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_variables_table_open_cache", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "method": "MAX", + "metric_field": "util", + "refId": "a", + "result_table_id": "dbm_system.io", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -4968,30 +5085,15 @@ ] } ], - "refId": "B", - "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "refId": "C", + "source": "", "step": "", "type": "range" } ], - "title": "Open Tables", - "transformations": [], + "title": "IO util", "type": "timeseries" - } - ], - "title": "Files and Opens", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 28 - }, - "id": null, - "panels": [ + }, { "datasource": { "type": "bkmonitor-timeseries-datasource", @@ -5045,32 +5147,31 @@ "value": 80 } ] - } + }, + "unit": "binBps" }, "overrides": [] }, "gridPos": { "h": 5, - "w": 12, - "x": 0, - "y": 17 + "w": 8, + "x": 16, + "y": 11 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], + "calcs": [], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -5084,34 +5185,26 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "Created Tmp Tables", + "alias": "Inbound", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_created_tmp_tables", + "method": "MAX", + "metric_field": "speed_recv", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5131,75 +5224,23 @@ ] }, { - "alias": "Created Tmp Disk Tables", + "alias": "Outbound", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "device_name" ], - "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_created_tmp_disk_tables", + "method": "MAX", + "metric_field": "speed_sent", "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "$dbrole" - ] - } - ] - }, - { - "alias": "Created Tmp Files", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } - ], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_created_tmp_files", - "refId": "c", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.net", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5219,14 +5260,13 @@ ] } ], - "refId": "B", - "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" } ], - "title": "MySQL Temporary Objects", - "transformations": [], + "title": "MySQL Network Traffic", "type": "timeseries" }, { @@ -5234,7 +5274,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "Shows how many selects were done without indexes. Such operations can impact performance.", + "description": "磁盘空间使用率", "fieldConfig": { "defaults": { "color": { @@ -5288,26 +5328,24 @@ }, "gridPos": { "h": 5, - "w": 12, - "x": 12, - "y": 17 + "w": 8, + "x": 0, + "y": 16 }, "id": null, "options": { "legend": { - "calcs": [ - "last", - "max" - ], - "displayMode": "table", - "placement": "right", + "calcs": [], + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "desc" + "sort": "none" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -5321,34 +5359,26 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "$tag_command", + "promqlAlias": "", "query_configs": [ { - "alias": "Select Full Join", + "alias": "Total $tag_mount_point", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "mount_point" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_select_full_join", + "method": "AVG", + "metric_field": "total", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "result_table_id": "dbm_system.disk", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5366,33 +5396,45 @@ ] } ] - }, + } + ], + "refId": "B", + "source": "", + "step": "", + "type": "range" + }, + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "", + "query_configs": [ { - "alias": "Select Full Range Join", + "alias": "Used $tag_mount_point", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [ - { - "id": "rate", - "params": [ - { - "id": "window", - "value": "2m" - } - ] - } + "functions": [], + "group_by": [ + "mount_point" ], - "group_by": [], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_global_status_select_full_range_join", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "method": "AVG", + "metric_field": "used", + "refId": "a", + "result_table_id": "dbm_system.disk", + "result_table_label": "os", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5412,35 +5454,21 @@ ] } ], - "refId": "B", - "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "refId": "C", + "source": "", "step": "", "type": "range" } ], - "title": "MySQL Select Types", - "transformations": [], + "title": "Disk Size Used", "type": "timeseries" - } - ], - "title": "Sorts & Temporary Objects", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": null, - "panels": [ + }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -5461,9 +5489,6 @@ "viz": false }, "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -5492,30 +5517,30 @@ } ] }, - "unit": "mbytes" + "unit": "binBps" }, "overrides": [] }, "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 29 + "h": 5, + "w": 16, + "x": 8, + "y": 16 }, "id": null, - "interval": "1h", "options": { "legend": { "calcs": [], - "displayMode": "list", - "placement": "bottom", + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, + "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -5525,28 +5550,30 @@ }, "expressionList": [], "format": "time_series", + "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "ioutil", "query_configs": [ { - "alias": "", + "alias": "$tag_instance_role, $tag_bk_target_ip, timewait", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "path" + "bk_target_ip", + "instance_role" ], - "interval": "auto", + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_du_used_mb", + "method": "MAX", + "metric_field": "cur_tcp_timewait", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", "time_field": "", "where": [ { @@ -5555,27 +5582,91 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", + } + ] + }, + { + "alias": "$tag_instance_role, $tag_bk_target_ip, closewait", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" + ], + "interval": 60, + "interval_unit": "s", + "method": "MAX", + "metric_field": "cur_tcp_closewait", + "refId": "b", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", "method": "eq", "value": [ - "backend_master" + "$cluster_domain" + ] + } + ] + }, + { + "alias": "$tag_instance_role, $tag_bk_target_ip, estab", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "bk_target_ip", + "instance_role" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "cur_tcp_estab", + "refId": "c", + "result_table_id": "dbm_system.netstat", + "result_table_label": "os", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" ] } ] } ], - "refId": "A", - "source": "", + "refId": "C", + "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", "step": "", "type": "range" } ], - "title": "DataSize by datadir", + "title": "TCP Connection", "type": "timeseries" - }, + } + ], + "title": "Host OS Metrics ($dbrole)", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": null, + "panels": [ { "datasource": { "type": "bkmonitor-timeseries-datasource", @@ -5601,6 +5692,9 @@ "viz": false }, "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { @@ -5634,16 +5728,18 @@ "overrides": [] }, "gridPos": { - "h": 6, + "h": 9, "w": 12, - "x": 12, - "y": 29 + "x": 0, + "y": 37 }, "id": null, - "interval": "1h", + "interval": "2h", "options": { "legend": { - "calcs": [], + "calcs": [ + "lastNotNull" + ], "displayMode": "table", "placement": "bottom", "showLegend": true @@ -5668,59 +5764,26 @@ "promqlAlias": "", "query_configs": [ { - "alias": "", + "alias": "$tag_instance_role($tag_instance) $tag_path", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "mount_point" + "path", + "instance", + "instance_role" ], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_datadir_df_used_mb", + "metric_field": "mysql_datadir_du_used_mb", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "backend_master" - ] - } - ] - }, - { - "alias": "", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "mount_point" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_datadir_df_total_mb", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5728,14 +5791,6 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "backend_master" - ] } ] } @@ -5746,7 +5801,7 @@ "type": "range" } ], - "title": "datadir disk space", + "title": "DataSize by datadir", "type": "timeseries" }, { @@ -5802,27 +5857,29 @@ } ] }, - "unit": "kbytes" + "unit": "mbytes" }, "overrides": [] }, "gridPos": { - "h": 4, + "h": 9, "w": 12, - "x": 0, - "y": 35 + "x": 12, + "y": 37 }, "id": null, "interval": "1h", "options": { "legend": { - "calcs": [], - "displayMode": "list", + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { - "mode": "single", + "mode": "multi", "sort": "none" } }, @@ -5841,23 +5898,57 @@ "promqlAlias": "", "query_configs": [ { - "alias": "$tag_schema", + "alias": "$tag_instance_role($tag_instance_host) $tag_mount_point, Used", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "schema" + "instance_role", + "instance_host", + "mount_point" ], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_info_schema_total_size", + "metric_field": "mysql_datadir_df_used_mb", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + } + ] + }, + { + "alias": "$tag_instance_role($tag_instance_host) $tag_mount_point, Total", + "data_label": "exporter_dbm_mysqld_exporter", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [], + "group_by": [ + "instance_role", + "instance_host", + "mount_point" + ], + "interval": "auto", + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_datadir_df_total_mb", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -5875,7 +5966,7 @@ "type": "range" } ], - "title": "DataSize by schema", + "title": "datadir disk partition space", "type": "timeseries" }, { @@ -5931,27 +6022,28 @@ } ] }, - "unit": "kbytes" + "unit": "bytes" }, "overrides": [] }, "gridPos": { - "h": 8, + "h": 9, "w": 12, - "x": 12, - "y": 35 + "x": 0, + "y": 46 }, "id": null, - "interval": "1h", + "interval": "24h", "options": { "legend": { "calcs": [ - "lastNotNull", - "max" + "lastNotNull" ], "displayMode": "table", "placement": "right", - "showLegend": true + "showLegend": true, + "sortBy": "Last *", + "sortDesc": true }, "tooltip": { "mode": "multi", @@ -5965,14 +6057,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "$tag_table", - "expression": "a + b", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "host": [], "mode": "ui", @@ -5980,23 +6065,24 @@ "promqlAlias": "", "query_configs": [ { - "alias": "", - "data_source_label": "bk_monitor", + "alias": "$tag_database_name", + "data_label": "dbm_report_channel", + "data_source_label": "custom", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "table" + "database_name" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_info_schema_table_size", + "method": "AVG", + "metric_field": "mysql_database_size", "refId": "a", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_id": "bkmonitor_time_series_553410.__default__", "result_table_label": "component", - "time_field": "", + "time_field": "time", "where": [ { "key": "cluster_domain", @@ -6004,82 +6090,6 @@ "value": [ "$cluster_domain" ] - }, - { - "condition": "and", - "key": "schema", - "method": "eq", - "value": [ - "$db_name" - ] - }, - { - "condition": "and", - "key": "component", - "method": "eq", - "value": [ - "data_length" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "backend_master" - ] - } - ] - }, - { - "alias": "", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": false, - "filter_dict": {}, - "functions": [], - "group_by": [ - "table" - ], - "interval": 60, - "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_info_schema_table_size", - "refId": "b", - "result_table_id": "exporter_dbm_mysqld_exporter.__default__", - "result_table_label": "component", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - }, - { - "condition": "and", - "key": "schema", - "method": "eq", - "value": [ - "$db_name" - ] - }, - { - "condition": "and", - "key": "component", - "method": "eq", - "value": [ - "index_length" - ] - }, - { - "condition": "and", - "key": "instance_role", - "method": "eq", - "value": [ - "backend_master" - ] } ] } @@ -6090,7 +6100,8 @@ "type": "range" } ], - "title": "DataSize by table [$db_name]", + "timeFrom": "7d", + "title": "Database Size (ibd)", "type": "timeseries" }, { @@ -6146,28 +6157,32 @@ } ] }, - "unit": "kbytes" + "unit": "bytes" }, "overrides": [] }, "gridPos": { - "h": 4, + "h": 9, "w": 12, - "x": 0, - "y": 39 + "x": 12, + "y": 46 }, "id": null, - "interval": "1h", + "interval": "24h", "options": { "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Last *", + "sortDesc": true }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, "targets": [ @@ -6185,27 +6200,38 @@ "promqlAlias": "", "query_configs": [ { - "alias": "", - "data_label": "bk_dba_custom_metrics", + "alias": "$tag_database_name.$tag_table_name", + "data_label": "dbm_report_channel", "data_source_label": "custom", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], + "functions": [ + { + "id": "topk", + "params": [ + { + "id": "k", + "value": "30" + } + ] + } + ], "group_by": [ - "database_name" + "database_name", + "table_name" ], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_database_size", + "metric_field": "mysql_table_size", "refId": "a", - "result_table_id": "bkmonitor_time_series_543957.__default__", + "result_table_id": "bkmonitor_time_series_553410.__default__", "result_table_label": "component", "time_field": "time", "where": [ { - "key": "immute_domain", + "key": "cluster_domain", "method": "eq", "value": [ "$cluster_domain" @@ -6220,7 +6246,8 @@ "type": "range" } ], - "title": "ibd by database", + "timeFrom": "7d", + "title": "Table Size Top 30 (ibd)", "type": "timeseries" } ], @@ -6233,7 +6260,7 @@ "h": 1, "w": 24, "x": 0, - "y": 30 + "y": 33 }, "id": null, "panels": [ @@ -6278,6 +6305,7 @@ } }, "mappings": [], + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -6290,7 +6318,7 @@ } ] }, - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -6298,18 +6326,17 @@ "h": 7, "w": 12, "x": 0, - "y": 19 + "y": 6 }, "id": null, - "interval": "5m", "options": { "legend": { "calcs": [ "last", - "lastNotNull" + "max" ], - "displayMode": "table", - "placement": "right", + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { @@ -6324,29 +6351,43 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "Hits", + "expression": "avg((a - b) / c) * 100", + "functions": [] + } + ], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "$tag_command, $tag_state", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, - "functions": [], - "group_by": [ - "command", - "state" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_info_schema_processlist_threads", + "metric_field": "mysql_global_status_innodb_buffer_pool_read_requests", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -6364,19 +6405,107 @@ "key": "instance_role", "method": "eq", "value": [ - "backend_master" + "$dbrole" + ] + } + ] + }, + { + "alias": "", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_innodb_buffer_pool_reads", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_innodb_buffer_pool_read_requests", + "refId": "c", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", "step": "", "type": "range" } ], - "title": "Processlist State", + "title": "Innodb Buffer Pool Hits", "type": "timeseries" }, { @@ -6420,6 +6549,7 @@ } }, "mappings": [], + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -6432,7 +6562,7 @@ } ] }, - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -6440,18 +6570,17 @@ "h": 7, "w": 12, "x": 12, - "y": 19 + "y": 6 }, "id": null, - "interval": "5m", "options": { "legend": { "calcs": [ "last", - "lastNotNull" + "max" ], - "displayMode": "table", - "placement": "right", + "displayMode": "list", + "placement": "bottom", "showLegend": true }, "tooltip": { @@ -6466,28 +6595,43 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "Hits", + "expression": "avg(a / ( b + c)) * 100", + "functions": [] + } + ], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "Com_$tag_command", "query_configs": [ { - "alias": "$tag_mysql_user", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, - "functions": [], - "group_by": [ - "mysql_user" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], + "group_by": [], "interval": 60, "interval_unit": "s", - "method": "SUM", - "metric_field": "mysql_info_schema_processlist_processes_by_user", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_hits", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -6505,24 +6649,112 @@ "key": "instance_role", "method": "eq", "value": [ - "backend_master" + "$dbrole" ] } ] - } - ], - "refId": "A", - "source": "", - "step": "", - "type": "range" - } - ], - "title": "Processlist User Stat", - "type": "timeseries" - } - ], - "title": "Processlist", - "type": "row" + }, + { + "alias": "", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_hits", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": false, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "AVG", + "metric_field": "mysql_global_status_table_open_cache_misses", + "refId": "c", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "avg((avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m])) - avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_reads{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) / avg(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_innodb_buffer_pool_read_requests{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))) * 100", + "step": "", + "type": "range" + } + ], + "title": "Table Cache Hits", + "type": "timeseries" + } + ], + "title": "InnoDB", + "type": "row" }, { "collapsed": true, @@ -6530,7 +6762,7 @@ "h": 1, "w": 24, "x": 0, - "y": 31 + "y": 34 }, "id": null, "panels": [ @@ -6539,6 +6771,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -6586,8 +6819,7 @@ "value": 80 } ] - }, - "unit": "percentunit" + } }, "overrides": [] }, @@ -6595,7 +6827,7 @@ "h": 5, "w": 12, "x": 0, - "y": 20 + "y": 35 }, "id": null, "options": { @@ -6620,38 +6852,36 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [ - { - "active": true, - "alias": "$tag_schema $tag_table, $tag_column", - "expression": "a / b", - "functions": [] - } - ], + "expressionList": [], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "", + "alias": "Created Tmp Tables", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [], - "group_by": [ - "schema", - "table", - "column", - "cluster_domain" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_auto_increment_column", + "method": "SUM", + "metric_field": "mysql_global_status_created_tmp_tables", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -6663,26 +6893,39 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] }, { - "alias": "", + "alias": "Created Tmp Disk Tables", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": false, + "display": true, "filter_dict": {}, - "functions": [], - "group_by": [ - "schema", - "table", - "column", - "cluster_domain" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_info_schema_auto_increment_column_max", + "method": "SUM", + "metric_field": "mysql_global_status_created_tmp_disk_tables", "refId": "b", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -6694,17 +6937,70 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "Created Tmp Files", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_created_tmp_files", + "refId": "c", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", "step": "", "type": "range" } ], - "title": "int 自增使用率", + "title": "MySQL Temporary Objects", + "transformations": [], "type": "timeseries" }, { @@ -6712,6 +7008,7 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "Shows how many selects were done without indexes. Such operations can impact performance.", "fieldConfig": { "defaults": { "color": { @@ -6759,8 +7056,7 @@ "value": 80 } ] - }, - "unit": "none" + } }, "overrides": [] }, @@ -6768,22 +7064,476 @@ "h": 5, "w": 12, "x": 12, - "y": 20 + "y": 35 }, "id": null, "options": { "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ + { + "alias": "Select Full Join", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_select_full_join", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "Select Full Range Join", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_select_full_range_join", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", + "step": "", + "type": "range" + } + ], + "title": "MySQL Select Types", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 40 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ + { + "alias": "Openings", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_opened_files", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "step": "", + "type": "range" + } + ], + "title": "MySQL File Opened", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 40 + }, + "id": null, + "options": { + "legend": { + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "cluster": [], + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "expressionList": [], + "format": "time_series", + "hide": false, + "host": [], + "mode": "ui", + "module": [], + "promqlAlias": "$tag_command", + "query_configs": [ + { + "alias": "Open Files", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_open_files", + "refId": "a", + "result_table_id": "exporter_dbm_mysqld_exporter.gstatus ", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "InnoDB Open Files", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_innodb_num_open_files", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + } + ], + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", + "step": "", + "type": "range" + }, { "cluster": [], "datasource": { @@ -6799,8 +7549,7 @@ "promqlAlias": "", "query_configs": [ { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", + "alias": "Open Files Limit", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, @@ -6810,11 +7559,11 @@ "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysql_engine_innodb_trx_idle_time_max", + "metric_field": "mysql_global_variables_open_files_limit", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "time", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -6840,7 +7589,8 @@ "type": "range" } ], - "title": "实例空闲事务持续时间", + "title": "MySQL File Openings", + "transformations": [], "type": "timeseries" }, { @@ -6852,13 +7602,37 @@ "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "displayMode": "auto", - "filterable": false, - "inspect": false + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } }, "mappings": [], "thresholds": { @@ -6872,71 +7646,33 @@ "value": 80 } ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "cluster_name" - }, - "properties": [ - { - "id": "custom.width", - "value": 130 - }, - { - "id": "custom.inspect", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "cluster_type" - }, - "properties": [ - { - "id": "custom.width", - "value": 103 - } - ] }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "custom.width", - "value": 169 - } - ] - } - ] + "unit": "short" + }, + "overrides": [] }, "gridPos": { "h": 5, "w": 12, "x": 0, - "y": 25 + "y": 45 }, "id": null, "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "legend": { + "calcs": [ + "last", + "max" ], - "show": false - }, - "frameIndex": 0, - "showHeader": true, - "sortBy": [] + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -6945,29 +7681,35 @@ "uid": "bkmonitor_timeseries" }, "expressionList": [], - "format": "table", + "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "a", + "alias": "Open Table Definitions", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], - "group_by": [ - "instance", - "instance_role", - "cluster_name" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": "auto", + "group_by": [], + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_up", + "method": "SUM", + "metric_field": "mysql_global_status_open_table_definitions", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", @@ -6979,14 +7721,66 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "Opened Table Definitions", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_status_opened_table_definitions", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", "step": "", - "type": "instant" + "type": "range" }, { "cluster": [], @@ -6995,7 +7789,7 @@ "uid": "bkmonitor_timeseries" }, "expressionList": [], - "format": "table", + "format": "time_series", "hide": false, "host": [], "mode": "ui", @@ -7003,23 +7797,19 @@ "promqlAlias": "", "query_configs": [ { - "alias": "b", + "alias": "Table Definitions Cache Size", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [ - "instance", - "instance_role", - "cluster_name" - ], + "group_by": [], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "mysqlproxy_process_total", + "metric_field": "mysql_global_variables_table_definition_cache", "refId": "a", - "result_table_id": "exporter_dbm_mysqlproxy_exporter.__default__", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", "time_field": "", "where": [ @@ -7029,39 +7819,34 @@ "value": [ "$cluster_domain" ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] } ] } ], - "refId": "B", + "refId": "A", "source": "", "step": "", - "type": "instant" - } - ], - "title": "Instance List", - "transformations": [ - { - "id": "filterFieldsByName", - "options": { - "include": { - "names": [ - "cluster_name", - "cluster_type", - "instance", - "instance_role" - ] - } - } + "type": "range" } ], - "type": "table" + "title": "MySQL Table Definition Cache", + "transformations": [], + "type": "timeseries" }, { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -7110,7 +7895,7 @@ } ] }, - "unit": "none" + "unit": "short" }, "overrides": [] }, @@ -7118,19 +7903,22 @@ "h": 5, "w": 12, "x": 12, - "y": 25 + "y": 45 }, "id": null, "options": { "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, "targets": [ @@ -7146,25 +7934,78 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "", - "data_label": "exporter_dbm_mysqld_exporter", + "alias": "Open Tables", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], "group_by": [], - "interval": "auto", + "interval": 60, "interval_unit": "s", - "method": "AVG", - "metric_field": "mysql_engine_innodb_trx_count", + "method": "SUM", + "metric_field": "mysql_global_status_open_tables", "refId": "a", "result_table_id": "exporter_dbm_mysqld_exporter.__default__", "result_table_label": "component", - "time_field": "time", + "time_field": "", + "where": [ + { + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", + "method": "eq", + "value": [ + "$dbrole" + ] + } + ] + }, + { + "alias": "Table Open Cache", + "data_source_label": "bk_monitor", + "data_type_label": "time_series", + "display": true, + "filter_dict": {}, + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [], + "interval": 60, + "interval_unit": "s", + "method": "SUM", + "metric_field": "mysql_global_variables_table_open_cache", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -7184,17 +8025,18 @@ ] } ], - "refId": "A", - "source": "", + "refId": "B", + "source": "sum by(command) (rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_commands_total{cluster_domain=\"$cluster_domain\",command=~\"select|insert|update|delete|replace|commit\",instance_role=\"$dbrole\"}[2m])) >0", "step": "", "type": "range" } ], - "title": "实例事务数", + "title": "Open Tables", + "transformations": [], "type": "timeseries" } ], - "title": "Misc", + "title": "Files, Opens and Objects", "type": "row" }, { @@ -7203,7 +8045,7 @@ "h": 1, "w": 24, "x": 0, - "y": 32 + "y": 35 }, "id": null, "panels": [ @@ -7265,17 +8107,20 @@ "overrides": [] }, "gridPos": { - "h": 5, - "w": 8, + "h": 6, + "w": 16, "x": 0, - "y": 35 + "y": 7 }, "id": null, "options": { "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", + "calcs": [ + "last", + "max" + ], + "displayMode": "table", + "placement": "right", "showLegend": true }, "tooltip": { @@ -7283,7 +8128,6 @@ "sort": "none" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -7297,24 +8141,36 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "", + "alias": "le=$tag_le s", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, - "functions": [], - "group_by": [], - "interval": "auto", + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } + ], + "group_by": [ + "le" + ], + "interval": 60, "interval_unit": "s", "method": "AVG", - "metric_field": "usage", + "metric_field": "mysql_info_schema_query_response_time_seconds_bucket", "refId": "a", - "result_table_id": "dbm_system.cpu_summary", - "result_table_label": "os", - "time_field": "time", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "", "where": [ { "key": "cluster_domain", @@ -7334,13 +8190,14 @@ ] } ], - "refId": "C", - "source": "", + "refId": "B", + "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", "step": "", "type": "range" } ], - "title": "CPU Usage", + "title": "Query Response Time Distribution Detail", + "transformations": [], "type": "timeseries" }, { @@ -7397,20 +8254,23 @@ } ] }, - "unit": "short" + "unit": "ms" }, "overrides": [] }, "gridPos": { - "h": 5, + "h": 6, "w": 8, - "x": 8, - "y": 35 + "x": 16, + "y": 7 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "max" + ], "displayMode": "table", "placement": "right", "showLegend": true @@ -7420,7 +8280,6 @@ "sort": "none" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -7428,86 +8287,139 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "Time", + "expression": "(a / b) * 1000", + "functions": [] + } + ], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "ioutil", + "promqlAlias": "$tag_command", "query_configs": [ { - "alias": "$tag_device_name : writes", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, - "functions": [], - "group_by": [ - "device_name" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], + "group_by": [], "interval": 60, "interval_unit": "s", - "method": "MAX", - "metric_field": "w_s", + "method": "AVG", + "metric_field": "mysql_info_schema_query_response_time_seconds_sum", "refId": "a", - "result_table_id": "dbm_system.io", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$host" + "$dbrole" ] } ] }, { - "alias": "$tag_device_name : reads", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, - "functions": [], - "group_by": [ - "device_name" + "functions": [ + { + "id": "rate", + "params": [ + { + "id": "window", + "value": "2m" + } + ] + } ], - "interval": 60, + "group_by": [], + "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "r_s", + "method": "AVG", + "metric_field": "mysql_info_schema_query_response_time_seconds_count", "refId": "b", - "result_table_id": "dbm_system.io", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$host" + "$dbrole" ] } ] } ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "refId": "B", + "source": "sum(rate(bkmonitor:exporter_dbm_mysqld_exporter:__default__:mysql_global_status_created_tmp_tables{cluster_domain=\"$cluster_domain\",instance_role=\"$dbrole\"}[2m]))", "step": "", "type": "range" } ], - "title": "Disk IOs per Device", + "title": "Average Query Response Time", + "transformations": [], "type": "timeseries" - }, + } + ], + "title": "ResponseTime", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 36 + }, + "id": null, + "panels": [ { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -7556,30 +8468,32 @@ } ] }, - "unit": "short" + "unit": "percentunit" }, "overrides": [] }, "gridPos": { "h": 5, - "w": 8, - "x": 16, - "y": 35 + "w": 12, + "x": 0, + "y": 37 }, "id": null, "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "max" + ], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -7587,108 +8501,79 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "expressionList": [], + "expressionList": [ + { + "active": true, + "alias": "$tag_schema $tag_table, $tag_column", + "expression": "a / b", + "functions": [] + } + ], "format": "time_series", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "ioutil", + "promqlAlias": "", "query_configs": [ { - "alias": "mem_usage", + "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, "functions": [], - "group_by": [], - "interval": 60, + "group_by": [ + "schema", + "table", + "column", + "cluster_domain" + ], + "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "pct_used", + "method": "AVG", + "metric_field": "mysql_info_schema_auto_increment_column", "refId": "a", - "result_table_id": "dbm_system.mem", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", "method": "eq", "value": [ - "$host" + "$cluster_domain" ] } ] }, - { - "alias": "mem_total", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "total", - "refId": "b", - "result_table_id": "dbm_system.mem", - "result_table_label": "os", - "time_field": "", - "where": [ - { - "key": "bk_target_ip", - "method": "eq", - "value": [ - "$host" - ] - } - ] - } - ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", - "step": "", - "type": "range" - }, - { - "cluster": [], - "datasource": { - "type": "bkmonitor-timeseries-datasource", - "uid": "bkmonitor_timeseries" - }, - "expressionList": [], - "format": "time_series", - "hide": true, - "host": [], - "mode": "ui", - "module": [], - "promqlAlias": "", - "query_configs": [ { "alias": "", "data_source_label": "bk_monitor", "data_type_label": "time_series", - "display": true, + "display": false, "filter_dict": {}, "functions": [], - "group_by": [], + "group_by": [ + "schema", + "table", + "column", + "cluster_domain" + ], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "used", - "refId": "a", - "result_table_id": "dbm_system.swap", - "result_table_label": "os", + "metric_field": "mysql_info_schema_auto_increment_column_max", + "refId": "b", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", "method": "eq", "value": [ - "$host" + "$cluster_domain" ] } ] @@ -7700,7 +8585,7 @@ "type": "range" } ], - "title": "Host Memory", + "title": "int 自增使用率", "type": "timeseries" }, { @@ -7708,7 +8593,6 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "磁盘空间使用率", "fieldConfig": { "defaults": { "color": { @@ -7756,15 +8640,16 @@ "value": 80 } ] - } + }, + "unit": "none" }, "overrides": [] }, "gridPos": { "h": 5, - "w": 8, - "x": 0, - "y": 40 + "w": 12, + "x": 12, + "y": 37 }, "id": null, "options": { @@ -7779,7 +8664,6 @@ "sort": "none" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -7796,7 +8680,8 @@ "promqlAlias": "", "query_configs": [ { - "alias": "ioutil", + "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, @@ -7805,30 +8690,38 @@ "group_by": [], "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "util", + "method": "AVG", + "metric_field": "mysql_engine_innodb_trx_idle_time_max", "refId": "a", - "result_table_id": "dbm_system.io", - "result_table_label": "os", - "time_field": "", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$host" + "$dbrole" ] } ] } ], - "refId": "C", + "refId": "A", "source": "", "step": "", "type": "range" } ], - "title": "IO util", + "title": "实例空闲事务持续时间", "type": "timeseries" }, { @@ -7836,41 +8729,17 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "磁盘空间使用率", + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "thresholds" }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "align": "auto", + "displayMode": "auto", + "filterable": false, + "inspect": false }, "mappings": [], "thresholds": { @@ -7886,26 +8755,67 @@ ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "cluster_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 130 + }, + { + "id": "custom.inspect", + "value": false + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "cluster_type" + }, + "properties": [ + { + "id": "custom.width", + "value": 103 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instance" + }, + "properties": [ + { + "id": "custom.width", + "value": 169 + } + ] + } + ] }, "gridPos": { "h": 5, - "w": 8, - "x": 8, - "y": 40 + "w": 12, + "x": 0, + "y": 42 }, "id": null, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "frameIndex": 0, + "showHeader": true, + "sortBy": [] }, "pluginVersion": "9.1.0", "targets": [ @@ -7916,54 +8826,48 @@ "uid": "bkmonitor_timeseries" }, "expressionList": [], - "format": "time_series", + "format": "table", "hide": false, "host": [], "mode": "ui", "module": [], - "promqlAlias": "Usage $tag_mount_point", + "promqlAlias": "", "query_configs": [ { - "alias": "Usage $tag_mount_point", + "alias": "a", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "mount_point" + "instance", + "instance_role", + "cluster_name" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "max_without_time", - "metric_field": "in_use", + "method": "AVG", + "metric_field": "mysql_up", "refId": "a", - "result_table_id": "dbm_system.disk", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", "method": "eq", "value": [ - "$host" - ] - }, - { - "condition": "and", - "key": "mount_point", - "method": "reg", - "value": [ - "/data.*|" + "$cluster_domain" ] } ] } ], "refId": "A", - "source": "max by(mount_point) (bkmonitor:dbm_system:disk:in_use{bk_target_ip=\"$host\",mount_point=~\"/data.*\"})", + "source": "", "step": "", - "type": "range" + "type": "instant" }, { "cluster": [], @@ -7972,7 +8876,7 @@ "uid": "bkmonitor_timeseries" }, "expressionList": [], - "format": "time_series", + "format": "table", "hide": false, "host": [], "mode": "ui", @@ -7980,29 +8884,31 @@ "promqlAlias": "", "query_configs": [ { - "alias": "Total $tag_mount_point", + "alias": "b", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "mount_point" + "instance", + "instance_role", + "cluster_name" ], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "total", + "metric_field": "mysqlproxy_process_total", "refId": "a", - "result_table_id": "dbm_system.disk", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqlproxy_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", "method": "eq", "value": [ - "$host" + "$cluster_domain" ] } ] @@ -8011,8 +8917,104 @@ "refId": "B", "source": "", "step": "", - "type": "range" + "type": "instant" + } + ], + "title": "Instance List", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "cluster_name", + "cluster_type", + "instance", + "instance_role" + ] + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "bkmonitor-timeseries-datasource", + "uid": "bkmonitor_timeseries" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 42 + }, + "id": null, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ { "cluster": [], "datasource": { @@ -8029,48 +9031,68 @@ "query_configs": [ { "alias": "", + "data_label": "exporter_dbm_mysqld_exporter", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], - "group_by": [ - "mount_point" - ], + "group_by": [], "interval": "auto", "interval_unit": "s", "method": "AVG", - "metric_field": "used", + "metric_field": "mysql_engine_innodb_trx_count", "refId": "a", - "result_table_id": "dbm_system.disk", - "result_table_label": "os", - "time_field": "", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", + "time_field": "time", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", + "method": "eq", + "value": [ + "$cluster_domain" + ] + }, + { + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$host" + "$dbrole" ] } ] } ], - "refId": "C", + "refId": "A", "source": "", "step": "", "type": "range" } ], - "title": "Disk Size Used", + "title": "实例事务数", "type": "timeseries" - }, + } + ], + "title": "Misc", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 37 + }, + "id": null, + "panels": [ { "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -8119,30 +9141,33 @@ } ] }, - "unit": "binBps" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 40 + "h": 7, + "w": 12, + "x": 0, + "y": 38 }, "id": null, + "interval": "5m", "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "lastNotNull" + ], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", - "sort": "none" + "sort": "desc" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -8156,72 +9181,53 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "ioutil", + "promqlAlias": "", "query_configs": [ { - "alias": "Inbound", + "alias": "$tag_command, $tag_state", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "device_name" + "command", + "state" ], - "interval": 60, + "interval": "auto", "interval_unit": "s", - "method": "MAX", - "metric_field": "speed_recv", + "method": "AVG", + "metric_field": "mysql_info_schema_processlist_threads", "refId": "a", - "result_table_id": "dbm_system.net", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { - "key": "bk_target_ip", + "key": "cluster_domain", "method": "eq", "value": [ - "$host" + "$cluster_domain" ] - } - ] - }, - { - "alias": "Outbound", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "device_name" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "speed_sent", - "refId": "b", - "result_table_id": "dbm_system.net", - "result_table_label": "os", - "time_field": "", - "where": [ + }, { - "key": "bk_target_ip", + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$host" + "backend_master" ] } ] } ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "MySQL Network Traffic", + "title": "Processlist State", "type": "timeseries" }, { @@ -8229,7 +9235,6 @@ "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" }, - "description": "", "fieldConfig": { "defaults": { "color": { @@ -8278,20 +9283,24 @@ } ] }, - "unit": "binBps" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 5, - "w": 16, - "x": 0, - "y": 45 + "h": 7, + "w": 12, + "x": 12, + "y": 38 }, "id": null, + "interval": "5m", "options": { "legend": { - "calcs": [], + "calcs": [ + "last", + "lastNotNull" + ], "displayMode": "table", "placement": "right", "showLegend": true @@ -8301,7 +9310,6 @@ "sort": "desc" } }, - "pluginVersion": "9.1.0", "targets": [ { "cluster": [], @@ -8315,55 +9323,25 @@ "host": [], "mode": "ui", "module": [], - "promqlAlias": "ioutil", + "promqlAlias": "", "query_configs": [ { - "alias": "$tag_instance_role, $tag_bk_target_ip, timewait", + "alias": "$tag_mysql_user", "data_source_label": "bk_monitor", "data_type_label": "time_series", "display": true, "filter_dict": {}, "functions": [], "group_by": [ - "bk_target_ip", - "instance_role" + "mysql_user" ], "interval": 60, "interval_unit": "s", - "method": "MAX", - "metric_field": "cur_tcp_timewait", + "method": "SUM", + "metric_field": "mysql_info_schema_processlist_processes_by_user", "refId": "a", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", - "time_field": "", - "where": [ - { - "key": "cluster_domain", - "method": "eq", - "value": [ - "$cluster_domain" - ] - } - ] - }, - { - "alias": "$tag_instance_role, $tag_bk_target_ip, closewait", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip", - "instance_role" - ], - "interval": 60, - "interval_unit": "s", - "method": "MAX", - "metric_field": "cur_tcp_closewait", - "refId": "b", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", + "result_table_id": "exporter_dbm_mysqld_exporter.__default__", + "result_table_label": "component", "time_field": "", "where": [ { @@ -8372,50 +9350,29 @@ "value": [ "$cluster_domain" ] - } - ] - }, - { - "alias": "$tag_instance_role, $tag_bk_target_ip, estab", - "data_source_label": "bk_monitor", - "data_type_label": "time_series", - "display": true, - "filter_dict": {}, - "functions": [], - "group_by": [ - "bk_target_ip", - "instance_role" - ], - "interval": "auto", - "interval_unit": "s", - "method": "AVG", - "metric_field": "cur_tcp_estab", - "refId": "c", - "result_table_id": "dbm_system.netstat", - "result_table_label": "os", - "time_field": "", - "where": [ + }, { - "key": "cluster_domain", + "condition": "and", + "key": "instance_role", "method": "eq", "value": [ - "$cluster_domain" + "backend_master" ] } ] } ], - "refId": "C", - "source": "max(max_over_time(bkmonitor:dbm_system:io:w_s{bk_target_ip=\"$host\"}[1m]))", + "refId": "A", + "source": "", "step": "", "type": "range" } ], - "title": "TCP Connection", + "title": "Processlist User Stat", "type": "timeseries" } ], - "title": "Host OS", + "title": "Processlist", "type": "row" } ], @@ -8427,7 +9384,11 @@ "templating": { "list": [ { - "current": {}, + "current": { + "selected": false, + "text": "dba", + "value": "dba" + }, "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" @@ -8459,7 +9420,11 @@ "type": "query" }, { - "current": {}, + "current": { + "selected": false, + "text": "", + "value": "" + }, "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" @@ -8536,7 +9501,11 @@ "type": "custom" }, { - "current": {}, + "current": { + "selected": false, + "text": "", + "value": "" + }, "datasource": { "type": "bkmonitor-timeseries-datasource", "uid": "bkmonitor_timeseries" @@ -8647,6 +9616,6 @@ "timezone": "default", "title": "MySQL-HA", "uid": "8wWk5T64z", - "version": 8, + "version": 14, "weekStart": "" -} \ No newline at end of file +} diff --git a/dbm-ui/backend/bk_dataview/dashboards/readme.md b/dbm-ui/backend/bk_dataview/dashboards/readme.md index d35735a23c..1735ea8179 100644 --- a/dbm-ui/backend/bk_dataview/dashboards/readme.md +++ b/dbm-ui/backend/bk_dataview/dashboards/readme.md @@ -1,4 +1,5 @@ # 导出仪表盘 +TODO: 把此步骤脚本化 到开发环境中,配置好仪表盘后,在设置中点击 JSON Model,复制对应的仪表盘到本目录对应的 json 文件中 保留 __inputs 为: ``` @@ -63,6 +64,7 @@ find . -type f -name "*.json" -exec sed -i '' -e 's#"id": [0-9]*,#"id": null,#g' templating.list.hide 设置为 2,这里一般把需暴露出来的变量设置为 0,不暴露的设置为 2 # 替换 datasource 为 bkmonitor_timeseries 或者 bklog +templating.list.datasource.uid 设置为 bkmonitor_timeseries 或者 bklog # 导入监控的方法,还原模板后导入 From a75fd151b27b82035e2c4afd76e908836cc8b946 Mon Sep 17 00:00:00 2001 From: yuanruji Date: Mon, 30 Sep 2024 14:48:48 +0800 Subject: [PATCH 086/164] =?UTF-8?q?refactor(dbm-services):=20=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E6=89=A7=E8=A1=8Ccreate=20table=20like=20#7199?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dbha/ha-module/test/agent_test.go | 2 +- .../app/syntax/spider_create_table_rule.go | 8 ++-- .../db-simulation/app/syntax/spider_rule.go | 1 - .../mysql/db-simulation/app/syntax/syntax.go | 42 ++++++++++++------- .../mysql/db-simulation/handler/handler.go | 8 ++-- .../mysql/db-simulation/spider_rule.yaml | 4 -- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/dbm-services/common/dbha/ha-module/test/agent_test.go b/dbm-services/common/dbha/ha-module/test/agent_test.go index f182dbc997..5177955d33 100644 --- a/dbm-services/common/dbha/ha-module/test/agent_test.go +++ b/dbm-services/common/dbha/ha-module/test/agent_test.go @@ -68,7 +68,7 @@ func TestAgentNetTransfor(t *testing.T) { case 3: dbIns.App = "APP4444" } - err = agentIns.ReporterGM(d) + err = agentIns.RepairGM(&gmInfo) if err != nil { t.Errorf("reporter gmInfo failed.err:%s", err.Error()) return diff --git a/dbm-services/mysql/db-simulation/app/syntax/spider_create_table_rule.go b/dbm-services/mysql/db-simulation/app/syntax/spider_create_table_rule.go index 3eba48dd4a..b62c219cb0 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/spider_create_table_rule.go +++ b/dbm-services/mysql/db-simulation/app/syntax/spider_create_table_rule.go @@ -33,16 +33,16 @@ func (c CreateTableResult) SpiderChecker(spiderVersion string) (r *CheckerResult return SpecialCharValidator(c.TableName) }) } - if c.IsCreateTableLike { - r.Trigger(SR.SpiderCreateTableRule.CreateTbLike, "") - } if c.IsCreateTableSelect { r.Trigger(SR.SpiderCreateTableRule.CreateWithSelect, "") } if c.ColCharsetNotEqTbCharset() { r.Trigger(SR.SpiderCreateTableRule.ColChasetNotEqTbChaset, "") } - c.shardKeyChecker(r) + // when sql is create table like, no check shard key + if !c.IsCreateTableLike { + c.shardKeyChecker(r) + } return r } diff --git a/dbm-services/mysql/db-simulation/app/syntax/spider_rule.go b/dbm-services/mysql/db-simulation/app/syntax/spider_rule.go index a7a52d502d..6671202e68 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/spider_rule.go +++ b/dbm-services/mysql/db-simulation/app/syntax/spider_rule.go @@ -38,7 +38,6 @@ type SpiderRules struct { type SpiderCreateTableRule struct { ColChasetNotEqTbChaset *BoolRuleItem `yaml:"ColChasetNotEqTbChaset"` CreateWithSelect *BoolRuleItem `yaml:"CreateWithSelect"` - CreateTbLike *BoolRuleItem `yaml:"CreateTbLike"` ShardKeyNotPk *BoolRuleItem `yaml:"ShardKeyNotPk"` ShardKeyNotIndex *BoolRuleItem `yaml:"ShardKeyNotIndex"` IllegalComment *BoolRuleItem `yaml:"IllegalComment"` diff --git a/dbm-services/mysql/db-simulation/app/syntax/syntax.go b/dbm-services/mysql/db-simulation/app/syntax/syntax.go index 2f9c76645c..be229fef97 100644 --- a/dbm-services/mysql/db-simulation/app/syntax/syntax.go +++ b/dbm-services/mysql/db-simulation/app/syntax/syntax.go @@ -303,59 +303,69 @@ func getSQLParseResultFile(fileName, version string) string { return fmt.Sprintf("%s-%s.json", version, fileName) } -func (t *TmysqlParse) getCommand(filename, version string) (cmd string) { - var in, out string - in = path.Join(t.tmpWorkdir, filename) +// getCommand generates the command string for running TmysqlParse +// It takes the input filename and MySQL version as parameters +func (t *TmysqlParse) getCommand(filename, version string) string { + // Construct input and output file paths + inputPath := path.Join(t.tmpWorkdir, filename) outputFileName := getSQLParseResultFile(filename, version) - out = path.Join(t.tmpWorkdir, outputFileName) + outputPath := path.Join(t.tmpWorkdir, outputFileName) - cmd = fmt.Sprintf(`%s --sql-file=%s --output-path=%s --print-query-mode=2 --output-format='JSON_LINE_PER_OBJECT' --sql-mode='' `, - t.TmysqlParseBinPath, in, out) + // Build the base command with common options + cmd := fmt.Sprintf(`%s --sql-file=%s --output-path=%s `+ + `--print-query-mode=2 --output-format='JSON_LINE_PER_OBJECT' --sql-mode=''`, + t.TmysqlParseBinPath, inputPath, outputPath) + // Add MySQL version if provided if lo.IsNotEmpty(version) { - cmd += fmt.Sprintf(" --mysql-version=%s ", version) + cmd += fmt.Sprintf(" --mysql-version=%s", version) } return cmd } -// Execute 运行tmysqlpase -// -// @receiver tf -// @return err +// Execute runs the TmysqlParse command for each SQL file in parallel. +// It takes a channel to send the names of successfully executed files and the MySQL version as parameters. +// The function returns an error if any of the executions fail. func (tf *TmysqlParseFile) Execute(alreadExecutedSqlfileCh chan string, version string) (err error) { var wg sync.WaitGroup var errs []error - c := make(chan struct{}, 10) + c := make(chan struct{}, 10) // Semaphore to limit concurrent goroutines errChan := make(chan error, 5) + + // Iterate through all SQL files for _, fileName := range tf.Param.FileNames { wg.Add(1) - c <- struct{}{} + c <- struct{}{} // Acquire semaphore go func(sqlfile, ver string) { + defer wg.Done() + defer func() { <-c }() // Release semaphore + //nolint command := exec.Command("/bin/bash", "-c", tf.getCommand(sqlfile, ver)) logger.Info("command is %s", command) output, err := command.CombinedOutput() if err != nil { - errChan <- fmt.Errorf("tmysqlparse.sh command run failed. error info:" + err.Error() + "," + string(output)) + errChan <- fmt.Errorf("tmysqlparse.sh command run failed. error info: %v, %s", err, string(output)) } else { alreadExecutedSqlfileCh <- sqlfile } - <-c - wg.Done() }(fileName, version) } + // Wait for all goroutines to finish and close error channel go func() { wg.Wait() close(errChan) }() + // Collect all errors for err := range errChan { errs = append(errs, err) } + // Join all errors and return return errors.Join(errs...) } diff --git a/dbm-services/mysql/db-simulation/handler/handler.go b/dbm-services/mysql/db-simulation/handler/handler.go index 813102608a..869952e08f 100644 --- a/dbm-services/mysql/db-simulation/handler/handler.go +++ b/dbm-services/mysql/db-simulation/handler/handler.go @@ -36,8 +36,9 @@ type Response struct { // CreateClusterParam 创建临时的spider的集群参数 type CreateClusterParam struct { - Pwd string `json:"pwd"` - PodName string `json:"podname"` + Pwd string `json:"pwd"` + PodName string `json:"podname"` + SpiderVersion string `json:"spider_version"` } // CreateTmpSpiderPodCluster 创建临时的spider的集群,多用于测试,debug @@ -55,8 +56,7 @@ func CreateTmpSpiderPodCluster(r *gin.Context) { Charset: "utf8mb4", } ps.DbImage = config.GAppConfig.Image.Tendb57Img - ps.TdbCtlImage = config.GAppConfig.Image.TdbCtlImg - ps.SpiderImage = config.GAppConfig.Image.SpiderImg + ps.SpiderImage, ps.TdbCtlImage = getSpiderAndTdbctlImg(param.SpiderVersion, LatestVersion) if err := ps.CreateClusterPod(); err != nil { logger.Error(err.Error()) return diff --git a/dbm-services/mysql/db-simulation/spider_rule.yaml b/dbm-services/mysql/db-simulation/spider_rule.yaml index 568abf2fac..8b8573d06a 100644 --- a/dbm-services/mysql/db-simulation/spider_rule.yaml +++ b/dbm-services/mysql/db-simulation/spider_rule.yaml @@ -61,10 +61,6 @@ SpiderCreateTableRule: turnOn: true ban: true desc: "UNSUPPORT SQL CREATE TABLE WITH SELECT" - CreateTbLike: - turnOn: true - ban: true - desc: "UNSUPPORT SQL CREATE TABLE LIKE" ShardKeyNotPk: turnOn: true ban: true From 532c892ba7dcf27cdf900f018ac560a9d844d3c0 Mon Sep 17 00:00:00 2001 From: yuanruji Date: Wed, 18 Sep 2024 16:39:52 +0800 Subject: [PATCH 087/164] feat(backend): standby slaves upgrade subflow #6804 --- .../db_services/mysql/toolbox/serializers.py | 15 + .../backend/db_services/mysql/toolbox/urls.py | 7 +- .../db_services/mysql/toolbox/views.py | 53 +- .../scene/mysql/common/common_sub_flow.py | 1 + .../mysql_migrate_cluster_remote_flow.py | 1 - .../mysql/mysql_non_standby_slaves_upgrade.py | 597 ++++++++++++++++++ .../bamboo/scene/mysql/mysql_upgrade.py | 40 +- .../backend/flow/engine/controller/mysql.py | 18 + dbm-ui/backend/flow/urls.py | 9 +- .../flow/utils/mysql/mysql_act_playload.py | 117 ++-- .../backend/flow/utils/mysql/mysql_db_meta.py | 95 ++- dbm-ui/backend/flow/views/mysql_upgrade.py | 30 + dbm-ui/backend/ticket/constants.py | 2 + .../frontend/src/common/const/ticketTypes.ts | 1 + 14 files changed, 925 insertions(+), 61 deletions(-) create mode 100644 dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_non_standby_slaves_upgrade.py diff --git a/dbm-ui/backend/db_services/mysql/toolbox/serializers.py b/dbm-ui/backend/db_services/mysql/toolbox/serializers.py index 933333fad4..e8600457cd 100644 --- a/dbm-ui/backend/db_services/mysql/toolbox/serializers.py +++ b/dbm-ui/backend/db_services/mysql/toolbox/serializers.py @@ -52,3 +52,18 @@ class TendbhaTransferToOtherBizFlowBuilder(BaseTendbTicketFlowBuilder): inner_flow_builder = TendbhaTransferToOtherBizFlowParamBuilder inner_flow_name = _("TenDBHa集群迁移到其他业务") retry_type = FlowRetryType.MANUAL_RETRY + + +class TendbhaAddSlaveDomainSerializer(serializers.Serializer): + cluster_id = serializers.IntegerField(help_text=_("集群id")) + slave_ip = serializers.CharField(help_text=_("slave ip")) + slave_port = serializers.IntegerField(help_text=_("slave port")) + domain_name = serializers.CharField(help_text=_("slave domain")) + + class Meta: + swagger_schema_fields = { + "bk_biz_id": 11, + "slave_ip": "1.1.1.1", + "slave_port": 3306, + "domain_name": "", + } diff --git a/dbm-ui/backend/db_services/mysql/toolbox/urls.py b/dbm-ui/backend/db_services/mysql/toolbox/urls.py index c1e856deef..3b6b6b5d3c 100644 --- a/dbm-ui/backend/db_services/mysql/toolbox/urls.py +++ b/dbm-ui/backend/db_services/mysql/toolbox/urls.py @@ -11,11 +11,16 @@ from rest_framework.routers import DefaultRouter -from backend.db_services.mysql.toolbox.views import TendbhaTransferToOtherBizViewSet, ToolboxViewSet +from backend.db_services.mysql.toolbox.views import ( + TendbHaSlaveInstanceAddDomainSet, + TendbhaTransferToOtherBizViewSet, + ToolboxViewSet, +) router = DefaultRouter(trailing_slash=True) router.register(r"toolbox", ToolboxViewSet, basename="toolbox") router.register(r"toolbox", TendbhaTransferToOtherBizViewSet, basename="toolbox") +router.register(r"toolbox", TendbHaSlaveInstanceAddDomainSet, basename="toolbox") urlpatterns = [] urlpatterns += router.urls diff --git a/dbm-ui/backend/db_services/mysql/toolbox/views.py b/dbm-ui/backend/db_services/mysql/toolbox/views.py index 241f3072cc..7ec47060a4 100644 --- a/dbm-ui/backend/db_services/mysql/toolbox/views.py +++ b/dbm-ui/backend/db_services/mysql/toolbox/views.py @@ -9,6 +9,7 @@ specific language governing permissions and limitations under the License. """ import logging +import traceback from typing import Any from django.utils.translation import ugettext_lazy as _ @@ -19,13 +20,15 @@ from backend.bk_web.swagger import common_swagger_auto_schema from backend.components import DBConfigApi from backend.components.dbconfig.constants import FormatType, LevelName -from backend.db_meta.enums import ClusterType -from backend.db_meta.models import Cluster, DBModule +from backend.db_meta.enums import ClusterEntryRole, ClusterEntryType, ClusterType, InstanceInnerRole +from backend.db_meta.models import Cluster, ClusterEntry, DBModule from backend.db_services.mysql.toolbox.handlers import ToolboxHandler from backend.db_services.mysql.toolbox.serializers import ( QueryPkgListByCompareVersionSerializer, + TendbhaAddSlaveDomainSerializer, TendbhaTransferToOtherBizSerializer, ) +from backend.flow.utils.dns_manage import DnsManage from backend.iam_app.handlers.drf_perm.base import DBManagePermission from backend.ticket.constants import TicketType from backend.ticket.models import Ticket @@ -52,7 +55,53 @@ def query_higher_version_pkg_list(self, request, **kwargs): return Response(ToolboxHandler().query_higher_version_pkg_list(cluster_id, higher_major_version)) +class TendbHaSlaveInstanceAddDomainSet(viewsets.SystemViewSet): + """ + 给从库添加域名 + """ + + action_permission_map = {} + default_permission_class = [DBManagePermission()] + + @common_swagger_auto_schema( + operation_summary=_("给从库添加域名"), + request_body=TendbhaAddSlaveDomainSerializer(), + tags=[SWAGGER_TAG], + ) + @action(methods=["POST"], detail=False, serializer_class=TendbhaAddSlaveDomainSerializer) + def slave_ins_add_domain(self, request, **kwargs): + data = self.params_validate(self.get_serializer_class()) + cluster_id = data["cluster_id"] + domain = data["domain_name"] + slave_ip = data["slave_ip"] + slave_port = data["slave_port"] + if ClusterEntry.objects.filter(cluster_entry_type=ClusterEntryType.DNS.value, entry=domain).exists(): + return Response({"result": False, "message": _("{}域名已经存在".format(domain))}) + cluster_obj = Cluster.objects.get(id=cluster_id) + cluster_entry = ClusterEntry.objects.create( + cluster=cluster_obj, + cluster_entry_type=ClusterEntryType.DNS.value, + entry=domain, + role=ClusterEntryRole.SLAVE_ENTRY.value, + ) + dns_manage = DnsManage(bk_biz_id=cluster_obj.bk_biz_id, bk_cloud_id=cluster_obj.bk_cloud_id) + slave_ins = cluster_obj.storageinstance_set.filter( + instance_inner_role=InstanceInnerRole.SLAVE.value, machine__ip=slave_ip, port=slave_port + ) + cluster_entry.storageinstance_set.add(*slave_ins) + try: + dns_manage.create_domain(instance_list=["{}#{}".format(slave_ip, str(slave_port))], add_domain_name=domain) + except Exception as e: + logger.error(traceback.format_exc()) + return Response({"result": False, "message": _("添加dns记录失败{}".format(e))}) + return Response({"result": True, "message": _("success")}) + + class TendbhaTransferToOtherBizViewSet(viewsets.SystemViewSet): + """ + 转移tendbha 集群到其他业务 + """ + action_permission_map = {} default_permission_class = [DBManagePermission()] diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py index 5ba0275faf..a3b1e820ae 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/common/common_sub_flow.py @@ -638,6 +638,7 @@ def install_mysql_in_cluster_sub_flow( # 阶段3 并发安装mysql实例(一个活动节点部署多实例) acts_list = [] if db_config is not None: + exec_act_kwargs.cluster["pkg_id"] = pkg_id exec_act_kwargs.cluster["old_instance_configs"] = db_config logger.debug("instance dbconfig", db_config) for mysql_ip in new_mysql_list: diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py index c3b9834674..1a68026278 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_migrate_cluster_remote_flow.py @@ -422,7 +422,6 @@ def migrate_cluster_flow(self, use_for_upgrade=False): uninstall_svr_sub_pipeline_list.append( uninstall_svr_sub_pipeline.build_sub_process(sub_name=_("卸载remote节点{}".format(ip))) ) - # 安装实例 tendb_migrate_pipeline.add_parallel_sub_pipeline(sub_flow_list=install_sub_pipeline_list) # 同步配置 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_non_standby_slaves_upgrade.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_non_standby_slaves_upgrade.py new file mode 100644 index 0000000000..7257e5d971 --- /dev/null +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_non_standby_slaves_upgrade.py @@ -0,0 +1,597 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 copy +import logging.config +from dataclasses import asdict +from typing import Dict, Optional + +from django.utils.translation import gettext as _ + +from backend.configuration.constants import DBType +from backend.constants import IP_PORT_DIVIDER +from backend.db_meta.enums import InstanceInnerRole, InstanceStatus +from backend.db_meta.exceptions import DBMetaException +from backend.db_meta.models import Cluster, StorageInstance +from backend.db_package.models import Package +from backend.flow.consts import MediumEnum +from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder +from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList +from backend.flow.engine.bamboo.scene.mysql.common.cluster_entrys import get_tendb_ha_entry +from backend.flow.engine.bamboo.scene.mysql.common.common_sub_flow import install_mysql_in_cluster_sub_flow +from backend.flow.engine.bamboo.scene.mysql.common.get_master_config import get_instance_config +from backend.flow.engine.bamboo.scene.mysql.common.mysql_resotre_data_sub_flow import mysql_restore_data_sub_flow +from backend.flow.engine.bamboo.scene.mysql.common.recover_slave_instance import slave_recover_sub_flow +from backend.flow.engine.bamboo.scene.mysql.common.slave_recover_switch import slave_migrate_switch_sub_flow +from backend.flow.engine.bamboo.scene.mysql.common.uninstall_instance import uninstall_instance_sub_flow +from backend.flow.engine.bamboo.scene.mysql.mysql_upgrade import upgrade_version_check +from backend.flow.plugins.components.collections.common.download_backup_client import DownloadBackupClientComponent +from backend.flow.plugins.components.collections.common.pause import PauseComponent +from backend.flow.plugins.components.collections.mysql.clear_machine import MySQLClearMachineComponent +from backend.flow.plugins.components.collections.mysql.exec_actuator_script import ExecuteDBActuatorScriptComponent +from backend.flow.plugins.components.collections.mysql.mysql_db_meta import MySQLDBMetaComponent +from backend.flow.plugins.components.collections.mysql.trans_flies import TransFileComponent +from backend.flow.utils.common_act_dataclass import DownloadBackupClientKwargs +from backend.flow.utils.mysql.common.mysql_cluster_info import get_ports, get_version_and_charset +from backend.flow.utils.mysql.mysql_act_dataclass import ( + ClearMachineKwargs, + DBMetaOPKwargs, + DownloadMediaKwargs, + ExecActuatorKwargs, +) +from backend.flow.utils.mysql.mysql_act_playload import MysqlActPayload +from backend.flow.utils.mysql.mysql_context_dataclass import ClusterInfoContext +from backend.flow.utils.mysql.mysql_db_meta import MySQLDBMeta +from backend.ticket.builders.common.constants import MySQLBackupSource + +logger = logging.getLogger("flow") + + +class DestroyNonStanbySlaveMySQLFlow(object): + """ + 下架非standby slave MySQL实例的流程 + """ + + def __init__(self, root_id: str, ticket_data: Optional[Dict]): + """ + @param root_id : 任务流程定义的root_id + @param tick_data : 单据传递过来的参数列表,是dict格式 + """ + self.root_id = root_id + self.ticket_data = ticket_data + if not self.ticket_data.get("force"): + self.ticket_data["force"] = False + + def destroy(self): + """ + { + "uid": "2022051612120001", + "created_by": "xxxx", + "bk_biz_id": "152", + "ticket_type": "MYSQL_RESTORE_SLAVE", + "infos": { + "cluster_ids": [1001,1002], + "slave_ip": "1.1.1.1", + } + } + """ + cluster_ids = self.ticket_data["infos"]["cluster_ids"] + slave_ip = self.ticket_data["infos"]["slave_ip"] + cluster_class = Cluster.objects.get(id=cluster_ids[0]) + ports = get_ports(cluster_ids) + slave_ins_list = StorageInstance.objects.filter(machine__ip=slave_ip) + + for slave_ins in slave_ins_list: + if slave_ins.is_stand_by: + raise DBMetaException(message=_("{}:{}实例是standby slave,请确认").format(slave_ip, slave_ins.port)) + + p = Builder( + root_id=self.root_id, + data=copy.deepcopy(self.ticket_data), + need_random_pass_cluster_ids=list(set(cluster_ids)), + ) + + p.add_act( + act_name=_("卸载实例前先删除元数据"), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.ro_slave_recover_del_instance.__name__, + cluster={"uninstall_ip": slave_ip, "cluster_ids": cluster_ids}, + ) + ), + ) + + p.add_act( + act_name=_("下发db-actor到节点{}").format(slave_ip), + act_component_code=TransFileComponent.code, + kwargs=asdict( + DownloadMediaKwargs( + bk_cloud_id=cluster_class.bk_cloud_id, + exec_ip=slave_ip, + file_list=GetFileList(db_type=DBType.MySQL).get_db_actuator_package(), + ) + ), + ) + + p.add_act( + act_name=_("清理机器配置"), + act_component_code=MySQLClearMachineComponent.code, + kwargs=asdict( + ClearMachineKwargs( + exec_ip=slave_ip, + bk_cloud_id=cluster_class.bk_cloud_id, + ) + ), + ) + + p.add_sub_pipeline( + sub_flow=uninstall_instance_sub_flow( + root_id=self.root_id, + ticket_data=copy.deepcopy(self.ticket_data), + ip=slave_ip, + ports=ports, + ) + ) + p.run_pipeline(is_drop_random_user=False) + + +class MySQLNonStandbySlavesUpgradeFlow(object): + """ + 一直多从非stanby slaves升级 + """ + + def __init__(self, root_id: str, ticket_data: Optional[Dict]): + """ + @param root_id : 任务流程定义的root_id + @param tick_data : 单据传递过来的参数列表,是dict格式 + """ + self.root_id = root_id + self.ticket_data = ticket_data + # 仅添加从库。不切换。不复制账号 + self.add_slave_only = self.ticket_data.get("add_slave_only", False) + + def __precheck(self): + """ + 升级前置检查 + """ + for info in self.ticket_data["infos"]: + cluster_class = Cluster.objects.get(id=info["cluster_ids"][0]) + origin_chaset, origin_mysql_ver = get_version_and_charset( + self.ticket_data["bk_biz_id"], + db_module_id=cluster_class.db_module_id, + cluster_type=cluster_class.cluster_type, + ) + + new_charset, new_mysql_ver = get_version_and_charset( + self.ticket_data["bk_biz_id"], + db_module_id=info["new_db_module_id"], + cluster_type=cluster_class.cluster_type, + ) + if new_charset != origin_chaset: + raise DBMetaException( + message=_("{}升级前后字符集不一致,原字符集:{},新模块的字符集{}").format( + cluster_class.immute_domain, origin_chaset, new_charset + ) + ) + upgrade_version_check(origin_mysql_ver, new_mysql_ver) + + def upgrade(self): + """ + { + "uid": "2022051612120001", + "created_by": "xxxx", + "bk_biz_id": "152", + "ticket_type": "MYSQL_RESTORE_SLAVE", + "backup_source": "local", + "infos": [ + { + "cluster_ids": [1001,1002], + "pkg_id": 123, + "new_db_module_id: "578", + "old_slave": { + "bk_biz_id": 200005000, + "bk_cloud_id": 0, + "bk_host_id": 1, + "ip": "1.1.1.1", + + }, + "new_slave": { + "bk_biz_id": 200005000, + "bk_cloud_id": 0, + "bk_host_id": 1, + "ip": "1.1.1.2" + } + } + ] + } + """ + self.__precheck() + cluster_ids = [] + for info in self.ticket_data["infos"]: + cluster_ids.extend(info["cluster_ids"]) + + p = Builder( + root_id=self.root_id, + data=copy.deepcopy(self.ticket_data), + need_random_pass_cluster_ids=list(set(cluster_ids)), + ) + subflows = [] + created_by = self.ticket_data["ticket_type"] + for info in self.ticket_data["infos"]: + subflow = non_standby_slaves_upgrade_subflow( + uid=str(self.ticket_data["uid"]), + root_id=self.root_id, + new_slave=info["new_slave"], + old_slave=info["old_slave"], + add_slave_only=self.add_slave_only, + relation_cluster_ids=info["cluster_ids"], + pkg_id=info["pkg_id"], + new_db_module_id=info["new_db_module_id"], + backup_source=self.ticket_data["backup_source"], + created_by=created_by, + force_uninstall=False, + ) + subflows.append(subflow) + + p.add_parallel_sub_pipeline(subflows) + + p.run_pipeline(init_trans_data_class=ClusterInfoContext(), is_drop_random_user=True) + + +def non_standby_slaves_upgrade_subflow( + uid: str, + root_id: str, + new_slave: dict, + old_slave: dict, + add_slave_only: bool, + relation_cluster_ids: list, + pkg_id: int, + new_db_module_id: int, + backup_source: str, + created_by: str, + force_uninstall: bool, +): + """ + 一主多从非stanby slaves升级subflow + """ + cluster_cls = Cluster.objects.get(id=relation_cluster_ids[0]) + ports = get_ports(relation_cluster_ids) + pkg = Package.objects.get(id=pkg_id, pkg_type=MediumEnum.MySQL, db_type=DBType.MySQL) + charset, db_version = get_version_and_charset( + cluster_cls.bk_biz_id, db_module_id=new_db_module_id, cluster_type=cluster_cls.cluster_type + ) + parent_global_data = { + "uid": uid, + "root_id": root_id, + "bk_biz_id": cluster_cls.bk_biz_id, + "bk_cloud_id": cluster_cls.bk_cloud_id, + "db_module_id": new_db_module_id, + "time_zone": cluster_cls.time_zone, + "cluster_type": cluster_cls.cluster_type, + "created_by": created_by, + "package": pkg.name, + "ports": ports, + "charset": charset, + "db_version": db_version, + "force": force_uninstall, + } + + sub_pipeline = SubBuilder(root_id=root_id, data=parent_global_data) + new_slave_ip = new_slave["ip"] + bk_host_ids = [new_slave["bk_host_id"]] + old_slave_ip = old_slave["ip"] + db_config = get_instance_config(cluster_cls.bk_cloud_id, old_slave_ip, ports=ports) + + # 安装mysql + install_sub_pipeline = build_install_sub_pipeline( + uid, + root_id, + parent_global_data, + cluster_cls, + new_slave_ip, + ports, + bk_host_ids, + db_config, + pkg_id, + pkg.name, + relation_cluster_ids, + new_db_module_id, + ) + sub_pipeline.add_sub_pipeline(sub_flow=install_sub_pipeline) + + # 恢复主从数据 + local_backup = False + if backup_source == MySQLBackupSource.LOCAL: + local_backup = True + sync_data_sub_pipeline_list = build_sync_data_sub_pipelines( + root_id, parent_global_data, relation_cluster_ids, new_slave_ip, local_backup, charset + ) + sub_pipeline.add_parallel_sub_pipeline(sync_data_sub_pipeline_list) + + # 切换到新从节点 + if not add_slave_only: + switch_sub_pipeline_list = build_switch_sub_pipelines( + root_id, parent_global_data, relation_cluster_ids, old_slave_ip, new_slave_ip + ) + sub_pipeline.add_parallel_sub_pipeline(switch_sub_pipeline_list) + # 更新新的从节点db module id + sub_pipeline.add_act( + act_name=_("更新[NewSlave]{} db module id".format(new_slave_ip)), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.update_upgrade_slaves_dbmodule.__name__, + is_update_trans_data=True, + cluster={ + "db_module_id": new_db_module_id, + "new_slave_ip": new_slave_ip, + }, + ) + ), + ) + + # 解除old从节点和集群的元数据的关系 + sub_pipeline.add_act( + act_name=_("解除[OldSlave]{}相关从实例和集群的元数据的关系".format(old_slave_ip)), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.dissolve_master_slave_relationship.__name__, + is_update_trans_data=True, + cluster={ + "cluster_ids": relation_cluster_ids, + "old_slave_ip": old_slave_ip, + }, + ) + ), + ) + + # 切换完成后,确认卸载旧的从节点 + sub_pipeline.add_act(act_name=_("确认卸载旧实例"), act_component_code=PauseComponent.code, kwargs={}) + # 卸载旧从节点 + uninstall_svr_sub_pipeline = build_uninstall_sub_pipeline( + root_id, parent_global_data, old_slave_ip, relation_cluster_ids, cluster_cls.bk_cloud_id, ports + ) + sub_pipeline.add_sub_pipeline(sub_flow=uninstall_svr_sub_pipeline) + + return sub_pipeline.build_sub_process(sub_name=_("{}:slave迁移升级到:{}").format(old_slave_ip, new_slave_ip)) + + +def build_install_sub_pipeline( + uid, + root_id, + parent_global_data, + cluster, + new_slave_ip, + ports, + bk_host_ids, + db_config, + pkg_id, + pkg_name, + relation_cluster_ids, + db_module_id, +): + install_sub_pipeline = SubBuilder(root_id=root_id, data=copy.deepcopy(parent_global_data)) + + install_sub_pipeline.add_sub_pipeline( + sub_flow=install_mysql_in_cluster_sub_flow( + uid=uid, + root_id=root_id, + cluster=cluster, + new_mysql_list=[new_slave_ip], + install_ports=ports, + bk_host_ids=bk_host_ids, + pkg_id=pkg_id, + db_config=db_config, + db_module_id=str(db_module_id), + ) + ) + + cluster_info = { + "install_ip": new_slave_ip, + "cluster_ids": relation_cluster_ids, + "package": pkg_name, + } + + install_sub_pipeline.add_act( + act_name=_("写入初始化实例的db_meta元信息"), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.slave_recover_add_instance.__name__, + cluster=copy.deepcopy(cluster_info), + is_update_trans_data=False, + ) + ), + ) + + install_sub_pipeline.add_act( + act_name=_("安装backup-client工具"), + act_component_code=DownloadBackupClientComponent.code, + kwargs=asdict( + DownloadBackupClientKwargs( + bk_cloud_id=cluster.bk_cloud_id, + bk_biz_id=int(cluster.bk_biz_id), + download_host_list=[new_slave_ip], + ) + ), + ) + + exec_act_kwargs = ExecActuatorKwargs( + cluster=cluster_info, + bk_cloud_id=cluster.bk_cloud_id, + cluster_type=cluster.cluster_type, + get_mysql_payload_func=MysqlActPayload.get_install_tmp_db_backup_payload.__name__, + exec_ip=[new_slave_ip], + ) + install_sub_pipeline.add_act( + act_name=_("安装临时备份程序"), + act_component_code=ExecuteDBActuatorScriptComponent.code, + kwargs=asdict(exec_act_kwargs), + ) + + return install_sub_pipeline.build_sub_process(sub_name=_("{}:安装MySQL实例").format(new_slave_ip)) + + +def build_sync_data_sub_pipelines( + root_id, parent_global_data, relation_cluster_ids, new_slave_ip, local_backup: bool, charset: str +): + sync_data_sub_pipeline_list = [] + for cluster_id in relation_cluster_ids: + cluster_model = Cluster.objects.get(id=cluster_id) + master = cluster_model.storageinstance_set.get(instance_inner_role=InstanceInnerRole.MASTER.value) + cluster = { + "mysql_port": master.port, + "cluster_id": cluster_model.id, + "cluster_type": cluster_model.cluster_type, + "master_ip": master.machine.ip, + "master_port": master.port, + "new_slave_ip": new_slave_ip, + "new_slave_port": master.port, + "bk_cloud_id": cluster_model.bk_cloud_id, + "file_target_path": f"/data/dbbak/{root_id}/{master.port}", + "charset": charset, + "change_master_force": True, + "change_master": True, + } + sync_data_sub_pipeline = SubBuilder(root_id=root_id, data=copy.deepcopy(parent_global_data)) + if local_backup: + # 获取本地备份并恢复 + inst_list = ["{}{}{}".format(master.machine.ip, IP_PORT_DIVIDER, master.port)] + stand_by_slaves = cluster_model.storageinstance_set.filter( + instance_inner_role=InstanceInnerRole.SLAVE.value, + is_stand_by=True, + status=InstanceStatus.RUNNING.value, + ).exclude(machine__ip__in=[new_slave_ip]) + if len(stand_by_slaves) > 0: + inst_list.append( + "{}{}{}".format(stand_by_slaves[0].machine.ip, IP_PORT_DIVIDER, stand_by_slaves[0].port) + ) + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=mysql_restore_data_sub_flow( + root_id=root_id, + ticket_data=copy.deepcopy(parent_global_data), + cluster=cluster, + cluster_model=cluster_model, + ins_list=inst_list, + ) + ) + else: + sync_data_sub_pipeline.add_sub_pipeline( + sub_flow=slave_recover_sub_flow( + root_id=root_id, ticket_data=copy.deepcopy(parent_global_data), cluster_info=cluster + ) + ) + + sync_data_sub_pipeline.add_act( + act_name=_("同步完毕,写入主从关系,设置节点为running状态"), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.mysql_add_slave_info.__name__, + cluster=cluster, + is_update_trans_data=True, + ) + ), + ) + sync_data_sub_pipeline_list.append( + sync_data_sub_pipeline.build_sub_process(sub_name=_("{}:恢复实例数据").format(cluster_model.immute_domain)) + ) + return sync_data_sub_pipeline_list + + +def build_switch_sub_pipelines(root_id, parent_global_data, relation_cluster_ids, old_slave_ip, new_slave_ip): + switch_sub_pipeline_list = [] + for cluster_id in relation_cluster_ids: + cluster_model = Cluster.objects.get(id=cluster_id) + switch_sub_pipeline = SubBuilder(root_id=root_id, data=copy.deepcopy(parent_global_data)) + switch_sub_pipeline.add_sub_pipeline( + sub_flow=slave_migrate_switch_sub_flow( + root_id=root_id, + ticket_data=copy.deepcopy(parent_global_data), + cluster=cluster_model, + old_slave_ip=old_slave_ip, + new_slave_ip=new_slave_ip, + ) + ) + domain_map = get_tendb_ha_entry(cluster_model.id) + cluster_info = { + "slave_domain": domain_map[old_slave_ip], + "new_slave_ip": new_slave_ip, + "old_slave_ip": old_slave_ip, + "cluster_id": cluster_model.id, + } + switch_sub_pipeline.add_act( + act_name=_("slave切换完毕,修改集群 {} 数据").format(cluster_model.immute_domain), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.mysql_restore_slave_change_cluster_info.__name__, + cluster=cluster_info, + is_update_trans_data=True, + ) + ), + ) + switch_sub_pipeline_list.append( + switch_sub_pipeline.build_sub_process(sub_name=_("切换到新从节点:{}").format(new_slave_ip)) + ) + return switch_sub_pipeline_list + + +def build_uninstall_sub_pipeline(root_id, parent_global_data, old_slave_ip, relation_cluster_ids, bk_cloud_id, ports): + uninstall_svr_sub_pipeline = SubBuilder(root_id=root_id, data=copy.deepcopy(parent_global_data)) + cluster_info = {"uninstall_ip": old_slave_ip, "cluster_ids": relation_cluster_ids} + + uninstall_svr_sub_pipeline.add_act( + act_name=_("卸载实例前先删除元数据"), + act_component_code=MySQLDBMetaComponent.code, + kwargs=asdict( + DBMetaOPKwargs( + db_meta_class_func=MySQLDBMeta.del_old_slave_meta.__name__, + is_update_trans_data=True, + cluster=cluster_info, + ) + ), + ) + + uninstall_svr_sub_pipeline.add_act( + act_name=_("下发db-actor到节点{}").format(old_slave_ip), + act_component_code=TransFileComponent.code, + kwargs=asdict( + DownloadMediaKwargs( + bk_cloud_id=bk_cloud_id, + exec_ip=old_slave_ip, + file_list=GetFileList(db_type=DBType.MySQL).get_db_actuator_package(), + ) + ), + ) + + uninstall_svr_sub_pipeline.add_act( + act_name=_("清理机器配置"), + act_component_code=MySQLClearMachineComponent.code, + kwargs=asdict( + ClearMachineKwargs( + exec_ip=old_slave_ip, + bk_cloud_id=bk_cloud_id, + ) + ), + ) + + uninstall_svr_sub_pipeline.add_sub_pipeline( + sub_flow=uninstall_instance_sub_flow( + root_id=root_id, + ticket_data=copy.deepcopy(parent_global_data), + ip=old_slave_ip, + ports=ports, + ) + ) + + return uninstall_svr_sub_pipeline.build_sub_process(sub_name=_("卸载remote节点{}").format(old_slave_ip)) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py index 8cb0977478..466159ebf9 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_upgrade.py @@ -25,7 +25,6 @@ from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList from backend.flow.engine.bamboo.scene.mysql.common.master_and_slave_switch import master_and_slave_switch -from backend.flow.engine.bamboo.scene.mysql.mysql_migrate_cluster_flow import MySQLMigrateClusterFlow from backend.flow.engine.bamboo.scene.mysql.mysql_migrate_cluster_remote_flow import MySQLMigrateClusterRemoteFlow from backend.flow.plugins.components.collections.common.pause import PauseComponent from backend.flow.plugins.components.collections.mysql.exec_actuator_script import ExecuteDBActuatorScriptComponent @@ -36,7 +35,6 @@ from backend.flow.utils.mysql.mysql_act_playload import MysqlActPayload from backend.flow.utils.mysql.mysql_db_meta import MySQLDBMeta from backend.flow.utils.mysql.mysql_version_parse import get_sub_version_by_pkg_name, mysql_version_parse -from backend.ticket.builders.common.constants import MySQLBackupSource logger = logging.getLogger("flow") @@ -66,24 +64,26 @@ def convert_mysql8_version_num(verno: int) -> int: # MySQLMigrateClusterRemoteFlow: 使用远程备份来恢复 # MySQLMigrateClusterFlow: 使用本地备份来恢复 -class MySQMigrateUpgradeFlow(MySQLMigrateClusterRemoteFlow, MySQLMigrateClusterFlow): +class MySQMigrateUpgradeFlow(MySQLMigrateClusterRemoteFlow): """ 构建mysql主从成对迁移的方式来升级MySQL + # new_non_standy_slave_ip_list:[ + { + "old_slave": {"ip": "127.0.0.2", "bk_cloud_id": 0, "bk_host_id": 1, "bk_biz_id": 2005000002}, + "new_slave": {"ip": "127.0.0.3", "bk_cloud_id": 0, "bk_host_id": 1, "bk_biz_id": 2005000003}, + }, + { + "old_slave": {"ip": "127.0.1.2", "bk_cloud_id": 0, "bk_host_id": 1, "bk_biz_id": 2005000004}, + "new_slave": {"ip": "127.0.1.3", "bk_cloud_id": 0, "bk_host_id": 1, "bk_biz_id": 2005000005}, + } + ] + ] """ - def __init__(self, root_id: str, ticket_data: Optional[Dict]): - self.root_id = root_id - self.ticket_data = ticket_data - def upgrade(self): # 进行模块的版本检查 self.__pre_check() - if self.ticket_data["backup_source"] == MySQLBackupSource.LOCAL: - # 使用本地备份来做迁移 - self.deploy_migrate_cluster_flow(use_for_upgrade=True) - elif self.ticket_data["backup_source"] == MySQLBackupSource.REMOTE: - # 使用远程备份来做迁移 - self.migrate_cluster_flow(use_for_upgrade=True) + self.migrate_cluster_flow(use_for_upgrade=True) def __pre_check(self): for info in self.ticket_data["infos"]: @@ -103,18 +103,22 @@ def __pre_check(self): ) # 判断是否存在一组多从的情况 slave = cluster_class.storageinstance_set.filter( - instance_inner_role=InstanceInnerRole.SLAVE.value, is_stand_by=True + instance_inner_role=InstanceInnerRole.SLAVE.value, + is_stand_by=True, + db_module_id=cluster_class.db_module_id, ).first() if slave is None: raise DBMetaException(message=_("查询集群{}stanb_by slave实例为None").format(cluster_class.immute_domain)) mysql_storage_slave = cluster_class.storageinstance_set.filter( - instance_inner_role=InstanceInnerRole.SLAVE.value, status=InstanceStatus.RUNNING.value + instance_inner_role=InstanceInnerRole.SLAVE.value, + status=InstanceStatus.RUNNING.value, + is_stand_by=False, ) - other_slave = [y.machine.ip for y in mysql_storage_slave.exclude(machine__ip=slave.machine.ip)] - if len(other_slave) > 0: - raise DBMetaException(message=_("请先升级{}stanb_by的其他slave实例").format(cluster_class.immute_domain)) + for other_slave in mysql_storage_slave: + if other_slave.db_module_id != info["new_db_module_id"]: + raise DBMetaException(message=_("请先升级{}stanb_by的其他slave实例").format(cluster_class.immute_domain)) if new_charset != origin_chaset: raise DBMetaException( message=_("{}升级前后字符集不一致,原字符集:{},新模块的字符集{}").format( diff --git a/dbm-ui/backend/flow/engine/controller/mysql.py b/dbm-ui/backend/flow/engine/controller/mysql.py index a64f64f9f9..9dd3af8b0b 100644 --- a/dbm-ui/backend/flow/engine/controller/mysql.py +++ b/dbm-ui/backend/flow/engine/controller/mysql.py @@ -34,6 +34,10 @@ from backend.flow.engine.bamboo.scene.mysql.mysql_master_slave_switch import MySQLMasterSlaveSwitchFlow from backend.flow.engine.bamboo.scene.mysql.mysql_migrate_cluster_flow import MySQLMigrateClusterFlow from backend.flow.engine.bamboo.scene.mysql.mysql_migrate_cluster_remote_flow import MySQLMigrateClusterRemoteFlow +from backend.flow.engine.bamboo.scene.mysql.mysql_non_standby_slaves_upgrade import ( + DestroyNonStanbySlaveMySQLFlow, + MySQLNonStandbySlavesUpgradeFlow, +) from backend.flow.engine.bamboo.scene.mysql.mysql_open_area_flow import MysqlOpenAreaFlow from backend.flow.engine.bamboo.scene.mysql.mysql_partition import MysqlPartitionFlow from backend.flow.engine.bamboo.scene.mysql.mysql_partition_cron import MysqlPartitionCronFlow @@ -674,3 +678,17 @@ def push_peripheral_config_scene(self): flow = MySQLPushPeripheralConfigFlow(root_id=self.root_id, data=self.ticket_data) flow.push_config() + + def non_standby_slaves_upgrade_scene(self): + """ + 非Standby从库升级 + """ + flow = MySQLNonStandbySlavesUpgradeFlow(root_id=self.root_id, ticket_data=self.ticket_data) + flow.upgrade() + + def non_standby_slaves_destory_scene(self): + """ + 非Standby从库升级 + """ + flow = DestroyNonStanbySlaveMySQLFlow(root_id=self.root_id, ticket_data=self.ticket_data) + flow.destroy() diff --git a/dbm-ui/backend/flow/urls.py b/dbm-ui/backend/flow/urls.py index cec16c0499..6a76f53220 100644 --- a/dbm-ui/backend/flow/urls.py +++ b/dbm-ui/backend/flow/urls.py @@ -139,7 +139,12 @@ ) from backend.flow.views.mysql_single_rename_database import MySQLSingleRenameDatabaseView from backend.flow.views.mysql_single_truncate_data import MySQLSingleTruncateDataView -from backend.flow.views.mysql_upgrade import MigrateUpgradeMySQLSceneApiView, UpgradeMySQLSceneApiView +from backend.flow.views.mysql_upgrade import ( + MigrateUpgradeMySQLSceneApiView, + NonStanbySlavesDestorySceneApiView, + NonStanbySlavesUpgradeMySQLSceneApiView, + UpgradeMySQLSceneApiView, +) from backend.flow.views.name_service import ( ClbCreateSceneApiView, ClbDeleteSceneApiView, @@ -340,6 +345,8 @@ url(r"^scene/upgrade_mysql_proxy$", UpgradeMySQLProxySceneApiView.as_view()), url(r"^scene/upgrade_mysql$", UpgradeMySQLSceneApiView.as_view()), url(r"^scene/migrate_upgrade_mysql$", MigrateUpgradeMySQLSceneApiView.as_view()), + url(r"^scene/non_stanby_slave_upgrade_mysql$", NonStanbySlavesUpgradeMySQLSceneApiView.as_view()), + url(r"^scene/uninstall_non_standby_slave$", NonStanbySlavesDestorySceneApiView.as_view()), # mysql url(r"^scene/dbconsole_dump$", DbConsoleDumpApiView.as_view()), url(r"^scene/install_mysql_apply$", InstallMySQLSingleSceneApiView.as_view()), diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py index 0a95b2572c..05ea28da28 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_act_playload.py @@ -126,47 +126,70 @@ def get_sys_init_payload(self, **kwargs) -> dict: "payload": {"user": self.account["os_mysql_user"], "pwd": self.account["os_mysql_pwd"]}, } - def deal_mysql_config(self, db_version: str, origin_configs: dict, init_configs: dict) -> dict: + def deal_with_upgrade_to_mysql57(self, cfg: dict) -> dict: + del_keys = [ + "secure_auth", + "innodb_additional_mem_pool_size", + "innodb_create_use_gcs_real_format", + "thread_concurrency", + "storage_engine", + "old_passwords", + "innodb_file_io_threads", + ] + for key in del_keys: + if key in cfg["mysqld"]: + del cfg["mysqld"][key] + + # 需要rename key 的配置 + if "thread_cache" in cfg["mysqld"]: + cfg["mysqld"]["thread_cache_size"] = cfg["mysqld"]["thread_cache"] + del cfg["mysqld"]["thread_cache"] + if "key_buffer" in cfg["mysqld"]: + cfg["mysqld"]["key_buffer_size"] = cfg["mysqld"]["key_buffer"] + del cfg["mysqld"]["key_buffer"] + if "log_warnings" in cfg["mysqld"]: + cfg["mysqld"]["log_error_verbosity"] = "1" + del cfg["mysqld"]["log_warnings"] + + return cfg + + def deal_with_upgrade_to_mysql80(self, is_community: bool, cfg: dict) -> dict: """ 处理不同介质的之间的mysql配置 """ - cfg = copy.deepcopy(init_configs) - cfg["mysqld"].update(origin_configs) - - if db_version >= "8.0.0": - if "log_warnings" in cfg["mysqld"]: - value = cfg["mysqld"]["log_warnings"] - if value == "0": - cfg["mysqld"]["log_error_verbosity"] = "1" - elif value == "1": - cfg["mysqld"]["log_error_verbosity"] = "2" - else: - cfg["mysqld"]["log_error_verbosity"] = "3" - del cfg["mysqld"]["log_warnings"] - # mysql8.0 无法识别这些参数 - for key in [ - "innodb_file_format", - "query_cache_size", - "query_cache_type", - "show_compatibility_56", - "query_response_time_stats", - "userstat", - ]: - if key in cfg["mysqld"]: - del cfg["mysqld"][key] - if "thread_handling" in cfg["mysqld"]: - val = cfg["mysqld"]["thread_handling"] - # thread_handling = 2 是tmysql参数。社区版本和txsql 都不能识别 - if val == "1": - cfg["mysqld"]["thread_handling"] = "no-threads" - elif val == "2": - cfg["mysqld"]["thread_handling"] = "one-thread-per-connection" - elif val == "3": - cfg["mysqld"]["thread_handling"] = "loaded-dynamically" + if "log_warnings" in cfg["mysqld"]: + value = cfg["mysqld"]["log_warnings"] + if value == "0": + cfg["mysqld"]["log_error_verbosity"] = "1" + elif value == "1": + cfg["mysqld"]["log_error_verbosity"] = "2" + else: + cfg["mysqld"]["log_error_verbosity"] = "3" + del cfg["mysqld"]["log_warnings"] + # mysql8.0 无法识别这些参数 + for key in [ + "innodb_file_format", + "query_cache_size", + "query_cache_type", + "show_compatibility_56", + "query_response_time_stats", + "userstat", + ]: + if key in cfg["mysqld"]: + del cfg["mysqld"][key] + if "thread_handling" in cfg["mysqld"]: + val = cfg["mysqld"]["thread_handling"] + # thread_handling = 2 是tmysql参数。社区版本和txsql 都不能识别 + if val == "1": + cfg["mysqld"]["thread_handling"] = "no-threads" + elif val == "2": + cfg["mysqld"]["thread_handling"] = "one-thread-per-connection" + elif val == "3": + cfg["mysqld"]["thread_handling"] = "loaded-dynamically" # 这里应该是社区版本等非Tendb数据库的版本需要处理的参数 # 介质管理暂未记录介质来源属性 - if db_version >= "8.0.30": + if is_community: for key in [ "log_bin_compress", "relay_log_uncompress", @@ -182,6 +205,24 @@ def deal_mysql_config(self, db_version: str, origin_configs: dict, init_configs: del cfg["mysqld"][key] return cfg + def deal_mysql_config(self, db_version: str, origin_configs: dict, init_configs: dict) -> dict: + """ + 处理不同介质的之间的mysql配置 + """ + cfg = copy.deepcopy(init_configs) + cfg["mysqld"].update(origin_configs) + if db_version >= "5.7.0": + cfg = self.deal_with_upgrade_to_mysql57(cfg) + is_community = False + if db_version >= "8.0.0": + # 这里应该是社区版本等非Tendb数据库的版本需要处理的参数 + # 介质管理暂未记录介质来源属性 + if db_version >= "8.0.30": + is_community = True + cfg = self.deal_with_upgrade_to_mysql80(is_community=is_community, cfg=cfg) + + return cfg + def get_install_mysql_payload(self, **kwargs) -> dict: """ 拼接安装MySQL的payload参数, 分别兼容集群申请、集群实例重建、集群实例添加单据的获取方式 @@ -199,10 +240,12 @@ def get_install_mysql_payload(self, **kwargs) -> dict: init_mysql_config[cluster["mysql_port"]] = self.__get_mysql_config( immutable_domain=cluster["master"], db_version=db_version ) - mysql_pkg = Package.get_latest_package(version=db_version, pkg_type=MediumEnum.MySQL) + if self.cluster.get("pkg_id"): + pkg_id = self.cluster["pkg_id"] + if pkg_id > 0: + mysql_pkg = Package.objects.get(id=pkg_id, pkg_type=MediumEnum.MySQL) version_no = get_mysql_real_version(mysql_pkg.name) - install_mysql_ports = self.ticket_data.get("mysql_ports") mysql_config = {} if not isinstance(install_mysql_ports, list) or len(install_mysql_ports) == 0: diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py index 73995e421e..27fe96ad1d 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py @@ -27,7 +27,7 @@ InstanceStatus, MachineType, ) -from backend.db_meta.models import Cluster, ProxyInstance, StorageInstance, StorageInstanceTuple +from backend.db_meta.models import Cluster, ClusterEntry, Machine, ProxyInstance, StorageInstance, StorageInstanceTuple from backend.db_meta.models.extra_process import ExtraProcessInstance from backend.db_package.models import Package from backend.db_services.mysql.dumper.models import DumperSubscribeConfig @@ -776,6 +776,99 @@ def slave_recover_del_instance(self): ).exists(): api.machine.delete(machines=[self.cluster["uninstall_ip"]], bk_cloud_id=cluster.bk_cloud_id) + def ro_slave_recover_del_instance(self): + """ + ro slave 实例卸载完毕修改元数据 + """ + + with atomic(): + for cluster_id in self.cluster["cluster_ids"]: + cluster = Cluster.objects.get(id=cluster_id) + master = cluster.main_storage_instances()[0] + old_slave = cluster.storageinstance_set.get(machine__ip=self.cluster["uninstall_ip"], port=master.port) + api.cluster.tendbha.remove_storage_tuple( + master_ip=master.machine.ip, + slave_ip=old_slave.machine.ip, + bk_cloud_id=cluster.bk_cloud_id, + port_list=[master.port], + ) + api.cluster.tendbha.remove_slave(cluster_id=cluster.id, target_slave_ip=old_slave.machine.ip) + CcManage(cluster.bk_biz_id, cluster_type=cluster.cluster_type).delete_service_instance( + bk_instance_ids=[old_slave.bk_instance_id] + ) + # 删除实例元数据信息 + api.storage_instance.delete( + [ + { + "ip": old_slave.machine.ip, + "port": old_slave.port, + "bk_cloud_id": cluster.bk_cloud_id, + } + ] + ) + if not StorageInstance.objects.filter( + machine__ip=self.cluster["uninstall_ip"], machine__bk_cloud_id=cluster.bk_cloud_id + ).exists(): + api.machine.delete(machines=[self.cluster["uninstall_ip"]], bk_cloud_id=cluster.bk_cloud_id) + # 删除cluster entry + for ce in ClusterEntry.objects.filter(cluster=cluster).all(): + ce.delete(keep_parents=True) + + def update_upgrade_slaves_dbmodule(self): + """ + 更新升级后slave的db moudule id + """ + with atomic(): + new_slave_ip = self.cluster["new_slave_ip"] + db_module_id = self.cluster["db_module_id"] + Machine.objects.filter(ip=new_slave_ip).update(db_module_id=db_module_id) + StorageInstance.objects.filter(machine__ip=new_slave_ip).update(db_module_id=db_module_id) + + def dissolve_master_slave_relationship(self): + """ + 解绑主从关系 + """ + with atomic(): + for cluster_id in self.cluster["cluster_ids"]: + cluster = Cluster.objects.get(id=cluster_id) + master = cluster.main_storage_instances()[0] + old_slave = cluster.storageinstance_set.get(machine__ip=self.cluster["old_slave_ip"], port=master.port) + api.cluster.tendbha.remove_storage_tuple( + master_ip=master.machine.ip, + slave_ip=old_slave.machine.ip, + bk_cloud_id=cluster.bk_cloud_id, + port_list=[master.port], + ) + api.cluster.tendbha.remove_slave(cluster_id=cluster.id, target_slave_ip=old_slave.machine.ip) + + def del_old_slave_meta(self): + """ + 删除旧从节点的元数据 + """ + with atomic(): + for cluster_id in self.cluster["cluster_ids"]: + cluster = Cluster.objects.get(id=cluster_id) + master = cluster.main_storage_instances()[0] + old_slave = StorageInstance.objects.get(machine__ip=self.cluster["uninstall_ip"], port=master.port) + # 删除服务实例 + CcManage(cluster.bk_biz_id, cluster_type=cluster.cluster_type).delete_service_instance( + bk_instance_ids=[old_slave.bk_instance_id] + ) + # 删除实例元数据信息 + api.storage_instance.delete( + [ + { + "ip": old_slave.machine.ip, + "port": old_slave.port, + "bk_cloud_id": cluster.bk_cloud_id, + } + ] + ) + if not StorageInstance.objects.filter( + machine__ip=self.cluster["uninstall_ip"], machine__bk_cloud_id=cluster.bk_cloud_id + ).exists(): + api.machine.delete(machines=[self.cluster["uninstall_ip"]], bk_cloud_id=cluster.bk_cloud_id) + def tendb_modify_storage_status(self): storage = StorageInstance.objects.get(id=self.cluster["storage_id"]) storage.status = self.cluster["storage_status"] diff --git a/dbm-ui/backend/flow/views/mysql_upgrade.py b/dbm-ui/backend/flow/views/mysql_upgrade.py index 9a830b7acf..d66f097365 100644 --- a/dbm-ui/backend/flow/views/mysql_upgrade.py +++ b/dbm-ui/backend/flow/views/mysql_upgrade.py @@ -49,3 +49,33 @@ def post(request): test = MySQLController(root_id=root_id, ticket_data=request.data) test.mysql_migrate_upgrade_scene() return Response({"root_id": root_id}) + + +class NonStanbySlavesUpgradeMySQLSceneApiView(FlowTestView): + """ + api: /apis/v1/flow/scene/migrate_upgrade_mysql + """ + + @staticmethod + def post(request): + logger.info(_("开始测试迁移升级非standy mysql实例场景")) + root_id = generate_root_id() + logger.info("define root_id: {}".format(root_id)) + test = MySQLController(root_id=root_id, ticket_data=request.data) + test.non_standby_slaves_upgrade_scene() + return Response({"root_id": root_id}) + + +class NonStanbySlavesDestorySceneApiView(FlowTestView): + """ + api: /apis/v1/flow/scene/uninstall_non_standby_slave + """ + + @staticmethod + def post(request): + logger.info(_("开始下架非standy slave实例场景")) + root_id = generate_root_id() + logger.info("define root_id: {}".format(root_id)) + test = MySQLController(root_id=root_id, ticket_data=request.data) + test.non_standby_slaves_destory_scene() + return Response({"root_id": root_id}) diff --git a/dbm-ui/backend/ticket/constants.py b/dbm-ui/backend/ticket/constants.py index 6ea512b818..ab39619d07 100644 --- a/dbm-ui/backend/ticket/constants.py +++ b/dbm-ui/backend/ticket/constants.py @@ -211,6 +211,8 @@ def get_cluster_type_by_ticket(cls, ticket_type): MYSQL_DUMP_DATA = TicketEnumField("MYSQL_DUMP_DATA", _("MySQL 数据导出"), _("数据处理")) MYSQL_LOCAL_UPGRADE = TicketEnumField("MYSQL_LOCAL_UPGRADE", _("MySQL 原地升级"), _("版本升级")) MYSQL_MIGRATE_UPGRADE = TicketEnumField("MYSQL_MIGRATE_UPGRADE", _("MySQL 迁移升级"), _("版本升级")) + MYSQL_SLAVE_MIGRATE_UPGRADE = TicketEnumField("MYSQL_SLAVE_MIGRATE_UPGRADE", _("MySQL Slave 迁移升级"), _("版本升级")) + MYSQL_RO_SLAVE_UNINSTALL = TicketEnumField("MYSQL_RO_SLAVE_UNINSTALL", _("MySQL非stanby slave下架"), _("集群维护")) MYSQL_PROXY_UPGRADE = TicketEnumField("MYSQL_PROXY_UPGRADE", _("MySQL Proxy升级"), _("版本升级")) MYSQL_HA_TRANSFER_TO_OTHER_BIZ = TicketEnumField("MYSQL_HA_TRANSFER_TO_OTHER_BIZ", _("TendbHA集群迁移至其他业务"), register_iam=False)# noqa MYSQL_PUSH_PERIPHERAL_CONFIG = TicketEnumField("MYSQL_PUSH_PERIPHERAL_CONFIG", _("推送周边配置"), register_iam=False) diff --git a/dbm-ui/frontend/src/common/const/ticketTypes.ts b/dbm-ui/frontend/src/common/const/ticketTypes.ts index 6ab8d2b9af..76114084b2 100644 --- a/dbm-ui/frontend/src/common/const/ticketTypes.ts +++ b/dbm-ui/frontend/src/common/const/ticketTypes.ts @@ -40,6 +40,7 @@ export enum TicketTypes { MYSQL_PROXY_UPGRADE = 'MYSQL_PROXY_UPGRADE', // MySQL Proxy 升级 MYSQL_LOCAL_UPGRADE = 'MYSQL_LOCAL_UPGRADE', // MySQL 原地升级 MYSQL_MIGRATE_UPGRADE = 'MYSQL_MIGRATE_UPGRADE', // MySQL 迁移升级 + MYSQL_SLAVE_MIGRATE_UPGRADE = 'MYSQL_SLAVE_MIGRATE_UPGRADE' // MySQL 从库迁移升级 } export enum TicketTypes { REDIS_CLUSTER_APPLY = 'REDIS_CLUSTER_APPLY', From 4e3770b0cf2e20fbdba6af59b090379a0ffb57f2 Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Sun, 29 Sep 2024 15:12:20 +0800 Subject: [PATCH 088/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dsqlserver?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=BA=93=E7=9A=84sql=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E9=9A=90=E6=82=A3=20#7183?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/components/sqlserver/clean_dbs.go | 10 +++++----- .../sqlserver/init_sqlserver_instance.go | 16 +++++++++++++--- .../components/sqlserver/install_sqlserver.go | 11 +---------- .../pkg/components/sqlserver/rename_dbs.go | 4 ++-- .../db-tools/dbactuator/pkg/core/cst/const.go | 8 -------- .../pkg/core/staticembed/monitor_dbm.sql | 4 ++-- 6 files changed, 23 insertions(+), 30 deletions(-) diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/clean_dbs.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/clean_dbs.go index e0272eae6c..f3c626348e 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/clean_dbs.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/clean_dbs.go @@ -250,7 +250,7 @@ func (c *CleanDBSComp) DropdbwithMirroring(dbName string) error { } // 表示有建立镜像关系,所以drop之前需要解除 if cnt != 0 { - execDBSQLs = append(execDBSQLs, fmt.Sprintf("ALTER DATABASE %s SET PARTNER OFF;", dbName)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("ALTER DATABASE [%s] SET PARTNER OFF;", dbName)) } // 查询数据库是否有关联的快照库 getSnapshots := fmt.Sprintf( @@ -264,11 +264,11 @@ func (c *CleanDBSComp) DropdbwithMirroring(dbName string) error { // 如果有存在快照,则先删除快照库 if len(dbSnapshots) != 0 { for _, snapshot := range dbSnapshots { - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s;", snapshot)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s];", snapshot)) } } // 拼接执行删除源库 - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s", dbName)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s]", dbName)) // 执行drop 批命令 if _, err := c.DB.ExecMore(execDBSQLs); err != nil { @@ -339,11 +339,11 @@ func (c *CleanDBSComp) DropdbwithAlwayson(dbName string) error { // 如果有存在快照,则先删除快照库 if len(dbSnapshots) != 0 { for _, snapshot := range dbSnapshots { - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s;", snapshot)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s];", snapshot)) } } // 拼接执行删除源库 - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s", dbName)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s]", dbName)) // 执行drop 批命令 if _, err := c.DB.ExecMore(execDBSQLs); err != nil { diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/init_sqlserver_instance.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/init_sqlserver_instance.go index aa40184eee..15ef31de51 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/init_sqlserver_instance.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/init_sqlserver_instance.go @@ -110,6 +110,16 @@ func (r *InitSqlserverInstanceComp) CreateSysUser() error { logger.Error("init drs login failed %v", err) return err } + // 初始化dbha账号 + if err := r.DB.CreateLoginUser( + r.GeneralParam.RuntimeAccountParam.DBHAUser, + r.GeneralParam.RuntimeAccountParam.DBHAPwd, + "sysadmin", + ); err != nil { + logger.Error("init dbha login failed %v", err) + return err + } + // 初始化mssql_exporter账号 if err := r.DB.CreateLoginUser( r.GeneralParam.RuntimeAccountParam.MssqlExporterUser, @@ -120,12 +130,12 @@ func (r *InitSqlserverInstanceComp) CreateSysUser() error { return err } // mssql_exporter账号, 授权 - cmd := fmt.Sprintf( + exporterCmd := fmt.Sprintf( cst.GRANT_MSSQL_EXPORTER_SQL, r.GeneralParam.RuntimeAccountParam.MssqlExporterUser, ) - if _, err := r.DB.Exec(cmd); err != nil { - logger.Error("init mssql_exporter failed %v", err) + if _, err := r.DB.Exec(exporterCmd); err != nil { + logger.Error("init mssql_exporter-grant failed %v", err) return err } return nil diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/install_sqlserver.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/install_sqlserver.go index 11c79cb067..d614d131ca 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/install_sqlserver.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/install_sqlserver.go @@ -545,20 +545,11 @@ func (i *InstallSqlServerComp) InitUsers() (err error) { if err := dbWork.CreateLoginUser( i.GeneralParam.RuntimeAccountParam.DBHAUser, i.GeneralParam.RuntimeAccountParam.DBHAPwd, - "public", + "sysadmin", ); err != nil { logger.Error("init dbha login failed %v", err) return err } - // dbha账号, 授权 - dbhaCmd := fmt.Sprintf( - cst.GRANT_DBHA_SQL, - i.GeneralParam.RuntimeAccountParam.DBHAUser, - ) - if _, err := dbWork.Exec(dbhaCmd); err != nil { - logger.Error("init dbha-grant failed %v", err) - return err - } // 初始化mssql_exporter账号 if err := dbWork.CreateLoginUser( diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go index f4b48bd081..116938fa23 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/components/sqlserver/rename_dbs.go @@ -266,11 +266,11 @@ func DropOldDatabaseOnslave(dbname string, DRS []slaves) error { // 如果有存在快照,则先删除快照库 if len(dbSnapshots) != 0 { for _, snapshot := range dbSnapshots { - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s;", snapshot)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s];", snapshot)) } } // 拼接执行删除源库 - execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE %s", dbname)) + execDBSQLs = append(execDBSQLs, fmt.Sprintf("DROP DATABASE [%s]", dbname)) // 执行drop 从库 if _, err := slave.Connet.ExecMore(execDBSQLs); err != nil { diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go index 755180d621..f7681d2f50 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/cst/const.go @@ -254,14 +254,6 @@ var ( ` ) -// dbha账号权限sql -var ( - GRANT_DBHA_SQL = ` - use [master] - GRANT CONTROL SERVER TO [%s] AS [sa] - ` -) - // mssql_exporter账号权限 var ( GRANT_MSSQL_EXPORTER_SQL = ` diff --git a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql index 1f84a0dbd2..986e03ceb2 100644 --- a/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql +++ b/dbm-services/sqlserver/db-tools/dbactuator/pkg/core/staticembed/monitor_dbm.sql @@ -124,8 +124,8 @@ GO IF DB_ID('Monitor') IS NOT NULL BEGIN - ALTER DATABASE Monitor SET SINGLE_USER WITH ROLLBACK IMMEDIATE - DROP DATABASE Monitor + ALTER DATABASE [Monitor] SET SINGLE_USER WITH ROLLBACK IMMEDIATE + DROP DATABASE [Monitor] END --****************************************** DATABASE **************************************** From 537fb3f900ac244a0a4a3483e22209faccd3099b Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Tue, 8 Oct 2024 14:23:37 +0800 Subject: [PATCH 089/164] =?UTF-8?q?feat(backend):=20dbha=20=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E5=88=86=E6=B4=BE=E6=94=AF=E6=8C=81=20tendbcluster=20?= =?UTF-8?q?=E5=92=8C=20sqlserver=5Fha=20#7205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_monitor/models/alarm.py | 2 +- ...64\245\347\224\265\350\257\235\345\221\212\350\255\246.json" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/db_monitor/models/alarm.py b/dbm-ui/backend/db_monitor/models/alarm.py index d7530ee73e..b1b34c1b56 100644 --- a/dbm-ui/backend/db_monitor/models/alarm.py +++ b/dbm-ui/backend/db_monitor/models/alarm.py @@ -433,7 +433,7 @@ def get_rules_by_dbtype(cls, db_type, bk_biz_id) -> List[Dict[str, Any]]: ] # 补充 dbha 特殊策略的分派规则 - if db_type in [DBType.MySQL, DBType.Redis, DBType.Sqlserver]: + if db_type in [DBType.MySQL, DBType.TenDBCluster, DBType.Redis, DBType.Sqlserver]: policies = MonitorPolicy.get_dbha_policies() rules.append( { diff --git "a/dbm-ui/backend/db_monitor/tpls/alarm/cloud/dbha\344\272\214\346\254\241\346\216\242\346\265\213\345\244\261\350\264\245\347\224\265\350\257\235\345\221\212\350\255\246.json" "b/dbm-ui/backend/db_monitor/tpls/alarm/cloud/dbha\344\272\214\346\254\241\346\216\242\346\265\213\345\244\261\350\264\245\347\224\265\350\257\235\345\221\212\350\255\246.json" index 4495a9a605..51a9054eeb 100644 --- "a/dbm-ui/backend/db_monitor/tpls/alarm/cloud/dbha\344\272\214\346\254\241\346\216\242\346\265\213\345\244\261\350\264\245\347\224\265\350\257\235\345\221\212\350\255\246.json" +++ "b/dbm-ui/backend/db_monitor/tpls/alarm/cloud/dbha\344\272\214\346\254\241\346\216\242\346\265\213\345\244\261\350\264\245\347\224\265\350\257\235\345\221\212\350\255\246.json" @@ -245,7 +245,7 @@ }, "is_enabled": true, "monitor_indicator": "COUNT(dbha_doublecheck_ssh_fail-dbm_report_channel)", - "version": 1, + "version": 2, "alert_source": "event", "custom_conditions": [], "export_at": "2024-08-13T15:24:37+08:00" From b8460aa442759e726deae0a9c06f52904b14f3c5 Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Thu, 26 Sep 2024 10:20:35 +0800 Subject: [PATCH 090/164] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=B1=A0=E5=AF=BC=E5=85=A5=E7=9A=84flow=EF=BC=8C?= =?UTF-8?q?=E6=89=A7=E8=A1=8Cwindow=E6=9C=BA=E5=99=A8=20#7130?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_services/dbresource/serializers.py | 2 + .../db_services/dbresource/views/resource.py | 71 +++++++++++-------- dbm-ui/backend/flow/consts.py | 3 + .../bamboo/scene/common/machine_os_init.py | 17 ++++- .../components/collections/common/sa_init.py | 1 + .../flow/utils/mysql/mysql_act_dataclass.py | 1 + 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/dbm-ui/backend/db_services/dbresource/serializers.py b/dbm-ui/backend/db_services/dbresource/serializers.py index 9d31b7c721..1133a0ebcf 100644 --- a/dbm-ui/backend/db_services/dbresource/serializers.py +++ b/dbm-ui/backend/db_services/dbresource/serializers.py @@ -25,6 +25,7 @@ RESOURCE_UPDATE_PARAMS, SPEC_DATA, ) +from backend.db_services.ipchooser.constants import BkOsTypeCode from backend.db_services.ipchooser.serializers.base import QueryHostsBaseSer from backend.ticket.builders.common.field import DBTimezoneField from backend.ticket.constants import TicketStatus @@ -35,6 +36,7 @@ class HostInfoSerializer(serializers.Serializer): ip = serializers.CharField() host_id = serializers.IntegerField() bk_cloud_id = serializers.IntegerField() + os_type = serializers.CharField(required=False, default=BkOsTypeCode.LINUX) for_bizs = serializers.ListSerializer(help_text=_("专属业务的ID列表"), child=serializers.IntegerField()) resource_types = serializers.ListField( diff --git a/dbm-ui/backend/db_services/dbresource/views/resource.py b/dbm-ui/backend/db_services/dbresource/views/resource.py index c96117c2ae..0c33cb5c52 100644 --- a/dbm-ui/backend/db_services/dbresource/views/resource.py +++ b/dbm-ui/backend/db_services/dbresource/views/resource.py @@ -11,6 +11,7 @@ import itertools import time +from collections import defaultdict from typing import Dict, List from django.utils.translation import ugettext_lazy as _ @@ -51,7 +52,7 @@ SpecCountResourceResponseSerializer, SpecCountResourceSerializer, ) -from backend.db_services.ipchooser.constants import BkOsType, ModeType +from backend.db_services.ipchooser.constants import BK_OS_CODE__TYPE, BkOsType, ModeType from backend.db_services.ipchooser.handlers.host_handler import HostHandler from backend.db_services.ipchooser.handlers.topo_handler import TopoHandler from backend.db_services.ipchooser.query.resource import ResourceQueryHelper @@ -187,34 +188,48 @@ def query_dba_hosts(self, request): @action(detail=False, methods=["POST"], url_path="import", serializer_class=ResourceImportSerializer) def resource_import(self, request): validated_data = self.params_validate(self.get_serializer_class()) - root_id = generate_root_id() - - # 补充必要的单据参数 - validated_data.update( - ticket_type=TicketType.RESOURCE_IMPORT, - created_by=request.user.username, - uid=None, - # 额外补充资源池导入的参数,用于记录操作日志 - bill_id=None, - bill_type=None, - task_id=root_id, - operator=request.user.username, - ) - - # 资源导入记录 - import_record = {"task_id": root_id, "operator": request.user.username, "hosts": validated_data["hosts"]} - DBResourceApi.import_operation_create(params=import_record) - - # 执行资源导入的后台flow - BaseController(root_id=root_id, ticket_data=validated_data).import_resource_init_step() + host_ids = [host["host_id"] for host in validated_data.pop("hosts")] + + # 查询主机信息,并按照集群类型聚合 + host_infos = ResourceQueryHelper.search_cc_hosts(role_host_ids=host_ids) + os_hosts = defaultdict(list) + for host in host_infos: + host.update(ip=host["bk_host_innerip"], host_id=host["bk_host_id"]) + os_hosts[host["bk_os_type"]].append(host) + + # 按照集群类型分别导入 + for os_type, hosts in os_hosts.items(): + root_id = generate_root_id() + + # 补充必要的单据参数 + validated_data.update( + ticket_type=TicketType.RESOURCE_IMPORT, + created_by=request.user.username, + uid=None, + hosts=hosts, + # 额外补充资源池导入的参数,用于记录操作日志 + bill_id=None, + bill_type=None, + task_id=root_id, + operator=request.user.username, + os_type=BK_OS_CODE__TYPE[os_type], + ) - # 缓存当前任务,并删除过期导入任务 - now = int(time.time()) - cache_key = RESOURCE_IMPORT_TASK_FIELD.format(user=request.user.username) - RedisConn.zadd(cache_key, {root_id: now}) - expired_tasks = RedisConn.zrangebyscore(cache_key, "-inf", now - RESOURCE_IMPORT_EXPIRE_TIME) - if expired_tasks: - RedisConn.zrem(cache_key, *expired_tasks) + # 资源导入记录 + import_record = {"task_id": root_id, "operator": request.user.username, "hosts": hosts} + DBResourceApi.import_operation_create(params=import_record) + + # 执行资源导入的后台flow + validated_data.update(hosts=list(hosts), os_type=BK_OS_CODE__TYPE[os_type]) + BaseController(root_id=root_id, ticket_data=validated_data).import_resource_init_step() + + # 缓存当前任务,并删除过期导入任务 + now = int(time.time()) + cache_key = RESOURCE_IMPORT_TASK_FIELD.format(user=request.user.username) + RedisConn.zadd(cache_key, {root_id: now}) + expired_tasks = RedisConn.zrangebyscore(cache_key, "-inf", now - RESOURCE_IMPORT_EXPIRE_TIME) + if expired_tasks: + RedisConn.zrem(cache_key, *expired_tasks) return Response() diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index b84acdbf83..52b24b3804 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -68,6 +68,9 @@ # window操作系统超级账号,标准运维调用 WINDOW_ADMIN_USER_FOR_CHECK = "Administrator" +# linux操作系统超级账号,标准运维调用 +LINUX_ADMIN_USER_FOR_CHECK = "root" + # tendisplus默认kvstorecount DEFAULT_TENDISPLUS_KVSTORECOUNT = 10 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/common/machine_os_init.py b/dbm-ui/backend/flow/engine/bamboo/scene/common/machine_os_init.py index 44dc1f1b7e..b43f35c00b 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/common/machine_os_init.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/common/machine_os_init.py @@ -18,6 +18,8 @@ from backend.components.dbresource.client import DBResourceApi from backend.configuration.constants import SystemSettingsEnum from backend.configuration.models import SystemSettings +from backend.db_services.ipchooser.constants import BkOsType +from backend.flow.consts import LINUX_ADMIN_USER_FOR_CHECK, WINDOW_ADMIN_USER_FOR_CHECK from backend.flow.engine.bamboo.scene.common.builder import Builder from backend.flow.plugins.components.collections.common.external_service import ExternalServiceComponent from backend.flow.plugins.components.collections.common.sa_idle_check import CheckMachineIdleComponent @@ -39,12 +41,23 @@ def machine_init_flow(self): p = Builder(root_id=self.root_id, data=self.data) ip_list = self.data["hosts"] bk_biz_id = self.data["bk_biz_id"] + + if self.data.get("os_type", BkOsType.LINUX.value) == BkOsType.WINDOWS.value: + # 如果是window类型机器,用administrator账号 + account_name = WINDOW_ADMIN_USER_FOR_CHECK + else: + account_name = LINUX_ADMIN_USER_FOR_CHECK + # 先执行空闲检查 if env.SA_CHECK_TEMPLATE_ID: p.add_act( act_name=_("执行sa空闲检查"), act_component_code=CheckMachineIdleComponent.code, - kwargs=asdict(InitCheckForResourceKwargs(ips=[host["ip"] for host in ip_list], bk_biz_id=bk_biz_id)), + kwargs=asdict( + InitCheckForResourceKwargs( + ips=[host["ip"] for host in ip_list], bk_biz_id=bk_biz_id, account_name=account_name + ) + ), ) # 在执行sa初始化 @@ -53,7 +66,7 @@ def machine_init_flow(self): p.add_act( act_name=_("执行sa初始化"), act_component_code=SaInitComponent.code, - kwargs={"ips": [host["ip"] for host in ip_list], "bk_biz_id": bk_biz_id}, + kwargs={"ips": [host["ip"] for host in ip_list], "bk_biz_id": bk_biz_id, "account_name": account_name}, ) # 调用资源导入接口 diff --git a/dbm-ui/backend/flow/plugins/components/collections/common/sa_init.py b/dbm-ui/backend/flow/plugins/components/collections/common/sa_init.py index fcc0b08e8f..efa12eb64b 100644 --- a/dbm-ui/backend/flow/plugins/components/collections/common/sa_init.py +++ b/dbm-ui/backend/flow/plugins/components/collections/common/sa_init.py @@ -31,6 +31,7 @@ def _execute(self, data, parent_data) -> bool: "${biz_cc_id}": bk_biz_id, "${job_ip_list}": "\n".join(iplist), "${bk_biz_id}": bk_biz_id, + "${job_account}": kwargs.get("account_name", "root"), }, } rpdata = BkSopsApi.create_task(param) diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py b/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py index ab15a3df10..5db9d1eeae 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_act_dataclass.py @@ -474,6 +474,7 @@ class InitCheckForResourceKwargs: ips: list bk_biz_id: int = env.DBA_APP_BK_BIZ_ID + account_name: str = "root" @dataclass() From 363301ff5e8eb3e63aada87443325a7c56076aa0 Mon Sep 17 00:00:00 2001 From: xfwduke Date: Tue, 8 Oct 2024 12:08:56 +0800 Subject: [PATCH 091/164] =?UTF-8?q?fix(mysql):=20=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=8D=95=E6=8D=AE=E7=BB=93=E6=9E=9C=E8=A1=A8=E5=90=8D=E5=B0=8F?= =?UTF-8?q?=E5=86=99=20#7206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbactuator/pkg/components/mysql/pt_table_checksum.go | 2 +- dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go index 6db7828036..e9293b7664 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/pt_table_checksum.go @@ -162,7 +162,7 @@ func (c *PtTableChecksumComp) GenerateConfigFile() (err error) { return err } - c.cfgFile = path.Join("/tmp", fmt.Sprintf("checksum_%s.yaml", c.uid)) + c.cfgFile = path.Join("/tmp", fmt.Sprintf("checksum_%d_%s.yaml", c.Params.MasterPort, c.uid)) err = os.WriteFile(c.cfgFile, yamlData, 0644) if err != nil { logger.Error("write config failed: %s", err.Error()) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py index ab4b5df116..f8fb7e6747 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_checksum.py @@ -106,7 +106,7 @@ def mysql_checksum_flow(self): if len(dup_masters) > 0: raise Exception("duplicate master found: {}".format(dup_masters)) - ran_str = get_random_string(length=8) + ran_str = get_random_string(length=8).lower() random_account = "{}{}".format(ACCOUNT_PREFIX, ran_str) ran_str_obj = {"ran_str": ran_str} From 3b1c69fdffb3422863372ec4cd6dade8cbb0a95d Mon Sep 17 00:00:00 2001 From: xiepaup Date: Thu, 19 Sep 2024 10:21:31 +0800 Subject: [PATCH 092/164] fix(redis): redis_instance_cmr flush dbmon #6985 --- .../bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py index 2592764a62..0927c7a2d1 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/redis_cluster_master_rep.py @@ -200,7 +200,7 @@ def TwemproxyClusterMasterReplaceJob( # 刷新bkdbmon if act_kwargs.cluster["cluster_type"] == ClusterType.TendisRedisInstance.value: - for replace_link in master_replace_detail: + for replace_info in master_replace_detail: new_host_master = replace_info["target"]["master"]["ip"] act_kwargs.exec_ip = new_host_master act_kwargs.cluster["ip"] = new_host_master From 4b2ca79c24b92b4f6524234a68c82bd2fcd9374d Mon Sep 17 00:00:00 2001 From: OMG-By <504094596@qq.com> Date: Sun, 29 Sep 2024 17:45:06 +0800 Subject: [PATCH 093/164] =?UTF-8?q?fix(redis):=20=E4=B8=8B=E6=9E=B6?= =?UTF-8?q?=E6=9C=AA=E6=B8=85=E7=90=86clb=20dns=E5=9F=9F=E5=90=8D=20#7187?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/flow/consts.py | 6 ------ .../bamboo/scene/redis/atom_jobs/access_manager.py | 10 +++++----- dbm-ui/backend/flow/utils/dns_manage.py | 4 +++- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index 52b24b3804..a3de9650d3 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -1093,12 +1093,6 @@ class TenDBBackUpLocation(str, StructuredEnum): SPIDER_MNT = EnumField("spider_mnt", _("spider_mnt")) -class AccessType(str, StructuredEnum): - CLB = EnumField("clb", _("clb")) - POLARIS = EnumField("polaris", _("北极星")) - DNS = EnumField("dns", _("域名")) - - class TBinlogDumperAddType(str, StructuredEnum): """ TBinlogDumper添加类型 diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py index 73102b387e..7e1e94c637 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/atom_jobs/access_manager.py @@ -15,9 +15,9 @@ from bamboo_engine.builder import SubProcess from django.utils.translation import ugettext as _ -from backend.db_meta.enums import ClusterEntryRole +from backend.db_meta.enums import ClusterEntryRole, ClusterEntryType from backend.db_meta.models import Cluster, ClusterEntry -from backend.flow.consts import DEFAULT_REDIS_START_PORT, AccessType, DnsOpType +from backend.flow.consts import DEFAULT_REDIS_START_PORT, DnsOpType from backend.flow.engine.bamboo.scene.common.builder import SubBuilder from backend.flow.plugins.components.collections.common.clb_manage import RedisClbManageComponent from backend.flow.plugins.components.collections.common.polaris_manage import RedisPolarisManageComponent @@ -219,11 +219,11 @@ def PolarisManagerAtomJob(root_id, ticket_data, act_kwargs: ActKwargs, param: Di def generic_manager( cluster_entry_type, root_id, ticket_data, act_kwargs: ActKwargs, param: Dict ) -> Optional[SubProcess]: - if cluster_entry_type == AccessType.DNS: + if cluster_entry_type == ClusterEntryType.DNS: return DNSManagerAtomJob(root_id, ticket_data, act_kwargs, param) - if cluster_entry_type == AccessType.CLB: + if cluster_entry_type == ClusterEntryType.CLB: return CLBManagerAtomJob(root_id, ticket_data, act_kwargs, param) - if cluster_entry_type == AccessType.POLARIS: + if cluster_entry_type == ClusterEntryType.POLARIS: return PolarisManagerAtomJob(root_id, ticket_data, act_kwargs, param) diff --git a/dbm-ui/backend/flow/utils/dns_manage.py b/dbm-ui/backend/flow/utils/dns_manage.py index 0266a59cc3..69bb2847c7 100644 --- a/dbm-ui/backend/flow/utils/dns_manage.py +++ b/dbm-ui/backend/flow/utils/dns_manage.py @@ -73,7 +73,9 @@ def delete_domain(self, cluster_id: int, is_only_delete_slave_domain=False) -> b cluster=cluster, cluster_entry_type=ClusterEntryType.DNS, role=ClusterEntryRole.SLAVE_ENTRY.value ).all() else: - dns_info = ClusterEntry.objects.filter(cluster=cluster, cluster_entry_type=ClusterEntryType.DNS).all() + dns_info = ClusterEntry.objects.filter( + cluster=cluster, cluster_entry_type__in=[ClusterEntryType.DNS, ClusterEntryType.CLBDNS] + ).all() for d in dns_info: delete_domain_payload = [{"domain_name": self.format_domain(d.entry)}] logger.info(d.entry) From 25a573b631835a92c91ca57d77e34639e1df8e0b Mon Sep 17 00:00:00 2001 From: xiepaup Date: Tue, 8 Oct 2024 14:52:17 +0800 Subject: [PATCH 094/164] =?UTF-8?q?=20fix(redis):=20=E4=B8=BB=E4=BB=8E?= =?UTF-8?q?=E9=87=8D=E5=BB=BASlave=20Entry=E5=88=B7=E6=96=B0=20=20#7054?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_meta/api/cluster/nosqlcomm/scale_tendis.py | 13 +++++++++++++ dbm-ui/backend/db_meta/api/dbha/apis.py | 2 +- .../scene/redis/redis_cluster_scene_auotfix.py | 1 + dbm-ui/backend/flow/utils/redis/redis_db_meta.py | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/scale_tendis.py b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/scale_tendis.py index 2ffcc19040..837628f2d3 100644 --- a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/scale_tendis.py +++ b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/scale_tendis.py @@ -27,6 +27,7 @@ ) from backend.db_meta.models import Cluster, StorageInstance, StorageInstanceTuple from backend.flow.utils.cc_manage import CcManage +from backend.flow.utils.dns_manage import DnsManage from backend.flow.utils.redis.redis_module_operate import RedisCCTopoOperator logger = logging.getLogger("flow") @@ -74,6 +75,7 @@ def redo_slaves(cluster: Cluster, tendisss: List[Dict], created_by: str = ""): ) ) + dns_manage = DnsManage(bk_biz_id=cluster.bk_biz_id, bk_cloud_id=cluster.bk_cloud_id) # 修改表 db_meta_storageinstancetuple ,## 这个时候会出现一主多从 ! for ms_pair in tendisss: ejector_obj = StorageInstance.objects.get( @@ -95,6 +97,17 @@ def redo_slaves(cluster: Cluster, tendisss: List[Dict], created_by: str = ""): if cluster.clusterentry_set.filter(role=ClusterEntryRole.SLAVE_ENTRY.value).exists(): slave_entry = cluster.clusterentry_set.filter(role=ClusterEntryRole.SLAVE_ENTRY.value).first() receiver_obj.bind_entry.add(slave_entry) + ejector_obj.bind_entry.remove(slave_entry) + + old_instance = "{}#{}".format(ejector_obj.machine.ip, ejector_obj.port) + new_instance = "{}#{}".format(receiver_obj.machine.ip, receiver_obj.port) + logger.info( + "try update dns pointer {} from {} to {}".format(slave_entry.entry, old_instance, new_instance) + ) + if not dns_manage.update_domain( + old_instance=old_instance, new_instance=new_instance, update_domain_name=slave_entry.entry + ): + raise Exception("update domain {} failed ".format(slave_entry.entry)) # 修改表 db_meta_storageinstance_cluster cluster.storageinstance_set.add(*receiver_objs) diff --git a/dbm-ui/backend/db_meta/api/dbha/apis.py b/dbm-ui/backend/db_meta/api/dbha/apis.py index c591f8e2ce..6a0cc45e40 100644 --- a/dbm-ui/backend/db_meta/api/dbha/apis.py +++ b/dbm-ui/backend/db_meta/api/dbha/apis.py @@ -361,7 +361,7 @@ def switch_instance_domain(ins1, ins2: StorageInstance, entry_obj: ClusterEntry) if not dns_manage.update_domain( old_instance=old_instance, new_instance=new_instance, update_domain_name=entry_obj.entry ): - raise Exception("update domain {} failed ".format(entry_obj.domain)) + raise Exception("update domain {} failed ".format(entry_obj.entry)) @transaction.atomic diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py index 54c1bcbf08..52bb35f59f 100644 --- a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_cluster_scene_auotfix.py @@ -516,6 +516,7 @@ def slave_fix(self, flow_data, sub_kwargs, slave_fix_info): act_component_code=ExecuteDBActuatorScriptComponent.code, kwargs=asdict(sub_kwargs), ) + # 刷新slave域名 在《新节点加入集群》节点修改 # # #### 下架旧实例 (生产Ticket单据) ################################################## 完毕 ### old_slaves = [fix_link["ip"] for fix_link in slave_fix_detail] diff --git a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py index 2941d7634d..60eb9febb0 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_db_meta.py +++ b/dbm-ui/backend/flow/utils/redis/redis_db_meta.py @@ -1199,6 +1199,7 @@ def cluster_add_slave_update_meta(self): for entry_obj in cluster.clusterentry_set.filter(role=ClusterEntryRole.SLAVE_ENTRY): slave_domain = entry_obj.entry entry_obj.storageinstance_set.add(new_slave_obj) + entry_obj.storageinstance_set.remove(master_obj) if old_slave_obj and old_slave_obj.ip_port != new_slave_obj.ip_port: entry_obj.storageinstance_set.remove(old_slave_obj) if slave_domain != "": From a84f9ea4f93d9810714a64e7abe686e647b2cf29 Mon Sep 17 00:00:00 2001 From: lukemakeit <2302063437@qq.com> Date: Fri, 27 Sep 2024 15:25:28 +0800 Subject: [PATCH 095/164] =?UTF-8?q?feat(redis):=20redis=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E9=87=8D=E5=BB=BAslave=E5=90=8C=E6=AD=A5=E5=85=B3=E7=B3=BB=20#?= =?UTF-8?q?7135?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/redis_replicas_force_resync.md | 17 + .../dbactuator/models/myredis/client.go | 30 ++ .../atomredis/redis_replicas_force_resync.go | 365 ++++++++++++++++++ .../dbactuator/pkg/jobmanager/jobmanager.go | 1 + .../pkg/redismaxmemory/redismaxmemory.go | 26 +- dbm-ui/backend/flow/consts.py | 1 + .../redis/redis_replicas_force_resync.py | 104 +++++ .../backend/flow/engine/controller/redis.py | 8 + .../flow/utils/redis/redis_act_playload.py | 14 + 9 files changed, 559 insertions(+), 7 deletions(-) create mode 100644 dbm-services/redis/db-tools/dbactuator/example/redis_replicas_force_resync.md create mode 100644 dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_replicas_force_resync.go create mode 100644 dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_replicas_force_resync.py diff --git a/dbm-services/redis/db-tools/dbactuator/example/redis_replicas_force_resync.md b/dbm-services/redis/db-tools/dbactuator/example/redis_replicas_force_resync.md new file mode 100644 index 0000000000..113c71c0d1 --- /dev/null +++ b/dbm-services/redis/db-tools/dbactuator/example/redis_replicas_force_resync.md @@ -0,0 +1,17 @@ +### redis_replicas_force_resync +redis slave 强制重同步. + + +``` +./dbactuator_redis --uid={{uid}} --root_id={{root_id}} --node_id={{node_id}} --version_id={{version_id}} --atom-job-list="redis_replicas_force_resync" --data_dir=/path/to/data --backup_dir=/path/to/backup --payload='{{payload_base64}}' +``` + +`--data_dir`、`--backup_dir` 可以留空. + +原始payload +```json +{ + "slave_ip":"xx.xx.xx.xx", + "slave_ports":[30000,30001] +} +``` \ No newline at end of file diff --git a/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go b/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go index b59654098e..d2c9b74dd6 100644 --- a/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go +++ b/dbm-services/redis/db-tools/dbactuator/models/myredis/client.go @@ -1215,6 +1215,36 @@ func (db *RedisClient) ClusterMeet(ip, port string) (ret string, err error) { return } +// ClusterMeetAndUtilFinish TODO +func (db *RedisClient) ClusterMeetAndUtilFinish(ip, port string) (err error) { + // 执行 cluster addslots 命令只能用 普通redis client + if db.InstanceClient == nil { + err = fmt.Errorf("ClusterMeetAndUtilFinish redis:%s must create a standalone client", db.Addr) + mylog.Logger.Error(err.Error()) + return + } + mylog.Logger.Info("redis(%s) 'cluster meet %s %s' start", db.Addr, ip, port) + _, err = db.ClusterMeet(ip, port) + if err != nil { + return + } + targetAddr := fmt.Sprintf("%s:%s", ip, port) + var addrMapToNodes map[string]*ClusterNodeData + for { + addrMapToNodes, err = db.GetAddrMapToNodes() + if err != nil { + return + } + if _, ok := addrMapToNodes[targetAddr]; ok { + mylog.Logger.Info("redis:%s cluster meet %s %s success", db.Addr, ip, port) + break + } + mylog.Logger.Info("redis:%s cluster meet %s %s done,but not in 'cluster nodes'", db.Addr, ip, port) + time.Sleep(3 * time.Second) + } + return nil +} + // ClusterAddSlots 添加slots, 'cluster addslots 'command func (db *RedisClient) ClusterAddSlots(slots []int) (ret string, err error) { // 执行 cluster addslots 命令只能用 普通redis client diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_replicas_force_resync.go b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_replicas_force_resync.go new file mode 100644 index 0000000000..7f3051eda2 --- /dev/null +++ b/dbm-services/redis/db-tools/dbactuator/pkg/atomjobs/atomredis/redis_replicas_force_resync.go @@ -0,0 +1,365 @@ +package atomredis + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strconv" + "time" + + "github.com/go-playground/validator/v10" + + "dbm-services/redis/db-tools/dbactuator/models/myredis" + "dbm-services/redis/db-tools/dbactuator/pkg/consts" + "dbm-services/redis/db-tools/dbactuator/pkg/jobruntime" + "dbm-services/redis/db-tools/dbactuator/pkg/util" +) + +// ReplicaResyncParams params +type ReplicaResyncParams struct { + SlaveIP string `json:"slave_ip" validate:"required"` + SlavePorts []int `json:"slave_ports" validate:"required"` +} + +// ReplicasForceResync TODO +type ReplicasForceResync struct { + runtime *jobruntime.JobGenericRuntime + params ReplicaResyncParams + slaveAddrMapCli map[string]*myredis.RedisClient + slavePairsMap map[string]ReplicaItem +} + +// 无实际作用,仅确保实现了 jobruntime.JobRunner 接口 +var _ jobruntime.JobRunner = (*ReplicasForceResync)(nil) + +// NewReplicasForceResync new +func NewReplicasForceResync() jobruntime.JobRunner { + return &ReplicasForceResync{} +} + +// Init prepare run env +func (job *ReplicasForceResync) Init(m *jobruntime.JobGenericRuntime) error { + job.runtime = m + err := json.Unmarshal([]byte(job.runtime.PayloadDecoded), &job.params) + if err != nil { + job.runtime.Logger.Error(fmt.Sprintf("json.Unmarshal failed,err:%+v", err)) + return err + } + // 参数有效性检查 + validate := validator.New() + err = validate.Struct(job.params) + if err != nil { + if _, ok := err.(*validator.InvalidValidationError); ok { + job.runtime.Logger.Error("ReplicasForceResync Init params validate failed,err:%v,params:%+v", + err, job.params) + return err + } + for _, err := range err.(validator.ValidationErrors) { + job.runtime.Logger.Error("ReplicasForceResync Init params validate failed,err:%v,params:%+v", + err, job.params) + return err + } + } + return nil +} + +// Name 原子任务名 +func (job *ReplicasForceResync) Name() string { + return "redis_replicas_force_resync" +} + +// getReplicaPairsFile 获取 master slave pairs 文件 +func (job *ReplicasForceResync) getReplicaPairsFile() string { + file := fmt.Sprintf("%s_%s_master_replica_pairs", job.runtime.UID, job.params.SlaveIP) + saveDir := filepath.Join(consts.GetRedisBackupDir(), "dbbak", "replicas_force_resync") + if !util.FileExists(saveDir) { + util.MkDirsIfNotExists([]string{saveDir}) + util.LocalDirChownMysql(saveDir) + } + fullPath := filepath.Join(saveDir, file) + return fullPath +} + +// checkReplicaParisFileExistsAndNotEmpty 检查文件是否存在且不为空 +// 如果文件不存在或为空,则返回 false +// 如果文件存在且不为空,则返回 true +func (job *ReplicasForceResync) checkReplicaParisFileExistsAndNotEmpty() (ok bool, err error) { + fullPath := job.getReplicaPairsFile() + if !util.FileExists(fullPath) { + return false, nil + } + statInfo, err := os.Stat(fullPath) + if err != nil { + err = fmt.Errorf("os.Stat failed,err:%v,fullPath:%s", err, fullPath) + job.runtime.Logger.Error(err.Error()) + return false, err + } + if statInfo.Size() == 0 { + return false, nil + } + return true, nil +} + +// writeSlavePairsToFile 将主从关系写入文件 +func (job *ReplicasForceResync) writeSlavePairsToFile() (err error) { + pairFile := job.getReplicaPairsFile() + pairData, err := json.Marshal(job.slavePairsMap) + if err != nil { + err = fmt.Errorf("json.Marshal failed,err:%v,pairData:%+v", err, job.slavePairsMap) + job.runtime.Logger.Error(err.Error()) + return err + } + err = os.WriteFile(pairFile, pairData, 0644) + if err != nil { + err = fmt.Errorf("os.WriteFile failed,err:%v,pairFile:%s,pairData:%s", err, pairFile, pairData) + job.runtime.Logger.Error(err.Error()) + return err + } + util.LocalDirChownMysql(pairFile) + job.runtime.Logger.Info(fmt.Sprintf("writeSlavePairsToFile to %s ok", pairFile)) + return nil +} + +// getSlavePairsFromFile 从slave pairs文件中读取数据,并填充到job.slavePairsMap中,得到主从关系 +func (job *ReplicasForceResync) getSlavePairsFromFile() (err error) { + pairFile := job.getReplicaPairsFile() + if !util.FileExists(pairFile) { + err = fmt.Errorf("file:%s not exists", pairFile) + job.runtime.Logger.Error(err.Error()) + return err + } + pairData, err := os.ReadFile(pairFile) + if err != nil { + err = fmt.Errorf("os.ReadFile failed,err:%v,pairFile:%s", err, pairFile) + job.runtime.Logger.Error(err.Error()) + return err + } + pairDecoded := make(map[string]ReplicaItem) + err = json.Unmarshal(pairData, &pairDecoded) + if err != nil { + err = fmt.Errorf("json.Unmarshal failed,err:%v,pairData:%s", err, pairData) + job.runtime.Logger.Error(err.Error()) + return err + } + for k, v := range pairDecoded { + if _, ok := job.slavePairsMap[k]; !ok { + job.slavePairsMap[k] = v + } + } + job.runtime.Logger.Info(fmt.Sprintf("completeSlavePairs from %s ok", pairFile)) + return nil +} + +// Run Command Run +func (job *ReplicasForceResync) Run() (err error) { + util.StopBkDbmon() + defer util.StartBkDbmon() + + job.slavePairsMap = make(map[string]ReplicaItem) + err = job.slaveInstsAbleToConnect() + if err != nil { + return err + } + defer job.allInstDisconnect() + + // slaveof no one + err = job.slaveofNoOneAndUtilToMaster() + if err != nil { + return err + } + // slave flushall + err = job.slaveFlushall() + if err != nil { + return err + } + err = job.clusterMeetAndUtilFinish() + if err != nil { + return err + } + // slaveof master_ip master_port + err = job.ReplicaResync() + if err != nil { + return err + } + return nil +} + +// slaveInstsAbleToConnect 检查所有slave可连接 +func (job *ReplicasForceResync) slaveInstsAbleToConnect() (err error) { + instsAddrs := make([]string, 0, len(job.params.SlavePorts)) + job.slaveAddrMapCli = make(map[string]*myredis.RedisClient, len(job.params.SlavePorts)) + var addr, password, role, masterHost, masterPortStr string + pairFileOK, err := job.checkReplicaParisFileExistsAndNotEmpty() + if err != nil { + return err + } + allInstancesSlave := true + for _, port := range job.params.SlavePorts { + addr = fmt.Sprintf("%s:%d", job.params.SlaveIP, port) + instsAddrs = append(instsAddrs, addr) + password, err = myredis.GetRedisPasswdFromConfFile(port) + if err != nil { + return err + } + cli, err := myredis.NewRedisClientWithTimeout(addr, password, 0, + consts.TendisTypeRedisInstance, 5*time.Second) + if err != nil { + return err + } + role, err = cli.GetRole() + if err != nil { + return err + } + if role != consts.RedisSlaveRole { + if !pairFileOK { + // 如果存在非slave角色,同时 不存在slave pairs 文件 + // 代表是第一次运行,这种情况报错 + // 第一次运行,slave关系必须是ok的 + err = fmt.Errorf("redis instance(%s) role:%s,not slave role", addr, role) + job.runtime.Logger.Error(err.Error()) + return err + } + allInstancesSlave = false + } else { + // 获取 master_host and master_port + masterHost, masterPortStr, _, _, err = cli.GetMasterData() + if err != nil { + return err + } + masterPort, _ := strconv.Atoi(masterPortStr) + job.slavePairsMap[addr] = ReplicaItem{ + MasterIP: masterHost, + MasterPort: masterPort, + MasterAuth: password, + SlaveIP: job.params.SlaveIP, + SlavePort: port, + SlavePassword: password, + } + } + job.slaveAddrMapCli[addr] = cli + } + if !allInstancesSlave { + if !pairFileOK { + err = fmt.Errorf("slave instances not all slave role,and %s not exist", job.getReplicaPairsFile()) + job.runtime.Logger.Error(err.Error()) + return err + } + err = job.getSlavePairsFromFile() + if err != nil { + return err + } + } + err = job.writeSlavePairsToFile() + if err != nil { + return err + } + job.runtime.Logger.Info("all slave instances able to connect,(%+v)", instsAddrs) + return nil +} + +// allInstDisconnect 所有实例断开连接 +func (job *ReplicasForceResync) allInstDisconnect() { + for _, cli := range job.slaveAddrMapCli { + cli.Close() + } +} + +// slaveofNoOneAndUtilToMaster slaveof on one and util to master +func (job *ReplicasForceResync) slaveofNoOneAndUtilToMaster() (err error) { + var role, msg string + var isClusterEnabled bool + for _, cli := range job.slaveAddrMapCli { + isClusterEnabled, err = cli.IsClusterEnabled() + if err != nil { + return err + } + if isClusterEnabled { + msg = "cluster reset" + job.runtime.Logger.Info(fmt.Sprintf("slave(%s) run cluster reset", cli.Addr)) + err = cli.ClusterReset() + } else { + msg = "slaveof no one" + job.runtime.Logger.Info(fmt.Sprintf("slave(%s) run 'slaveof no one'", cli.Addr)) + _, err = cli.SlaveOf("no", "one") + } + if err != nil { + return err + } + // wait util slave to master + for { + time.Sleep(3 * time.Second) + role, err = cli.GetRole() + if err != nil { + return err + } + if role == consts.RedisMasterRole { + job.runtime.Logger.Info("after %s, slave(%s) role:%s", msg, cli.Addr, role) + break + } + job.runtime.Logger.Info("slave(%s) role:%s,retry...", cli.Addr, role) + } + } + return nil +} + +// slaveFlushall slaveof flushall +func (job *ReplicasForceResync) slaveFlushall() (err error) { + cmd := []string{consts.CacheFlushAllRename} + for _, cli := range job.slaveAddrMapCli { + job.runtime.Logger.Info("slave(%s) flushall...", cli.Addr) + _, err = cli.DoCommand(cmd, 0) + if err != nil { + return err + } + } + return nil +} + +func (job *ReplicasForceResync) clusterMeetAndUtilFinish() (err error) { + var isClusterEnabled bool + for _, cli := range job.slaveAddrMapCli { + isClusterEnabled, err = cli.IsClusterEnabled() + if err != nil { + return err + } + if !isClusterEnabled { + job.runtime.Logger.Info("slave(%s) cluster disbaled,skip cluster meet...", cli.Addr) + continue + } + masterIP := job.slavePairsMap[cli.Addr].MasterIP + masterPort := job.slavePairsMap[cli.Addr].MasterPort + err = cli.ClusterMeetAndUtilFinish(masterIP, strconv.Itoa(masterPort)) + if err != nil { + return err + } + } + return nil +} + +// ReplicaResync slaveof $master_ip $master_port and wait util master_link_status ok +func (job *ReplicasForceResync) ReplicaResync() (err error) { + resyncTasks := make([]*ReplicaTask, 0, len(job.slavePairsMap)) + for _, item := range job.slavePairsMap { + resyncTasks = append(resyncTasks, &ReplicaTask{ + ReplicaItem: item, + runtime: job.runtime, + }) + } + job.runtime.Logger.Info("slave start resync...resyncTasks:%s", util.ToString(resyncTasks)) + err = GroupRunReplicaTasksAndWait(resyncTasks, job.runtime) + if err != nil { + return err + } + return nil +} + +// Retry times +func (job *ReplicasForceResync) Retry() uint { + return 2 +} + +// Rollback rollback +func (job *ReplicasForceResync) Rollback() error { + return nil +} diff --git a/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go b/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go index cb722be478..755fa6a47f 100644 --- a/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go +++ b/dbm-services/redis/db-tools/dbactuator/pkg/jobmanager/jobmanager.go @@ -205,6 +205,7 @@ func (m *JobGenericManager) atomjobsMapperLoading() { m.atomJobMapper[atomproxy.NewPredixyAddModulesCmds().Name()] = atomproxy.NewPredixyAddModulesCmds m.atomJobMapper[atomredis.NewRedisReshape().Name()] = atomredis.NewRedisReshape m.atomJobMapper[atomredis.NewClusterResetFlushMeet().Name()] = atomredis.NewClusterResetFlushMeet + m.atomJobMapper[atomredis.NewReplicasForceResync().Name()] = atomredis.NewReplicasForceResync // 老备份系统 // m.atomJobMapper[atomredis.NewRedisDataRecover().Name()] = atomredis.NewRedisDataRecover m.atomJobMapper[atomredis.NewRedisDataStructure().Name()] = atomredis.NewRedisDataStructure diff --git a/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go b/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go index 8168ea16e8..cb66c797df 100644 --- a/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go +++ b/dbm-services/redis/db-tools/dbmon/pkg/redismaxmemory/redismaxmemory.go @@ -130,7 +130,7 @@ func (job *Job) Run() { } // GetRedisUsedMemory 并发获得redis实例的used_memory -func (job *Job) GetRedisUsedMemory() (err error) { +func (job *Job) GetRedisUsedMemory() { job.SortUsedMemItems = []*RedisUsedMemItem{} for _, server := range job.Conf.Servers { if !consts.IsRedisMetaRole(server.MetaRole) { @@ -151,7 +151,8 @@ func (job *Job) GetRedisUsedMemory() (err error) { redisItem := item redisItem.GetPassword() if redisItem.Err != nil { - return redisItem.Err + job.Err = redisItem.Err + return } } // concurrently get multi redis used memory @@ -213,7 +214,8 @@ func (job *Job) GetRedisUsedMemory() (err error) { redisItem := item if redisItem.Err != nil { mylog.Logger.Error(redisItem.Err.Error()) - return redisItem.Err + job.Err = redisItem.Err + return } job.UsedMemSum += redisItem.UsedMemory job.addrToUsedMem[redisItem.Addr()] = redisItem.UsedMemory @@ -221,7 +223,7 @@ func (job *Job) GetRedisUsedMemory() (err error) { sort.Slice(job.SortUsedMemItems, func(i, j int) bool { return job.SortUsedMemItems[i].UsedMemory < job.SortUsedMemItems[j].UsedMemory }) - return nil + return } // DisConnectAllRedis disconnect all redis client connection in job.SortUsedMemItems @@ -463,15 +465,25 @@ func (job *Job) CalculateRedisMaxMemory() { // 获取最大的used_memory的redis节点 maxUsedMemItem := job.SortUsedMemItems[len(job.SortUsedMemItems)-1] + var sumMaxmemory int64 = 0 for _, item := range job.SortUsedMemItems { redisItem := item redisItem.MaxMemory = int64(float64(redisItem.UsedMemory)/float64(job.UsedMemSum)*float64(job.OsAvailMem- job.UsedMemSum) + float64(redisItem.UsedMemory)) + sumMaxmemory = sumMaxmemory + redisItem.MaxMemory if maxUsedMemItem.UsedMemory > 10*redisItem.UsedMemory { redisItem.MaxMemory = redisItem.MaxMemory + 500*consts.MiByte + // 超小的redis,则其maxmemory不添加到 sumMaxmemory } } + if sumMaxmemory > job.OsAvailMem { + // 如果sumMaxmemory大于OsAvailMem,则说明计算出来的maxmemory总和大于系统可用内存,则直接报错 + job.Err = fmt.Errorf("sumMaxmemory:%s > OsAvailMem:%s", + util.SizeToHumanStr(sumMaxmemory), util.SizeToHumanStr(job.OsAvailMem)) + mylog.Logger.Error(job.Err.Error()) + return + } return } @@ -548,16 +560,16 @@ var resourceSpecOsMem = map[string]int64{ "8g_avail": consts.GiByte * 8 * 75 / 100, // 6GB可用 "16g_min": consts.GiByte * 15, "16g_max": consts.GiByte * 16, - "16g_avail": consts.GiByte * 16 * 85 / 100, // 13.6GB可用 + "16g_avail": consts.GiByte * 16 * 81 / 100, // 13GB可用 "32g_min": consts.GiByte * 30, "32g_max": consts.GiByte * 32, "32g_avail": consts.GiByte * 32 * 85 / 100, // 27.2GB可用 "64g_min": consts.GiByte * 61, "64g_max": consts.GiByte * 64, - "64g_avail": consts.GiByte * 64 * 9 / 10, // 57.6GB可用 + "64g_avail": consts.GiByte * 64 * 87 / 100, // 55.68GB可用 "128g_min": consts.GiByte * 125, "128g_max": consts.GiByte * 128, - "128g_avail": consts.GiByte * 128 * 9 / 10, // 115.2GB可用 + "128g_avail": consts.GiByte * 128 * 90 / 100, // 115.2GB可用 } // GetLocalHostAvailMemory TODO diff --git a/dbm-ui/backend/flow/consts.py b/dbm-ui/backend/flow/consts.py index a3de9650d3..424d548506 100644 --- a/dbm-ui/backend/flow/consts.py +++ b/dbm-ui/backend/flow/consts.py @@ -486,6 +486,7 @@ class RedisActuatorActionEnum(str, StructuredEnum): PREDIXY_ADD_MODULES_CMDS = EnumField("predixy_add_modules_cmds", _("predixy_add_modules_cmds")) RESHAPE = EnumField("reshape", _("reshape")) CLUSTER_RESET_FLUSH_MEET = EnumField("cluster_reset_flush_meet", _("cluster_reset_flush_meet")) + REPLICAS_FORCE_RESYNC = EnumField("replicas_force_resync", _("replicas_force_resync")) class MongoDBActuatorActionEnum(str, StructuredEnum): diff --git a/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_replicas_force_resync.py b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_replicas_force_resync.py new file mode 100644 index 0000000000..308a33f64a --- /dev/null +++ b/dbm-ui/backend/flow/engine/bamboo/scene/redis/redis_replicas_force_resync.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +""" +TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. +Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. +Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at https://opensource.org/licenses/MIT +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +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 logging.config +from copy import deepcopy +from dataclasses import asdict +from typing import Dict, Optional + +from django.utils.translation import ugettext as _ + +from backend.configuration.constants import DBType +from backend.db_meta.models import Cluster +from backend.flow.engine.bamboo.scene.common.builder import Builder, SubBuilder +from backend.flow.engine.bamboo.scene.common.get_file_list import GetFileList +from backend.flow.plugins.components.collections.redis.exec_actuator_script import ExecuteDBActuatorScriptComponent +from backend.flow.plugins.components.collections.redis.get_redis_payload import GetRedisActPayloadComponent +from backend.flow.plugins.components.collections.redis.trans_flies import TransFileComponent +from backend.flow.utils.redis.redis_act_playload import RedisActPayload +from backend.flow.utils.redis.redis_context_dataclass import ActKwargs, CommonContext +from backend.flow.utils.redis.redis_proxy_util import async_multi_clusters_precheck, get_cluster_info_by_cluster_id + +logger = logging.getLogger("flow") + + +class RedisReplicasForceResyncSceneFlow(object): + def __init__(self, root_id: str, data: Optional[Dict]): + """ + @param root_id : 任务流程定义的root_id + @param data : 单据传递过来的参数列表,是dict格式 + """ + self.root_id = root_id + self.data = data + self.precheck(self.data["cluster_ids"]) + + @staticmethod + def precheck(cluster_ids: list): + async_multi_clusters_precheck(cluster_ids) + + def replicas_force_resync(self): + """ + slaves 强制重同步 + self.data (Dict): + { + "bk_biz_id": "", + "bk_cloud_id":0, + "cluster_ids":[1,2,3], + } + """ + redis_pipeline = Builder(root_id=self.root_id, data=self.data) + trans_files = GetFileList(db_type=DBType.Redis) + act_kwargs = ActKwargs() + act_kwargs.set_trans_data_dataclass = CommonContext.__name__ + act_kwargs.file_list = trans_files.redis_base() + act_kwargs.is_update_trans_data = True + act_kwargs.bk_cloud_id = self.data["bk_cloud_id"] + + redis_pipeline = Builder(root_id=self.root_id, data=self.data) + sub_pipelines = [] + for cluster_id in self.data["cluster_ids"]: + cluster = Cluster.objects.get(id=cluster_id) + cluster_info = get_cluster_info_by_cluster_id(cluster_id=cluster.id) + sub_pipeline = SubBuilder(root_id=self.root_id, data=self.data) + cluster_kwargs = deepcopy(act_kwargs) + + sub_pipeline.add_act( + act_name=_("初始化配置"), + act_component_code=GetRedisActPayloadComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + cluster_kwargs.exec_ip = cluster_info["slave_ips"] + sub_pipeline.add_act( + act_name=_("下发介质包"), + act_component_code=TransFileComponent.code, + kwargs=asdict(cluster_kwargs), + ) + + cluster_kwargs.cluster = {} + acts_list = [] + for slave_ip, slave_ports in cluster_info["slave_ports"].items(): + cluster_kwargs.exec_ip = slave_ip + cluster_kwargs.cluster = {"slave_ip": slave_ip, "slave_ports": slave_ports} + cluster_kwargs.get_redis_payload_func = RedisActPayload.redis_replicas_force_resync.__name__ + acts_list.append( + { + "act_name": _("slave:{} 强制重同步").format(slave_ip), + "act_component_code": ExecuteDBActuatorScriptComponent.code, + "kwargs": asdict(cluster_kwargs), + } + ) + sub_pipeline.add_parallel_acts(acts_list=acts_list) + sub_pipelines.append( + sub_pipeline.build_sub_process(sub_name=_("集群{} slave强制重同步".format(cluster_info["immute_domain"]))) + ) + + redis_pipeline.add_parallel_sub_pipeline(sub_flow_list=sub_pipelines) + redis_pipeline.run_pipeline() diff --git a/dbm-ui/backend/flow/engine/controller/redis.py b/dbm-ui/backend/flow/engine/controller/redis.py index d94be79cfa..05efbad31a 100644 --- a/dbm-ui/backend/flow/engine/controller/redis.py +++ b/dbm-ui/backend/flow/engine/controller/redis.py @@ -50,6 +50,7 @@ ) from backend.flow.engine.bamboo.scene.redis.redis_proxy_scale import RedisProxyScaleFlow from backend.flow.engine.bamboo.scene.redis.redis_remove_dts_server import RedisRemoveDtsServerFlow +from backend.flow.engine.bamboo.scene.redis.redis_replicas_force_resync import RedisReplicasForceResyncSceneFlow from backend.flow.engine.bamboo.scene.redis.redis_reupload_old_backup_records import RedisReuploadOldBackupRecordsFlow from backend.flow.engine.bamboo.scene.redis.redis_slots_migrate import RedisSlotsMigrateFlow from backend.flow.engine.bamboo.scene.redis.redis_storages_client_conns_kill import ( @@ -401,3 +402,10 @@ def tendisplus_lightning_data(self): """ flow = TendisPlusLightningData(root_id=self.root_id, data=self.ticket_data) flow.lightning_data_flow() + + def redis_replicas_force_resync_scene(self): + """ + tendis 强制slave重建同步关系 + """ + flow = RedisReplicasForceResyncSceneFlow(root_id=self.root_id, data=self.ticket_data) + flow.replicas_force_resync() diff --git a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py index c13fea6684..bbe2656320 100644 --- a/dbm-ui/backend/flow/utils/redis/redis_act_playload.py +++ b/dbm-ui/backend/flow/utils/redis/redis_act_playload.py @@ -2464,3 +2464,17 @@ def redis_clsuter_reset_flush_meet(self, **kwargs) -> dict: "reset_flush_meet_params": params["reset_flush_meet_params"], }, } + + def redis_replicas_force_resync(self, **kwargs) -> dict: + """ + redis replicas force resync + """ + params = kwargs["params"] + return { + "db_type": DBActuatorTypeEnum.Redis.value, + "action": DBActuatorTypeEnum.Redis.value + "_" + RedisActuatorActionEnum.REPLICAS_FORCE_RESYNC.value, + "payload": { + "slave_ip": params["slave_ip"], + "slave_ports": params["slave_ports"], + }, + } From ac0f1eba30b57484017c3182883811dec91a8880 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Wed, 25 Sep 2024 19:24:46 +0800 Subject: [PATCH 096/164] =?UTF-8?q?feat(backend):=20=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E6=89=98=E7=AE=A1=E4=B8=9A=E5=8A=A1=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9B=91=E6=8E=A7=E7=AD=96=E7=95=A5=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=20#7128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../json_files => db_monitor}/format.py | 0 dbm-ui/backend/db_monitor/models/alarm.py | 119 +++++++++++++++++- dbm-ui/backend/db_monitor/utils.py | 112 ++++++++++++++++- .../local_tasks/db_monitor.py | 105 +--------------- dbm-ui/backend/dbm_init/services.py | 114 ++--------------- dbm-ui/backend/flow/utils/cc_manage.py | 13 +- .../dbm_init/test_auto_create_services.py | 4 +- 7 files changed, 248 insertions(+), 219 deletions(-) rename dbm-ui/backend/{dbm_init/json_files => db_monitor}/format.py (100%) diff --git a/dbm-ui/backend/dbm_init/json_files/format.py b/dbm-ui/backend/db_monitor/format.py similarity index 100% rename from dbm-ui/backend/dbm_init/json_files/format.py rename to dbm-ui/backend/db_monitor/format.py diff --git a/dbm-ui/backend/db_monitor/models/alarm.py b/dbm-ui/backend/db_monitor/models/alarm.py index b1b34c1b56..abbe660f71 100644 --- a/dbm-ui/backend/db_monitor/models/alarm.py +++ b/dbm-ui/backend/db_monitor/models/alarm.py @@ -12,6 +12,7 @@ import datetime import json import logging +import os from collections import defaultdict from typing import Any, Dict, List @@ -35,14 +36,25 @@ DEFAULT_ALERT_NOTICE, PLAT_PRIORITY, TARGET_LEVEL_TO_PRIORITY, + TPLS_ALARM_DIR, AlertSourceEnum, DutyRuleCategory, PolicyStatus, TargetLevel, + TargetPriority, +) +from backend.db_monitor.exceptions import ( + BkMonitorDeleteAlarmException, + BkMonitorSaveAlarmException, + BuiltInNotAllowDeleteException, ) -from backend.db_monitor.exceptions import BkMonitorDeleteAlarmException, BuiltInNotAllowDeleteException from backend.db_monitor.tasks import update_app_policy -from backend.db_monitor.utils import bkm_delete_alarm_strategy, bkm_save_alarm_strategy, render_promql_sql +from backend.db_monitor.utils import ( + bkm_delete_alarm_strategy, + bkm_save_alarm_strategy, + get_dbm_autofix_action_id, + render_promql_sql, +) from backend.exceptions import ApiError __all__ = ["NoticeGroup", "AlertRule", "RuleTemplate", "DispatchGroup", "MonitorPolicy", "DutyRule"] @@ -996,6 +1008,109 @@ def get_dbha_policies(cls): cls.objects.filter(details__labels__contains=["/DBM_DBHA/"]).values_list("monitor_policy_id", flat=True) ) + @classmethod + def sync_plat_monitor_policy(cls, action_id=None, db_type=None, force=False): + if action_id is None: + action_id = get_dbm_autofix_action_id() + skip_dir = "v1" + now = datetime.datetime.now(timezone.utc) + logger.warning("[sync_plat_monitor_policy] sync bkm alarm policy start: %s", now) + + # 逐个json导入,本地+远程 + updated_policies = 0 + for root, dirs, files in os.walk(TPLS_ALARM_DIR): + if skip_dir in dirs: + dirs.remove(skip_dir) + + for alarm_tpl in files: + + with open(os.path.join(root, alarm_tpl), "r", encoding="utf-8") as f: + logger.info("[sync_plat_monitor_policy] start sync bkm alarm tpl: %s " % alarm_tpl) + try: + template_dict = json.loads(f.read()) + # 监控API不支持传入额外的字段 + template_dict.pop("export_at", "") + policy_name = template_dict["name"] + except json.decoder.JSONDecodeError: + logger.error("[sync_plat_monitor_policy] load template failed: %s", alarm_tpl) + continue + + # 如指定db_type,只同步指定db_type的策略(跳过非指定db_type的策略) + if db_type is not None and template_dict["db_type"] != db_type: + continue + + deleted = template_dict.pop("deleted", False) + + if not template_dict.get("details"): + logger.error(("[sync_plat_monitor_policy] template %s has no details" % alarm_tpl)) + continue + + # patch template + labels = list(set(template_dict["details"]["labels"])) + template_dict["details"]["labels"] = labels + template_dict["details"]["name"] = policy_name + template_dict["details"]["priority"] = TargetPriority.PLATFORM.value + # 平台策略仅开启基于分派通知 + template_dict["details"]["notice"]["options"]["assign_mode"] = ["by_rule"] + for label in labels: + if label.startswith("NEED_AUTOFIX") and action_id is not None: + template_dict["details"]["actions"] = [ + { + "config_id": action_id, + "signal": ["abnormal"], + "user_groups": [], + "options": { + "converge_config": { + "is_enabled": False, + "converge_func": "skip_when_success", + "timedelta": 60, + "count": 1, + } + }, + } + ] + + policy = MonitorPolicy(**template_dict) + + policy_name = policy.name + logger.info("[sync_plat_monitor_policy] start sync bkm alarm policy: %s " % policy_name) + try: + synced_policy = MonitorPolicy.objects.get(bk_biz_id=policy.bk_biz_id, name=policy_name) + + if deleted: + logger.info("[sync_plat_monitor_policy] delete old alarm: %s " % policy_name) + synced_policy.delete() + continue + + if synced_policy.version >= policy.version and not force: + logger.info("[sync_plat_monitor_policy] skip same version alarm: %s " % policy_name) + continue + + for keeped_field in MonitorPolicy.KEEPED_FIELDS: + setattr(policy, keeped_field, getattr(synced_policy, keeped_field)) + + policy.details["id"] = synced_policy.monitor_policy_id + logger.info("[sync_plat_monitor_policy] update bkm alarm policy: %s " % policy_name) + except MonitorPolicy.DoesNotExist: + logger.info("[sync_plat_monitor_policy] create bkm alarm policy: %s " % policy_name) + + try: + # fetch targets/test_rules/notify_rules/notify_groups from parent details + for attr, value in policy.parse_details().items(): + setattr(policy, attr, value) + + policy.save() + updated_policies += 1 + logger.error("[sync_plat_monitor_policy] save bkm alarm policy success: %s", policy_name) + except BkMonitorSaveAlarmException as e: + logger.error("[sync_plat_monitor_policy] save bkm alarm policy failed: %s, %s ", policy_name, e) + + logger.warning( + "[sync_plat_monitor_policy] finish sync bkm alarm policy end: %s, update_cnt: %s", + datetime.datetime.now(timezone.utc) - now, + updated_policies, + ) + @staticmethod def bkm_search_event( bk_biz_ids: list, diff --git a/dbm-ui/backend/db_monitor/utils.py b/dbm-ui/backend/db_monitor/utils.py index dc0efb9651..b243a03a0e 100644 --- a/dbm-ui/backend/db_monitor/utils.py +++ b/dbm-ui/backend/db_monitor/utils.py @@ -7,13 +7,20 @@ 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 copy +import json import logging +import os import re +from django.utils.translation import gettext as _ + from backend import env -from backend.components import BKMonitorV3Api -from backend.db_monitor.constants import AUTOFIX_ACTION_NAME +from backend.components import BKLogApi, BKMonitorV3Api +from backend.db_monitor.constants import AUTOFIX_ACTION_NAME, AUTOFIX_ACTION_TEMPLATE from backend.db_monitor.exceptions import BkMonitorDeleteAlarmException, BkMonitorSaveAlarmException +from backend.db_monitor.format import JsonConfigFormat +from backend.exceptions import ApiError logger = logging.getLogger("root") @@ -109,3 +116,104 @@ def get_dbm_autofix_action_id() -> int: if action["name"] == AUTOFIX_ACTION_NAME: action_id = action["id"] return action_id + + +def create_bkmonitor_action() -> int: + """ + 创建监控处理套餐 + """ + action_id = get_dbm_autofix_action_id() + action_config = copy.deepcopy(AUTOFIX_ACTION_TEMPLATE) + + if action_id is None: + BKMonitorV3Api.save_action_config(action_config) + else: + action_config["id"] = action_id + BKMonitorV3Api.edit_action_config(action_config) + return action_id + + +def create_bklog_collector(startswith: str = ""): + bklog_json_files_path = "backend/dbm_init/json_files/bklog" + for filename in os.listdir(bklog_json_files_path): + if not filename.endswith(".json"): + continue + if not filename.startswith(startswith): + continue + + # 读取日志采集项json文件,并渲染配置 + with open(os.path.join(bklog_json_files_path, filename), "r", encoding="utf-8") as file: + try: + bklog_params = json.load(file) + except json.decoder.JSONDecodeError as err: + logger.error(f"[create_bklog_collector] Failed to load json: {filename}, {err}") + raise err + log_name = filename.split(".")[0] + # 优先获取指定了 log_name 的 formatter + if hasattr(JsonConfigFormat, f"format_{log_name}"): + bklog_params = JsonConfigFormat.format(bklog_params, f"format_{log_name}") + # 根据不同 db 类型,指定对应的 formatter,主要是区分采集目标 + elif "mysql" in filename: + bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_mysql.__name__) + elif "redis" in filename: + bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_redis.__name__) + elif "mssql" in filename: + bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_mssql.__name__) + else: + logger.warning(_("格式化函数{log_name}不存在(如果无需格式化json可忽略)").format(log_name=log_name)) + + # 针对特殊需求修改请求参数 + if hasattr(JsonConfigFormat, f"custom_modify_{log_name}"): + bklog_params = JsonConfigFormat.custom_modify(bklog_params, f"custom_modify_{log_name}") + # 如果存在对应的环境变量设置了日志自定义的保留天数,则进行更新 + retention = getattr(env, f"BKLOG_{log_name.upper()}_RETENTION", "") or env.BKLOG_DEFAULT_RETENTION + bklog_params["retention"] = retention + # 自定义了 ES 存储集群,则指定 storage_cluster_id + if env.BKLOG_STORAGE_CLUSTER_ID: + bklog_params["storage_cluster_id"] = env.BKLOG_STORAGE_CLUSTER_ID + # 如果集群支持冷热数据,则补充 allocation_min_days,为 retention 的一半即可 + if env.BKLOG_CLUSTER_SUPPORT_HOT_COLD: + bklog_params["allocation_min_days"] = retention // 2 + + # 获取当前采集项的列表 + data = BKLogApi.list_collectors( + {"bk_biz_id": env.DBA_APP_BK_BIZ_ID, "pagesize": 500, "page": 1}, use_admin=True + ) + collectors_name__info_map = {collector["collector_config_name_en"]: collector for collector in data["list"]} + + # 判断采集项是否重复创建 + collector_name = bklog_params["collector_config_name_en"] + data = BKLogApi.pre_check( + { + "bk_biz_id": env.DBA_APP_BK_BIZ_ID, + "collector_config_name_en": collector_name, + }, + use_admin=True, + ) + if not data["allowed"]: + # 采集项已创建,对采集项进行更新 + try: + collector_config_id = collectors_name__info_map[collector_name]["collector_config_id"] + except KeyError: + logger.error(_("采集项{collector_name}被创建后删除,暂无法自动重建,请联系管理员处理。").format(collector_name=collector_name)) + continue + bklog_params.update({"collector_config_id": collector_config_id}) + logger.info(_("采集项{collector_name}已创建, 对采集项进行更新...").format(collector_name=collector_name)) + try: + BKLogApi.fast_update(params=bklog_params, use_admin=True) + except ApiError as err: + logger.error( + _("采集项{collector_name}更新失败,请联系管理员。错误信息:{err}").format(collector_name=collector_name, err=err) + ) + + continue + + # 创建采集项 + try: + data = BKLogApi.fast_create(params=bklog_params, use_admin=True) + logger.info(_("采集项创建成功,相关信息: {data}").format(data=data)) + except ApiError as err: + # 当前采集项创建失败默认不影响下一个采集项的创建 + logger.error(_("采集项创建失败,请联系管理员。错误信息:{err}").format(err=err)) + + return True diff --git a/dbm-ui/backend/db_periodic_task/local_tasks/db_monitor.py b/dbm-ui/backend/db_periodic_task/local_tasks/db_monitor.py index dd0d02f78b..e6ce6395ce 100644 --- a/dbm-ui/backend/db_periodic_task/local_tasks/db_monitor.py +++ b/dbm-ui/backend/db_periodic_task/local_tasks/db_monitor.py @@ -8,24 +8,19 @@ 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 datetime import json import logging -import os from blueapps.core.celery.celery import app from celery.schedules import crontab from django.core.cache import cache -from django.utils import timezone from backend import env from backend.configuration.constants import DEFAULT_DB_ADMINISTRATORS, PLAT_BIZ_ID, SystemSettingsEnum from backend.configuration.models import DBAdministrator, SystemSettings -from backend.db_monitor.constants import DEFAULT_ALERT_NOTICE, MONITOR_EVENTS, TPLS_ALARM_DIR, TargetPriority -from backend.db_monitor.exceptions import BkMonitorSaveAlarmException +from backend.db_monitor.constants import DEFAULT_ALERT_NOTICE, MONITOR_EVENTS from backend.db_monitor.models import CollectInstance, DispatchGroup, MonitorPolicy, NoticeGroup from backend.db_monitor.tasks import update_app_policy -from backend.db_monitor.utils import get_dbm_autofix_action_id from backend.db_periodic_task.local_tasks.register import register_periodic_task from backend.db_periodic_task.utils import TimeUnit, calculate_countdown @@ -73,103 +68,9 @@ def update_dba_notice_group(dba_id: int): @register_periodic_task(run_every=crontab(minute="*/5")) -def sync_plat_monitor_policy(action_id=None): +def sync_plat_monitor_policy(action_id=None, db_type=None, force=False): """同步平台告警策略""" - if action_id is None: - action_id = get_dbm_autofix_action_id() - skip_dir = "v1" - now = datetime.datetime.now(timezone.utc) - logger.warning("[sync_plat_monitor_policy] sync bkm alarm policy start: %s", now) - - # 逐个json导入,本地+远程 - updated_policies = 0 - for root, dirs, files in os.walk(TPLS_ALARM_DIR): - if skip_dir in dirs: - dirs.remove(skip_dir) - - for alarm_tpl in files: - with open(os.path.join(root, alarm_tpl), "r", encoding="utf-8") as f: - logger.info("[sync_plat_monitor_policy] start sync bkm alarm tpl: %s " % alarm_tpl) - try: - template_dict = json.loads(f.read()) - # 监控API不支持传入额外的字段 - template_dict.pop("export_at", "") - policy_name = template_dict["name"] - except json.decoder.JSONDecodeError: - logger.error("[sync_plat_monitor_policy] load template failed: %s", alarm_tpl) - continue - - deleted = template_dict.pop("deleted", False) - - if not template_dict.get("details"): - logger.error(("[sync_plat_monitor_policy] template %s has no details" % alarm_tpl)) - continue - - # patch template - labels = list(set(template_dict["details"]["labels"])) - template_dict["details"]["labels"] = labels - template_dict["details"]["name"] = policy_name - template_dict["details"]["priority"] = TargetPriority.PLATFORM.value - # 平台策略仅开启基于分派通知 - template_dict["details"]["notice"]["options"]["assign_mode"] = ["by_rule"] - for label in labels: - if label.startswith("NEED_AUTOFIX") and action_id is not None: - template_dict["details"]["actions"] = [ - { - "config_id": action_id, - "signal": ["abnormal"], - "user_groups": [], - "options": { - "converge_config": { - "is_enabled": False, - "converge_func": "skip_when_success", - "timedelta": 60, - "count": 1, - } - }, - } - ] - - policy = MonitorPolicy(**template_dict) - - policy_name = policy.name - logger.info("[sync_plat_monitor_policy] start sync bkm alarm policy: %s " % policy_name) - try: - synced_policy = MonitorPolicy.objects.get(bk_biz_id=policy.bk_biz_id, name=policy_name) - - if deleted: - logger.info("[sync_plat_monitor_policy] delete old alarm: %s " % policy_name) - synced_policy.delete() - continue - - if synced_policy.version >= policy.version: - logger.info("[sync_plat_monitor_policy] skip same version alarm: %s " % policy_name) - continue - - for keeped_field in MonitorPolicy.KEEPED_FIELDS: - setattr(policy, keeped_field, getattr(synced_policy, keeped_field)) - - policy.details["id"] = synced_policy.monitor_policy_id - logger.info("[sync_plat_monitor_policy] update bkm alarm policy: %s " % policy_name) - except MonitorPolicy.DoesNotExist: - logger.info("[sync_plat_monitor_policy] create bkm alarm policy: %s " % policy_name) - - try: - # fetch targets/test_rules/notify_rules/notify_groups from parent details - for attr, value in policy.parse_details().items(): - setattr(policy, attr, value) - - policy.save() - updated_policies += 1 - logger.error("[sync_plat_monitor_policy] save bkm alarm policy success: %s", policy_name) - except BkMonitorSaveAlarmException as e: - logger.error("[sync_plat_monitor_policy] save bkm alarm policy failed: %s, %s ", policy_name, e) - - logger.warning( - "[sync_plat_monitor_policy] finish sync bkm alarm policy end: %s, update_cnt: %s", - datetime.datetime.now(timezone.utc) - now, - updated_policies, - ) + MonitorPolicy.sync_plat_monitor_policy(action_id=action_id, db_type=db_type, force=force) @register_periodic_task(run_every=crontab(minute=0, hour="*/1")) diff --git a/dbm-ui/backend/dbm_init/services.py b/dbm-ui/backend/dbm_init/services.py index cdc5ba3c8f..e64a6804a4 100644 --- a/dbm-ui/backend/dbm_init/services.py +++ b/dbm-ui/backend/dbm_init/services.py @@ -8,7 +8,6 @@ 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 copy import datetime import json import logging @@ -24,7 +23,7 @@ from backend import env from backend.bk_dataview.grafana.views import SwitchOrgView -from backend.components import BKLogApi, BKMonitorV3Api, CCApi, ItsmApi +from backend.components import BKMonitorV3Api, CCApi, ItsmApi from backend.components.constants import SSL_KEY from backend.configuration.constants import DBM_REPORT_INITIAL_VALUE, SystemSettingsEnum from backend.configuration.models.system import SystemSettings @@ -32,13 +31,11 @@ from backend.core.storages.file_source import BkJobFileSourceManager from backend.core.storages.storage import get_storage from backend.db_meta.models import AppMonitorTopo -from backend.db_monitor.constants import AUTOFIX_ACTION_TEMPLATE -from backend.db_monitor.utils import get_dbm_autofix_action_id +from backend.db_monitor.utils import create_bklog_collector, create_bkmonitor_action from backend.db_services.cmdb.biz import get_or_create_cmdb_module_with_name, get_or_create_set_with_name from backend.db_services.ipchooser.constants import DB_MANAGE_SET, DEFAULT_CLOUD, DIRTY_MODULE, RESOURCE_MODULE from backend.dbm_init.constants import CC_APP_ABBR_ATTR, CC_HOST_DBM_ATTR -from backend.dbm_init.json_files.format import JsonConfigFormat -from backend.exceptions import ApiError, ApiRequestError, ApiResultError +from backend.exceptions import ApiError from backend.iam_app.dataclass import generate_iam_migration_json from backend.utils.time import datetime2str @@ -110,88 +107,7 @@ def auto_create_bklog_service(startswith: str = "") -> bool: """ 创建/更新 日志平台 采集项 """ - bklog_json_files_path = "backend/dbm_init/json_files/bklog" - for filename in os.listdir(bklog_json_files_path): - if not filename.endswith(".json"): - continue - if not filename.startswith(startswith): - continue - - # 读取日志采集项json文件,并渲染配置 - with open(os.path.join(bklog_json_files_path, filename), "r", encoding="utf-8") as file: - try: - bklog_params = json.load(file) - except json.decoder.JSONDecodeError as err: - logger.error(f"读取json文件失败: {filename}, {err}") - raise err - log_name = filename.split(".")[0] - # 优先获取指定了 log_name 的 formatter - if hasattr(JsonConfigFormat, f"format_{log_name}"): - bklog_params = JsonConfigFormat.format(bklog_params, f"format_{log_name}") - # 根据不同 db 类型,指定对应的 formatter,主要是区分采集目标 - elif "mysql" in filename: - bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_mysql.__name__) - elif "redis" in filename: - bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_redis.__name__) - elif "mssql" in filename: - bklog_params = JsonConfigFormat.format(bklog_params, JsonConfigFormat.format_mssql.__name__) - else: - logger.warning(f"格式化函数{log_name}不存在(如果无需格式化json可忽略)") - - # 针对特殊需求修改请求参数 - if hasattr(JsonConfigFormat, f"custom_modify_{log_name}"): - bklog_params = JsonConfigFormat.custom_modify(bklog_params, f"custom_modify_{log_name}") - # 如果存在对应的环境变量设置了日志自定义的保留天数,则进行更新 - retention = getattr(env, f"BKLOG_{log_name.upper()}_RETENTION", "") or env.BKLOG_DEFAULT_RETENTION - bklog_params["retention"] = retention - # 自定义了 ES 存储集群,则指定 storage_cluster_id - if env.BKLOG_STORAGE_CLUSTER_ID: - bklog_params["storage_cluster_id"] = env.BKLOG_STORAGE_CLUSTER_ID - # 如果集群支持冷热数据,则补充 allocation_min_days,为 retention 的一半即可 - if env.BKLOG_CLUSTER_SUPPORT_HOT_COLD: - bklog_params["allocation_min_days"] = retention // 2 - - # 获取当前采集项的列表 - data = BKLogApi.list_collectors( - {"bk_biz_id": env.DBA_APP_BK_BIZ_ID, "pagesize": 500, "page": 1}, use_admin=True - ) - collectors_name__info_map = { - collector["collector_config_name_en"]: collector for collector in data["list"] - } - - # 判断采集项是否重复创建 - collector_name = bklog_params["collector_config_name_en"] - data = BKLogApi.pre_check( - { - "bk_biz_id": env.DBA_APP_BK_BIZ_ID, - "collector_config_name_en": collector_name, - }, - use_admin=True, - ) - if not data["allowed"]: - # 采集项已创建,对采集项进行更新 - try: - collector_config_id = collectors_name__info_map[collector_name]["collector_config_id"] - except KeyError: - logger.error(f"采集项{collector_name}被创建后删除,暂无法自动重建,请联系管理员处理。") - continue - bklog_params.update({"collector_config_id": collector_config_id}) - logger.info(f"采集项{collector_name}已创建, 对采集项进行更新...") - try: - BKLogApi.fast_update(params=bklog_params, use_admin=True) - except (ApiRequestError, ApiResultError) as e: - logger.error(f"采集项{collector_name}更新失败,请联系管理员。错误信息:{e}") - - continue - - # 创建采集项 - try: - data = BKLogApi.fast_create(params=bklog_params, use_admin=True) - logger.info(f"采集项创建成功,相关信息: {data}") - except (ApiRequestError, ApiResultError) as e: - # 当前采集项创建失败默认不影响下一个采集项的创建 - logger.error(f"采集项创建失败,请联系管理员。错误信息:{e}") - + create_bklog_collector(startswith=startswith) return True @staticmethod @@ -422,36 +338,20 @@ def init_custom_metric_and_event(): key=SystemSettingsEnum.BKM_DBM_REPORT.value, ) - @staticmethod - def auto_create_bkmonitor_action() -> int: - """初始化监控处理套餐""" - action_id = get_dbm_autofix_action_id() - action_config = copy.deepcopy(AUTOFIX_ACTION_TEMPLATE) - - if action_id is None: - BKMonitorV3Api.save_action_config(action_config) - else: - action_config["id"] = action_id - BKMonitorV3Api.edit_action_config(action_config) - - return action_id - @staticmethod def auto_create_bkmonitor_alarm() -> bool: """初始化bkmonitor配置""" - - from backend.db_monitor.models import CollectInstance - from backend.db_periodic_task.local_tasks import sync_plat_monitor_policy + from backend.db_monitor.models import CollectInstance, MonitorPolicy logger.info("auto_create_bkmonitor_service") - action_id = Services.auto_create_bkmonitor_action() + action_id = create_bkmonitor_action() # 加载采集策略 CollectInstance.sync_collect_strategy() # 加载告警策略 - sync_plat_monitor_policy(action_id) + MonitorPolicy.sync_plat_monitor_policy(action_id=action_id) return True diff --git a/dbm-ui/backend/flow/utils/cc_manage.py b/dbm-ui/backend/flow/utils/cc_manage.py index ec080d29a1..9d4ebcf5ad 100644 --- a/dbm-ui/backend/flow/utils/cc_manage.py +++ b/dbm-ui/backend/flow/utils/cc_manage.py @@ -21,7 +21,8 @@ from backend.db_meta.enums import ClusterType, ClusterTypeMachineTypeDefine from backend.db_meta.models import AppMonitorTopo, Cluster, ClusterMonitorTopo, Machine, StorageInstance from backend.db_meta.models.cluster_monitor import INSTANCE_MONITOR_PLUGINS, SET_NAME_TEMPLATE -from backend.db_monitor.models import CollectInstance +from backend.db_monitor.models import CollectInstance, MonitorPolicy +from backend.db_monitor.utils import create_bklog_collector from backend.db_services.cmdb.biz import get_or_create_cmdb_module_with_name, get_or_create_set_with_name from backend.db_services.ipchooser.constants import IDLE_HOST_MODULE from backend.db_services.ipchooser.query.resource import ResourceQueryHelper @@ -107,10 +108,14 @@ def get_or_create_set_module( machine_topo[machine_type] = topo.bk_module_id - # 同步采集项 + # 同步采集项、监控策略 if sync_collector_flag: - CollectInstance.sync_collect_strategy(db_type=db_type, force=True) - Services.auto_create_bklog_service(startswith=db_type) + try: + create_bklog_collector(startswith=db_type) + CollectInstance.sync_collect_strategy(db_type=db_type, force=True) + MonitorPolicy.sync_plat_monitor_policy(db_type=db_type, force=True) + except ApiError as e: + logger.exception("{} sync_collector error: {}".format(db_type, e)) logger.info("get_or_create_set_module machine_topo: {}".format(machine_topo)) return machine_topo diff --git a/dbm-ui/backend/tests/dbm_init/test_auto_create_services.py b/dbm-ui/backend/tests/dbm_init/test_auto_create_services.py index 123ea0626b..1ee7ac2116 100644 --- a/dbm-ui/backend/tests/dbm_init/test_auto_create_services.py +++ b/dbm-ui/backend/tests/dbm_init/test_auto_create_services.py @@ -24,8 +24,8 @@ def test_auto_create_itsm_service(self): service_id = Services.auto_create_itsm_service() self.assertEqual(service_id, 94) - @patch("backend.dbm_init.services.BKLogApi", BKLogApiMock) - @patch("backend.dbm_init.json_files.format.CCApi", CCApiMock) + @patch("backend.db_monitor.utils.BKLogApi", BKLogApiMock) + @patch("backend.db_monitor.format.CCApi", CCApiMock) def test_auto_create_bklog_service(self): is_success = Services.auto_create_bklog_service() self.assertEqual(is_success, True) From e12a373ec43e6e9193dd064f3bb475943672ec5a Mon Sep 17 00:00:00 2001 From: xiaog Date: Fri, 27 Sep 2024 16:59:46 +0800 Subject: [PATCH 097/164] =?UTF-8?q?feat(mysql):=20=E4=BF=AE=E6=94=B9=20mys?= =?UTF-8?q?ql=20server-id=20#7175?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subcmd/mysqlcmd/change_server_id.go | 92 ++++++++++++++ .../internal/subcmd/mysqlcmd/mysqlcmd.go | 1 + .../pkg/components/db_base_account.go | 2 +- .../pkg/components/mysql/change_server_id.go | 119 ++++++++++++++++++ .../pkg/components/mysql/cutover/base.go | 2 +- .../pkg/components/mysql/mycnf_change.go | 103 ++++----------- .../pkg/components/mysql/restore/backup.go | 2 +- .../mysql/restore/dbloader/xtrabackup.go | 2 +- .../mysql/restore/dbloader_restore.go | 4 +- .../components/mysql/restore/gomysqlbinlog.go | 1 + .../dbactuator/pkg/util/mysqlutil/mysql_os.go | 23 ++++ .../db-tools/dbactuator/pkg/util/util.go | 2 +- .../pkg/src/dbareport/backup_report.go | 6 +- .../db-tools/mysql-dbbackup/pkg/util/misc.go | 3 + 14 files changed, 274 insertions(+), 88 deletions(-) create mode 100644 dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/change_server_id.go create mode 100644 dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/change_server_id.go create mode 100644 dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/gomysqlbinlog.go diff --git a/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/change_server_id.go b/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/change_server_id.go new file mode 100644 index 0000000000..7776a14b76 --- /dev/null +++ b/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/change_server_id.go @@ -0,0 +1,92 @@ +package mysqlcmd + +import ( + "fmt" + + "dbm-services/common/go-pubpkg/logger" + "dbm-services/mysql/db-tools/dbactuator/internal/subcmd" + "dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql" + "dbm-services/mysql/db-tools/dbactuator/pkg/util" + + "github.com/spf13/cobra" +) + +// ChangeServerIdAct TODO +type ChangeServerIdAct struct { + *subcmd.BaseOptions + Payload mysql.ChangeServerIdComp +} + +// ChangeServerIdCommand godoc +// +// @Summary 修改 server-id +// @Description 如果是 5.7,同时会修改 server_uuid +// @Tags mysql +// @Accept json +// @Produce json +// @Param body body mysql.ChangeServerIdComp true "description" +// @Router /mysql/change-server-id[post] +func ChangeServerIdCommand() *cobra.Command { + act := ChangeServerIdAct{ + BaseOptions: subcmd.GBaseOptions, + } + cmd := &cobra.Command{ + Use: "change-server-id", + Short: "修改mysql配置", + Example: fmt.Sprintf( + `dbactuator mysql change-server-id %s %s`, + subcmd.CmdBaseExampleStr, subcmd.ToPrettyJson(act.Payload.Example()), + ), + Run: func(cmd *cobra.Command, args []string) { + util.CheckErr(act.Validate()) + util.CheckErr(act.Init()) + util.CheckErr(act.Run()) + }, + } + return cmd +} + +// Init TODO +func (d *ChangeServerIdAct) Init() (err error) { + if err = d.BaseOptions.Validate(); err != nil { // @todo 应该在一开始就validate + return err + } + if err = d.Deserialize(&d.Payload.Params); err != nil { + logger.Error("DeserializeAndValidate err %s", err.Error()) + return err + } + logger.Warn("params %+v", d.Payload.Params) + d.Payload.GeneralParam = subcmd.GeneralRuntimeParam + return +} + +// Validate TODO +func (d *ChangeServerIdAct) Validate() error { + return nil +} + +// Run TODO +func (d *ChangeServerIdAct) Run() (err error) { + defer util.LoggerErrorStack(logger.Error, err) + steps := subcmd.Steps{ + { + FunName: "加载配置文件", + Func: d.Payload.Init, + }, + { + FunName: "预检查", + Func: d.Payload.PreCheck, + }, + { + FunName: "修改server-id", + Func: d.Payload.Start, + }, + } + + if err = steps.Run(); err != nil { + return err + } + + logger.Info("change server-id successfully") + return nil +} diff --git a/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/mysqlcmd.go b/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/mysqlcmd.go index 60da4c5283..00006f3b62 100644 --- a/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/mysqlcmd.go +++ b/dbm-services/mysql/db-tools/dbactuator/internal/subcmd/mysqlcmd/mysqlcmd.go @@ -82,6 +82,7 @@ func NewMysqlCommand() *cobra.Command { NewPushNewDbBackupConfigCommand(), NewPushMySQLRotateBinlogConfigCommand(), NewPushMySQLCrondConfigCommand(), + ChangeServerIdCommand(), }, }, { diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/db_base_account.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/db_base_account.go index e457b42dee..69f855cad5 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/db_base_account.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/db_base_account.go @@ -224,7 +224,7 @@ type MySQLDbBackupAccount struct { func (m MySQLDbBackupAccount) GetAccountPrivs(ver string, grantHosts ...string) MySQLAccountPrivs { var isMysql80 = cmutil.MySQLVersionParse(ver) >= cmutil.MySQLVersionParse("8.0") && !strings.Contains(ver, "tspider") - logger.Info("mysql version %s >=8.0: %v", ver, isMysql80) + logger.Info("mysql version %s >=8.0: %t", ver, isMysql80) privPairs := []PrivPari{ {Object: "*.*", Privs: backupUserPriv}, { diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/change_server_id.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/change_server_id.go new file mode 100644 index 0000000000..e5f003838d --- /dev/null +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/change_server_id.go @@ -0,0 +1,119 @@ +package mysql + +import ( + "os" + "path/filepath" + "strconv" + + "github.com/pkg/errors" + + "dbm-services/common/go-pubpkg/cmutil" + "dbm-services/common/go-pubpkg/logger" + "dbm-services/mysql/db-tools/dbactuator/pkg/components" + "dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/common" + "dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil" +) + +// ChangeServerIdComp 需要将 BaseInputParam 转换成 Comp 参数 +type ChangeServerIdComp struct { + GeneralParam *components.GeneralParam `json:"general"` + Params []ChangeServerId `json:"extend"` + + //mycnfChange MycnfChangeParam + mycnfChange map[int]*MycnfChangeComp + // autoCnfFilePath auto.cnf in datadir + autoCnfFilePath map[int]string +} + +// Example TODO +func (c *ChangeServerIdComp) Example() interface{} { + comp := ChangeServerIdComp{ + Params: []ChangeServerId{}, + GeneralParam: &components.GeneralParam{ + RuntimeAccountParam: components.RuntimeAccountParam{ + MySQLAccountParam: common.AccountAdminExample, + }, + }, + } + return comp +} + +// ChangeServerId 修改 server_id,会重启 +type ChangeServerId struct { + // NewServerId if new_server_id is 0, will auto-generate one + NewServerId map[int]uint32 `json:"new_server_id"` + // NewServerUUID if new_server_uuid is empty, will regenerate auto.cnf + NewServerUUID map[int]string `json:"new_server_uuid"` + Host string `json:"host"` + Port int `json:"port"` +} + +// Init init +func (c *ChangeServerIdComp) Init() (err error) { + c.mycnfChange = make(map[int]*MycnfChangeComp) + for _, change := range c.Params { + serverId := mysqlutil.GenMysqlServerIdByRandom() + mycnfChange := MycnfChangeComp{ + GeneralParam: c.GeneralParam, + Params: MycnfChangeParam{ + Items: map[string]*ConfItemOp{ + "mysqld.server_id": { + ConfValue: strconv.FormatUint(serverId, 10), + OPType: "upsert", + NeedRestart: true, + }, + }, + Persistent: 2, + Restart: 2, + Host: change.Host, + Ports: []int{change.Port}, + }, + } + if err = mycnfChange.Init(); err != nil { + return err + } else { + c.mycnfChange[change.Port] = &mycnfChange + } + } + return nil +} + +// PreCheck pre run pre check +func (c *ChangeServerIdComp) PreCheck() (err error) { + c.autoCnfFilePath = make(map[int]string) + + for port, mycnfChange := range c.mycnfChange { + if err = mycnfChange.PreCheck(); err != nil { + return err + } + + cnf := mycnfChange.CnfMap[port] + datadir, err := cnf.GetMySQLDataDir() + if datadir == "" { + return errors.Errorf("fail to get datadir for %d from %s", port, cnf.FileName) + } else if err != nil { + return err + } + c.autoCnfFilePath[port] = filepath.Join(datadir, "data/auto.cnf") // check if exists when actually doing + } + return nil +} + +// Start change my.cnf +func (c *ChangeServerIdComp) Start() error { + for port, change := range c.mycnfChange { + if cmutil.FileExists(c.autoCnfFilePath[port]) { + logger.Info("remove server_uuid %s ", c.autoCnfFilePath[port]) + if err := os.Remove(c.autoCnfFilePath[port]); err != nil { + return errors.WithMessage(err, "remove server_uuid") + } + } + + logger.Info("start change my.cnf for %d", port) + if err := change.DoInstance(port, change.CnfMap[port]); err != nil { + logger.Error("change %d my.cnf failed %v", port, err) + return err + } + } + return nil +} diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/cutover/base.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/cutover/base.go index 43ace7766a..eb71953ccc 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/cutover/base.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/cutover/base.go @@ -367,7 +367,7 @@ func realVal(v sql.NullString) string { // RecordBinPos 记录切换时候的bin postion func (s *AltSlaveInfo) RecordBinPos() (binPosJsonStr string, err error) { pos, _ := s.dbConn.ShowMasterStatus() - logger.Info("show master status on %s,detail: File:%s,Pos:%s", s.Addr(), pos.File, pos.Position) + logger.Info("show master status on %s,detail: File:%s,Pos:%d", s.Addr(), pos.File, pos.Position) b, err := json.Marshal(pos) if err != nil { return "", err diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/mycnf_change.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/mycnf_change.go index 62ab29a9d1..855fe97002 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/mycnf_change.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/mycnf_change.go @@ -29,9 +29,9 @@ type MycnfChangeComp struct { // 自动判断的是否 需要重启 needRestart bool - connMap map[Port]*native.DbWorker + ConnMap map[Port]*native.DbWorker `json:"-"` + CnfMap map[Port]*util.CnfFile `json:"-"` socketMap map[Port]string - cnfMap map[Port]*util.CnfFile adminUser string adminPwd string } @@ -75,13 +75,15 @@ func (c *MycnfChangeComp) Example() interface{} { // 移除一个配置项时,代表要回归系统的默认值(不是配置中心plat或者其它地方定义的默认值),因为我们不知道这个值所以不修改 runtime type MycnfChangeParam struct { Items map[string]*ConfItemOp `json:"items" validate:"required"` - // 是否持久化到 my.cnf 文件,-1: 不持久化,1: 持久化, 2: 仅持久化但不修改运行时 + // 是否持久化到 my.cnf 文件, + // -1: set global var,但不持久化到文件 + // 1: set global var,且持久化到文件 + // 2: 仅持久化,针对部分变量不支持 set global (read only) Persistent int `json:"persistent" validate:"required" enums:"-1,1,2"` // 指定是否 允许重启, -1:不重启, 1: 重启, 2:根据 items need_restart 自动判断是否重启 - Restart int `json:"restart" validate:"required" enums:"-1,1,2"` - // TgtInstance native.InsObject `json:"tgt_instance" validate:"required"` - Host string `json:"host"` - Ports []int `json:"ports"` + Restart int `json:"restart" validate:"required" enums:"-1,1,2"` + Host string `json:"host"` + Ports []int `json:"ports"` } func (m MycnfChangeParam) justModiftMyCnfCannotRestart() bool { @@ -105,9 +107,9 @@ type ConfItemOp struct { // Init init func (c *MycnfChangeComp) Init() (err error) { - c.connMap = make(map[Port]*native.DbWorker) + c.ConnMap = make(map[Port]*native.DbWorker) c.socketMap = make(map[Port]string) - c.cnfMap = make(map[int]*util.CnfFile) + c.CnfMap = make(map[int]*util.CnfFile) c.adminUser = c.GeneralParam.RuntimeAccountParam.AdminUser c.adminPwd = c.GeneralParam.RuntimeAccountParam.AdminPwd for _, port := range c.Params.Ports { @@ -127,7 +129,7 @@ func (c *MycnfChangeComp) Init() (err error) { if errx != nil { logger.Warn("backup origin my.cnf failed %s,stderr:%s", errx, stderr) } - c.connMap[port] = dbConn + c.ConnMap[port] = dbConn cnf := &util.CnfFile{FileName: util.GetMyCnfFileName(port)} if err := cnf.Load(); err != nil { return err @@ -137,7 +139,7 @@ func (c *MycnfChangeComp) Init() (err error) { return err } c.socketMap[port] = socket - c.cnfMap[port] = cnf + c.CnfMap[port] = cnf } return nil } @@ -146,14 +148,20 @@ func (c *MycnfChangeComp) Init() (err error) { func (c *MycnfChangeComp) PreCheck() (err error) { var errList []error for _, port := range c.Params.Ports { - myCnf := &util.CnfFile{FileName: util.GetMyCnfFileName(port)} for k, v := range c.Params.Items { sk := util.GetSectionFromKey(k, true) switch { case v.OPType == OPTypeUpsert: // 如果是持久化配置文件,就检查配置文件里面的变量 if c.Params.justModiftMyCnfCannotRestart() { - if v.confValueOld, err = myCnf.GetMySQLCnfByKey(sk.Section, sk.Key); err != nil { + /* + myCnf := &util.CnfFile{FileName: util.GetMyCnfFileName(port)} + if v.confValueOld, err = myCnf.GetMySQLCnfByKey(sk.Section, sk.Key); err != nil { + errList = append(errList, err) + continue + } + */ + if v.confValueOld, err = c.CnfMap[port].GetMySQLCnfByKey(sk.Section, sk.Key); err != nil { errList = append(errList, err) continue } @@ -164,7 +172,7 @@ func (c *MycnfChangeComp) PreCheck() (err error) { if sk.Section != util.MysqldSec { continue } - conn, ok := c.connMap[port] + conn, ok := c.ConnMap[port] if !ok { return fmt.Errorf("get %d conn failed", port) } @@ -194,69 +202,8 @@ func (c *MycnfChangeComp) PreCheck() (err error) { return nil } -// PreCheck 前置检查 -// 会初始化 needRestart -// func (c *MycnfChangeComp) PreCheck() error { -// var errList []error -// var err error -// // persistent == 2 时表示不修改运行时,所以不检查连接性。修改配置只能操作 my.cnf 已有项 -// // 即关机状态下不允许写入新的配置项,因为没法判断配置项是否合法。但可以 remove -// if c.Params.Persistent == 2 { -// for k, v := range c.Params.Items { -// sk := util.GetSectionFromKey(k, true) -// if v.OPType != OPTypeRemove { -// if v.confValueOld, err = c.myCnf.GetMySQLCnfByKey(sk.Section, sk.Key); err != nil { -// errList = append(errList, err) -// } else { -// logger.Warn("change [%s]%s new: %s. old: %s", sk.Section, sk.Key, v.ConfValue, v.confValueOld) -// } -// } -// // 仅写到文件,也判断是否需要重启。但如果进程没在运行,则不启动 -// if v.NeedRestart && computil.IsInstanceRunning(c.TgtInstance) { -// c.needRestart = true -// } -// } -// } else if c.Params.Persistent <= 1 { -// // 判断连接性 -// if dbw, err := c.TgtInstance.Conn(); err != nil { -// return err -// } else { -// c.dbworker = dbw -// } -// for k, v := range c.Params.Items { -// if v.OPType == OPTypeRemove { // 不校验 key 是否存在 -// if v.NeedRestart { -// c.needRestart = true -// } -// continue -// } -// sk := util.GetSectionFromKey(k, true) -// if sk.Section != util.MysqldSec { -// continue -// } -// v.confValueOld, err = c.dbworker.GetSingleGlobalVar(sk.Key) // valRuntime -// logger.Warn("change cnf: [%s]%s new: %s. old: %s", sk.Section, sk.Key, v.ConfValue, v.confValueOld) -// if err != nil { -// errList = append(errList, err) -// } else if v.ConfValue != v.confValueOld { -// if v.NeedRestart { -// c.needRestart = true -// } -// } else { -// // 运行值与修改值相同,不必重启. 但不妨碍多修改一次 -// } -// } -// } else { -// return fmt.Errorf("unknown persistent %d", c.Params.Persistent) -// } -// if len(errList) > 0 { -// return errors.Join(errList...) -// } -// return nil -// } - -func (c *MycnfChangeComp) doInstance(port int, myCnf *util.CnfFile) (err error) { - conn, ok := c.connMap[port] +func (c *MycnfChangeComp) DoInstance(port int, myCnf *util.CnfFile) (err error) { + conn, ok := c.ConnMap[port] if !ok { return fmt.Errorf("get %d conn failed", port) } @@ -312,7 +259,7 @@ func (c *MycnfChangeComp) doInstance(port int, myCnf *util.CnfFile) (err error) func (c *MycnfChangeComp) Start() error { for _, port := range c.Params.Ports { logger.Info("start change %d's my.cnf ", port) - if err := c.doInstance(port, c.cnfMap[port]); err != nil { + if err := c.DoInstance(port, c.CnfMap[port]); err != nil { logger.Error("change %d my.cnf failed %v", port, err) return err } diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/backup.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/backup.go index dd99353d26..e55848c780 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/backup.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/backup.go @@ -93,7 +93,7 @@ func (b *BackupInfo) GetBackupMetaFile(fileType string) error { metaFilename = indexInfoFile metaFilePath = filepath.Join(b.BackupDir, metaFilename) } - logger.Info("GetBackupMetaFile backupType:%+v metaFilename", b.backupType, metaFilename) + logger.Info("GetBackupMetaFile backupType:%s metaFilename %s", b.backupType, metaFilename) if strings.HasSuffix(metaFilename, ".info") { b.infoFilePath = metaFilePath //b.backupBaseName = strings.TrimSuffix(metaFilename, ".info") diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader/xtrabackup.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader/xtrabackup.go index bd0e79c57e..21b91cdaa2 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader/xtrabackup.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader/xtrabackup.go @@ -40,7 +40,7 @@ func (x *Xtrabackup) PreRun() error { // 关闭本地mysql inst := x.TgtInstance - logger.Info("stop local mysqld ", inst.Socket) + logger.Info("stop local mysqld %s", inst.Socket) param := &computil.ShutdownMySQLParam{MySQLUser: inst.User, MySQLPwd: inst.Pwd, Socket: inst.Socket} if err := param.ForceShutDownMySQL(); err != nil { logger.Error("shutdown mysqld failed %s", inst.Socket) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go index e426f97d1c..904024fd25 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/dbloader_restore.go @@ -209,8 +209,8 @@ func (m *DBLoader) initDirs(removeOld bool) error { return err } m.targetDir = m.BackupInfo.indexObj.GetTargetDir(m.taskDir) - logger.Info("current recover work directory: ", m.taskDir) - logger.Info("current recover work target directory: ", m.targetDir) + logger.Info("current recover work directory: %s", m.taskDir) + logger.Info("current recover work target directory: %s", m.targetDir) return nil } diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/gomysqlbinlog.go b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/gomysqlbinlog.go new file mode 100644 index 0000000000..9b70a15f00 --- /dev/null +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/components/mysql/restore/gomysqlbinlog.go @@ -0,0 +1 @@ +package restore diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_os.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_os.go index 00c9a1c1bc..7682258560 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_os.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysql_os.go @@ -2,8 +2,10 @@ package mysqlutil import ( "fmt" + "math/rand" "strconv" "strings" + "time" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/logger" @@ -149,3 +151,24 @@ func GenMysqlServerId(ip string, port int) (uint64, error) { logger.Info("serverID:%s\n", serverId) return strconv.ParseUint(serverId, 2, 64) } + +// GenMysqlServerIdByRandom 根据随机数+时间戳,生产 server_id +// 比如毫秒时间戳 1727423 789001 +// 生产3位数的随机数 + 时间戳后6位 +// mysql的server-id是4字节整数,范围从0-4294967295 +func GenMysqlServerIdByRandom() uint64 { + rand.Seed(time.Now().UnixNano()) + //partOne := rand.Intn(900) + 100 + partOne := rand.Intn(3000) + 1000 + + ts := time.Now().UnixMilli() + partTwo := ts % 1000000 + //s := strconv.FormatInt(ts, 10) + //partTwo := s[len(s)-6:] + + serverId := fmt.Sprintf("%d%d", partOne, partTwo) + logger.Info("serverID:%s", serverId) + + id, _ := strconv.ParseUint(serverId, 10, 64) + return id +} diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/util.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/util.go index 6bce4d7599..9fee8097ba 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/util.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/util.go @@ -46,7 +46,7 @@ func Retry(r RetryConfig, f func() error) (err error) { if err = f(); err == nil { return nil } - logger.Warn("第%d次重试,函数错误:%s", i, err.Error(), err.Error()) + logger.Warn("第 %d 次重试,函数错误: %s", i, err.Error()) } return } diff --git a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/dbareport/backup_report.go b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/dbareport/backup_report.go index 7fc051a859..8a258633ea 100644 --- a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/dbareport/backup_report.go +++ b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/src/dbareport/backup_report.go @@ -178,7 +178,7 @@ func (r *BackupLogReport) ReportBackupStatus(status string) error { if !cmutil.IsDirectory(r.cfg.Public.StatusReportPath) { if err := os.MkdirAll(r.cfg.Public.StatusReportPath, 0755); err != nil { - logger.Log.Errorf("fail to mkdir: %s", r.cfg.Public.StatusReportPath) + logger.Log.Warnf("fail to mkdir Report Dir: %s", r.cfg.Public.StatusReportPath) } } statusFileName = filepath.Join(r.cfg.Public.StatusReportPath, statusFileName) @@ -246,12 +246,12 @@ func (r *BackupLogReport) ReportToLocalBackup(indexFilePath string, metaInfo *In return err } // 因为可能会改变 session 变量,所以那单独的连接处理 - conn, err := db.Conn(context.Background()) + ctx := context.Background() + conn, err := db.Conn(ctx) if err != nil { return err } defer conn.Close() - ctx := context.Background() if isTspider { if _, err = conn.ExecContext(ctx, "set session ddl_execute_by_ctl=OFF;"); err != nil { return err diff --git a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go index c16c0decb8..14a04e2829 100644 --- a/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go +++ b/dbm-services/mysql/db-tools/mysql-dbbackup/pkg/util/misc.go @@ -134,6 +134,9 @@ func CalBackupDataSize() (uint64, error) { func DiskUsage(path string) (disk DiskStatus, err error) { switch runtime.GOOS { case "linux": + if realPath, _ := os.Readlink(path); realPath != "" { + path = realPath + } fs := syscall.Statfs_t{} err = syscall.Statfs(path, &fs) if err != nil { From 813f5641759e7c14d3d79227e2f8cc65e6e19bb4 Mon Sep 17 00:00:00 2001 From: yksitu <1297650644@qq.com> Date: Wed, 9 Oct 2024 11:23:32 +0800 Subject: [PATCH 098/164] =?UTF-8?q?fix:=20=E5=AF=BC=E5=85=A5=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=A2=9E=E5=8A=A0=E5=AF=B9=E4=B8=BB=E6=9C=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E8=BF=BD=E5=8A=A0=E9=80=BB=E8=BE=91=20#7213?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py | 5 ++++- .../backend/db_meta/api/cluster/sqlserversingle/handler.py | 5 ++++- dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py index 8179728fa9..dc37895211 100644 --- a/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/sqlserverha/handler.py @@ -49,6 +49,7 @@ def create( region: str, sync_type: str, disaster_tolerance_level: str, + is_increment: bool = False, ): """ 1: 录入机器信息 @@ -121,7 +122,9 @@ def create( ) # 主机转移模块、添加对应的服务实例 - SqlserverCCTopoOperator(new_clusters).transfer_instances_to_cluster_module(storage_objs) + SqlserverCCTopoOperator(new_clusters).transfer_instances_to_cluster_module( + instances=storage_objs, is_increment=is_increment + ) @transaction.atomic def decommission(self): diff --git a/dbm-ui/backend/db_meta/api/cluster/sqlserversingle/handler.py b/dbm-ui/backend/db_meta/api/cluster/sqlserversingle/handler.py index 5611aab2d1..83fac071a3 100644 --- a/dbm-ui/backend/db_meta/api/cluster/sqlserversingle/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/sqlserversingle/handler.py @@ -34,6 +34,7 @@ def create( bk_cloud_id: int, resource_spec: dict, region: str, + is_increment: bool = False, ): """ 1: 录入机器信息 @@ -90,7 +91,9 @@ def create( ) # 主机转移模块、添加对应的服务实例 - SqlserverCCTopoOperator(new_clusters).transfer_instances_to_cluster_module(new_storage_objs) + SqlserverCCTopoOperator(new_clusters).transfer_instances_to_cluster_module( + instances=new_storage_objs, is_increment=is_increment + ) @transaction.atomic def decommission(self): diff --git a/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py b/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py index 57dfe79a0a..e03bd4bb13 100644 --- a/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py +++ b/dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_meta.py @@ -50,6 +50,7 @@ def sqlserver_single_apply(self): bk_cloud_id=int(self.global_data["bk_cloud_id"]), resource_spec=self.global_data.get("resource_spec", def_resource_spec), region=self.global_data["region"], + is_increment=self.global_data.get("is_increment", False), ) return True @@ -72,6 +73,7 @@ def sqlserver_ha_apply(self): region=self.global_data["region"], sync_type=self.global_data["sync_type"], disaster_tolerance_level=self.global_data["disaster_tolerance_level"], + is_increment=self.global_data.get("is_increment", False), ) return True From b2584ba22b31f07f6412664f3303359eca2e5a83 Mon Sep 17 00:00:00 2001 From: xfan0805 Date: Wed, 9 Oct 2024 11:01:04 +0800 Subject: [PATCH 099/164] fix: sql_result_output_file #7212 --- .../dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go index cdd064e8b4..bfe89ef0b2 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go @@ -131,10 +131,11 @@ func (e ExecuteSqlAtLocal) ExcuteCommand(command string, report bool) (err error } defer ef.Close() defer ef.Sync() - stdout := io.MultiWriter(os.Stdout) - + // 标准输出复制一份到错误文件中 + // stdout := io.MultiWriter(os.Stdout) + stdout := io.MultiWriter(os.Stdout, ef) // 错误不输出控制台 去掉os.Stderr - //stderr := io.MultiWriter(os.Stderr, &stderrBuf, ef) + // stderr := io.MultiWriter(os.Stderr, &stderrBuf, ef) stderr := io.MultiWriter(&stderrBuf, ef) if !report { stderr = io.MultiWriter(&stderrBuf, ef) From 1344b46b3763f0179118f32c4691ec92327e1b88 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Wed, 9 Oct 2024 12:14:27 +0800 Subject: [PATCH 100/164] =?UTF-8?q?feat(backend):=20=E5=A4=A7=E9=9B=86?= =?UTF-8?q?=E7=BE=A4=E6=8B=93=E6=89=91=E4=BC=98=E5=8C=96=20#7210?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/db_meta/api/cluster/base/graph.py | 6 +- .../api/cluster/nosqlcomm/detail_cluster.py | 72 ++++----------- .../api/cluster/rediscluster/__init__.py | 1 - .../api/cluster/rediscluster/detail.py | 90 ------------------- .../api/cluster/rediscluster/handler.py | 2 +- .../api/cluster/tendispluscluster/__init__.py | 1 - .../api/cluster/tendispluscluster/detail.py | 90 ------------------- .../api/cluster/tendispluscluster/handler.py | 2 +- 8 files changed, 20 insertions(+), 244 deletions(-) delete mode 100644 dbm-ui/backend/db_meta/api/cluster/rediscluster/detail.py delete mode 100644 dbm-ui/backend/db_meta/api/cluster/tendispluscluster/detail.py diff --git a/dbm-ui/backend/db_meta/api/cluster/base/graph.py b/dbm-ui/backend/db_meta/api/cluster/base/graph.py index 5de4cf6dfd..aea63642c7 100644 --- a/dbm-ui/backend/db_meta/api/cluster/base/graph.py +++ b/dbm-ui/backend/db_meta/api/cluster/base/graph.py @@ -27,7 +27,7 @@ class Node: node_id: str node_type: str - url: str + # url: str status: str @staticmethod @@ -90,12 +90,12 @@ def __init__( ins: Union[StorageInstance, ProxyInstance, ClusterEntry], node_id: str = None, node_type: str = None, - url: str = None, + # url: str = None, status: str = None, ): self.node_id = node_id or Node.generate_node_id(ins) self.node_type = node_type or Node.generate_node_type(ins) - self.url = url or Node.generate_url(ins) + # self.url = url or Node.generate_url(ins) self.status = status or Node.generate_status(ins) super(Node, self).__init__() diff --git a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py index 3cbef5779f..ad0e521c28 100644 --- a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py +++ b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py @@ -12,8 +12,7 @@ from django.utils.translation import gettext as _ -from backend.db_meta.api.cluster.base.graph import ForeignRelationType, Graphic, Group, LineLabel -from backend.db_meta.enums import InstanceInnerRole +from backend.db_meta.api.cluster.base.graph import Graphic, Group, LineLabel from backend.db_meta.models import Cluster, StorageInstanceTuple logger = logging.getLogger("root") @@ -21,7 +20,6 @@ def scan_cluster(cluster: Cluster) -> Graphic: """ - TODO: 这里的代码拷贝自dbha,若所有架构均可复用,考虑合并 所有往 error report 中添加的信息都是集群的检查规则 这部分应该抽象出去独立生成 report """ @@ -29,66 +27,26 @@ def scan_cluster(cluster: Cluster) -> Graphic: for tr in StorageInstanceTuple.objects.prefetch_related( "ejector__cluster", - "ejector__proxyinstance_set", - "ejector__proxyinstance_set__cluster", "receiver__cluster", + "ejector__machine", + "receiver__machine", ).filter(receiver__cluster=cluster, ejector__cluster=cluster): ejector_instance = tr.ejector receiver_instance = tr.receiver - ejector_instance_node, ejector_instance_grp = graph.add_node(ejector_instance) - - if ejector_instance.instance_inner_role == InstanceInnerRole.REPEATER: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance, ejector_instance_grp) - else: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance) - + receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance) graph.add_line(source=ejector_instance_node, target=receiver_instance_node, label=LineLabel.Rep) - for foreign_proxy in ejector_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - for foreign_proxy in receiver_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - slave_be_group = Group(node_id="slave_bind_entry_group", group_name=_("访问入口(从)")) - for slave_be in receiver_instance.bind_entry.all(): - dummy_slave_be_node, slave_be_group = graph.add_node(slave_be, to_group=slave_be_group) - graph.add_line(source=slave_be_group, target=receiver_instance_group, label=LineLabel.Bind) - - for otr in ( - StorageInstanceTuple.objects.filter(ejector=ejector_instance) - .prefetch_related("cluster") - .exclude(receiver__cluster=cluster) - ): - foreign_receiver_cluster = otr.receiver.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepTo, foreign_receiver_cluster) - - for otr in ( - StorageInstanceTuple.objects.filter(receiver=ejector_instance) - .prefetch_related("cluster") - .exclude(ejector__cluster=cluster) - ): - foreign_ejector_cluster = otr.ejector.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepFrom, foreign_ejector_cluster) - - for proxy_instance in cluster.proxyinstance_set.prefetch_related( - "storageinstance", "storageinstance__cluster", "bind_entry", "cluster" - ).all(): - dummy_proxy_instance_node, proxy_instance_group = graph.add_node(proxy_instance) - - for backend_instance in proxy_instance.storageinstance.all(): - backend_instance_cluster = backend_instance.cluster.get() - if backend_instance_cluster == cluster: - backend_instance_grp = graph.get_or_create_group(*Group.generate_group_info(backend_instance)) - graph.add_line(source=proxy_instance_group, target=backend_instance_grp, label=LineLabel.Access) - - else: - graph.add_foreign_cluster(ForeignRelationType.AccessTo, backend_instance_cluster) - - master_be_group = Group(node_id="master_bind_entry_group", group_name=_("访问入口(主)")) - for be in proxy_instance.bind_entry.all(): - dummy_be_node, master_be_group = graph.add_node(be, to_group=master_be_group) - graph.add_line(source=master_be_group, target=proxy_instance_group, label=LineLabel.Bind) + # redis proxy 都直接指向所有后端,因此只需要连一条 group 的线即可 + proxy_instance = cluster.proxyinstance_set.first() + dummy_proxy_instance_node, proxy_instance_group = graph.add_node(proxy_instance) + backend_instance = cluster.storageinstance_set.first() + backend_instance_grp = graph.get_or_create_group(*Group.generate_group_info(backend_instance)) + graph.add_line(source=proxy_instance_group, target=backend_instance_grp, label=LineLabel.Access) + + master_bind_entry_group = Group(node_id="master_bind_entry_group", group_name=_("访问入口(主)")) + for be in proxy_instance.bind_entry.all(): + dummy_be_node, master_bind_entry_group = graph.add_node(be, to_group=master_bind_entry_group) + graph.add_line(source=master_bind_entry_group, target=proxy_instance_group, label=LineLabel.Bind) return graph diff --git a/dbm-ui/backend/db_meta/api/cluster/rediscluster/__init__.py b/dbm-ui/backend/db_meta/api/cluster/rediscluster/__init__.py index fb5d50eb46..38c6880908 100644 --- a/dbm-ui/backend/db_meta/api/cluster/rediscluster/__init__.py +++ b/dbm-ui/backend/db_meta/api/cluster/rediscluster/__init__.py @@ -10,4 +10,3 @@ """ from .create import create -from .detail import scan_cluster diff --git a/dbm-ui/backend/db_meta/api/cluster/rediscluster/detail.py b/dbm-ui/backend/db_meta/api/cluster/rediscluster/detail.py deleted file mode 100644 index 853ed4c793..0000000000 --- a/dbm-ui/backend/db_meta/api/cluster/rediscluster/detail.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -""" -TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. -Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at https://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -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. -""" -from django.utils.translation import gettext as _ - -from backend.db_meta.api.cluster.base.graph import ForeignRelationType, Graphic, Group, LineLabel -from backend.db_meta.enums import InstanceInnerRole -from backend.db_meta.models import Cluster, StorageInstanceTuple - - -def scan_cluster(cluster: Cluster) -> Graphic: - """ - TODO: 这里的代码拷贝自dbha,若所有架构均可复用,考虑合并 - 所有往 error report 中添加的信息都是集群的检查规则 - 这部分应该抽象出去独立生成 report - """ - graph = Graphic(node_id=Graphic.generate_graphic_id(cluster)) - - for tr in StorageInstanceTuple.objects.prefetch_related( - "ejector__cluster", - "ejector__proxyinstance_set", - "ejector__proxyinstance_set__cluster", - "receiver__cluster", - ).filter(receiver__cluster=cluster, ejector__cluster=cluster): - ejector_instance = tr.ejector - receiver_instance = tr.receiver - - ejector_instance_node, ejector_instance_grp = graph.add_node(ejector_instance) - - if ejector_instance.instance_inner_role == InstanceInnerRole.REPEATER: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance, ejector_instance_grp) - else: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance) - - graph.add_line(source=ejector_instance_node, target=receiver_instance_node, label=LineLabel.Rep) - - for foreign_proxy in ejector_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - for foreign_proxy in receiver_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - slave_be_group = Group(node_id="slave_bind_entry_group", group_name=_("访问入口(从)")) - for slave_be in receiver_instance.bind_entry.all(): - dummy_slave_be_node, slave_be_group = graph.add_node(slave_be, to_group=slave_be_group) - graph.add_line(source=slave_be_group, target=receiver_instance_group, label=LineLabel.Bind) - - for otr in ( - StorageInstanceTuple.objects.filter(ejector=ejector_instance) - .prefetch_related("cluster") - .exclude(receiver__cluster=cluster) - ): - foreign_receiver_cluster = otr.receiver.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepTo, foreign_receiver_cluster) - - for otr in ( - StorageInstanceTuple.objects.filter(receiver=ejector_instance) - .prefetch_related("cluster") - .exclude(ejector__cluster=cluster) - ): - foreign_ejector_cluster = otr.ejector.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepFrom, foreign_ejector_cluster) - - for proxy_instance in cluster.proxyinstance_set.prefetch_related( - "storageinstance", "storageinstance__cluster", "bind_entry", "cluster" - ).all(): - dummy_proxy_instance_node, proxy_instance_group = graph.add_node(proxy_instance) - - for backend_instance in proxy_instance.storageinstance.all(): - backend_instance_cluster = backend_instance.cluster.get() - if backend_instance_cluster == cluster: - backend_instance_grp = graph.get_or_create_group(*Group.generate_group_info(backend_instance)) - graph.add_line(source=proxy_instance_group, target=backend_instance_grp, label=LineLabel.Access) - - else: - graph.add_foreign_cluster(ForeignRelationType.AccessTo, backend_instance_cluster) - - master_be_group = Group(node_id="master_bind_entry_group", group_name=_("访问入口(主)")) - for be in proxy_instance.bind_entry.all(): - dummy_be_node, master_be_group = graph.add_node(be, to_group=master_be_group) - graph.add_line(source=master_be_group, target=proxy_instance_group, label=LineLabel.Bind) - - return graph diff --git a/dbm-ui/backend/db_meta/api/cluster/rediscluster/handler.py b/dbm-ui/backend/db_meta/api/cluster/rediscluster/handler.py index f6483ab073..6b9be9cfa1 100644 --- a/dbm-ui/backend/db_meta/api/cluster/rediscluster/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/rediscluster/handler.py @@ -14,6 +14,7 @@ from backend.constants import DEFAULT_BK_CLOUD_ID from backend.db_meta.api.cluster.base.handler import ClusterHandler +from backend.db_meta.api.cluster.nosqlcomm import scan_cluster from backend.db_meta.api.cluster.nosqlcomm.decommission import ( decommission_backends, decommission_cluster, @@ -24,7 +25,6 @@ from backend.db_meta.enums import ClusterType from .create import create -from .detail import scan_cluster class RedisClusterHandler(ClusterHandler): diff --git a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/__init__.py b/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/__init__.py index fb5d50eb46..38c6880908 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/__init__.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/__init__.py @@ -10,4 +10,3 @@ """ from .create import create -from .detail import scan_cluster diff --git a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/detail.py b/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/detail.py deleted file mode 100644 index 853ed4c793..0000000000 --- a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/detail.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -""" -TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. -Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. -Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. -You may obtain a copy of the License at https://opensource.org/licenses/MIT -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -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. -""" -from django.utils.translation import gettext as _ - -from backend.db_meta.api.cluster.base.graph import ForeignRelationType, Graphic, Group, LineLabel -from backend.db_meta.enums import InstanceInnerRole -from backend.db_meta.models import Cluster, StorageInstanceTuple - - -def scan_cluster(cluster: Cluster) -> Graphic: - """ - TODO: 这里的代码拷贝自dbha,若所有架构均可复用,考虑合并 - 所有往 error report 中添加的信息都是集群的检查规则 - 这部分应该抽象出去独立生成 report - """ - graph = Graphic(node_id=Graphic.generate_graphic_id(cluster)) - - for tr in StorageInstanceTuple.objects.prefetch_related( - "ejector__cluster", - "ejector__proxyinstance_set", - "ejector__proxyinstance_set__cluster", - "receiver__cluster", - ).filter(receiver__cluster=cluster, ejector__cluster=cluster): - ejector_instance = tr.ejector - receiver_instance = tr.receiver - - ejector_instance_node, ejector_instance_grp = graph.add_node(ejector_instance) - - if ejector_instance.instance_inner_role == InstanceInnerRole.REPEATER: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance, ejector_instance_grp) - else: - receiver_instance_node, receiver_instance_group = graph.add_node(receiver_instance) - - graph.add_line(source=ejector_instance_node, target=receiver_instance_node, label=LineLabel.Rep) - - for foreign_proxy in ejector_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - for foreign_proxy in receiver_instance.proxyinstance_set.prefetch_related("cluster").exclude(cluster=cluster): - graph.add_foreign_cluster(ForeignRelationType.AccessFrom, foreign_proxy.cluster.get()) - - slave_be_group = Group(node_id="slave_bind_entry_group", group_name=_("访问入口(从)")) - for slave_be in receiver_instance.bind_entry.all(): - dummy_slave_be_node, slave_be_group = graph.add_node(slave_be, to_group=slave_be_group) - graph.add_line(source=slave_be_group, target=receiver_instance_group, label=LineLabel.Bind) - - for otr in ( - StorageInstanceTuple.objects.filter(ejector=ejector_instance) - .prefetch_related("cluster") - .exclude(receiver__cluster=cluster) - ): - foreign_receiver_cluster = otr.receiver.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepTo, foreign_receiver_cluster) - - for otr in ( - StorageInstanceTuple.objects.filter(receiver=ejector_instance) - .prefetch_related("cluster") - .exclude(ejector__cluster=cluster) - ): - foreign_ejector_cluster = otr.ejector.cluster.get() - graph.add_foreign_cluster(ForeignRelationType.RepFrom, foreign_ejector_cluster) - - for proxy_instance in cluster.proxyinstance_set.prefetch_related( - "storageinstance", "storageinstance__cluster", "bind_entry", "cluster" - ).all(): - dummy_proxy_instance_node, proxy_instance_group = graph.add_node(proxy_instance) - - for backend_instance in proxy_instance.storageinstance.all(): - backend_instance_cluster = backend_instance.cluster.get() - if backend_instance_cluster == cluster: - backend_instance_grp = graph.get_or_create_group(*Group.generate_group_info(backend_instance)) - graph.add_line(source=proxy_instance_group, target=backend_instance_grp, label=LineLabel.Access) - - else: - graph.add_foreign_cluster(ForeignRelationType.AccessTo, backend_instance_cluster) - - master_be_group = Group(node_id="master_bind_entry_group", group_name=_("访问入口(主)")) - for be in proxy_instance.bind_entry.all(): - dummy_be_node, master_be_group = graph.add_node(be, to_group=master_be_group) - graph.add_line(source=master_be_group, target=proxy_instance_group, label=LineLabel.Bind) - - return graph diff --git a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/handler.py b/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/handler.py index b5a397f4c6..5d512614f8 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/handler.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendispluscluster/handler.py @@ -14,6 +14,7 @@ from backend.constants import DEFAULT_BK_CLOUD_ID from backend.db_meta.api.cluster.base.handler import ClusterHandler +from backend.db_meta.api.cluster.nosqlcomm import scan_cluster from backend.db_meta.api.cluster.nosqlcomm.decommission import ( decommission_backends, decommission_cluster, @@ -24,7 +25,6 @@ from backend.db_meta.enums import ClusterType from .create import create -from .detail import scan_cluster class TendisPlusClusterHandler(ClusterHandler): From 316fa0e3fa8c38f7c8d2091ceedb91d3e298c441 Mon Sep 17 00:00:00 2001 From: zfrendo <842557664@qq.com> Date: Sun, 29 Sep 2024 16:08:48 +0800 Subject: [PATCH 101/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=AA?= =?UTF-8?q?=E5=86=99=E5=85=A5db=5Fmodule=5Fid=20#7186?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cluster/tendbcluster/remotedb_node_migrate.py | 7 ++++++- dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py b/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py index 54d76dc451..a7d1c524f2 100644 --- a/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py +++ b/dbm-ui/backend/db_meta/api/cluster/tendbcluster/remotedb_node_migrate.py @@ -14,7 +14,7 @@ from backend.db_meta import api, request_validator from backend.db_meta.api import common from backend.db_meta.enums import ClusterType, InstanceRole, InstanceStatus, MachineType -from backend.db_meta.models import Cluster, StorageInstance, StorageInstanceTuple, TenDBClusterStorageSet +from backend.db_meta.models import Cluster, Machine, StorageInstance, StorageInstanceTuple, TenDBClusterStorageSet from backend.db_package.models import Package from backend.flow.consts import MediumEnum from backend.flow.engine.bamboo.scene.common.get_real_version import get_mysql_real_version @@ -44,7 +44,9 @@ def storage_create( mysql_pkg = Package.get_latest_package(version=mysql_version, pkg_type=MediumEnum.MySQL, db_type=DBType.MySQL) machines = [] storages = [] + machine_ips = [] if master_ip is not None: + machine_ips.append(master_ip) machines.append( { "ip": master_ip, @@ -65,6 +67,7 @@ def storage_create( }, ) if slave_ip is not None: + machine_ips.append(slave_ip) machines.append( { "ip": slave_ip, @@ -86,6 +89,8 @@ def storage_create( ) api.machine.create(machines=machines, creator=creator, bk_cloud_id=bk_cloud_id) + machine_objs = Machine.objects.filter(bk_cloud_id=bk_cloud_id, ip__in=machine_ips) + machine_objs.update(db_module_id=cluster.db_module_id) api.storage_instance.create( instances=storages, creator=creator, time_zone=time_zone, status=InstanceStatus.RESTORING ) diff --git a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py index 27fe96ad1d..e8ae300f37 100644 --- a/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py +++ b/dbm-ui/backend/flow/utils/mysql/mysql_db_meta.py @@ -728,6 +728,10 @@ def slave_recover_add_instance(self): bk_cloud_id=int(self.ticket_data["bk_cloud_id"]), creator=self.ticket_data["created_by"], ) + machine_objs = Machine.objects.filter( + bk_cloud_id=self.ticket_data["bk_cloud_id"], ip=self.cluster["install_ip"] + ) + machine_objs.update(db_module_id=self.ticket_data["db_module_id"]) storage_objs = api.storage_instance.create( instances=storage_instances, creator=self.ticket_data["created_by"], @@ -939,6 +943,11 @@ def migrate_cluster_add_instance(self): api.machine.create( bk_cloud_id=self.ticket_data["bk_cloud_id"], machines=machines, creator=self.ticket_data["created_by"] ) + machines_objs = Machine.objects.filter( + bk_cloud_id=self.ticket_data["bk_cloud_id"], + ip__in=[self.cluster["new_slave_ip"], self.cluster["new_master_ip"]], + ) + machines_objs.update(db_module_id=self.ticket_data["db_module_id"]) storage_objs = api.storage_instance.create( instances=storage_instances, creator=self.ticket_data["created_by"], From 75044de50324afc011206c9e03d2000cc95fcb6b Mon Sep 17 00:00:00 2001 From: hLinx <327159425@qq.com> Date: Wed, 9 Oct 2024 12:01:14 +0800 Subject: [PATCH 102/164] =?UTF-8?q?fix(frontend):=20sqlserver=20=E5=8D=95?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E9=83=A8=E7=BD=B2=E6=94=AF=E6=8C=81=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E5=8F=B7=20#7218?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/db-manage/sqlserver/apply/SqlServer.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/apply/SqlServer.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/apply/SqlServer.vue index 761910aca8..fb1fea7a12 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/apply/SqlServer.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/apply/SqlServer.vue @@ -99,10 +99,9 @@ - + Date: Wed, 9 Oct 2024 15:51:09 +0800 Subject: [PATCH 103/164] =?UTF-8?q?refactor(backend):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?helm=E6=95=B4=E5=8C=85=20#7224?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helm-charts/bk-dbm/Chart.yaml | 4 ++-- helm-charts/bk-dbm/charts/db-simulation/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/dbconfig/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/dbm/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/dbpriv/Chart.yaml | 2 +- helm-charts/bk-dbm/charts/hadb-api/Chart.yaml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/helm-charts/bk-dbm/Chart.yaml b/helm-charts/bk-dbm/Chart.yaml index 6131c0dc51..20ced84a1b 100644 --- a/helm-charts/bk-dbm/Chart.yaml +++ b/helm-charts/bk-dbm/Chart.yaml @@ -91,5 +91,5 @@ dependencies: description: A Helm chart for bk-dbm name: bk-dbm type: application -version: 1.5.0-alpha.17 -appVersion: 1.5.0-alpha.17 +version: 1.5.0-alpha.18 +appVersion: 1.5.0-alpha.18 diff --git a/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml b/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml index 5bc645ac89..c44e273253 100644 --- a/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml +++ b/helm-charts/bk-dbm/charts/db-simulation/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.0.1-alpha.72 +appVersion: 0.0.1-alpha.74 description: A Helm chart for Kubernetes name: db-simulation type: application diff --git a/helm-charts/bk-dbm/charts/dbconfig/Chart.yaml b/helm-charts/bk-dbm/charts/dbconfig/Chart.yaml index ac2c0b2a81..0a7d1313c5 100644 --- a/helm-charts/bk-dbm/charts/dbconfig/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbconfig/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.0.1-alpha.123 +appVersion: 0.0.1-alpha.124 description: A Helm chart for dbconfig name: dbconfig type: application diff --git a/helm-charts/bk-dbm/charts/dbm/Chart.yaml b/helm-charts/bk-dbm/charts/dbm/Chart.yaml index 231c785632..a19d97b7ff 100644 --- a/helm-charts/bk-dbm/charts/dbm/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbm/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.5.0-alpha.623 +appVersion: 1.5.0-alpha.700 description: A Helm chart for dbm name: dbm type: application diff --git a/helm-charts/bk-dbm/charts/dbpriv/Chart.yaml b/helm-charts/bk-dbm/charts/dbpriv/Chart.yaml index ed1dc4180a..92a3ba1e22 100644 --- a/helm-charts/bk-dbm/charts/dbpriv/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbpriv/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.0.1-alpha.464 +appVersion: 0.0.1-alpha.490 name: dbpriv description: A Helm chart for dbpriv type: application diff --git a/helm-charts/bk-dbm/charts/hadb-api/Chart.yaml b/helm-charts/bk-dbm/charts/hadb-api/Chart.yaml index b33d76f81e..fd53918cfc 100644 --- a/helm-charts/bk-dbm/charts/hadb-api/Chart.yaml +++ b/helm-charts/bk-dbm/charts/hadb-api/Chart.yaml @@ -3,4 +3,4 @@ name: hadb-api description: A Helm chart for Kubernetes type: application version: 0.0.11 -appVersion: 0.0.1-alpha.27 +appVersion: 0.0.1-alpha.31 From e67ba3d6f98be18d584a3544173778426f48c9ae Mon Sep 17 00:00:00 2001 From: Jackvideo <1290448509@qq.com> Date: Wed, 9 Oct 2024 16:33:22 +0800 Subject: [PATCH 104/164] =?UTF-8?q?fix(backend):=20=E5=A4=A7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E7=BE=A4=E6=9F=A5=E7=9C=8B=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=20#7228?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_services/bigdata/resources/query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_services/bigdata/resources/query.py b/dbm-ui/backend/db_services/bigdata/resources/query.py index b278776c3b..552eb9a5d5 100644 --- a/dbm-ui/backend/db_services/bigdata/resources/query.py +++ b/dbm-ui/backend/db_services/bigdata/resources/query.py @@ -87,7 +87,7 @@ def _filter_instance_qs_hook(cls, storage_queryset, proxy_queryset, inst_fields, instance_queryset = ( StorageInstance.objects.select_related("machine") .prefetch_related("cluster") - .annotate(role=F("instance_inner_role"), instance_name=F("name")) + .annotate(role=F("instance_role"), instance_name=F("name")) .filter(query_filters) .values(*inst_fields) .order_by("create_at") From 0c239b8e428c5f93518d3bf120bd7ecf6fa4b1a9 Mon Sep 17 00:00:00 2001 From: xfan0805 Date: Wed, 9 Oct 2024 18:16:02 +0800 Subject: [PATCH 105/164] fix: sql_result_do_not_output_file #7235 --- .../dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go index bfe89ef0b2..bc0997d0a8 100644 --- a/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go +++ b/dbm-services/mysql/db-tools/dbactuator/pkg/util/mysqlutil/mysqlclient_exec.go @@ -132,8 +132,8 @@ func (e ExecuteSqlAtLocal) ExcuteCommand(command string, report bool) (err error defer ef.Close() defer ef.Sync() // 标准输出复制一份到错误文件中 - // stdout := io.MultiWriter(os.Stdout) - stdout := io.MultiWriter(os.Stdout, ef) + stdout := io.MultiWriter(os.Stdout) + //stdout := io.MultiWriter(os.Stdout, ef) // 错误不输出控制台 去掉os.Stderr // stderr := io.MultiWriter(os.Stderr, &stderrBuf, ef) stderr := io.MultiWriter(&stderrBuf, ef) From ea70ab11e5fcaf5bd998cf84e6f79858ab09c456 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Wed, 9 Oct 2024 19:30:15 +0800 Subject: [PATCH 106/164] =?UTF-8?q?refactor(backend):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?helm=E6=95=B4=E5=8C=85=20#7238?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helm-charts/bk-dbm/Chart.yaml | 4 ++-- helm-charts/bk-dbm/charts/dbm/Chart.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/helm-charts/bk-dbm/Chart.yaml b/helm-charts/bk-dbm/Chart.yaml index 20ced84a1b..71ccb52762 100644 --- a/helm-charts/bk-dbm/Chart.yaml +++ b/helm-charts/bk-dbm/Chart.yaml @@ -91,5 +91,5 @@ dependencies: description: A Helm chart for bk-dbm name: bk-dbm type: application -version: 1.5.0-alpha.18 -appVersion: 1.5.0-alpha.18 +version: 1.5.0-alpha.19 +appVersion: 1.5.0-alpha.19 diff --git a/helm-charts/bk-dbm/charts/dbm/Chart.yaml b/helm-charts/bk-dbm/charts/dbm/Chart.yaml index a19d97b7ff..bca75c2a52 100644 --- a/helm-charts/bk-dbm/charts/dbm/Chart.yaml +++ b/helm-charts/bk-dbm/charts/dbm/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 1.5.0-alpha.700 +appVersion: 1.5.0-alpha.705 description: A Helm chart for dbm name: dbm type: application From 20a8fd6d493f9c298952368af024613e1920d923 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Wed, 9 Oct 2024 19:45:23 +0800 Subject: [PATCH 107/164] =?UTF-8?q?fix(backend):=20redis=20=E9=9B=86?= =?UTF-8?q?=E7=BE=A4=E6=8B=93=E6=89=91=E8=BF=9E=E7=BA=BF=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20#7240?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py index ad0e521c28..fe3e0a7981 100644 --- a/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py +++ b/dbm-ui/backend/db_meta/api/cluster/nosqlcomm/detail_cluster.py @@ -40,7 +40,7 @@ def scan_cluster(cluster: Cluster) -> Graphic: # redis proxy 都直接指向所有后端,因此只需要连一条 group 的线即可 proxy_instance = cluster.proxyinstance_set.first() dummy_proxy_instance_node, proxy_instance_group = graph.add_node(proxy_instance) - backend_instance = cluster.storageinstance_set.first() + backend_instance = proxy_instance.storageinstance.first() backend_instance_grp = graph.get_or_create_group(*Group.generate_group_info(backend_instance)) graph.add_line(source=proxy_instance_group, target=backend_instance_grp, label=LineLabel.Access) From 64811b60582d89757ac61b400fb6402fad598464 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Wed, 9 Oct 2024 20:59:03 +0800 Subject: [PATCH 108/164] =?UTF-8?q?fix(backend):=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90iam=E7=BB=84=E5=90=8D=20#7242?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/configuration/views/profile.py | 1 + dbm-ui/backend/iam_app/dataclass/__init__.py | 1 + dbm-ui/backend/iam_app/serializers.py | 2 +- .../ticket/builders/redis/redis_toolbox_proxy_scale_down.py | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dbm-ui/backend/configuration/views/profile.py b/dbm-ui/backend/configuration/views/profile.py index c1ab732a50..7cf048bfb4 100644 --- a/dbm-ui/backend/configuration/views/profile.py +++ b/dbm-ui/backend/configuration/views/profile.py @@ -40,6 +40,7 @@ def get_profile(self, request, *args, **kwargs): "global_manage": global_manage, "username": username, "profile": list(Profile.objects.filter(username=username).values("label", "values")), + "is_superuser": request.user.is_superuser, } ) diff --git a/dbm-ui/backend/iam_app/dataclass/__init__.py b/dbm-ui/backend/iam_app/dataclass/__init__.py index 396aef1a98..92eb2c06db 100644 --- a/dbm-ui/backend/iam_app/dataclass/__init__.py +++ b/dbm-ui/backend/iam_app/dataclass/__init__.py @@ -239,6 +239,7 @@ def assign_auth_to_dba(bk_biz_id: int, group_name: str, members: list): iam = Permission.get_iam_client() # 创建用户组 + group_name = group_name or f"{biz.bk_biz_name}_DBA(#{biz.bk_biz_id})" group_data = {"groups": [{"name": group_name, "description": group_name}]} ok, message, data = iam._client.create_user_groups(env.BK_IAM_SYSTEM_ID, manager_id, data=group_data) if not ok: diff --git a/dbm-ui/backend/iam_app/serializers.py b/dbm-ui/backend/iam_app/serializers.py index 2a9a7ee7fd..798abb157f 100644 --- a/dbm-ui/backend/iam_app/serializers.py +++ b/dbm-ui/backend/iam_app/serializers.py @@ -65,5 +65,5 @@ class Meta: class AssignAuthToDBASerializer(serializers.Serializer): bk_biz_id = serializers.IntegerField(help_text=_("业务ID")) - group_name = serializers.CharField(help_text=_("组名")) + group_name = serializers.CharField(help_text=_("组名"), required=False, default="") members = serializers.ListField(help_text=_("成员列表"), child=serializers.CharField()) diff --git a/dbm-ui/backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py b/dbm-ui/backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py index 04bcc82e4d..d5181c954c 100644 --- a/dbm-ui/backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py +++ b/dbm-ui/backend/ticket/builders/redis/redis_toolbox_proxy_scale_down.py @@ -26,6 +26,7 @@ class ProxyScaleDownDetailSerializer(SkipToRepresentationMixin, ClusterValidateM class InfoSerializer(serializers.Serializer): cluster_id = serializers.IntegerField(help_text=_("集群ID")) target_proxy_count = serializers.IntegerField(help_text=_("目标proxy数量"), min_value=2, required=False) + proxy_reduce_count = serializers.IntegerField(help_text=_("缩容proxy数量"), required=False) proxy_reduced_hosts = serializers.ListSerializer( help_text=_("缩容指定主机"), child=HostInfoSerializer(), required=False ) From 44667c2c1b24bb0a6c49eae75bd5837d4c5a22aa Mon Sep 17 00:00:00 2001 From: peterxucai Date: Thu, 10 Oct 2024 10:11:24 +0800 Subject: [PATCH 109/164] =?UTF-8?q?fix(frontend):=20sqlserver=20=E5=8D=95?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E9=83=A8=E7=BD=B2=E6=94=AF=E6=8C=81=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E5=8F=B7=20#7218=20,=20#=20Reviewed,=20transaction=20?= =?UTF-8?q?id:=2020091?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/db_services/dbbase/serializers.py | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dbm-ui/backend/db_services/dbbase/serializers.py b/dbm-ui/backend/db_services/dbbase/serializers.py index 0a37665a19..4723bcfbfc 100644 --- a/dbm-ui/backend/db_services/dbbase/serializers.py +++ b/dbm-ui/backend/db_services/dbbase/serializers.py @@ -8,12 +8,14 @@ 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 re from django.db.models import Q from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from backend.components import CCApi +from backend.constants import IP_PORT_DIVIDER, IP_PORT_RE_PATTERN from backend.db_dirty.models import DirtyMachine from backend.db_meta.enums import ClusterPhase, ClusterType from backend.db_services.dbbase.constants import ResourceType @@ -76,16 +78,30 @@ class Meta: class ClusterFilterSerializer(serializers.Serializer): bk_biz_id = serializers.IntegerField(help_text=_("业务ID")) - exact_domain = serializers.CharField(help_text=_("域名精确查询"), required=False) + exact_domain = serializers.CharField(help_text=_("域名精确查询(逗号分割)"), required=False, default="") cluster_ids = serializers.CharField(help_text=_("集群ID(逗号分割)"), required=False, default="") # 后续有其他过滤条件可以再加 + cluster_type = serializers.CharField(help_text=_("集群类型"), required=False) + instance = serializers.CharField(help_text=_("实例查询(逗号分割)"), required=False, default="") def validate(self, attrs): cluster_ids = attrs["cluster_ids"].split(",") if attrs["cluster_ids"] else [] + exact_domains = attrs["exact_domain"].split(",") if attrs["exact_domain"] else [] + instances = attrs["instance"].split(",") if attrs["instance"] else [] filters = Q(bk_biz_id=attrs["bk_biz_id"]) - filters &= Q(immute_domain=attrs["exact_domain"]) if attrs.get("exact_domain") else Q() filters &= Q(id__in=cluster_ids) if cluster_ids else Q() + filters &= Q(immute_domain__in=exact_domains) if exact_domains else Q() + filters &= Q(cluster_type=attrs["cluster_type"]) if attrs.get("cluster_type") else Q() + instance_filters = Q() + for instance in instances: + if re.compile(IP_PORT_RE_PATTERN).match(instance): + ip, port = instance.split(IP_PORT_DIVIDER) + instance_filter = Q(storageinstance__machine__ip=ip, storageinstance__port=port) | Q( + proxyinstance__machine__ip=ip, proxyinstance__port=port + ) + instance_filters |= instance_filter + filters &= instance_filters attrs["filters"] = filters return attrs From 5e4231f8645fd24aef3ad4f34f3bbbd44306f0c4 Mon Sep 17 00:00:00 2001 From: zfrendo <842557664@qq.com> Date: Thu, 10 Oct 2024 11:32:11 +0800 Subject: [PATCH 110/164] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=97=AA?= =?UTF-8?q?=E5=9B=9E=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=BA=93=E7=9A=84=E9=94=99=E8=AF=AF=20#7249?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/filter_database_table_by_flashback_input.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dbm-ui/backend/flow/plugins/components/collections/mysql/filter_database_table_by_flashback_input.py b/dbm-ui/backend/flow/plugins/components/collections/mysql/filter_database_table_by_flashback_input.py index 01250b6146..413fac4359 100644 --- a/dbm-ui/backend/flow/plugins/components/collections/mysql/filter_database_table_by_flashback_input.py +++ b/dbm-ui/backend/flow/plugins/components/collections/mysql/filter_database_table_by_flashback_input.py @@ -64,6 +64,8 @@ def _execute(self, data, parent_data) -> bool: return False databases_filtered = [ele["SCHEMA_NAME"] for ele in db_filter_res[0]["cmd_results"][0]["table_data"]] + if len(databases_filtered) == 0: + databases_filtered.append("") # tables 和 tables_ignore 使用三元操作符返回一个恒真表达式, 简化代码 table_filter_sql = ( From 5def79cdc4f8b56ff051f5bf67cf3d5ea80dae89 Mon Sep 17 00:00:00 2001 From: ycggyao Date: Thu, 10 Oct 2024 10:35:42 +0800 Subject: [PATCH 111/164] =?UTF-8?q?fix(sqlserver):=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=8D=95=E6=8D=AE=E5=BE=85=E5=8A=9E=E4=BA=8B?= =?UTF-8?q?=E9=A1=B9=E6=9B=B4=E6=96=B0=E8=BF=81=E7=A7=BB=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=BF=A1=E6=81=AF=20#7244=20#=20Reviewed,=20?= =?UTF-8?q?transaction=20id:=2020099?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/ticket/todos/pause_todo.py | 9 ++++++++- dbm-ui/backend/ticket/views.py | 6 ------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/dbm-ui/backend/ticket/todos/pause_todo.py b/dbm-ui/backend/ticket/todos/pause_todo.py index 6067b1f245..10e8c412a8 100644 --- a/dbm-ui/backend/ticket/todos/pause_todo.py +++ b/dbm-ui/backend/ticket/todos/pause_todo.py @@ -13,8 +13,9 @@ from django.utils.translation import gettext as _ from backend.constants import DEFAULT_SYSTEM_USER +from backend.db_meta.models.sqlserver_dts import DtsStatus, SqlserverDtsInfo from backend.ticket import todos -from backend.ticket.constants import TicketFlowStatus, TodoType +from backend.ticket.constants import TicketFlowStatus, TicketType, TodoType from backend.ticket.exceptions import TodoWrongOperatorException from backend.ticket.flow_manager import manager from backend.ticket.flow_manager.manager import TicketFlowManager @@ -51,6 +52,12 @@ def process(self, username, action, params): if not self.todo.ticket.todo_of_ticket.exist_unfinished(): manager.TicketFlowManager(ticket=self.todo.ticket).run_next_flow() + # 如果是数据迁移单据,更改迁移记录状态信息 + if self.todo.ticket.ticket_type in [TicketType.SQLSERVER_INCR_MIGRATE, TicketType.SQLSERVER_FULL_MIGRATE]: + dts = SqlserverDtsInfo.objects.get(ticket_id=self.todo.ticket.id) + dts.status = DtsStatus.Terminated.value + dts.save() + @todos.TodoActorFactory.register(TodoType.RESOURCE_REPLENISH) class ResourceReplenishTodo(todos.TodoActor): diff --git a/dbm-ui/backend/ticket/views.py b/dbm-ui/backend/ticket/views.py index e13b4b97df..9b66b6e7a4 100644 --- a/dbm-ui/backend/ticket/views.py +++ b/dbm-ui/backend/ticket/views.py @@ -24,7 +24,6 @@ from backend.bk_web import viewsets from backend.bk_web.swagger import PaginatedResponseSwaggerAutoSchema, common_swagger_auto_schema from backend.configuration.models import DBAdministrator -from backend.db_meta.models.sqlserver_dts import DtsStatus, SqlserverDtsInfo from backend.db_services.ipchooser.query.resource import ResourceQueryHelper from backend.iam_app.dataclass import ResourceEnum from backend.iam_app.dataclass.actions import ActionEnum @@ -441,11 +440,6 @@ def process_todo(self, request, *args, **kwargs): todo = ticket.todo_of_ticket.get(id=validated_data["todo_id"]) TodoActorFactory.actor(todo).process(request.user.username, validated_data["action"], validated_data["params"]) - # 如果是数据迁移单据,更改迁移记录状态信息 - if ticket.ticket_type in [TicketType.SQLSERVER_INCR_MIGRATE, TicketType.SQLSERVER_FULL_MIGRATE]: - dts = SqlserverDtsInfo.objects.get(ticket_id=ticket.id) - dts.status = DtsStatus.Terminated.value - dts.save() return Response(TodoSerializer(ticket.todo_of_ticket.all(), many=True).data) @common_swagger_auto_schema( From a1fb8602404d7a7c1e8fcd44a3a8ce78f4ba4fca Mon Sep 17 00:00:00 2001 From: WytheLi Date: Fri, 27 Sep 2024 14:59:59 +0800 Subject: [PATCH 112/164] =?UTF-8?q?fix(mongodb):=20mongo=E5=8D=95=E6=8D=AE?= =?UTF-8?q?=E8=81=94=E8=B0=83=20#4233?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/ticket/builders/mongodb/mongo_replicaset_apply.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_apply.py b/dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_apply.py index e0a0c07c2a..d08c399f1f 100644 --- a/dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_apply.py +++ b/dbm-ui/backend/ticket/builders/mongodb/mongo_replicaset_apply.py @@ -28,7 +28,7 @@ class MongoReplicaSetApplyDetailSerializer(serializers.Serializer): class ReplicaSet(serializers.Serializer): set_id = serializers.CharField(help_text=_("复制集群ID(英文数字及下划线)")) - name = serializers.CharField(help_text=_("集群别名")) + name = serializers.CharField(help_text=_("集群别名"), allow_blank=True, allow_null=True) domain = serializers.CharField(help_text=_("集群域名")) bk_cloud_id = serializers.IntegerField(help_text=_("云区域ID")) From 0052aa331818d51fe4264cba8c7e9f9bf2e1fd52 Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Thu, 10 Oct 2024 15:24:54 +0800 Subject: [PATCH 113/164] =?UTF-8?q?fix(backend):=20tendbha=20=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E7=9B=98=E9=94=99=E4=B9=B1=E9=97=AE=E9=A2=98=20#7253?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/bk_dataview/dashboards/json/tendbsingle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbm-ui/backend/bk_dataview/dashboards/json/tendbsingle.json b/dbm-ui/backend/bk_dataview/dashboards/json/tendbsingle.json index 38d8ed4068..3b8105b01e 100644 --- a/dbm-ui/backend/bk_dataview/dashboards/json/tendbsingle.json +++ b/dbm-ui/backend/bk_dataview/dashboards/json/tendbsingle.json @@ -7829,7 +7829,7 @@ "schemaVersion": 37, "style": "dark", "tags": [ - "tendbha" + "tendbsingle" ], "templating": { "list": [ From 558d435102b2365de230dc117fdbcc0db0da0809 Mon Sep 17 00:00:00 2001 From: make123 Date: Mon, 12 Aug 2024 11:41:11 +0800 Subject: [PATCH 114/164] =?UTF-8?q?feat(dbm-services):=20=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=B1=A0=E7=BB=9F=E8=AE=A1=E8=A7=86=E5=9B=BE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=20#6160?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/{import.go => rs_import.go} | 34 +- .../controller/manage/{list.go => rs_list.go} | 61 +-- .../manage/{manage.go => rs_manage.go} | 59 +-- .../controller/manage/{spec.go => rs_spec.go} | 14 +- .../controller/statistic/statistic.go | 475 ++++++++++++++++++ .../db-resource/internal/mock/dbm_spec.go | 90 ++++ .../db-resource/internal/model/TbRpDetail.go | 71 ++- .../internal/model/TbRpDetailArchive.go | 4 +- .../db-resource/internal/routers/routers.go | 4 + .../db-resource/internal/svr/apply/api.go | 165 +----- .../db-resource/internal/svr/apply/apply.go | 23 +- .../db-resource/internal/svr/apply/core.go | 133 ----- .../internal/svr/apply/match_resource.go | 20 +- .../db-resource/internal/svr/bk/cc_test.go | 4 +- .../internal/svr/dbmapi/dbm_api.go | 22 + .../internal/svr/dbmapi/dbm_env.go | 80 +++ .../internal/svr/dbmapi/dbm_logic_city.go | 155 ++++++ .../internal/svr/dbmapi/dbm_spec.go | 135 +++++ .../db-resource/internal/svr/meta/disk.go | 55 ++ .../db-resource/internal/svr/meta/location.go | 30 ++ .../db-resource/internal/svr/meta/meta.go | 200 +++----- .../db-resource/internal/svr/meta/spec.go | 27 + .../internal/svr/task/inspection_task.go | 7 +- 23 files changed, 1293 insertions(+), 575 deletions(-) rename dbm-services/common/db-resource/internal/controller/manage/{import.go => rs_import.go} (90%) rename dbm-services/common/db-resource/internal/controller/manage/{list.go => rs_list.go} (80%) rename dbm-services/common/db-resource/internal/controller/manage/{manage.go => rs_manage.go} (84%) rename dbm-services/common/db-resource/internal/controller/manage/{spec.go => rs_spec.go} (88%) create mode 100644 dbm-services/common/db-resource/internal/controller/statistic/statistic.go create mode 100644 dbm-services/common/db-resource/internal/mock/dbm_spec.go create mode 100644 dbm-services/common/db-resource/internal/svr/dbmapi/dbm_api.go create mode 100644 dbm-services/common/db-resource/internal/svr/dbmapi/dbm_env.go create mode 100644 dbm-services/common/db-resource/internal/svr/dbmapi/dbm_logic_city.go create mode 100644 dbm-services/common/db-resource/internal/svr/dbmapi/dbm_spec.go create mode 100644 dbm-services/common/db-resource/internal/svr/meta/disk.go create mode 100644 dbm-services/common/db-resource/internal/svr/meta/location.go create mode 100644 dbm-services/common/db-resource/internal/svr/meta/spec.go diff --git a/dbm-services/common/db-resource/internal/controller/manage/import.go b/dbm-services/common/db-resource/internal/controller/manage/rs_import.go similarity index 90% rename from dbm-services/common/db-resource/internal/controller/manage/import.go rename to dbm-services/common/db-resource/internal/controller/manage/rs_import.go index 6be8d892f6..3d0309d15a 100644 --- a/dbm-services/common/db-resource/internal/controller/manage/import.go +++ b/dbm-services/common/db-resource/internal/controller/manage/rs_import.go @@ -35,8 +35,8 @@ import ( // ImportMachParam 资源导入请求参数 type ImportMachParam struct { // ForBizs 业务标签,表示这个资源将来给ForBizs这个业务使用 - ForBizs []int `json:"for_bizs"` - RsTypes []string `json:"resource_types"` + ForBiz int `json:"for_biz"` + RsType string `json:"resource_type"` BkBizId int `json:"bk_biz_id" binding:"number"` Hosts []HostBase `json:"hosts" binding:"gt=0,dive,required"` Labels map[string]string `json:"labels"` @@ -120,29 +120,13 @@ type ImportHostResp struct { NotFoundInCCHosts []string `json:"not_found_in_cc_hosts"` } -func (p ImportMachParam) transParamToBytes() (lableJson, bizJson, rstypes json.RawMessage, err error) { +func (p ImportMachParam) transParamToBytes() (lableJson json.RawMessage, err error) { // lableJson = []byte("{}") lableJson, err = json.Marshal(cmutil.CleanStrMap(p.Labels)) if err != nil { logger.Error(fmt.Sprintf("ConverLableToJsonStr Failed,Error:%s", err.Error())) return } - bizJson = []byte("[]") - if len(p.ForBizs) > 0 { - bizJson, err = json.Marshal(cmutil.IntSliceToStrSlice(p.ForBizs)) - if err != nil { - logger.Error(fmt.Sprintf("conver biz json Failed,Error:%s", err.Error())) - return - } - } - rstypes = []byte("[]") - if len(p.RsTypes) > 0 { - rstypes, err = json.Marshal(cmutil.StringsRemoveEmpty(p.RsTypes)) - if err != nil { - logger.Error(fmt.Sprintf("conver resource types Failed,Error:%s", err.Error())) - return - } - } return } @@ -183,7 +167,7 @@ func Doimport(param ImportMachParam) (resp *ImportHostResp, err error) { } resp.SearchDiskErrInfo = diskResp.IpFailedLogMap resp.NotFoundInCCHosts = notFoundHosts - lableJson, bizJson, rstypes, err := param.transParamToBytes() + lableJson, err := param.transParamToBytes() if err != nil { return resp, err } @@ -204,7 +188,7 @@ func Doimport(param ImportMachParam) (resp *ImportHostResp, err error) { } for _, h := range ccHostsInfo { delete(hostsMap, h.InnerIP) - el := transHostInfoToDbModule(h, h.BkCloudId, param.BkBizId, rstypes, bizJson, lableJson) + el := param.transHostInfoToDbModule(h, h.BkCloudId, lableJson) el.SetMore(h.InnerIP, diskResp.IpLogContentMap) // gse agent 1.0的 agent 是用 cloudid:ip gseAgentId := h.BkAgentId @@ -265,16 +249,16 @@ func getCvmMachList(hosts []*cc.Host) []string { } // transHostInfoToDbModule 获取的到的主机信息赋值给db model -func transHostInfoToDbModule(h *cc.Host, bkCloudId, bkBizId int, rstp, biz, label []byte) model.TbRpDetail { +func (p ImportMachParam) transHostInfoToDbModule(h *cc.Host, bkCloudId int, label []byte) model.TbRpDetail { osType := h.BkOsType if cmutil.IsEmpty(osType) { osType = bk.OsLinux } return model.TbRpDetail{ - RsTypes: rstp, - DedicatedBizs: biz, + DedicatedBiz: p.ForBiz, + RsType: p.RsType, BkCloudID: bkCloudId, - BkBizId: bkBizId, + BkBizId: p.BkBizId, AssetID: h.AssetID, BkHostID: h.BKHostId, IP: h.InnerIP, diff --git a/dbm-services/common/db-resource/internal/controller/manage/list.go b/dbm-services/common/db-resource/internal/controller/manage/rs_list.go similarity index 80% rename from dbm-services/common/db-resource/internal/controller/manage/list.go rename to dbm-services/common/db-resource/internal/controller/manage/rs_list.go index b125057c1f..8b59d354c1 100644 --- a/dbm-services/common/db-resource/internal/controller/manage/list.go +++ b/dbm-services/common/db-resource/internal/controller/manage/rs_list.go @@ -19,8 +19,8 @@ import ( "gorm.io/gorm" "dbm-services/common/db-resource/internal/model" - "dbm-services/common/db-resource/internal/svr/apply" "dbm-services/common/db-resource/internal/svr/bk" + "dbm-services/common/db-resource/internal/svr/dbmapi" "dbm-services/common/db-resource/internal/svr/meta" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/errno" @@ -30,21 +30,24 @@ import ( // MachineResourceGetterInputParam TODO type MachineResourceGetterInputParam struct { // 专用业务Ids - ForBizs []int `json:"for_bizs"` - City []string `json:"city"` - SubZones []string `json:"subzones"` - DeviceClass []string `json:"device_class"` - Labels map[string]string `json:"labels"` - Hosts []string `json:"hosts"` - BkCloudIds []int `json:"bk_cloud_ids"` - RsTypes []string `json:"resource_types"` - MountPoint string `json:"mount_point"` - Cpu apply.MeasureRange `json:"cpu"` - Mem apply.MeasureRange `json:"mem"` - Disk apply.MeasureRange `json:"disk"` - DiskType string `json:"disk_type"` - OsType string `json:"os_type"` - StorageSpecs []apply.DiskSpec `json:"storage_spec"` + ForBiz int `json:"for_biz"` + City []string `json:"city"` + SubZoneIds []string `json:"subzone_ids"` + DeviceClass []string `json:"device_class"` + Labels map[string]string `json:"labels"` + Hosts []string `json:"hosts"` + BkCloudIds []int `json:"bk_cloud_ids"` + RsType string `json:"resource_type"` + MountPoint string `json:"mount_point"` + Cpu meta.MeasureRange `json:"cpu"` + Mem meta.MeasureRange `json:"mem"` + Disk meta.MeasureRange `json:"disk"` + DiskType string `json:"disk_type"` + OsType string `json:"os_type"` + StorageSpecs []meta.DiskSpec `json:"storage_spec"` + // 适用于用户没选业务和db类型的情况 + SetBizEmpty bool `json:"set_empty_biz"` + SetRsTypeEmpty bool `json:"set_empty_resource_type"` // true,false,"" GseAgentAlive string `json:"gse_agent_alive"` Limit int `json:"limit"` @@ -129,7 +132,7 @@ func (c *MachineResourceGetterInputParam) matchStorageSpecs(db *gorm.DB) { func (c *MachineResourceGetterInputParam) getRealCitys() (realCistys []string, err error) { for _, logicCity := range c.City { - rcitys, err := meta.GetIdcCityByLogicCity(logicCity) + rcitys, err := dbmapi.GetIdcCityByLogicCity(logicCity) if err != nil { logger.Error("from %s get real citys failed %s", logicCity, err.Error()) return nil, err @@ -172,13 +175,11 @@ func (c *MachineResourceGetterInputParam) queryBs(db *gorm.DB) (err error) { if len(c.BkCloudIds) > 0 { db.Where("bk_cloud_id in (?) ", c.BkCloudIds) } - if len(c.RsTypes) > 0 { - // 如果参数["all"],表示选择没有任何资源类型标签的资源 - if c.RsTypes[0] == "all" { - db.Where("JSON_LENGTH(rs_types) <= 0") - } else { - db.Where("(?)", model.JSONQuery("rs_types").JointOrContains(c.RsTypes)) - } + if !c.SetRsTypeEmpty { + db.Where("rs_type = ? ", c.RsType) + } + if !c.SetBizEmpty { + db.Where("dedicated_biz = ?", c.ForBiz) } c.matchSpec(db) c.matchStorageSpecs(db) @@ -189,18 +190,10 @@ func (c *MachineResourceGetterInputParam) queryBs(db *gorm.DB) (err error) { } db.Where(" city in (?) ", realCitys) } - if len(c.SubZones) > 0 { - db.Where(" sub_zone in (?) ", c.SubZones) + if len(c.SubZoneIds) > 0 { + db.Where(" sub_zone_id in (?) ", c.SubZoneIds) } - if len(c.ForBizs) > 0 { - // 如果参数[0],表示选择没有任何业务标签的资源 - if c.ForBizs[0] == 0 { - db.Where("JSON_LENGTH(dedicated_bizs) <= 0") - } else { - db.Where("(?)", model.JSONQuery("dedicated_bizs").JointOrContains(cmutil.IntSliceToStrSlice(c.ForBizs))) - } - } if cmutil.IsNotEmpty(c.OsType) { db.Where("os_type = ?", c.OsType) } diff --git a/dbm-services/common/db-resource/internal/controller/manage/manage.go b/dbm-services/common/db-resource/internal/controller/manage/rs_manage.go similarity index 84% rename from dbm-services/common/db-resource/internal/controller/manage/manage.go rename to dbm-services/common/db-resource/internal/controller/manage/rs_manage.go index a29d3dd509..88803cec6b 100644 --- a/dbm-services/common/db-resource/internal/controller/manage/manage.go +++ b/dbm-services/common/db-resource/internal/controller/manage/rs_manage.go @@ -23,6 +23,7 @@ import ( "dbm-services/common/go-pubpkg/logger" rf "github.com/gin-gonic/gin" + "github.com/samber/lo" ) // MachineResourceHandler 主机处理handler @@ -86,8 +87,8 @@ func (c *MachineResourceHandler) Delete(r *rf.Context) { // BatchUpdateMachineInput 批量编辑主机信息请求参数 type BatchUpdateMachineInput struct { BkHostIds []int `json:"bk_host_ids" binding:"required,dive,gt=0" ` - ForBizs []int `json:"for_bizs"` - RsTypes []string `json:"resource_types"` + ForBiz int `json:"for_biz"` + RsType string `json:"resource_type"` RackId string `json:"rack_id"` SetBizEmpty bool `json:"set_empty_biz"` SetRsTypeEmpty bool `json:"set_empty_resource_type"` @@ -111,31 +112,13 @@ func (c *MachineResourceHandler) BatchUpdate(r *rf.Context) { } // update for biz - if len(input.ForBizs) > 0 { - bizJson, err := json.Marshal(cmutil.IntSliceToStrSlice(input.ForBizs)) - if err != nil { - logger.Error(fmt.Sprintf("conver biz json Failed,Error:%s", err.Error())) - c.SendResponse(r, err, requestId, err.Error()) - return - } - updateMap["dedicated_bizs"] = bizJson - } - if input.SetBizEmpty { - updateMap["dedicated_bizs"] = EmptyArryJson + if input.ForBiz > 0 { + updateMap["dedicated_biz"] = input.ForBiz } // update resource type - if len(input.RsTypes) > 0 { - rstypes, err := json.Marshal(input.RsTypes) - if err != nil { - logger.Error(fmt.Sprintf("conver resource types Failed,Error:%s", err.Error())) - c.SendResponse(r, err, requestId, err.Error()) - return - } - updateMap["rs_types"] = rstypes - } - if input.SetRsTypeEmpty { - updateMap["rs_types"] = EmptyArryJson + if lo.IsNotEmpty(input.RsType) { + updateMap["rs_type"] = input.RsType } // update disk @@ -155,7 +138,7 @@ func (c *MachineResourceHandler) BatchUpdate(r *rf.Context) { } // do update - err := model.DB.Self.Table(model.TbRpDetailName()).Select("dedicated_bizs", "rs_types", "storage_device", "rack_id"). + err := model.DB.Self.Table(model.TbRpDetailName()).Select("dedicated_biz", "rs_type", "storage_device", "rack_id"). Where("bk_host_id in (?)", input.BkHostIds).Updates(updateMap).Error if err != nil { c.SendResponse(r, err, requestId, err.Error()) @@ -175,8 +158,8 @@ type MachineResourceInputParam struct { type MachineResource struct { BkHostID int `json:"bk_host_id" binding:"required"` Labels map[string]string `json:"labels"` - ForBizs []int `json:"for_bizs"` - RsTypes []string `json:"resource_types"` + ForBiz int `json:"for_biz"` + RsType string `json:"resource_type"` StorageDevice map[string]bk.DiskDetail `json:"storage_device"` } @@ -199,23 +182,11 @@ func (c *MachineResourceHandler) Update(r *rf.Context) { } updateMap["lable"] = l } - if len(v.ForBizs) > 0 { - bizJson, err := json.Marshal(cmutil.IntSliceToStrSlice(v.ForBizs)) - if err != nil { - logger.Error(fmt.Sprintf("conver biz json Failed,Error:%s", err.Error())) - c.SendResponse(r, err, requestId, err.Error()) - return - } - updateMap["dedicated_bizs"] = bizJson + if v.ForBiz > 0 { + updateMap["dedicated_biz"] = v.ForBiz } - if len(v.RsTypes) > 0 { - rstypes, err := json.Marshal(v.RsTypes) - if err != nil { - logger.Error(fmt.Sprintf("conver resource types Failed,Error:%s", err.Error())) - c.SendResponse(r, err, requestId, err.Error()) - return - } - updateMap["rs_types"] = rstypes + if lo.IsNotEmpty(v.RsType) { + updateMap["rs_type"] = v.RsType } if len(v.StorageDevice) > 0 { storageJson, err := json.Marshal(v.StorageDevice) @@ -226,7 +197,7 @@ func (c *MachineResourceHandler) Update(r *rf.Context) { } updateMap["storage_device"] = storageJson } - err := tx.Model(&model.TbRpDetail{}).Table(model.TbRpDetailName()).Select("dedicated_bizs", "rs_types", + err := tx.Model(&model.TbRpDetail{}).Table(model.TbRpDetailName()).Select("dedicated_biz", "rs_type", "label").Where("bk_host_id=?", v.BkHostID).Updates(updateMap).Error if err != nil { tx.Rollback() diff --git a/dbm-services/common/db-resource/internal/controller/manage/spec.go b/dbm-services/common/db-resource/internal/controller/manage/rs_spec.go similarity index 88% rename from dbm-services/common/db-resource/internal/controller/manage/spec.go rename to dbm-services/common/db-resource/internal/controller/manage/rs_spec.go index 186f4770bf..833b6cdce8 100644 --- a/dbm-services/common/db-resource/internal/controller/manage/spec.go +++ b/dbm-services/common/db-resource/internal/controller/manage/rs_spec.go @@ -11,13 +11,12 @@ package manage import ( - "strconv" - "github.com/gin-gonic/gin" "dbm-services/common/db-resource/internal/model" "dbm-services/common/db-resource/internal/svr/apply" "dbm-services/common/db-resource/internal/svr/bk" + "dbm-services/common/db-resource/internal/svr/meta" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/errno" "dbm-services/common/go-pubpkg/logger" @@ -33,10 +32,10 @@ type SpecCheckInput struct { // SpecInfo TODO type SpecInfo struct { - GroupMark string `json:"group_mark" binding:"required" ` - DeviceClass []string `json:"device_class"` - Spec apply.Spec `json:"spec"` - StorageSpecs []apply.DiskSpec `json:"storage_spec"` + GroupMark string `json:"group_mark" binding:"required" ` + DeviceClass []string `json:"device_class"` + Spec meta.Spec `json:"spec"` + StorageSpecs []meta.DiskSpec `json:"storage_spec"` } // SpecSum TODO @@ -67,8 +66,7 @@ func (m MachineResourceHandler) SpecSum(r *gin.Context) { // 如果没有指定资源类型,表示只能选择无资源类型标签的资源 // 没有资源类型标签的资源可以被所有其他类型使用 if input.ForbizId > 0 { - db.Where("( ? or JSON_LENGTH(dedicated_bizs)<=0 )", model.JSONQuery("dedicated_bizs").Contains([]string{ - strconv.Itoa(input.ForbizId)})) + db.Where("dedicated_biz = ? ", input.ForbizId) } if cmutil.IsEmpty(input.ResourceType) { db.Where("JSON_LENGTH(rs_types) <= 0") diff --git a/dbm-services/common/db-resource/internal/controller/statistic/statistic.go b/dbm-services/common/db-resource/internal/controller/statistic/statistic.go new file mode 100644 index 0000000000..029a9bf39d --- /dev/null +++ b/dbm-services/common/db-resource/internal/controller/statistic/statistic.go @@ -0,0 +1,475 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +// Package statistic 资源统计相关接口 +package statistic + +import ( + "errors" + "fmt" + "hash/crc32" + "math" + "sort" + "strconv" + "strings" + "sync" + + "github.com/gin-gonic/gin" + "github.com/samber/lo" + "gorm.io/gorm" + + "dbm-services/common/db-resource/internal/controller" + "dbm-services/common/db-resource/internal/model" + "dbm-services/common/db-resource/internal/svr/bk" + "dbm-services/common/db-resource/internal/svr/dbmapi" + "dbm-services/common/go-pubpkg/logger" +) + +// Handler statistic handler +type Handler struct { + controller.BaseHandler +} + +const ( + // EmptyDeviceClass 无机型信息 + EmptyDeviceClass = "无机型信息" +) + +// RegisterRouter 注册路由 +func (s *Handler) RegisterRouter(engine *gin.Engine) { + r := engine.Group("statistic") + { + r.POST("/groupby/resource_type", s.CountGroupbyResourceType) + r.POST("/summary", s.ResourceDistribution) + } +} + +// CountGroupbyResourceType 按照资源类型统计 + +// CountGroupbyResourceTypeResult 按照资源类型统计结果数据 +type CountGroupbyResourceTypeResult struct { + RsType string `json:"rs_type"` + Count int `json:"count"` +} + +// CountGroupbyResourceType count groupby resource type +func (s *Handler) CountGroupbyResourceType(c *gin.Context) { + var data []CountGroupbyResourceTypeResult + err := model.DB.Self.Table(model.TbRpDetailName()). + Select("rs_type, count(*) as count").Group("rs_type"). + Find(&data, "status = ? ", model.Unused).Error + if err != nil { + logger.Error("query failed %s", err.Error) + s.SendResponse(c, err, err.Error(), "") + } + s.SendResponse(c, nil, data, "") +} + +// ResourDistributionParam 统计资源分布参数 +type ResourDistributionParam struct { + ForBiz int `json:"for_biz"` + City string `json:"city"` + SubZoneIds []string `json:"subzone_ids"` + GroupBy string `json:"group_by" binding:"required"` + SpecParam DbmSpecParam `json:"spec_param" ` + SetBizEmpty bool `json:"set_empty_biz"` + SetRsTypeEmpty bool `json:"set_empty_resource_type"` +} + +// DbmSpecParam 规格参数 +type DbmSpecParam struct { + DbType string `json:"db_type"` + MachineType string `json:"machine_type"` + ClusterType string `json:"cluster_type"` + SpecIdList []int `json:"spec_id_list"` +} + +func (m DbmSpecParam) getQueryParam() map[string]string { + p := make(map[string]string) + if lo.IsNotEmpty(m.DbType) && m.DbType != model.PUBLIC_RESOURCE_DBTYEP { + p["spec_db_type"] = m.DbType + } + if lo.IsNotEmpty(m.MachineType) { + p["spec_machine_type"] = m.MachineType + } + if lo.IsNotEmpty(m.ClusterType) { + p["spec_cluster_type"] = m.ClusterType + } + if len(m.SpecIdList) > 0 { + var specIdStrList []string + for _, specId := range m.SpecIdList { + specIdStrList = append(specIdStrList, strconv.Itoa(specId)) + } + p["spec_ids"] = strings.Join(specIdStrList, ",") + } + return p +} + +// ResourceDistribution 统计资源分布 +func (s *Handler) ResourceDistribution(c *gin.Context) { + var param ResourDistributionParam + if err := s.Prepare(c, ¶m); err != nil { + logger.Error("parse ResourDistributionParam failed: %v", err) + s.SendResponse(c, err, "Failed to parse parameters", "") + return + } + + dbmClient := dbmapi.NewDbmClient() + specList, err := dbmClient.GetDbmSpec(param.SpecParam.getQueryParam()) + if err != nil { + logger.Error("get dbm spec failed: %v", err) + s.SendResponse(c, err, "Failed to get DBM specifications", "") + return + } + allLogicCityInfos, err := dbmapi.GetAllLogicCityInfo() + if err != nil { + logger.Error("get all logic city info failed: %v", err) + s.SendResponse(c, err, "Failed to get logic city info", "") + return + } + cityMap := make(map[string]string) + for _, cityInfo := range allLogicCityInfos { + cityMap[cityInfo.BkIdcCityName] = cityInfo.LogicalCityName + } + db := model.DB.Self.Table(model.TbRpDetailName()) + if err := param.dbFilter(db); err != nil { + s.SendResponse(c, err, "Failed to apply database filter", "") + return + } + + var rsListBefore, rsList []model.TbRpDetail + if err := db.Find(&rsListBefore).Error; err != nil { + logger.Error("query failed: %v", err) + s.SendResponse(c, err, "Failed to query resource list", "") + return + } + for _, rs := range rsListBefore { + if v, ok := cityMap[rs.City]; ok { + rs.City = v + } + rsList = append(rsList, rs) + } + var result interface{} + var processErr error + + switch param.GroupBy { + case "device_class": + result = s.processDeviceClassGroup(rsList, specList, param.SpecParam.ClusterType) + case "spec": + result, processErr = groupByDbmSpec(rsList, specList) + default: + err := errors.New("unknown aggregation type") + msg := fmt.Sprintf("Unknown aggregation type: %s", param.GroupBy) + s.SendResponse(c, err, msg, "") + return + } + + if processErr != nil { + s.SendResponse(c, processErr, "Failed to process data", "") + return + } + + s.SendResponse(c, nil, result, "") +} + +func (s *Handler) processDeviceClassGroup( + rsList []model.TbRpDetail, + specList []dbmapi.DbmSpec, + clusterType string, +) interface{} { + if lo.IsEmpty(clusterType) { + return groupByDeviceClass(rsList) + } + + var filteredList []model.TbRpDetail + for _, rs := range rsList { + for _, spec := range specList { + if rs.MatchDbmSpec(spec) { + filteredList = append(filteredList, rs) + break + } + } + } + return groupByDeviceClass(filteredList) +} + +func (r ResourDistributionParam) dbFilter(db *gorm.DB) (err error) { + db.Where("status = ? ", model.Unused) + if lo.IsNotEmpty(r.City) { + realCitys, err := dbmapi.GetIdcCityByLogicCity(r.City) + if err != nil { + logger.Error("get idc city by logic city failed %s", err.Error()) + return fmt.Errorf("根据逻辑城市%s获取机房城市失败:%v", r.City, err) + } + db.Where("city in (?)", realCitys) + } + if len(r.SubZoneIds) > 0 { + db.Where("sub_zone_id in (?)", r.SubZoneIds) + } + if !r.SetBizEmpty { + db.Where("dedicated_biz = ? ", r.ForBiz) + } + if !r.SetRsTypeEmpty { + db.Where("rs_type = ?", r.SpecParam.DbType) + } + return nil +} + +func dealCity(city string) string { + if lo.IsEmpty(city) { + city = "无区域信息" + } + return city +} + +func dealDeviceClass(deviceClass string) string { + if lo.IsEmpty(deviceClass) { + deviceClass = EmptyDeviceClass + } + return deviceClass +} + +// CityGroupCount city分组统计 +type CityGroupCount struct { + City string + Count int +} + +// GroupByDeviceClassResult 按照机型聚合结果 +type GroupByDeviceClassResult struct { + DedicatedBiz int `json:"dedicated_biz"` + City string `json:"city"` + DeviceClass string `json:"device_class"` + DiskSummary []bk.DiskInfo `json:"disk_summary"` + CpuMemSummary string `json:"cpu_mem_summary"` + Count int `json:"count"` + SubZoneDetail map[string]SubZoneInfo `json:"sub_zone_detail"` +} + +func groupByDeviceClass(rpList []model.TbRpDetail) []GroupByDeviceClassResult { + groupMap := make(map[string]*GroupByDeviceClassResult) + cityCountMap := make(map[string]int) + + for _, rs := range rpList { + if err := rs.UnmarshalDiskInfo(); err != nil { + logger.Error("%s: unmarshal disk info failed %s", rs.IP, err.Error()) + continue + } + + diskHash32 := crc32.ChecksumIEEE([]byte(rs.ConcatDiskInfoIgnoreDiskId())) + city := dealCity(rs.City) + deviceClass := dealDeviceClass(rs.DeviceClass) + groupKey := fmt.Sprintf("%d:%s:%s:%d", rs.DedicatedBiz, city, deviceClass, diskHash32) + + group, exists := groupMap[groupKey] + if !exists { + group = &GroupByDeviceClassResult{ + DedicatedBiz: rs.DedicatedBiz, + City: city, + DeviceClass: deviceClass, + DiskSummary: make([]bk.DiskInfo, 0), + SubZoneDetail: make(map[string]SubZoneInfo), + } + groupMap[groupKey] = group + } + + group.Count++ + cityCountMap[city]++ + + if len(group.DiskSummary) == 0 { + for mp, dinfo := range rs.Storages { + group.DiskSummary = append(group.DiskSummary, bk.DiskInfo{ + MountPoint: mp, + DiskDetail: bk.DiskDetail{ + Size: dinfo.Size, + DiskType: dinfo.DiskType, + }, + }) + } + } + + if group.CpuMemSummary == "" && lo.IsNotEmpty(rs.DeviceClass) { + group.CpuMemSummary = fmt.Sprintf("%d核%dG", rs.CPUNum, int(math.Ceil(float64(rs.DramCap)/1000))) + } + + subZoneInfo := group.SubZoneDetail[rs.SubZoneID] + subZoneInfo.Name = rs.SubZone + subZoneInfo.Count++ + group.SubZoneDetail[rs.SubZoneID] = subZoneInfo + } + + var citysGroupKey []CityGroupCount + for city, count := range cityCountMap { + citysGroupKey = append(citysGroupKey, CityGroupCount{City: city, Count: count}) + } + + sort.SliceStable(citysGroupKey, func(i, j int) bool { + return citysGroupKey[i].Count > citysGroupKey[j].Count + }) + + result := make([]GroupByDeviceClassResult, 0, len(groupMap)) + for _, cityGroup := range citysGroupKey { + cityResults := make([]GroupByDeviceClassResult, 0) + for _, group := range groupMap { + if group.City == cityGroup.City { + cityResults = append(cityResults, *group) + } + } + sort.SliceStable(cityResults, func(i, j int) bool { + return cityResults[i].Count > cityResults[j].Count + }) + result = append(result, cityResults...) + } + + return result +} + +// GroupBySpecResult 按照规格聚合结果 +type GroupBySpecResult struct { + DedicatedBiz int `json:"dedicated_biz"` + City string `json:"city"` + SpecId int `json:"spec_id"` + SpecName string `json:"spec_name"` + SpecMachineType string `json:"spec_machine_type"` + SpecClusterType string `json:"spec_cluster_type"` + Count int `json:"count"` + SubZoneDetail map[string]SubZoneInfo `json:"sub_zone_detail"` +} + +// SubZoneInfo sub zone count info +type SubZoneInfo struct { + Name string `json:"name"` + Count int `json:"count"` +} + +func transferSubZoneDetail(subZonegroupMap map[string]int, subZoneMap map[string]string) map[string]SubZoneInfo { + s := make(map[string]SubZoneInfo) + for subZoneId, count := range subZonegroupMap { + subName := "" + if v, ok := subZoneMap[subZoneId]; ok { + subName = v + } + s[subZoneId] = SubZoneInfo{ + Count: count, + Name: subName, + } + } + return s +} + +func groupByDbmSpec(rpList []model.TbRpDetail, specList []dbmapi.DbmSpec) (result []GroupBySpecResult, err error) { + result = []GroupBySpecResult{} + specMap := make(map[int]dbmapi.DbmSpec) + for _, spec := range specList { + specMap[spec.SpecId] = spec + } + specMatchrelationMap := rsMatchSpecs(rpList, specList) + groupMap := make(map[string][]model.TbRpDetail) + subZonegroupMap := make(map[string]map[string]int) + subzoneNameMap := make(map[string]string) + for _, rs := range rpList { + matchSpecIds, ok := specMatchrelationMap[rs.BkHostID] + if !ok { + logger.Warn("%s 资源没有匹配到任何规格", rs.IP) + continue + } + subzoneNameMap[rs.SubZoneID] = rs.SubZone + for _, specId := range matchSpecIds { + groupKey := fmt.Sprintf("%d:%s:%d", rs.DedicatedBiz, dealCity(rs.City), specId) + groupMap[groupKey] = append(groupMap[groupKey], rs) + if _, exist := subZonegroupMap[groupKey]; !exist { + subZonegroupMap[groupKey] = make(map[string]int) + subZonegroupMap[groupKey][rs.SubZoneID] = 1 + } else { + subZonegroupMap[groupKey][rs.SubZoneID]++ + } + } + } + cityMap := make(map[string][]GroupBySpecResult) + cityCountMap := make(map[string]int) + for groupKey, grs := range groupMap { + dedicatedBiz, city, specId, err := parseSpecGroupKey(groupKey) + if err != nil { + logger.Error("parse group key failed %s", err.Error) + continue + } + spec, ok := specMap[specId] + if !ok { + spec = dbmapi.DbmSpec{} + } + + cityCountMap[city] += len(grs) + cityMap[city] = append(cityMap[city], GroupBySpecResult{ + DedicatedBiz: dedicatedBiz, + SpecId: specId, + SpecName: spec.SpecName, + SpecMachineType: spec.SpecMachineType, + SpecClusterType: spec.SpecClusterType, + City: city, + Count: len(grs), + SubZoneDetail: transferSubZoneDetail(subZonegroupMap[groupKey], subzoneNameMap), + }) + } + var citysGroupKey []CityGroupCount + for city, count := range cityCountMap { + citysGroupKey = append(citysGroupKey, CityGroupCount{City: city, Count: count}) + } + // 对城市整体数量进行排序 + sort.SliceStable(citysGroupKey, func(i, j int) bool { + return citysGroupKey[i].Count > citysGroupKey[j].Count + }) + // 按照subZone数量排序 + for _, city := range citysGroupKey { + part := cityMap[city.City] + sort.SliceStable(part, func(i, j int) bool { + return part[i].Count > part[j].Count + }) + result = append(result, part...) + } + return result, nil +} + +func parseSpecGroupKey(groupKey string) (dedicatedBiz int, city string, specId int, err error) { + cols := strings.Split(groupKey, ":") + if len(cols) < 3 { + return -1, "", -1, fmt.Errorf("group key format error, %s", groupKey) + } + dedicatedBiz, err = strconv.Atoi(cols[0]) + if err != nil { + return -1, "", -1, fmt.Errorf("dedicated biz format error, %s", cols[0]) + } + city = cols[1] + specId, err = strconv.Atoi(cols[2]) + return dedicatedBiz, city, specId, err +} + +func rsMatchSpecs(rsList []model.TbRpDetail, specList []dbmapi.DbmSpec) map[int][]int { + relationMap := make(map[int][]int) + ctrlChan := make(chan struct{}, 10) + wg := sync.WaitGroup{} + lc := sync.Mutex{} + for _, rs := range rsList { + for _, spec := range specList { + wg.Add(1) + ctrlChan <- struct{}{} + go func(xrs model.TbRpDetail, xspec dbmapi.DbmSpec) { + if xrs.MatchDbmSpec(xspec) { + lc.Lock() + relationMap[xrs.BkHostID] = append(relationMap[xrs.BkHostID], xspec.SpecId) + lc.Unlock() + } + wg.Done() + <-ctrlChan + }(rs, spec) + } + } + wg.Wait() + return relationMap +} diff --git a/dbm-services/common/db-resource/internal/mock/dbm_spec.go b/dbm-services/common/db-resource/internal/mock/dbm_spec.go new file mode 100644 index 0000000000..9f774eb989 --- /dev/null +++ b/dbm-services/common/db-resource/internal/mock/dbm_spec.go @@ -0,0 +1,90 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +// Package mock TODO +package mock + +import ( + "dbm-services/common/db-resource/internal/svr/dbmapi" + "dbm-services/common/db-resource/internal/svr/meta" +) + +// GetDbmSpecListMock 获取dbm_spec列表的mock数据 +func GetDbmSpecListMock() (dbmSpecList []dbmapi.DbmSpec) { + return []dbmapi.DbmSpec{ + { + SpecId: 1, + SpecName: "2核4G100G磁盘", + SpecClusterType: "single", + SpecMachineType: "single", + DeviceClass: []string{}, + Cpu: meta.MeasureRange{ + Min: 2, + Max: 4, + }, + Mem: meta.MeasureRange{ + Min: 2000, + Max: 8000, + }, + StorageSpecs: []meta.DiskSpec{ + { + MountPoint: "/data", + DiskType: "ALL", + MinSize: 10, + }, + }, + }, + { + SpecId: 2, + SpecName: "4核16G500G磁盘", + SpecClusterType: "single", + SpecMachineType: "single", + DeviceClass: []string{}, + Cpu: meta.MeasureRange{ + Min: 4, + Max: 8, + }, + Mem: meta.MeasureRange{ + Min: 6000, + Max: 16000, + }, + + StorageSpecs: []meta.DiskSpec{ + { + MountPoint: "/data", + DiskType: "ALL", + MinSize: 100, + }, + }, + }, + { + SpecId: 3, + SpecName: "16核64G3000G磁盘", + SpecClusterType: "single", + SpecMachineType: "single", + DeviceClass: []string{}, + Cpu: meta.MeasureRange{ + Min: 16, + Max: 16, + }, + Mem: meta.MeasureRange{ + Min: 60000, + Max: 64000, + }, + StorageSpecs: []meta.DiskSpec{ + { + MountPoint: "/data", + DiskType: "ALL", + MinSize: 2900, + }, + }, + }, + } +} diff --git a/dbm-services/common/db-resource/internal/model/TbRpDetail.go b/dbm-services/common/db-resource/internal/model/TbRpDetail.go index 2286f0c19c..1e746ab252 100644 --- a/dbm-services/common/db-resource/internal/model/TbRpDetail.go +++ b/dbm-services/common/db-resource/internal/model/TbRpDetail.go @@ -17,9 +17,11 @@ import ( "time" "dbm-services/common/db-resource/internal/svr/bk" + "dbm-services/common/db-resource/internal/svr/dbmapi" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/logger" + "github.com/samber/lo" "gorm.io/gorm" ) @@ -36,14 +38,21 @@ const ( UsedByOther = "UsedByOther" ) +const ( + // PUBLIC_RESOURCE_DBTYEP 公共资源DB类型 + PUBLIC_RESOURCE_DBTYEP = "PUBLIC" + // PUBLIC_RESOURCE_BIZ 公共资源业务ID + PUBLIC_RESOURCE_BIZ = 0 +) + // TbRpDetail 机器资源明细表 // nolint type TbRpDetail struct { ID int `gorm:"primary_key;auto_increment;not_null" json:"-"` BkCloudID int `gorm:"uniqueIndex:ip;column:bk_cloud_id;type:int(11);not null;comment:'云区域 ID'" json:"bk_cloud_id"` - BkBizId int `gorm:"column:bk_biz_id;type:int(11);not null;comment:'机器当前所属业务'" json:"bk_biz_id"` - DedicatedBizs json.RawMessage `gorm:"column:dedicated_bizs;type:json;comment:'专属业务,可属于多个'" json:"for_bizs"` - RsTypes json.RawMessage `gorm:"column:rs_types;type:json;comment:'资源类型标签'" json:"resource_types"` + BkBizId int `gorm:"column:bk_biz_id;type:int(11);not null;comment:机器当前所属业务" json:"bk_biz_id"` + DedicatedBiz int `gorm:"column:dedicated_biz;type:int(11);default:0;comment:专属业务" json:"dedicated_biz"` + RsType string `gorm:"column:rs_type;type:varchar(64);default:'PUBLIC';comment:资源专用组件类型" json:"rs_type"` Bizs map[string]string `gorm:"-" json:"-"` BkHostID int `gorm:"index:idx_host_id;column:bk_host_id;type:int(11);not null;comment:'bk主机ID'" json:"bk_host_id"` IP string `gorm:"uniqueIndex:ip;column:ip;type:varchar(20);not null" json:"ip"` @@ -110,6 +119,54 @@ func TbRpDetailName() string { return "tb_rp_detail" } +// MatchDbmSpec 资源是否匹配dbm的规格 +func (t TbRpDetail) MatchDbmSpec(spec dbmapi.DbmSpec) bool { + logger.Info("spec:%+v", spec) + logger.Info("cpu:%d,mem:%d,city:%s,disk:%s", t.CPUNum, t.DramCap, t.City, string(t.StorageDevice)) + if len(spec.DeviceClass) > 0 { + if !lo.Contains(spec.DeviceClass, t.DeviceClass) { + logger.Warn("deviceClass not match, dbmSpec:%+v, detail:%s", spec.SpecName, t.IP) + return false + } + } else { + if !isWithinRange(t.CPUNum, spec.Cpu.Min, spec.Cpu.Max) { + logger.Warn("cpu not match, dbmSpec:%+v, detail:%s", spec.SpecName, t.IP) + return false + } + if !isWithinRange(t.DramCap, int(spec.Mem.Min*1024), spec.Mem.Max*1024) { + logger.Warn("mem not match, dbmSpec:%+v, detail:%s", spec.SpecName, t.IP) + return false + } + } + if len(spec.StorageSpecs) > 0 { + if err := t.UnmarshalDiskInfo(); err != nil { + logger.Error("unmarshal disk info failed, err:%s") + return false + } + for _, diskSpec := range spec.StorageSpecs { + mp := diskSpec.MountPoint + realDiskInfo, ok := t.Storages[mp] + if !ok { + logger.Warn("disk not found, mp:%s, detail:%s", mp, t.IP) + return false + } + if diskSpec.DiskType != "ALL" && lo.IsNotEmpty(diskSpec.DiskType) { + if diskSpec.DiskType != realDiskInfo.DiskType { + return false + } + } + if realDiskInfo.Size < diskSpec.Size { + return false + } + } + } + return true +} + +func isWithinRange(value, min, max int) bool { + return value >= min && value <= max +} + // DeviceClassIsLocalSSD TODO func (t TbRpDetail) DeviceClassIsLocalSSD() bool { if cmutil.IsEmpty(t.DeviceClass) { @@ -126,6 +183,14 @@ func (t *TbRpDetail) UnmarshalDiskInfo() (err error) { return } +// ConcatDiskInfoIgnoreDiskId concat disk info +func (t *TbRpDetail) ConcatDiskInfoIgnoreDiskId() (info string) { + for mp, dk := range t.Storages { + info += fmt.Sprintf("%s:%d:%s,", mp, dk.Size, dk.DiskType) + } + return +} + // GetTbRpDetailAll TODO func GetTbRpDetailAll(sqlstr string) ([]TbRpDetail, error) { var m []TbRpDetail diff --git a/dbm-services/common/db-resource/internal/model/TbRpDetailArchive.go b/dbm-services/common/db-resource/internal/model/TbRpDetailArchive.go index 60a466d4c1..36768bb50a 100644 --- a/dbm-services/common/db-resource/internal/model/TbRpDetailArchive.go +++ b/dbm-services/common/db-resource/internal/model/TbRpDetailArchive.go @@ -25,8 +25,8 @@ type TbRpDetailArchive struct { ID int `gorm:"primary_key;auto_increment;not_null" json:"-"` BkCloudID int `gorm:"column:bk_cloud_id;type:int(11);not null;comment:'云区域 ID'" json:"bk_cloud_id"` BkBizId int `gorm:"column:bk_biz_id;type:int(11);not null;comment:'机器当前所属业务'" json:"bk_biz_id"` - DedicatedBizs json.RawMessage `gorm:"column:dedicated_bizs;type:json;comment:'专属业务,可属于多个'" json:"dedicated_bizs"` - RsTypes json.RawMessage `gorm:"column:rs_types;type:json;comment:'资源类型标签'" json:"rs_types"` + DedicatedBiz int `gorm:"column:dedicated_biz;type:int(11);default:0;comment:专属业务" json:"dedicated_biz"` + RsType string `gorm:"column:rs_type;type:varchar(64);default:'PUBLIC';comment:资源专用组件类型" json:"rs_type"` Bizs map[string]string `gorm:"-"` BkHostID int `gorm:"column:bk_host_id;type:int(11);not null;comment:'bk主机ID'" json:"bk_host_id"` IP string `gorm:"column:ip;type:varchar(20);not null" json:"ip"` // svr ip diff --git a/dbm-services/common/db-resource/internal/routers/routers.go b/dbm-services/common/db-resource/internal/routers/routers.go index 02c0b37a06..98924c2b03 100644 --- a/dbm-services/common/db-resource/internal/routers/routers.go +++ b/dbm-services/common/db-resource/internal/routers/routers.go @@ -17,6 +17,7 @@ import ( "dbm-services/common/db-resource/internal/controller" "dbm-services/common/db-resource/internal/controller/apply" "dbm-services/common/db-resource/internal/controller/manage" + "dbm-services/common/db-resource/internal/controller/statistic" "github.com/gin-gonic/gin" ) @@ -31,6 +32,9 @@ func RegisterRoutes(engine *gin.Engine) { // background router background := controller.BackStageHandler{} background.RegisterRouter(engine) + // statistic router + statistic := statistic.Handler{} + statistic.RegisterRouter(engine) engine.Handle("GET", "/ping", func(context *gin.Context) { context.String(http.StatusOK, "pong") }) diff --git a/dbm-services/common/db-resource/internal/svr/apply/api.go b/dbm-services/common/db-resource/internal/svr/apply/api.go index a77a81043e..88156d420c 100644 --- a/dbm-services/common/db-resource/internal/svr/apply/api.go +++ b/dbm-services/common/db-resource/internal/svr/apply/api.go @@ -13,15 +13,13 @@ package apply import ( "encoding/json" "fmt" - "path" "strconv" "time" "github.com/samber/lo" - "gorm.io/gorm" - "gorm.io/gorm/clause" "dbm-services/common/db-resource/internal/model" + "dbm-services/common/db-resource/internal/svr/meta" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/logger" ) @@ -195,10 +193,10 @@ type ObjectDetail struct { Labels map[string]string `json:"labels"` // 标签 // 通过机型规格 或者 资源规格描述来匹配资源 // 这两个条件是 || 关系 - DeviceClass []string `json:"device_class"` // 机器类型 "IT5.8XLARGE128" "SA3.2XLARGE32" - Spec Spec `json:"spec"` // 规格描述 - StorageSpecs []DiskSpec `json:"storage_spec"` - LocationSpec LocationSpec `json:"location_spec"` // 地域区间 + DeviceClass []string `json:"device_class"` // 机器类型 "IT5.8XLARGE128" "SA3.2XLARGE32" + Spec meta.Spec `json:"spec"` // 规格描述 + StorageSpecs []meta.DiskSpec `json:"storage_spec"` + LocationSpec meta.LocationSpec `json:"location_spec"` // 地域区间 // 反亲和性 目前只有一种选项,当campus是空的时候,则此值生效 // SAME_SUBZONE_CROSS_SWTICH: 同城同subzone跨交换机跨机架、 // SAME_SUBZONE: 同城同subzone @@ -273,156 +271,3 @@ func (a *ObjectDetail) GetMessage() (message string) { message += fmt.Sprintf("申请总数: %d \n\r", a.Count) return message } - -// GetEmptyDiskSpec get empty disk spec info -func GetEmptyDiskSpec(ds []DiskSpec) (dms []DiskSpec) { - for _, v := range ds { - if v.MountPointIsEmpty() { - dms = append(dms, v) - } - } - return -} - -// GetDiskSpecMountPoints get disk mount point -func GetDiskSpecMountPoints(ds []DiskSpec) (mountPoints []string) { - for _, v := range ds { - logger.Info("disk info %v", v) - if v.MountPointIsEmpty() { - continue - } - mountPoints = append(mountPoints, path.Clean(v.MountPoint)) - } - return -} - -// Spec cpu memory spec param -type Spec struct { - Cpu MeasureRange `json:"cpu"` // cpu range - Mem MeasureRange `json:"ram"` -} - -// IsEmpty judge spec is empty -func (s Spec) IsEmpty() bool { - return s.Cpu.IsEmpty() && s.Mem.IsEmpty() -} - -// NotEmpty judge spec is not empty -func (s Spec) NotEmpty() bool { - return s.Cpu.IsNotEmpty() || s.Mem.IsNotEmpty() -} - -// MeasureRange cpu spec range -type MeasureRange struct { - Min int `json:"min"` - Max int `json:"max"` -} - -// Iegal determine whether the parameter is legal -func (m MeasureRange) Iegal() bool { - if m.IsNotEmpty() { - return m.Max >= m.Min - } - return true -} - -// MatchTotalStorageSize match total disk capacity -func (m *MeasureRange) MatchTotalStorageSize(db *gorm.DB) { - m.MatchRange(db, "total_storage_cap") -} - -// MatchMem match memory size range -func (m *MeasureRange) MatchMem(db *gorm.DB) { - m.MatchRange(db, "dram_cap") -} - -// MatchCpu match cpu core number range -func (m *MeasureRange) MatchCpu(db *gorm.DB) { - m.MatchRange(db, "cpu_num") -} - -// MatchRange universal range matching -func (m *MeasureRange) MatchRange(db *gorm.DB, col string) { - switch { - case m.Min > 0 && m.Max > 0: - db.Where(col+" >= ? and "+col+" <= ?", m.Min, m.Max) - case m.Max > 0 && m.Min <= 0: - db.Where(col+" <= ?", m.Max) - case m.Max <= 0 && m.Min > 0: - db.Where(col+" >= ?", m.Min) - } -} - -// MatchCpuBuilder cpu builder -func (m *MeasureRange) MatchCpuBuilder() *MeasureRangeBuilder { - return &MeasureRangeBuilder{Col: "cpu_num", MeasureRange: m} -} - -// MatchMemBuilder mem builder -func (m *MeasureRange) MatchMemBuilder() *MeasureRangeBuilder { - return &MeasureRangeBuilder{Col: "dram_cap", MeasureRange: m} -} - -// MeasureRangeBuilder build range sql -type MeasureRangeBuilder struct { - Col string - *MeasureRange -} - -// Build build orm query sql -// nolint -func (m *MeasureRangeBuilder) Build(builder clause.Builder) { - switch { - case m.Min > 0 && m.Max > 0: - builder.WriteQuoted(m.Col) - builder.WriteString(fmt.Sprintf(" >= %d AND ", m.Min)) - builder.WriteQuoted(m.Col) - builder.WriteString(fmt.Sprintf(" <= %d ", m.Max)) - case m.Max > 0 && m.Min <= 0: - builder.WriteQuoted(m.Col) - builder.WriteString(fmt.Sprintf(" <= %d ", m.Max)) - case m.Max <= 0 && m.Min > 0: - builder.WriteQuoted(m.Col) - builder.WriteString(fmt.Sprintf(" >= %d ", m.Min)) - } -} - -// IsNotEmpty is not empty -func (m MeasureRange) IsNotEmpty() bool { - return m.Max > 0 && m.Min > 0 -} - -// IsEmpty is empty -func (m MeasureRange) IsEmpty() bool { - return m.Min == 0 && m.Max == 0 -} - -// DiskSpec disk spec param -type DiskSpec struct { - DiskType string `json:"disk_type"` - MinSize int `json:"min"` - MaxSize int `json:"max"` - MountPoint string `json:"mount_point"` -} - -// MountPointIsEmpty determine whether the disk parameter is empty -func (d DiskSpec) MountPointIsEmpty() bool { - return cmutil.IsEmpty(d.MountPoint) -} - -// LocationSpec location spec param -type LocationSpec struct { - City string `json:"city" validate:"required"` // 所属城市获取地域 - SubZoneIds []string `json:"sub_zone_ids"` - IncludeOrExclude bool `json:"include_or_exclue"` -} - -// IsEmpty whether the address location parameter is blank -func (l LocationSpec) IsEmpty() bool { - return cmutil.IsEmpty(l.City) -} - -// SubZoneIsEmpty determine whether subzone is empty -func (l LocationSpec) SubZoneIsEmpty() bool { - return l.IsEmpty() || len(l.SubZoneIds) == 0 -} diff --git a/dbm-services/common/db-resource/internal/svr/apply/apply.go b/dbm-services/common/db-resource/internal/svr/apply/apply.go index 531f727037..58c2a45910 100644 --- a/dbm-services/common/db-resource/internal/svr/apply/apply.go +++ b/dbm-services/common/db-resource/internal/svr/apply/apply.go @@ -14,12 +14,12 @@ package apply import ( "fmt" "path" - "strconv" "strings" "dbm-services/common/db-resource/internal/config" "dbm-services/common/db-resource/internal/model" "dbm-services/common/db-resource/internal/svr/bk" + "dbm-services/common/db-resource/internal/svr/dbmapi" "dbm-services/common/db-resource/internal/svr/meta" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/errno" @@ -56,7 +56,7 @@ func CycleApply(param RequestInputParam) (pickers []*PickerObject, err error) { if config.AppConfig.RunMode == "dev" { idcCitys = []string{} } else if cmutil.ElementNotInArry(v.Affinity, []string{CROSS_RACK, NONE}) || lo.IsNotEmpty(&v.LocationSpec.City) { - idcCitys, err = meta.GetIdcCityByLogicCity(v.LocationSpec.City) + idcCitys, err = dbmapi.GetIdcCityByLogicCity(v.LocationSpec.City) if err != nil { logger.Error("request real citys by logic city %s from bkdbm api failed:%v", v.LocationSpec.City, err) return pickers, err @@ -134,18 +134,17 @@ func (o *SearchContext) pickBase(db *gorm.DB) { // 如果没有指定资源类型,表示只能选择无资源类型标签的资源 // 没有资源类型标签的资源可以被所有其他类型使用 - if cmutil.IsEmpty(o.RsType) { - db.Where("JSON_LENGTH(rs_types) <= 0") + if lo.IsEmpty(o.RsType) { + db.Where("rs_type == 'PUBLIC' ") } else { - db.Where("? or JSON_LENGTH(rs_types) <= 0 ", model.JSONQuery("rs_types").Contains([]string{o.RsType})) + db.Where("rs_type in (?)", []string{"PUBLIC", o.RsType}) } // 如果没有指定专属业务,就表示只能选用公共的资源 // 不能匹配打了业务标签的资源 if o.IntetionBkBizId <= 0 { - db.Where("JSON_LENGTH(dedicated_bizs) <= 0") + db.Where("dedicated_biz == 0") } else { - db.Where("? or JSON_LENGTH(dedicated_bizs) <= 0", model.JSONQuery("dedicated_bizs").Contains([]string{ - strconv.Itoa(o.IntetionBkBizId)})) + db.Where("dedicated_biz in (?)", []int{0, o.IntetionBkBizId}) } o.MatchLables(db) o.MatchLocationSpec(db) @@ -191,7 +190,7 @@ func (o *SearchContext) PickInstance() (picker *PickerObject, err error) { } // 过滤没有挂载点的磁盘匹配需求 logger.Info("storage spec %v", o.StorageSpecs) - diskSpecs := GetEmptyDiskSpec(o.StorageSpecs) + diskSpecs := meta.GetEmptyDiskSpec(o.StorageSpecs) if len(diskSpecs) > 0 { ts := []model.TbRpDetail{} for _, ins := range items { @@ -201,7 +200,7 @@ func (o *SearchContext) PickInstance() (picker *PickerObject, err error) { } logger.Info("%v", ins.Storages) noUseStorages := make(map[string]bk.DiskDetail) - smp := GetDiskSpecMountPoints(o.StorageSpecs) + smp := meta.GetDiskSpecMountPoints(o.StorageSpecs) for mp, v := range ins.Storages { if cmutil.ElementNotInArry(mp, smp) { noUseStorages[mp] = v @@ -239,7 +238,7 @@ func (o *SearchContext) MatchLables(db *gorm.DB) { db.Where(" JSON_TYPE(label) = 'NULL' OR JSON_LENGTH(label) <= 1 ") } -func matchNoMountPointStorage(spec []DiskSpec, sinc map[string]bk.DiskDetail) bool { +func matchNoMountPointStorage(spec []meta.DiskSpec, sinc map[string]bk.DiskDetail) bool { mcount := 0 for _, s := range spec { for mp, d := range sinc { @@ -253,7 +252,7 @@ func matchNoMountPointStorage(spec []DiskSpec, sinc map[string]bk.DiskDetail) bo return mcount == len(spec) } -func diskDetailMatch(d bk.DiskDetail, s DiskSpec) bool { +func diskDetailMatch(d bk.DiskDetail, s meta.DiskSpec) bool { logger.Info("spec %v", s) logger.Info("detail %v", d) if d.DiskType != s.DiskType && cmutil.IsNotEmpty(s.DiskType) { diff --git a/dbm-services/common/db-resource/internal/svr/apply/core.go b/dbm-services/common/db-resource/internal/svr/apply/core.go index d5eaa8a7d5..35de15225a 100644 --- a/dbm-services/common/db-resource/internal/svr/apply/core.go +++ b/dbm-services/common/db-resource/internal/svr/apply/core.go @@ -146,106 +146,6 @@ func NewPicker(count int, item string) *PickerObject { } } -// PickerSameSubZone 挑选同subzone的资源 -// func (c *PickerObject) PickerSameSubZone(cross_switch bool) { -// sortSubZones := c.sortSubZone(false) -// if len(sortSubZones) == 0 { -// return -// } -// for _, subzone := range sortSubZones { -// logger.Info("PickerSameSubZone:PickeElements: %v", c.PickeElements[subzone]) -// if len(c.PickeElements[subzone]) < c.Count || len(c.PickeElements[subzone]) == 0 { -// c.ProcessLogs = append(c.ProcessLogs, fmt.Sprintf("%s 符合条件的资源有%d,实际需要申请%d,不满足!!!", -// subzone, len(c.PickeElements[subzone]), c.Count)) -// continue -// } -// logger.Info("dbeug %v", subzone) -// logger.Info("dbeug %v", c.PickeElements[subzone]) -// c.SatisfiedHostIds = []int{} -// c.ExistEquipmentIds = []string{} -// c.ExistLinkNetdeviceIds = []string{} -// for idx := range c.PickeElements[subzone] { -// logger.Info("loop %d", idx) -// c.pickerOne(subzone, cross_switch) -// // 匹配资源完成 -// logger.Info(fmt.Sprintf("surplus %s,%d", subzone, len(c.PickeElements[subzone]))) -// logger.Info(fmt.Sprintf("%s,%d,%d", subzone, c.Count, len(c.SatisfiedHostIds))) -// if c.PickerDone() { -// return -// } -// } -// } -// } - -// Picker 筛选,匹配资源 -// -// @receiver c -// @param cross_campus 是否跨园区 -// func (c *PickerObject) Picker(cross_subzone bool) { -// campKeys := c.sortSubZone(cross_subzone) -// if len(campKeys) == 0 { -// return -// } -// subzoneChan := make(chan subzone, len(campKeys)) -// for _, v := range campKeys { -// subzoneChan <- v -// } -// for subzone := range subzoneChan { -// if len(c.PickeElements[subzone]) == 0 { -// delete(c.PickeElements, subzone) -// } -// if len(c.sortSubZone(cross_subzone)) == 0 { -// logger.Info("go out here") -// close(subzoneChan) -// return -// } -// logger.Info(fmt.Sprintf("surplus %s,%d", subzone, len(c.PickeElements[subzone]))) -// logger.Info(fmt.Sprintf("%s,%d,%d", subzone, c.Count, len(c.SatisfiedHostIds))) -// if c.pickerOne(subzone, false) { -// if cross_subzone { -// delete(c.PickeElements, subzone) -// } -// } -// // 匹配资源完成 -// if c.PickerDone() { -// close(subzoneChan) -// return -// } -// // 非跨园区循环读取 -// if !cross_subzone { -// subzoneChan <- subzone -// continue -// } -// // 跨园区 -// if len(subzoneChan) == 0 { -// close(subzoneChan) -// return -// } -// } - -// } - -// func (c *PickerObject) pickerOne(key string, cross_switch bool) bool { -// c.ExistSubZone = append(c.ExistSubZone, key) -// for _, v := range c.PickeElements[key] { -// if cross_switch { -// if !c.CrossRackCheck(v) || !c.CrossSwitchCheck(v) { -// // 如果存在交集,则删除该元素 -// c.deleteElement(key, v.BkHostId) -// continue -// } -// } -// c.ExistEquipmentIds = append(c.ExistEquipmentIds, v.Equipment) -// c.SatisfiedHostIds = append(c.SatisfiedHostIds, v.BkHostId) -// c.SelectedResources = append(c.SelectedResources, v.InsDetail) -// c.ExistLinkNetdeviceIds = append(c.ExistLinkNetdeviceIds, v.LinkNetdeviceId...) -// c.PickDistrbute[key]++ -// c.deleteElement(key, v.BkHostId) -// return true -// } -// return len(c.PickeElements) == 0 -// } - // CrossSwitchCheck 跨交换机检查 func (c *PickerObject) CrossSwitchCheck(v InstanceObject) bool { if len(v.LinkNetdeviceId) == 0 { @@ -269,16 +169,6 @@ func (c *PickerObject) DebugDistrubuteLog() { } } -// func (c *PickerObject) deleteElement(key string, bkhostId int) { -// var k []InstanceObject -// for _, v := range c.PickeElements[key] { -// if v.BkHostId != bkhostId { -// k = append(k, v) -// } -// } -// c.PickeElements[key] = k -// } - // PreselectedSatisfiedInstance TODO func (c *PickerObject) PreselectedSatisfiedInstance() error { affectRows, err := model.UpdateTbRpDetail(c.SatisfiedHostIds, model.Preselected) @@ -324,29 +214,6 @@ func (pw CampusWrapper) Less(i, j int) bool { return pw.by(&pw.Campus[i], &pw.Campus[j]) } -// sortSubZone 根据排序剩下有效的园区 -// func (c *PickerObject) sortSubZone(cross_subzone bool) []string { -// var keys []string -// var campusNice []CampusNice -// for key, campusIntances := range c.PickeElements { -// // keys = append(keys, key) -// if !cross_subzone || cmutil.ElementNotInArry(key, c.ExistSubZone) { -// campusNice = append(campusNice, CampusNice{ -// Campus: key, -// Count: len(campusIntances), -// }) -// } -// } -// // 按照每个园区的数量从大到小排序 -// sort.Sort(CampusWrapper{campusNice, func(p, q *CampusNice) bool { -// return q.Count < p.Count -// }}) -// for _, capmus := range campusNice { -// keys = append(keys, capmus.Campus) -// } -// return keys -// } - // PickerDone TODO func (c *PickerObject) PickerDone() bool { return len(c.SatisfiedHostIds) == c.Count diff --git a/dbm-services/common/db-resource/internal/svr/apply/match_resource.go b/dbm-services/common/db-resource/internal/svr/apply/match_resource.go index 44565b2a2b..d486fffadf 100644 --- a/dbm-services/common/db-resource/internal/svr/apply/match_resource.go +++ b/dbm-services/common/db-resource/internal/svr/apply/match_resource.go @@ -11,7 +11,6 @@ package apply import ( - "encoding/json" "fmt" "sort" "strconv" @@ -200,18 +199,12 @@ const ( ) func (o *SearchContext) setResourcePriority(ins model.TbRpDetail, ele *Item) { - var insDedicatedBizIds []string - var insDedicatedRstyps []string + logger.Info("%v", ins.Storages) if err := ins.UnmarshalDiskInfo(); err != nil { logger.Error("%s umarshal disk failed %s", ins.IP, err.Error()) } - if err := json.Unmarshal(ins.DedicatedBizs, &insDedicatedBizIds); err != nil { - logger.Error("unmarshal dedicate bizs failed %v", err) - } - if err := json.Unmarshal(ins.RsTypes, &insDedicatedRstyps); err != nil { - logger.Error("unmarshal resource type failed %v", err) - } + // 如果请求的磁盘为空,尽量匹配没有磁盘的机器 // 请求参数需要几块盘,如果机器盘数量预制相等,则优先级更高 if len(o.StorageSpecs) == len(ins.Storages) { @@ -222,15 +215,12 @@ func (o *SearchContext) setResourcePriority(ins model.TbRpDetail, ele *Item) { ele.Priority += PriorityP1 } // 如果请求参数请求了专属业务资源,则标记了专用业务的资源优先级更高 - if o.IntetionBkBizId > 0 && lo.Contains(insDedicatedBizIds, strconv.Itoa(o.IntetionBkBizId)) { - ele.Priority += PriorityP2 - } - // 如果请求参数请求了专属db类型,则标记了专用db类型的资源优先级更高 - if lo.IsNotEmpty(o.RsType) && lo.Contains(insDedicatedRstyps, o.RsType) { + if o.IntetionBkBizId > 0 && ins.DedicatedBiz == o.IntetionBkBizId { ele.Priority += PriorityP2 } + // 如果请求参数请求了专属db类型,机器的资源类型标签只有一个,且等于请求的资源的类中,则优先级更高 - if lo.IsNotEmpty(o.RsType) && (len(insDedicatedRstyps) == 1 && insDedicatedRstyps[0] == o.RsType) { + if lo.IsNotEmpty(o.RsType) && (ins.RsType == o.RsType) { ele.Priority += PriorityP2 } // 如果是匹配的资源是redis资源 diff --git a/dbm-services/common/db-resource/internal/svr/bk/cc_test.go b/dbm-services/common/db-resource/internal/svr/bk/cc_test.go index be740211d8..6986359c27 100644 --- a/dbm-services/common/db-resource/internal/svr/bk/cc_test.go +++ b/dbm-services/common/db-resource/internal/svr/bk/cc_test.go @@ -61,9 +61,9 @@ func TestReserverCC(t *testing.T) { }) } param := manage.ImportMachParam{ - ForBizs: []int{1001, 1002}, + ForBiz: 1001, BkBizId: 100443, - RsTypes: []string{"MySQL", "Redis"}, + RsType: "MySQL", Hosts: hosts, } importResp, err := manage.Doimport(param) diff --git a/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_api.go b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_api.go new file mode 100644 index 0000000000..3028afb97e --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_api.go @@ -0,0 +1,22 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package dbmapi + +const ( + // DBMLogicCityApi 查询逻辑城市映射 + DBMLogicCityApi = "/apis/proxypass/dbmeta/bk_city_name/" + // DBMListAllLogicCityInfoApi 查询所有逻辑城市信息 + DBMListAllLogicCityInfoApi = "/apis/infras/cities/list_logic_cities/" + // DBMEnvironApi 查询DBM环境变量 + DBMEnvironApi = "/apis/conf/system_settings/environ/" + // DBMSpecApi 查询规格接口 + DBMSpecApi = "/apis/dbresource/spec/" +) diff --git a/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_env.go b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_env.go new file mode 100644 index 0000000000..13c58d0c7b --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_env.go @@ -0,0 +1,80 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package dbmapi + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + + "dbm-services/common/go-pubpkg/logger" +) + +// DbmEnvData TODO +type DbmEnvData struct { + BK_DOMAIN string `json:"BK_DOMAIN"` + CC_IDLE_MODULE_ID int `json:"CC_IDLE_MODULE_ID"` + CC_MANAGE_TOPO struct { + SetId int `json:"set_id"` + DirtyModuleId int `json:"dirty_module_id"` + ResourceModuleId int `json:"resource_module_id"` + } `json:"CC_MANAGE_TOPO"` +} + +// GetDbmEnv get dbm env +func GetDbmEnv() (data DbmEnvData, err error) { + c := NewDbmClient() + return c.getDbmEnv() +} + +// getDbmEnv get dbm env +func (c *DbmClient) getDbmEnv() (data DbmEnvData, err error) { + u, err := url.JoinPath(c.EndPoint, DBMEnvironApi) + if err != nil { + return DbmEnvData{}, err + } + logger.Info("request url %s", u) + req, err := http.NewRequest(http.MethodGet, u, nil) + if err != nil { + return DbmEnvData{}, err + } + c.addCookie(req) + var content []byte + resp, err := http.DefaultClient.Do(req) + if resp.Body != nil { + content, err = io.ReadAll(resp.Body) + if err != nil { + logger.Error("read respone body failed %s", err.Error()) + return data, err + } + } + if err != nil { + return DbmEnvData{}, fmt.Errorf("respone body %s,err:%v", string(content), err) + } + defer resp.Body.Close() + logger.Info("get dbm env respone body %s", string(content)) + + var rpdata DbmBaseResp + if err = json.Unmarshal(content, &rpdata); err != nil { + return DbmEnvData{}, err + } + if rpdata.Code != 0 { + return DbmEnvData{}, errors.New(rpdata.Message) + } + var dbmEnvResp DbmEnvData + if err = json.Unmarshal(rpdata.Data, &dbmEnvResp); err != nil { + return DbmEnvData{}, err + } + return dbmEnvResp, nil +} diff --git a/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_logic_city.go b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_logic_city.go new file mode 100644 index 0000000000..87515d1897 --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_logic_city.go @@ -0,0 +1,155 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package dbmapi + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "net/url" + "time" + + "dbm-services/common/go-pubpkg/logger" +) + +// GetIdcCityByLogicCityParam TODO +type GetIdcCityByLogicCityParam struct { + LogicCityName string `json:"logic_city_name"` +} + +// IdcCitysResp idc citys respone +type IdcCitysResp struct { + Code int `json:"code"` + Message string `json:"message"` + Data []string `json:"data"` + RequestId string `json:"request_id"` +} + +// GetIdcCityByLogicCity 根据逻辑城市获取实际对应城市列表 +func GetIdcCityByLogicCity(logicCity string) (idcCitys []string, err error) { + var content []byte + cli := NewDbmClient() + u, err := url.JoinPath(cli.EndPoint, DBMLogicCityApi) + if err != nil { + return nil, err + } + p := GetIdcCityByLogicCityParam{ + LogicCityName: logicCity, + } + body, err := json.Marshal(p) + if err != nil { + logger.Error("marshal GetIdcCityByLogicCityParam body failed %s ", err.Error()) + return nil, err + } + request, err := http.NewRequest(http.MethodPost, u, bytes.NewBuffer(body)) + if err != nil { + return nil, err + } + request.Header.Add("content-type", "application/json;charset=utf-8") + cli.addCookie(request) + + f := func() (content []byte, err error) { + resp, err := cli.Client.Do(request) + if err != nil { + return nil, err + } + defer resp.Body.Close() + content, err = io.ReadAll(resp.Body) + if err != nil { + logger.Error("read respone body failed %s", err.Error()) + return nil, err + } + return + } + + for i := 0; i <= 3; i++ { + content, err = f() + if err == nil { + break + } + logger.Error("read respone body failed %s", err.Error()) + time.Sleep(1 * time.Second) + } + + if err != nil { + logger.Error("try 3 time get real citys from dbm failed %s", err.Error()) + return nil, err + } + + logger.Info("respone %v", string(content)) + var d IdcCitysResp + if err = json.Unmarshal(content, &d); err != nil { + return nil, err + } + return d.Data, nil +} + +// LogicCityInfo 逻辑城市信息 +type LogicCityInfo struct { + BkIdcCityId int `json:"bk_idc_city_id"` + BkIdcCityName string `json:"bk_idc_city_name"` + LogicalCity int `json:"logical_city"` + LogicalCityName string `json:"logical_city_name"` +} + +// GetAllLogicCityInfo 获取所有逻辑城市信息 +func GetAllLogicCityInfo() (idcCitys []LogicCityInfo, err error) { + var content []byte + cli := NewDbmClient() + u, err := url.JoinPath(cli.EndPoint, DBMListAllLogicCityInfoApi) + if err != nil { + return nil, err + } + request, err := http.NewRequest(http.MethodGet, u, nil) + if err != nil { + return nil, err + } + request.Header.Add("content-type", "application/json;charset=utf-8") + cli.addCookie(request) + + f := func() (content []byte, err error) { + resp, err := cli.Client.Do(request) + if err != nil { + return nil, err + } + defer resp.Body.Close() + content, err = io.ReadAll(resp.Body) + if err != nil { + logger.Error("read respone body failed %s", err.Error()) + return nil, err + } + return + } + for i := 0; i <= 3; i++ { + content, err = f() + if err == nil { + break + } + logger.Error("read respone body failed %s", err.Error()) + time.Sleep(1 * time.Second) + } + + if err != nil { + logger.Error("try 3 time get real citys from dbm failed %s", err.Error()) + return nil, err + } + logger.Info("respone %v", string(content)) + var d DbmBaseResp + if err = json.Unmarshal(content, &d); err != nil { + return nil, err + } + var d2 []LogicCityInfo + if err = json.Unmarshal(d.Data, &d2); err != nil { + return nil, err + } + return d2, nil +} diff --git a/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_spec.go b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_spec.go new file mode 100644 index 0000000000..1811e53696 --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/dbmapi/dbm_spec.go @@ -0,0 +1,135 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +// Package dbmapi TODO +package dbmapi + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + + "dbm-services/common/db-resource/internal/config" + "dbm-services/common/db-resource/internal/svr/meta" + + "dbm-services/common/go-pubpkg/cmutil" + "dbm-services/common/go-pubpkg/logger" +) + +// DbmSpec Data dbm 规格信息 +type DbmSpec struct { + SpecId int `json:"spec_id"` + SpecName string `json:"spec_name"` + SpecClusterType string `json:"spec_cluster_type"` + SpecMachineType string `json:"spec_machine_type"` + DeviceClass []string `json:"device_class"` + Mem meta.MeasureRange `json:"mem"` + Cpu meta.MeasureRange `json:"cpu"` + StorageSpecs []RealDiskSpec `json:"storage_spec"` +} + +// RealDiskSpec 真实磁盘规格 +type RealDiskSpec struct { + DiskType string `json:"type"` + Size int `json:"size"` + MountPoint string `json:"mount_point"` +} + +// DbmSpecBaseResp dbm 规格信息 +type DbmSpecBaseResp struct { + Count int `json:"code"` + Results []DbmSpec `json:"results"` +} + +// DbmBaseResp dbm base api respone data +type DbmBaseResp struct { + Code int `json:"code"` + Message string `json:"message"` + RequestId string `json:"request_id"` + Data json.RawMessage `json:"data"` +} + +// DbmClient request client +type DbmClient struct { + EndPoint string + AppCode string + AppSecret string + Client *http.Client +} + +// NewDbmClient TODO +func NewDbmClient() *DbmClient { + base := config.AppConfig.DbMeta + if cmutil.IsEmpty(config.AppConfig.DbMeta) { + base = "http://bk-dbm" + } + return &DbmClient{ + EndPoint: base, + AppCode: config.AppConfig.BkSecretConfig.BkAppCode, + AppSecret: config.AppConfig.BkSecretConfig.BKAppSecret, + Client: &http.Client{}, + } +} + +// GetDbmSpec 获取dbm规格 +func (c *DbmClient) GetDbmSpec(queryParam map[string]string) (specData []DbmSpec, err error) { + fullUrl, err := url.JoinPath(c.EndPoint, DBMSpecApi) + if err != nil { + return nil, err + } + u, err := url.Parse(fullUrl) + if err != nil { + return nil, err + } + query := u.Query() + for k, v := range queryParam { + query.Set(k, v) + } + query.Set("limit", "-1") + u.RawQuery = query.Encode() + request, err := http.NewRequest("GET", u.String(), nil) + if err != nil { + return nil, err + } + c.addCookie(request) + resp, err := c.Client.Do(request) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + logger.Error("read respone body failed %s", err.Error()) + return + } + var rpdata DbmBaseResp + if err = json.Unmarshal(body, &rpdata); err != nil { + logger.Error("unmarshal respone body failed %s", err.Error()) + return + } + if rpdata.Code != 0 { + return nil, fmt.Errorf("respone code:%d,message:%s", rpdata.Code, rpdata.Message) + } + var specRespData DbmSpecBaseResp + if err = json.Unmarshal(rpdata.Data, &specRespData); err != nil { + logger.Error("unmarshal DbmBaseResp body failed %s", err.Error()) + return + } + return specRespData.Results, nil +} + +func (c *DbmClient) addCookie(request *http.Request) { + request.AddCookie(&http.Cookie{Name: "bk_app_code", Path: "/", Value: c.AppCode, + MaxAge: 86400}) + request.AddCookie(&http.Cookie{Name: "bk_app_secret", Path: "/", Value: c.AppSecret, + MaxAge: 86400}) +} diff --git a/dbm-services/common/db-resource/internal/svr/meta/disk.go b/dbm-services/common/db-resource/internal/svr/meta/disk.go new file mode 100644 index 0000000000..7a8c5e8a36 --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/meta/disk.go @@ -0,0 +1,55 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package meta + +import ( + "path" + + "dbm-services/common/go-pubpkg/cmutil" + "dbm-services/common/go-pubpkg/logger" +) + +// MeasureRange cpu spec range + +// DiskSpec disk spec param +type DiskSpec struct { + DiskType string `json:"disk_type"` + MinSize int `json:"min"` + MaxSize int `json:"max"` + MountPoint string `json:"mount_point"` +} + +// MountPointIsEmpty determine whether the disk parameter is empty +func (d DiskSpec) MountPointIsEmpty() bool { + return cmutil.IsEmpty(d.MountPoint) +} + +// GetEmptyDiskSpec get empty disk spec info +func GetEmptyDiskSpec(ds []DiskSpec) (dms []DiskSpec) { + for _, v := range ds { + if v.MountPointIsEmpty() { + dms = append(dms, v) + } + } + return +} + +// GetDiskSpecMountPoints get disk mount point +func GetDiskSpecMountPoints(ds []DiskSpec) (mountPoints []string) { + for _, v := range ds { + logger.Info("disk info %v", v) + if v.MountPointIsEmpty() { + continue + } + mountPoints = append(mountPoints, path.Clean(v.MountPoint)) + } + return +} diff --git a/dbm-services/common/db-resource/internal/svr/meta/location.go b/dbm-services/common/db-resource/internal/svr/meta/location.go new file mode 100644 index 0000000000..bf9a5eb1b8 --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/meta/location.go @@ -0,0 +1,30 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package meta + +import "dbm-services/common/go-pubpkg/cmutil" + +// LocationSpec location spec param +type LocationSpec struct { + City string `json:"city" validate:"required"` // 所属城市获取地域 + SubZoneIds []string `json:"sub_zone_ids"` + IncludeOrExclude bool `json:"include_or_exclue"` +} + +// IsEmpty whether the address location parameter is blank +func (l LocationSpec) IsEmpty() bool { + return cmutil.IsEmpty(l.City) +} + +// SubZoneIsEmpty determine whether subzone is empty +func (l LocationSpec) SubZoneIsEmpty() bool { + return l.IsEmpty() || len(l.SubZoneIds) == 0 +} diff --git a/dbm-services/common/db-resource/internal/svr/meta/meta.go b/dbm-services/common/db-resource/internal/svr/meta/meta.go index 66ef93a1b0..f9658b7bc1 100644 --- a/dbm-services/common/db-resource/internal/svr/meta/meta.go +++ b/dbm-services/common/db-resource/internal/svr/meta/meta.go @@ -1,3 +1,4 @@ +// Package meta TODO /* * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. @@ -7,165 +8,96 @@ * 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. */ - -// Package meta TODO package meta import ( - "bytes" - "encoding/json" - "errors" "fmt" - "io" - "net/http" - "net/url" - "time" - "dbm-services/common/db-resource/internal/config" - "dbm-services/common/go-pubpkg/cmutil" - "dbm-services/common/go-pubpkg/logger" + "gorm.io/gorm" + "gorm.io/gorm/clause" ) -const ( - // DBMCityUrl 查询逻辑城市映射 - DBMCityUrl = "/apis/proxypass/dbmeta/bk_city_name/" - // DBMEnviron 查询DBM环境变量 - DBMEnviron = "/apis/conf/system_settings/environ/" -) +// MeasureRange TODO +type MeasureRange struct { + Min int `json:"min"` + Max int `json:"max"` +} -// GetIdcCityByLogicCityParam TODO -type GetIdcCityByLogicCityParam struct { - LogicCityName string `json:"logic_city_name"` +// Iegal determine whether the parameter is legal +func (m MeasureRange) Iegal() bool { + if m.IsNotEmpty() { + return m.Max >= m.Min + } + return true } -// IdcCitysResp idc citys respone -type IdcCitysResp struct { - Code int `json:"code"` - Message string `json:"message"` - Data []string `json:"data"` - RequestId string `json:"request_id"` +// MatchTotalStorageSize match total disk capacity +func (m *MeasureRange) MatchTotalStorageSize(db *gorm.DB) { + m.MatchRange(db, "total_storage_cap") } -// DbmEnvResp dbm env respone -type DbmEnvResp struct { - Data DbmEnvData `json:"data"` - Code int `json:"code"` - Message string `json:"message"` - RequestId string `json:"request_id"` +// MatchMem match memory size range +func (m *MeasureRange) MatchMem(db *gorm.DB) { + m.MatchRange(db, "dram_cap") } -// DbmEnvData TODO -type DbmEnvData struct { - BK_DOMAIN string `json:"BK_DOMAIN"` - CC_IDLE_MODULE_ID int `json:"CC_IDLE_MODULE_ID"` - CC_MANAGE_TOPO struct { - SetId int `json:"set_id"` - DirtyModuleId int `json:"dirty_module_id"` - ResourceModuleId int `json:"resource_module_id"` - } `json:"CC_MANAGE_TOPO"` +// MatchCpu match cpu core number range +func (m *MeasureRange) MatchCpu(db *gorm.DB) { + m.MatchRange(db, "cpu_num") } -// GetDbmEnv get dbm env -func GetDbmEnv() (data DbmEnvData, err error) { - u, err := getRequestUrl(DBMEnviron) - if err != nil { - return DbmEnvData{}, err - } - logger.Info("request url %s", u) - req, err := http.NewRequest(http.MethodGet, u, nil) - if err != nil { - return DbmEnvData{}, err - } - addCookie(req) - var content []byte - resp, err := http.DefaultClient.Do(req) - if resp.Body != nil { - content, err = io.ReadAll(resp.Body) - if err != nil { - logger.Error("read respone body failed %s", err.Error()) - return data, err - } - } - if err != nil { - return DbmEnvData{}, fmt.Errorf("respone body %s,err:%v", string(content), err) - } - defer resp.Body.Close() - var rpdata DbmEnvResp - if err = json.Unmarshal(content, &rpdata); err != nil { - return DbmEnvData{}, err - } - if rpdata.Code != 0 { - return DbmEnvData{}, errors.New(rpdata.Message) +// MatchRange universal range matching +func (m *MeasureRange) MatchRange(db *gorm.DB, col string) { + switch { + case m.Min > 0 && m.Max > 0: + db.Where(col+" >= ? and "+col+" <= ?", m.Min, m.Max) + case m.Max > 0 && m.Min <= 0: + db.Where(col+" <= ?", m.Max) + case m.Max <= 0 && m.Min > 0: + db.Where(col+" >= ?", m.Min) } - logger.Info("get dbm env respone body %s", string(content)) - return rpdata.Data, nil } -func addCookie(request *http.Request) { - request.AddCookie(&http.Cookie{Name: "bk_app_code", Path: "/", Value: config.AppConfig.BkSecretConfig.BkAppCode, - MaxAge: 86400}) - request.AddCookie(&http.Cookie{Name: "bk_app_secret", Path: "/", Value: config.AppConfig.BkSecretConfig.BKAppSecret, - MaxAge: 86400}) +// MatchCpuBuilder cpu builder +func (m *MeasureRange) MatchCpuBuilder() *MeasureRangeBuilder { + return &MeasureRangeBuilder{Col: "cpu_num", MeasureRange: m} } -func getRequestUrl(apiaddr string) (string, error) { - base := config.AppConfig.DbMeta - if cmutil.IsEmpty(config.AppConfig.DbMeta) { - base = "http://bk-dbm" - } - return url.JoinPath(base, apiaddr) +// MatchMemBuilder mem builder +func (m *MeasureRange) MatchMemBuilder() *MeasureRangeBuilder { + return &MeasureRangeBuilder{Col: "dram_cap", MeasureRange: m} } -// GetIdcCityByLogicCity 根据逻辑城市获取实际对应城市列表 -func GetIdcCityByLogicCity(logicCity string) (idcCitys []string, err error) { - var content []byte - u, err := getRequestUrl(DBMCityUrl) - if err != nil { - return nil, err - } - p := GetIdcCityByLogicCityParam{ - LogicCityName: logicCity, - } - client := &http.Client{} // 客户端,被Get,Head以及Post使用 - body, err := json.Marshal(p) - if err != nil { - logger.Error("marshal GetIdcCityByLogicCityParam body failed %s ", err.Error()) - return nil, err - } - request, err := http.NewRequest(http.MethodPost, u, bytes.NewBuffer(body)) - if err != nil { - return nil, err - } - request.Header.Add("content-type", "application/json;charset=utf-8") - addCookie(request) +// MeasureRangeBuilder build range sql +type MeasureRangeBuilder struct { + Col string + *MeasureRange +} - f := func() (content []byte, err error) { - resp, err := client.Do(request) - if err != nil { - return nil, err - } - defer resp.Body.Close() - content, err = io.ReadAll(resp.Body) - if err != nil { - logger.Error("read respone body failed %s", err.Error()) - return nil, err - } - return +// Build build orm query sql +// nolint +func (m *MeasureRangeBuilder) Build(builder clause.Builder) { + switch { + case m.Min > 0 && m.Max > 0: + builder.WriteQuoted(m.Col) + builder.WriteString(fmt.Sprintf(" >= %d AND ", m.Min)) + builder.WriteQuoted(m.Col) + builder.WriteString(fmt.Sprintf(" <= %d ", m.Max)) + case m.Max > 0 && m.Min <= 0: + builder.WriteQuoted(m.Col) + builder.WriteString(fmt.Sprintf(" <= %d ", m.Max)) + case m.Max <= 0 && m.Min > 0: + builder.WriteQuoted(m.Col) + builder.WriteString(fmt.Sprintf(" >= %d ", m.Min)) } +} - for i := 0; i <= 3; i++ { - content, err = f() - if err == nil { - break - } - logger.Error("read respone body failed %s", err.Error()) - time.Sleep(1 * time.Second) - } +// IsNotEmpty is not empty +func (m MeasureRange) IsNotEmpty() bool { + return m.Max > 0 && m.Min > 0 +} - logger.Info("respone %v", string(content)) - var d IdcCitysResp - if err = json.Unmarshal(content, &d); err != nil { - return nil, err - } - return d.Data, nil +// IsEmpty is empty +func (m MeasureRange) IsEmpty() bool { + return m.Min == 0 && m.Max == 0 } diff --git a/dbm-services/common/db-resource/internal/svr/meta/spec.go b/dbm-services/common/db-resource/internal/svr/meta/spec.go new file mode 100644 index 0000000000..0516a7b288 --- /dev/null +++ b/dbm-services/common/db-resource/internal/svr/meta/spec.go @@ -0,0 +1,27 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * 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. + */ + +package meta + +// Spec cpu memory spec param +type Spec struct { + Cpu MeasureRange `json:"cpu"` // cpu range + Mem MeasureRange `json:"ram"` +} + +// IsEmpty judge spec is empty +func (s Spec) IsEmpty() bool { + return s.Cpu.IsEmpty() && s.Mem.IsEmpty() +} + +// NotEmpty judge spec is not empty +func (s Spec) NotEmpty() bool { + return s.Cpu.IsNotEmpty() || s.Mem.IsNotEmpty() +} diff --git a/dbm-services/common/db-resource/internal/svr/task/inspection_task.go b/dbm-services/common/db-resource/internal/svr/task/inspection_task.go index ceabebbd4a..8e538d5008 100644 --- a/dbm-services/common/db-resource/internal/svr/task/inspection_task.go +++ b/dbm-services/common/db-resource/internal/svr/task/inspection_task.go @@ -13,7 +13,8 @@ package task import ( "dbm-services/common/db-resource/internal/model" "dbm-services/common/db-resource/internal/svr/bk" - "dbm-services/common/db-resource/internal/svr/meta" + "dbm-services/common/db-resource/internal/svr/dbmapi" + "dbm-services/common/go-pubpkg/cc.v3" "dbm-services/common/go-pubpkg/cmutil" "dbm-services/common/go-pubpkg/logger" @@ -23,13 +24,13 @@ import ( func InspectCheckResource() (err error) { // 获取空闲机器 var machines []model.TbRpDetail - var allowCCMouduleInfo meta.DbmEnvData + var allowCCMouduleInfo dbmapi.DbmEnvData err = model.DB.Self.Table(model.TbRpDetailName()).Find(&machines, "status = ?", model.Unused).Error if err != nil { logger.Error("get unused machines failed %s", err.Error()) return err } - allowCCMouduleInfo, err = meta.GetDbmEnv() + allowCCMouduleInfo, err = dbmapi.GetDbmEnv() if err != nil { logger.Error("get dbm env failed %s", err.Error()) return err From 57d72d402281bb95fe98bbfd564db0edb41d8390 Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Wed, 28 Aug 2024 15:06:38 +0800 Subject: [PATCH 115/164] =?UTF-8?q?feat(backend):=20=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=B1=A0=E7=BB=9F=E8=AE=A1=E8=A7=86=E5=9B=BE=20#6753?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/components/dbresource/client.py | 6 ++ dbm-ui/backend/db_meta/admin.py | 7 ++ .../migrations/0042_auto_20240903_1138.py | 33 +++++++ dbm-ui/backend/db_meta/models/city_map.py | 16 ++++ .../db_services/dbresource/constants.py | 5 ++ dbm-ui/backend/db_services/dbresource/mock.py | 31 ++++++- .../db_services/dbresource/serializers.py | 88 +++++++++++++------ .../db_services/dbresource/views/resource.py | 51 ++++++++--- dbm-ui/backend/db_services/infras/host.py | 12 +++ .../backend/db_services/infras/serializers.py | 13 +++ dbm-ui/backend/db_services/infras/views.py | 22 ++++- .../charts/db-remote-service/values.yaml | 2 +- 12 files changed, 240 insertions(+), 46 deletions(-) create mode 100644 dbm-ui/backend/db_meta/migrations/0042_auto_20240903_1138.py diff --git a/dbm-ui/backend/components/dbresource/client.py b/dbm-ui/backend/components/dbresource/client.py index 80864af592..54d01528b6 100644 --- a/dbm-ui/backend/components/dbresource/client.py +++ b/dbm-ui/backend/components/dbresource/client.py @@ -100,6 +100,12 @@ def __init__(self): url="/resource/spec/sum", description=_("预申请获取资源数量"), ) + self.resource_group_count = self.generate_data_api( + method="POST", url="/statistic/groupby/resource_type", description=_("按照组件统计资源数量") + ) + self.resource_summary = self.generate_data_api( + method="POST", url="/statistic/summary", description=_("按照条件聚合资源统计") + ) DBResourceApi = _DBResourceApi() diff --git a/dbm-ui/backend/db_meta/admin.py b/dbm-ui/backend/db_meta/admin.py index ea8bf8211d..8c9ca28820 100644 --- a/dbm-ui/backend/db_meta/admin.py +++ b/dbm-ui/backend/db_meta/admin.py @@ -36,6 +36,13 @@ class BKCityAdmin(admin.ModelAdmin): search_fields = ("bk_idc_city_name",) +@admin.register(models.city_map.BKSubzone) +class BKSubzoneAdmin(admin.ModelAdmin): + list_display = ("bk_city", "bk_sub_zone", "bk_sub_zone_id") + list_filter = ("bk_city",) + search_fields = ("bk_sub_zone", "bk_sub_zone_id") + + @admin.register(models.cluster.Cluster) class ClusterAdmin(admin.ModelAdmin): list_display = ("name", "bk_biz_id", "cluster_type", "db_module_id", "immute_domain") diff --git a/dbm-ui/backend/db_meta/migrations/0042_auto_20240903_1138.py b/dbm-ui/backend/db_meta/migrations/0042_auto_20240903_1138.py new file mode 100644 index 0000000000..f41989ade6 --- /dev/null +++ b/dbm-ui/backend/db_meta/migrations/0042_auto_20240903_1138.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.25 on 2024-09-03 03:38 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("db_meta", "0041_auto_20240819_1031"), + ] + + operations = [ + migrations.CreateModel( + name="BKSubzone", + fields=[ + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("creator", models.CharField(max_length=64, verbose_name="创建人")), + ("create_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), + ("updater", models.CharField(max_length=64, verbose_name="修改人")), + ("update_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), + ( + "bk_sub_zone", + models.CharField(blank=True, default="", help_text="子 Zone", max_length=128, null=True), + ), + ("bk_sub_zone_id", models.IntegerField(default=0, help_text="子 Zone ID")), + ("bk_city", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="db_meta.bkcity")), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/dbm-ui/backend/db_meta/models/city_map.py b/dbm-ui/backend/db_meta/models/city_map.py index 16a5374a90..e66f17df9d 100644 --- a/dbm-ui/backend/db_meta/models/city_map.py +++ b/dbm-ui/backend/db_meta/models/city_map.py @@ -44,3 +44,19 @@ def __str__(self): class Meta: verbose_name = verbose_name_plural = _("蓝鲸城市表(BKCity)") + + +class BKSubzone(AuditedModel): + """ + 机器实际的园区 + """ + + bk_sub_zone = models.CharField(max_length=128, default="", blank=True, null=True, help_text=_("子 Zone")) + bk_sub_zone_id = models.IntegerField(default=0, help_text=_("子 Zone ID")) + bk_city = models.ForeignKey(BKCity, on_delete=models.PROTECT) + + def __str__(self): + return self.bk_sub_zone + + class Meta: + verbose_name = verbose_name_plural = _("蓝鲸园区表(BKSubzone)") diff --git a/dbm-ui/backend/db_services/dbresource/constants.py b/dbm-ui/backend/db_services/dbresource/constants.py index ebe3703001..5d4f2a27cc 100644 --- a/dbm-ui/backend/db_services/dbresource/constants.py +++ b/dbm-ui/backend/db_services/dbresource/constants.py @@ -44,3 +44,8 @@ class ResourceOperation(str, StructuredEnum): import_hosts = EnumField("imported", _("导入主机")) consume_hosts = EnumField("consumed", _("消费主机")) + + +class ResourceGroupByEnum(str, StructuredEnum): + DEVICE_CLASS = EnumField("device_class", _("按照机型聚合")) + SPEC = EnumField("spec", _("按规格聚合")) diff --git a/dbm-ui/backend/db_services/dbresource/mock.py b/dbm-ui/backend/db_services/dbresource/mock.py index 112cd6e656..09972e6736 100644 --- a/dbm-ui/backend/db_services/dbresource/mock.py +++ b/dbm-ui/backend/db_services/dbresource/mock.py @@ -55,8 +55,8 @@ "bk_mem": 15, "bk_cpu": 8, "bk_disk": 0, - "resource_types": ["influxdb"], - "for_bizs": [{"bk_biz_id": 2005000100, "bk_biz_name": "xxxx"}], + "resource_type": "influxdb", + "for_biz": {"bk_biz_id": 2005000100, "bk_biz_name": "xxxx"}, }, ] @@ -81,9 +81,32 @@ RESOURCE_UPDATE_PARAMS = { "bk_host_ids": [192], - "for_bizs": [3], - "resource_types": ["tendbcluster"], + "for_biz": 3, + "resource_type": "tendbcluster", "set_empty_biz": False, "set_empty_resource_type": False, "storage_device": {"/data3": {"size": 200, "disk_type": "HDD"}}, } + +RESOURCE_SUMMARY_DATA = [ + { + "dedicated_biz": 3, + "for_biz_name": "业务1", + "city": "上海", + "spec_id": 1, + "spec_name": "2核4G100G磁盘", + "spec_machine_type": "single", + "count": 1, + "sub_zone_detail": {"上海-宝信": 1}, + }, + { + "dedicated_biz": 1001, + "for_biz_name": "业务2", + "city": "上海", + "device_class": "S5.4XLARGE32", + "disk_summary": "", + "cpu_mem_summary": "16核32000G", + "count": 1, + "sub_zone_detail": {"上海-宝信": 1}, + }, +] diff --git a/dbm-ui/backend/db_services/dbresource/serializers.py b/dbm-ui/backend/db_services/dbresource/serializers.py index 1133a0ebcf..d8c542ffe9 100644 --- a/dbm-ui/backend/db_services/dbresource/serializers.py +++ b/dbm-ui/backend/db_services/dbresource/serializers.py @@ -14,11 +14,11 @@ from rest_framework import serializers from backend import env -from backend.configuration.constants import DBType from backend.constants import INT_MAX from backend.db_meta.enums import ClusterType, InstanceRole, MachineType from backend.db_meta.models import Spec -from backend.db_services.dbresource.constants import ResourceOperation +from backend.db_services.dbresource import mock +from backend.db_services.dbresource.constants import ResourceGroupByEnum, ResourceOperation from backend.db_services.dbresource.mock import ( RECOMMEND_SPEC_DATA, RESOURCE_LIST_DATA, @@ -38,10 +38,8 @@ class HostInfoSerializer(serializers.Serializer): bk_cloud_id = serializers.IntegerField() os_type = serializers.CharField(required=False, default=BkOsTypeCode.LINUX) - for_bizs = serializers.ListSerializer(help_text=_("专属业务的ID列表"), child=serializers.IntegerField()) - resource_types = serializers.ListField( - help_text=_("专属DB"), child=serializers.ChoiceField(choices=DBType.get_choices()) - ) + for_biz = serializers.IntegerField(help_text=_("专属业务")) + resource_type = serializers.CharField(help_text=_("专属DB"), allow_blank=True, allow_null=True) bk_biz_id = serializers.IntegerField(help_text=_("机器当前所属的业务id "), default=env.DBA_APP_BK_BIZ_ID) hosts = serializers.ListSerializer(help_text=_("主机"), child=HostInfoSerializer()) labels = serializers.DictField(help_text=_("标签信息"), required=False) @@ -59,7 +57,7 @@ class HostDetailSerializer(serializers.Serializer): count = serializers.IntegerField(help_text=_("数量")) bk_cloud_id = serializers.IntegerField(help_text=_("云区域ID")) - resource_type = serializers.CharField(help_text=_("专属DB"), required=False) + resource_type = serializers.CharField(help_text=_("专属DB"), required=False, allow_null=True, allow_blank=True) for_biz_id = serializers.IntegerField(help_text=_("业务专属ID"), required=False) details = serializers.ListSerializer(help_text=_("资源申请参数"), child=HostDetailSerializer()) @@ -70,17 +68,17 @@ class Meta: class ResourceListSerializer(serializers.Serializer): - class ResourceLimitSerializer(serializers.Serializer): - min = serializers.IntegerField(help_text=_("资源最小值"), required=False) - max = serializers.IntegerField(help_text=_("资源最大值"), required=False) - - for_bizs = serializers.CharField(help_text=_("专属业务"), required=False) - resource_types = serializers.CharField(help_text=_("专属DB"), required=False) + for_biz = serializers.IntegerField(help_text=_("专属业务"), required=False) + resource_type = serializers.CharField(help_text=_("专属DB"), required=False, allow_null=True, allow_blank=True) device_class = serializers.CharField(help_text=_("机型"), required=False) hosts = serializers.CharField(help_text=_("主机IP列表"), required=False) bk_cloud_ids = serializers.CharField(help_text=_("云区域ID列表"), required=False) city = serializers.CharField(help_text=_("城市"), required=False) subzones = serializers.CharField(help_text=_("园区"), required=False) + subzone_ids = serializers.CharField(help_text=_("园区ID"), required=False) + + set_empty_biz = serializers.BooleanField(help_text=_("是否无专用业务"), required=False, default=False) + set_empty_resource_type = serializers.BooleanField(help_text=_("是否无专用资源类型"), required=False, default=False) os_type = serializers.CharField(help_text=_("操作系统类型"), required=False) cpu = serializers.CharField(help_text=_("cpu资源限制"), required=False) @@ -98,14 +96,18 @@ class ResourceLimitSerializer(serializers.Serializer): @staticmethod def format_fields(attrs, fields): + # 如果没有专用业务和专用DB,则无限制查询 + attrs["set_empty_biz"] = "for_biz" not in attrs + attrs["set_empty_resource_type"] = "resource_type" not in attrs + # 用逗号方便前端URL渲染,这里统一转换为数组 or obj for field in fields: divider = "-" if field in ["cpu", "mem", "disk"] else "," if attrs.get(field): attrs[field] = attrs[field].split(divider) - # for_bizs,bk_cloud_ids 要转换为int - if field in ["for_bizs", "bk_cloud_ids"]: + # bk_cloud_ids 要转换为int + if field in ["bk_cloud_ids"]: attrs[field] = list(map(int, attrs[field])) # cpu, mem, disk 需要转换为结构体 elif field in ["mem"]: @@ -138,12 +140,11 @@ def validate(self, attrs): self.format_fields( attrs, fields=[ - "for_bizs", - "resource_types", "device_class", "hosts", "city", "subzones", + "subzone_ids", "cpu", "mem", "disk", @@ -159,7 +160,17 @@ class Meta: class ListDBAHostsSerializer(QueryHostsBaseSer): - pass + def validate(self, attrs): + attrs = super().validate(attrs) + if not attrs.get("conditions"): + return attrs + + # ip这里需要精确查询 + attrs["conditions"] = [cond for cond in attrs["conditions"] if cond["field"] == "bk_host_innerip"] + for cond in attrs["conditions"]: + cond["operator"] = "equal" + + return attrs class QueryDBAHostsSerializer(serializers.Serializer): @@ -178,14 +189,8 @@ class ResourceDeleteSerializer(serializers.Serializer): class ResourceUpdateSerializer(serializers.Serializer): bk_host_ids = serializers.ListField(help_text=_("主机ID列表"), child=serializers.IntegerField()) labels = serializers.DictField(help_text=_("Labels"), required=False) - for_bizs = serializers.ListField(help_text=_("专用业务ID"), child=serializers.IntegerField(), required=False) - resource_types = serializers.ListField( - help_text=_("专属DB"), - child=serializers.ChoiceField(choices=DBType.get_choices()), - required=False, - ) - set_empty_biz = serializers.BooleanField(help_text=_("是否无专用业务"), required=False, default=False) - set_empty_resource_type = serializers.BooleanField(help_text=_("是否无专用资源类型"), required=False, default=False) + for_biz = serializers.IntegerField(help_text=_("专用业务ID"), required=False) + resource_type = serializers.CharField(help_text=_("专属DB"), allow_blank=True, allow_null=True) storage_device = serializers.JSONField(help_text=_("磁盘挂载点信息"), required=False) rack_id = serializers.CharField(help_text=_("机架ID"), required=False, allow_null=True, allow_blank=True) @@ -239,6 +244,37 @@ def validate(self, attrs): return attrs +class ResourceSummarySerializer(serializers.Serializer): + # 聚合过滤字段 + db_type = serializers.CharField(help_text=_("db类型")) + machine_type = serializers.ChoiceField( + help_text=_("机器类型"), choices=MachineType.get_choices(), required=False, default="" + ) + cluster_type = serializers.ChoiceField( + help_text=_("集群类型"), choices=ClusterType.get_choices(), required=False, default="" + ) + spec_id_list = serializers.CharField(help_text=_("规格ID"), required=False, default="") + + for_biz = serializers.IntegerField(help_text=_("专用业务ID"), required=False, default=0) + city = serializers.CharField(help_text=_("城市名"), required=False, allow_blank=True) + group_by = serializers.ChoiceField(help_text=_("聚合类型"), choices=ResourceGroupByEnum.get_choices()) + subzone_ids = serializers.CharField(help_text=_("园区"), required=False, default="") + + def validate(self, attrs): + # 平铺列表字段 + attrs["subzone_ids"] = attrs["subzone_ids"].split(",") if attrs["subzone_ids"] else [] + attrs["spec_id_list"] = attrs["spec_id_list"].split(",") if attrs["spec_id_list"] else [] + # 把聚合过滤字段放在spec_param + spec_param_fields = ["db_type", "machine_type", "cluster_type", "spec_id_list"] + attrs["spec_param"] = {field: attrs.pop(field) for field in spec_param_fields} + return attrs + + +class ResourceSummaryResponseSerializer(serializers.Serializer): + class Meta: + swagger_schema_fields = {"example": mock.RESOURCE_SUMMARY_DATA} + + class SpecSerializer(serializers.ModelSerializer): spec_db_type = serializers.SerializerMethodField(help_text=_("规格组件类型")) diff --git a/dbm-ui/backend/db_services/dbresource/views/resource.py b/dbm-ui/backend/db_services/dbresource/views/resource.py index 0c33cb5c52..bbde0bcc7f 100644 --- a/dbm-ui/backend/db_services/dbresource/views/resource.py +++ b/dbm-ui/backend/db_services/dbresource/views/resource.py @@ -9,7 +9,6 @@ specific language governing permissions and limitations under the License. """ -import itertools import time from collections import defaultdict from typing import Dict, List @@ -48,6 +47,8 @@ ResourceImportSerializer, ResourceListResponseSerializer, ResourceListSerializer, + ResourceSummaryResponseSerializer, + ResourceSummarySerializer, ResourceUpdateSerializer, SpecCountResourceResponseSerializer, SpecCountResourceSerializer, @@ -97,27 +98,28 @@ class DBResourceViewSet(viewsets.SystemViewSet): responses={status.HTTP_200_OK: ResourceListResponseSerializer()}, tags=[SWAGGER_TAG], ) + @action( + detail=False, methods=["POST"], url_path="list", serializer_class=ResourceListSerializer, pagination_class=None + ) @Permission.decorator_external_permission_field( param_field=lambda d: None, actions=[ActionEnum.RESOURCE_POLL_MANAGE], resource_meta=None, ) - @action(detail=False, methods=["POST"], url_path="list", serializer_class=ResourceListSerializer) def resource_list(self, request): - def _format_resource_fields(data, _cloud_info, _for_biz_infos): + def _format_resource_fields(data, _cloud_info, _biz_infos): data.update( { "bk_cloud_name": _cloud_info[str(data["bk_cloud_id"])]["bk_cloud_name"], "bk_host_innerip": data["ip"], - # 内存 MB --> GB "bk_mem": data.pop("dram_cap"), "bk_cpu": data.pop("cpu_num"), "bk_disk": data.pop("total_storage_cap"), - "resource_types": data.pop("resource_types"), - "for_bizs": [ - {"bk_biz_id": int(bk_biz_id), "bk_biz_name": _for_biz_infos[int(bk_biz_id)]} - for bk_biz_id in data.pop("for_bizs") - ], + "resource_type": data.pop("rs_type"), + "for_biz": { + "bk_biz_id": data["dedicated_biz"], + "bk_biz_name": _biz_infos.get(data["dedicated_biz"]), + }, "agent_status": int((data.pop("gse_agent_status_code") == GSE_AGENT_RUNNING_CODE)), } ) @@ -129,8 +131,7 @@ def _format_resource_fields(data, _cloud_info, _for_biz_infos): # 获取云区域信息和业务信息 cloud_info = ResourceQueryHelper.search_cc_cloud(get_cache=True) - for_biz_ids = list(set(itertools.chain(*[data["for_bizs"] for data in resource_data["details"]]))) - for_biz_ids = list(map(int, for_biz_ids)) + for_biz_ids = [data["dedicated_biz"] for data in resource_data["details"]] for_biz_infos = AppCache.batch_get_app_attr(bk_biz_ids=for_biz_ids, attr_name="bk_biz_name") # 格式化资源池字段信息 for data in resource_data.get("details") or []: @@ -141,7 +142,7 @@ def _format_resource_fields(data, _cloud_info, _for_biz_infos): @common_swagger_auto_schema( operation_summary=_("获取DBA业务下的主机信息"), - query_serializer=ListDBAHostsSerializer, + query_serializer=ListDBAHostsSerializer(), tags=[SWAGGER_TAG], ) @action(detail=False, methods=["GET"], url_path="list_dba_hosts", serializer_class=ListDBAHostsSerializer) @@ -169,7 +170,7 @@ def list_dba_hosts(self, request): @common_swagger_auto_schema( operation_summary=_("查询DBA业务下的主机信息"), - query_serializer=QueryDBAHostsSerializer, + query_serializer=QueryDBAHostsSerializer(), tags=[SWAGGER_TAG], ) @action(detail=False, methods=["GET"], url_path="query_dba_hosts", serializer_class=QueryDBAHostsSerializer) @@ -368,6 +369,30 @@ def resource_update(self, request): update_params = self.params_validate(self.get_serializer_class()) return Response(DBResourceApi.resource_batch_update(params=update_params)) + @common_swagger_auto_schema( + operation_summary=_("按照组件统计资源数量"), + tags=[SWAGGER_TAG], + ) + @action(detail=False, methods=["GET"]) + def resource_group_count(self, request): + return Response(DBResourceApi.resource_group_count()) + + @common_swagger_auto_schema( + operation_summary=_("按照条件聚合资源统计"), + query_serializer=ResourceSummarySerializer(), + responses={status.HTTP_200_OK: ResourceSummaryResponseSerializer()}, + tags=[SWAGGER_TAG], + ) + @action(methods=["GET"], detail=False, serializer_class=ResourceSummarySerializer) + def resource_summary(self, request): + group_params = self.params_validate(self.get_serializer_class()) + summary_data = DBResourceApi.resource_summary(params=group_params) + # 补充业务名 + for_biz_ids = [data["dedicated_biz"] for data in summary_data] + for_biz_infos = AppCache.batch_get_app_attr(bk_biz_ids=for_biz_ids, attr_name="bk_biz_name") + summary_data = [{"for_biz_name": for_biz_infos.get(data["dedicated_biz"]), **data} for data in summary_data] + return Response(summary_data) + @common_swagger_auto_schema( operation_summary=_("获取资源导入相关链接"), tags=[SWAGGER_TAG], diff --git a/dbm-ui/backend/db_services/infras/host.py b/dbm-ui/backend/db_services/infras/host.py index 0a9aa2257a..a184f554e6 100644 --- a/dbm-ui/backend/db_services/infras/host.py +++ b/dbm-ui/backend/db_services/infras/host.py @@ -16,6 +16,7 @@ from django.utils.translation import ugettext_lazy as _ from backend.db_meta.models import BKCity, LogicalCity +from backend.db_meta.models.city_map import BKSubzone from backend.db_services.dbbase.constants import IpSource from backend.db_services.infras.constants import InventoryTag @@ -71,6 +72,17 @@ def list_logic_cities() -> List: return logic_cities +def list_subzones(city_code: str = "") -> List: + subzones = BKSubzone.objects.select_related("bk_city").all() + if city_code: + subzones = subzones.filter(bk_city__bk_idc_city_name=city_code) + + subzone_infos = [] + for zone in subzones: + subzone_infos.append({**model_to_dict(zone), "bk_city_code": zone.bk_city.bk_idc_city_name}) + return subzone_infos + + def list_host_specs() -> List[HostSpecModel]: # TODO 暂时全量返回,后续机型设计时再做考虑 return [spec for spec in host_specs] diff --git a/dbm-ui/backend/db_services/infras/serializers.py b/dbm-ui/backend/db_services/infras/serializers.py index 87d9bf8870..b78a97e10d 100644 --- a/dbm-ui/backend/db_services/infras/serializers.py +++ b/dbm-ui/backend/db_services/infras/serializers.py @@ -39,6 +39,19 @@ class LogicCitySLZ(serializers.Serializer): logical_city_name = serializers.CharField() +class ListSubzoneSLZ(serializers.Serializer): + city_code = serializers.CharField(help_text=_("城市ID"), required=False, default="") + + +class SubzoneSLZ(serializers.Serializer): + """城市园区信息""" + + bk_city = serializers.IntegerField() + bk_city_code = serializers.CharField() + bk_sub_zone_id = serializers.IntegerField() + bk_sub_zone = serializers.CharField() + + class HostSpecSLZ(serializers.Serializer): """服务器规格""" diff --git a/dbm-ui/backend/db_services/infras/views.py b/dbm-ui/backend/db_services/infras/views.py index 07aa89f683..50e0c1ae72 100644 --- a/dbm-ui/backend/db_services/infras/views.py +++ b/dbm-ui/backend/db_services/infras/views.py @@ -15,11 +15,11 @@ from backend.bk_web import viewsets from backend.bk_web.swagger import common_swagger_auto_schema +from backend.configuration.constants import DBType from backend.db_meta.enums import ClusterType from backend.db_services.infras import serializers from backend.exceptions import ValidationError -from ...configuration.constants import DBType from ..dbbase.constants import IpSource from .host import ( list_cap_specs_cache, @@ -28,7 +28,9 @@ list_cities, list_host_specs, list_logic_cities, + list_subzones, ) +from .serializers import ListSubzoneSLZ SWAGGER_TAG = "infras" @@ -42,7 +44,11 @@ class DBTypeViewSet(viewsets.SystemViewSet): ) @action(methods=["GET"], detail=False) def list_db_types(self, requests, *args, **kwargs): - db_types = [{"id": db_type[0], "name": db_type[1]} for db_type in DBType.get_choices()] + db_types = [ + {"id": db_type[0], "name": db_type[1]} + for db_type in DBType.get_choices() + if db_type[0] not in [DBType.Cloud, DBType.TBinlogDumper] + ] return Response(db_types) @@ -69,6 +75,18 @@ def list_logic_cities(self, requests, *args, **kwargs): serializer = serializers.LogicCitySLZ(list_logic_cities(), many=True) return Response(serializer.data) + @common_swagger_auto_schema( + operation_summary=_("查询城市园区信息"), + query_serializer=ListSubzoneSLZ(), + responses={status.HTTP_200_OK: serializers.SubzoneSLZ(label=_("城市信息"), many=True)}, + tags=[SWAGGER_TAG], + ) + @action(methods=["GET"], detail=False, serializer_class=ListSubzoneSLZ) + def list_subzones(self, requests, *args, **kwargs): + params = self.params_validate(self.get_serializer_class()) + serializer = serializers.SubzoneSLZ(list_subzones(params["city_code"]), many=True) + return Response(serializer.data) + class HostSpecViewSet(viewsets.SystemViewSet): serializer_class = None diff --git a/helm-charts/bk-dbm/charts/db-remote-service/values.yaml b/helm-charts/bk-dbm/charts/db-remote-service/values.yaml index 2d43fcd483..b726cd966b 100644 --- a/helm-charts/bk-dbm/charts/db-remote-service/values.yaml +++ b/helm-charts/bk-dbm/charts/db-remote-service/values.yaml @@ -5,7 +5,7 @@ replicaCount: 1 image: registry: "mirrors.tencent.com" - repository: "build/blueking/db-remote-service" + repository: "build/blueking/cloud-drs" pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: "" From 6b0a87a90563cd11793910e7d3922c5ec1f94afd Mon Sep 17 00:00:00 2001 From: durant <826035498@qq.com> Date: Thu, 10 Oct 2024 16:25:28 +0800 Subject: [PATCH 116/164] =?UTF-8?q?feat(backend):=20dbha=20=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E5=88=86=E6=B4=BE=E6=94=AF=E6=8C=81=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=20#7257?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/backend/db_monitor/models/alarm.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/dbm-ui/backend/db_monitor/models/alarm.py b/dbm-ui/backend/db_monitor/models/alarm.py index abbe660f71..8149142948 100644 --- a/dbm-ui/backend/db_monitor/models/alarm.py +++ b/dbm-ui/backend/db_monitor/models/alarm.py @@ -447,19 +447,21 @@ def get_rules_by_dbtype(cls, db_type, bk_biz_id) -> List[Dict[str, Any]]: # 补充 dbha 特殊策略的分派规则 if db_type in [DBType.MySQL, DBType.TenDBCluster, DBType.Redis, DBType.Sqlserver]: policies = MonitorPolicy.get_dbha_policies() + conditions = [ + {"field": "alert.strategy_id", "method": "eq", "value": policies, "condition": "and"}, + { + "field": "cluster_type", + "method": "eq", + "value": ClusterType.db_type_to_cluster_types(db_type), + "condition": "and", + }, + ] + if bk_biz_id != PLAT_BIZ_ID: + conditions.append({"field": "appid", "method": "eq", "value": [str(bk_biz_id)], "condition": "and"}) rules.append( { "user_groups": user_groups, - "conditions": [ - {"field": "alert.strategy_id", "method": "eq", "value": policies, "condition": "and"}, - { - "field": "cluster_type", - "method": "eq", - "value": ClusterType.db_type_to_cluster_types(db_type), - "condition": "and", - }, - {"field": "appid", "method": "eq", "value": [str(bk_biz_id)], "condition": "and"}, - ], + "conditions": conditions, **BK_MONITOR_DISPATCH_RULE_MIXIN, } ) From 7c934cae6c533b19b374fac5a8131f6d49ceec9e Mon Sep 17 00:00:00 2001 From: chenwenchang <479999519@qq.com> Date: Thu, 26 Sep 2024 15:42:23 +0800 Subject: [PATCH 117/164] =?UTF-8?q?feat(frontend):=20=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=B1=A0=E7=BB=9F=E8=AE=A1=E8=A7=86=E5=9B=BE=20#6519=20#=20Rev?= =?UTF-8?q?iewed,=20transaction=20id:=2020109?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbm-ui/frontend/package.json | 3 +- .../src/common/const/clusterTypeInfos.ts | 193 ++++++++- .../frontend/src/common/const/dbTypeInfos.ts | 4 +- .../frontend/src/common/const/machineTypes.ts | 57 ++- dbm-ui/frontend/src/locales/en.json | 6 +- dbm-ui/frontend/src/locales/zh-cn.json | 21 + .../services/model/db-resource/DbResource.ts | 28 +- .../src/services/model/db-resource/summary.ts | 79 ++++ .../model/resource-spec/resourceSpec.ts | 8 +- .../src/services/source/dbresourceResource.ts | 48 ++- dbm-ui/frontend/src/services/source/infras.ts | 14 + .../components/table/Index.vue | 28 +- .../quick-search/components/ResourcePool.vue | 43 +- .../src/views/resource-manage/pool/Index.vue | 371 +++-------------- .../com-factory/components/City.vue | 56 --- .../com-factory/components/SpecId.vue | 382 ------------------ .../com-factory/components/Subzones.vue | 68 ---- .../resource-manage/pool/host-list/Index.vue | 343 ++++++++++++++++ .../components/ImportHostBtn.vue | 0 .../components/RenderTable.vue | 73 ++-- .../components/batch-setting/Index.vue | 100 +++-- .../components/ResourceSpecStorage.vue | 4 +- .../components/import-host/Index.vue | 4 +- .../import-host/components/FormPanel.vue | 99 ++--- .../components/select-host-panel/Index.vue | 0 .../components/HostEmpty.vue | 0 .../components/search-box/Index.vue | 112 ++--- .../components/com-factory/Index.vue | 18 +- .../com-factory/components/AgentStatus.vue | 0 .../com-factory/components/BkCloudIds.vue | 4 + .../com-factory/components/CitySubzones.vue | 117 ++++++ .../components/com-factory/components/Cpu.vue | 4 + .../com-factory/components/DeviceClass.vue | 4 + .../com-factory/components/Disk.vue | 4 + .../com-factory/components/DiskType.vue | 18 +- .../com-factory/components/ForBiz.vue} | 50 +-- .../com-factory/components/Hosts.vue | 3 + .../components/com-factory/components/Mem.vue | 4 + .../com-factory/components/MountPoint.vue | 4 + .../com-factory/components/OSType.vue | 0 .../com-factory/components/ResourceType.vue} | 46 ++- .../com-factory/components/SpecId.vue | 177 ++++++++ .../search-box/components/field-config.ts | 48 ++- .../components/field-input/Index.vue | 50 +-- .../components/CollectSearchParams.vue | 2 +- .../search-box/components/field-tag/Index.vue | 0 .../components/field-tag/ValueTag.vue | 0 .../components/search-box/components/utils.ts | 4 +- .../{ => host-list}/hooks/useTableSetting.ts | 12 +- .../pool/summary-view/Index.vue | 9 + .../pool/summary-view/components/BarChart.vue | 135 +++++++ .../components/DimensionSelect.vue | 120 ++++++ .../pool/summary-view/components/Export.vue | 85 ++++ .../pool/summary-view/components/List.vue | 206 ++++++++++ .../components/search-box/Index.vue | 121 ++++++ .../components/search-box/components/Biz.vue | 81 ++++ .../components/search-box/components/Db.vue | 77 ++++ .../search-box/components/Region.vue | 114 ++++++ .../components/search-box/components/Spec.vue | 151 +++++++ .../src/views/resource-manage/routes.ts | 3 +- .../src/views/resource-manage/spec/Index.vue | 296 +------------- 61 files changed, 2570 insertions(+), 1541 deletions(-) create mode 100644 dbm-ui/frontend/src/services/model/db-resource/summary.ts delete mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/City.vue delete mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/SpecId.vue delete mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Subzones.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/host-list/Index.vue rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/ImportHostBtn.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/RenderTable.vue (93%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/batch-setting/Index.vue (67%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/batch-setting/components/ResourceSpecStorage.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/import-host/Index.vue (97%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/import-host/components/FormPanel.vue (83%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/import-host/components/select-host-panel/Index.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/import-host/components/select-host-panel/components/HostEmpty.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/Index.vue (66%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/Index.vue (91%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/AgentStatus.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/BkCloudIds.vue (99%) create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/CitySubzones.vue rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/Cpu.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/DeviceClass.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/Disk.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/DiskType.vue (90%) rename dbm-ui/frontend/src/views/resource-manage/pool/{components/search-box/components/com-factory/components/ForBizs.vue => host-list/components/search-box/components/com-factory/components/ForBiz.vue} (71%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/Hosts.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/Mem.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/MountPoint.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/com-factory/components/OSType.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{components/search-box/components/com-factory/components/ResourceTypes.vue => host-list/components/search-box/components/com-factory/components/ResourceType.vue} (72%) create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/SpecId.vue rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/field-config.ts (83%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/field-input/Index.vue (94%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/field-input/components/CollectSearchParams.vue (99%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/field-tag/Index.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/field-tag/ValueTag.vue (100%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/components/search-box/components/utils.ts (62%) rename dbm-ui/frontend/src/views/resource-manage/pool/{ => host-list}/hooks/useTableSetting.ts (93%) create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/Index.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/BarChart.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/DimensionSelect.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/Export.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/List.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/search-box/Index.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/search-box/components/Biz.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/search-box/components/Db.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/search-box/components/Region.vue create mode 100644 dbm-ui/frontend/src/views/resource-manage/pool/summary-view/components/search-box/components/Spec.vue diff --git a/dbm-ui/frontend/package.json b/dbm-ui/frontend/package.json index 396751294d..2e8b9e5959 100644 --- a/dbm-ui/frontend/package.json +++ b/dbm-ui/frontend/package.json @@ -30,6 +30,7 @@ "bkui-vue": "2.0.1-beta.74", "date-fns": "3.6.0", "dayjs": "^1.11.13", + "echarts": "^5.5.1", "html-to-image": "1.11.11", "js-cookie": "3.0.5", "jsencrypt": "3.3.2", @@ -49,7 +50,7 @@ "vue-router": "^4.4.5", "vue-types": "^5.1.3", "vuedraggable": "4.1.0", - "xlsx": "0.18.5" + "xlsx": "^0.18.5" }, "devDependencies": { "@commitlint/config-conventional": "^19.5.0", diff --git a/dbm-ui/frontend/src/common/const/clusterTypeInfos.ts b/dbm-ui/frontend/src/common/const/clusterTypeInfos.ts index a5e450ba8e..85d7eedf73 100644 --- a/dbm-ui/frontend/src/common/const/clusterTypeInfos.ts +++ b/dbm-ui/frontend/src/common/const/clusterTypeInfos.ts @@ -4,18 +4,23 @@ import { t } from '@locales/index'; import { ClusterTypes } from './clusterTypes'; import { DBTypes } from './dbTypes'; +import { MachineTypes } from './machineTypes'; -interface InfoItem { +export interface ClusterTypeInfoItem { id: ClusterTypes; name: string; dbType: DBTypes; moduleId: ExtractedControllerDataKeys; + machineList: { + id: MachineTypes; + name: string; + }[]; } type InfoType = { - [x in ClusterTypes]?: InfoItem; + [x in ClusterTypes]?: ClusterTypeInfoItem; }; type RequiredInfoType = { - [x in ClusterTypes]: InfoItem; + [x in ClusterTypes]: ClusterTypeInfoItem; }; const mysql: InfoType = { @@ -24,18 +29,47 @@ const mysql: InfoType = { name: t('MySQL单节点'), dbType: DBTypes.MYSQL, moduleId: 'mysql', + machineList: [ + { + id: MachineTypes.SINGLE, + name: t('后端存储机型'), + }, + ], }, [ClusterTypes.TENDBHA]: { id: ClusterTypes.TENDBHA, name: t('MySQL主从'), dbType: DBTypes.MYSQL, moduleId: 'mysql', + machineList: [ + { + id: MachineTypes.BACKEND, + name: t('后端存储机型'), + }, + { + id: MachineTypes.PROXY, + name: t('Proxy机型'), + }, + ], }, +}; + +const spider: InfoType = { [ClusterTypes.TENDBCLUSTER]: { id: ClusterTypes.TENDBCLUSTER, name: 'TenDBCluster', - dbType: DBTypes.MYSQL, + dbType: DBTypes.TENDBCLUSTER, moduleId: 'mysql', + machineList: [ + { + id: MachineTypes.SPIDER, + name: t('接入层Master'), + }, + { + id: MachineTypes.REMOTE, + name: t('后端存储规格'), + }, + ], }, }; @@ -45,90 +79,198 @@ const redis: InfoType = { name: 'TendisCache', dbType: DBTypes.REDIS, moduleId: 'redis', + machineList: [ + { + id: MachineTypes.TENDISCACHE, + name: t('后端存储机型'), + }, + { + id: MachineTypes.TWEMPROXY, + name: t('Proxy机型'), + }, + ], }, [ClusterTypes.TWEMPROXY_TENDIS_SSD_INSTANCE]: { id: ClusterTypes.TWEMPROXY_TENDIS_SSD_INSTANCE, name: 'TendisSSD', dbType: DBTypes.REDIS, moduleId: 'redis', + machineList: [ + { + id: MachineTypes.TENDISSSD, + name: t('后端存储机型'), + }, + { + id: MachineTypes.TWEMPROXY, + name: t('Proxy机型'), + }, + ], }, [ClusterTypes.PREDIXY_TENDISPLUS_CLUSTER]: { id: ClusterTypes.PREDIXY_TENDISPLUS_CLUSTER, name: 'Tendisplus', dbType: DBTypes.REDIS, moduleId: 'redis', + machineList: [ + { + id: MachineTypes.TENDISPLUS, + name: t('后端存储机型'), + }, + { + id: MachineTypes.PREDIXY, + name: t('Proxy机型'), + }, + ], }, [ClusterTypes.PREDIXY_REDIS_CLUSTER]: { id: ClusterTypes.PREDIXY_REDIS_CLUSTER, name: 'RedisCluster', dbType: DBTypes.REDIS, moduleId: 'redis', + machineList: [ + { + id: MachineTypes.TENDISCACHE, + name: t('后端存储机型'), + }, + { + id: MachineTypes.PREDIXY, + name: t('Proxy机型'), + }, + ], }, [ClusterTypes.REDIS_INSTANCE]: { id: ClusterTypes.REDIS_INSTANCE, name: t('Redis主从'), dbType: DBTypes.REDIS, moduleId: 'redis', + machineList: [ + { + id: MachineTypes.TENDISCACHE, + name: t('后端存储机型'), + }, + ], }, }; const bigdata: InfoType = { [ClusterTypes.ES]: { id: ClusterTypes.ES, - name: 'ES', + name: 'ElasticSearch', dbType: DBTypes.ES, moduleId: 'bigdata', + machineList: [ + { + id: MachineTypes.ES_MASTER, + name: t('Master节点规格'), + }, + { + id: MachineTypes.ES_CLIENT, + name: t('Client节点规格'), + }, + { + id: MachineTypes.ES_DATANODE, + name: t('冷_热节点规格'), + }, + ], }, [ClusterTypes.KAFKA]: { id: ClusterTypes.KAFKA, name: 'Kafka', dbType: DBTypes.KAFKA, moduleId: 'bigdata', + machineList: [ + { + id: MachineTypes.ZOOKEEPER, + name: t('Zookeeper节点规格'), + }, + { + id: MachineTypes.BROKER, + name: t('Broker节点规格'), + }, + ], }, [ClusterTypes.HDFS]: { id: ClusterTypes.HDFS, name: 'HDFS', dbType: DBTypes.HDFS, moduleId: 'bigdata', + machineList: [ + { + id: MachineTypes.HDFS_DATANODE, + name: t('DataNode节点规格'), + }, + { + id: MachineTypes.HDFS_MASTER, + name: t('NameNode_Zookeeper_JournalNode节点规格'), + }, + ], }, [ClusterTypes.INFLUXDB]: { id: ClusterTypes.INFLUXDB, name: 'InfuxDB', dbType: DBTypes.INFLUXDB, moduleId: 'bigdata', + machineList: [ + { + id: MachineTypes.INFLUXDB, + name: t('后端存储机型'), + }, + ], }, [ClusterTypes.PULSAR]: { id: ClusterTypes.PULSAR, name: 'Pulsar', dbType: DBTypes.PULSAR, moduleId: 'bigdata', - }, - [ClusterTypes.RIAK]: { - id: ClusterTypes.RIAK, - name: 'Riak', - dbType: DBTypes.RIAK, - moduleId: 'bigdata', - }, - [ClusterTypes.DORIS]: { - id: ClusterTypes.DORIS, - name: 'Dodis', - dbType: DBTypes.DORIS, - moduleId: 'bigdata', + machineList: [ + { + id: MachineTypes.PULSAR_BOOKKEEPER, + name: t('Bookkeeper节点规格'), + }, + { + id: MachineTypes.PULSAR_ZOOKEEPER, + name: t('Zookeeper节点规格'), + }, + { + id: MachineTypes.PULSAR_BROKER, + name: t('Broker节点规格'), + }, + ], }, }; -const mongo: InfoType = { +const mongodb: InfoType = { [ClusterTypes.MONGO_REPLICA_SET]: { id: ClusterTypes.MONGO_REPLICA_SET, name: t('Mongo副本集'), dbType: DBTypes.MONGODB, moduleId: 'mongodb', + machineList: [ + { + id: MachineTypes.MONGODB, + name: t('Mongodb规格'), + }, + ], }, [ClusterTypes.MONGO_SHARED_CLUSTER]: { id: ClusterTypes.MONGO_SHARED_CLUSTER, name: t('Mongo分片集'), dbType: DBTypes.MONGODB, moduleId: 'mongodb', + machineList: [ + { + id: MachineTypes.MONGOS, + name: t('Mongos规格'), + }, + { + id: MachineTypes.MONGODB, + name: t('ConfigSvr规格'), + }, + { + id: MachineTypes.MONGO_CONFIG, + name: t('ShardSvr规格'), + }, + ], }, }; @@ -138,12 +280,24 @@ const sqlserver: InfoType = { name: t('SQLServer单节点'), dbType: DBTypes.SQLSERVER, moduleId: 'sqlserver', + machineList: [ + { + id: MachineTypes.SQLSERVER_SINGLE, + name: t('单节点规格'), + }, + ], }, [ClusterTypes.SQLSERVER_HA]: { id: ClusterTypes.SQLSERVER_HA, name: t('SQLServer主从'), dbType: DBTypes.SQLSERVER, moduleId: 'sqlserver', + machineList: [ + { + id: MachineTypes.SQLSERVER_HA, + name: t('主从规格'), + }, + ], }, }; @@ -152,9 +306,10 @@ const sqlserver: InfoType = { */ export const clusterTypeInfos: RequiredInfoType = { ...mysql, + ...spider, ...redis, ...bigdata, - ...mongo, + ...mongodb, ...sqlserver, } as RequiredInfoType; export type ClusterTypeInfos = keyof typeof clusterTypeInfos; diff --git a/dbm-ui/frontend/src/common/const/dbTypeInfos.ts b/dbm-ui/frontend/src/common/const/dbTypeInfos.ts index dc4cd47cba..9eee2db5ee 100644 --- a/dbm-ui/frontend/src/common/const/dbTypeInfos.ts +++ b/dbm-ui/frontend/src/common/const/dbTypeInfos.ts @@ -50,7 +50,7 @@ const sqlserver: InfoType = { const bigdata: InfoType = { [DBTypes.ES]: { id: DBTypes.ES, - name: 'ES', + name: 'ElasticSearch', moduleId: 'bigdata', }, [DBTypes.KAFKA]: { @@ -84,7 +84,7 @@ const bigdata: InfoType = { moduleId: 'bigdata', }, }; -export const DBTypeInfos: RequiredInfoType = { +export const DBTypeInfos = { ...mysql, ...redis, ...mongo, diff --git a/dbm-ui/frontend/src/common/const/machineTypes.ts b/dbm-ui/frontend/src/common/const/machineTypes.ts index 3cad0dd538..800e06123e 100644 --- a/dbm-ui/frontend/src/common/const/machineTypes.ts +++ b/dbm-ui/frontend/src/common/const/machineTypes.ts @@ -1,47 +1,64 @@ /** * 机器类型 */ + +// mysql export enum MachineTypes { - SPIDER = 'spider', - REMOTE = 'remote', - PROXY = 'proxy', BACKEND = 'backend', + PROXY = 'proxy', SINGLE = 'single', - PREDIXY = 'predixy', - TWEMPROXY = 'twemproxy', - INFLUXDB = 'influxdb', - RIAK = 'riak', } +// spider +export enum MachineTypes { + SPIDER = 'spider', + REMOTE = 'remote', +} +// redis export enum MachineTypes { - REDIS = 'redis', TENDISCACHE = 'tendiscache', TENDISSSD = 'tendisssd', TENDISPLUS = 'tendisplus', + TWEMPROXY = 'twemproxy', + PREDIXY = 'predixy', } -export enum MachineTypes { - ES_DATANODE = 'es_datanode', - ES_MASTER = 'es_master', - ES_CLIENT = 'es_client', -} -export enum MachineTypes { - HDFS_MASTER = 'hdfs_master', - HDFS_DATANODE = 'hdfs_datanode', -} +// mongodb export enum MachineTypes { MONGOS = 'mongos', MONGODB = 'mongodb', MONGO_CONFIG = 'mongo_config', } +// sqlserver export enum MachineTypes { SQLSERVER_HA = 'sqlserver_ha', SQLSERVER_SINGLE = 'sqlserver_single', } +// kefka export enum MachineTypes { + BROKER = 'broker', ZOOKEEPER = 'zookeeper', - PULSAR_ZOOKEEPER = 'pulsar_zookeeper', - PULSAR_BOOKKEEPER = 'pulsar_bookkeeper', } +// es +export enum MachineTypes { + ES_DATANODE = 'es_datanode', + ES_MASTER = 'es_master', + ES_CLIENT = 'es_client', +} +// hdfs +export enum MachineTypes { + HDFS_MASTER = 'hdfs_master', + HDFS_DATANODE = 'hdfs_datanode', +} +// pulsar export enum MachineTypes { - BROKER = 'broker', PULSAR_BROKER = 'pulsar_broker', + PULSAR_BOOKKEEPER = 'pulsar_bookkeeper', + PULSAR_ZOOKEEPER = 'pulsar_zookeeper', +} +// influxdb +export enum MachineTypes { + INFLUXDB = 'influxdb', +} +// riak +export enum MachineTypes { + RIAK = 'riak', } diff --git a/dbm-ui/frontend/src/locales/en.json b/dbm-ui/frontend/src/locales/en.json index 1d56985a0f..5aa731aa89 100644 --- a/dbm-ui/frontend/src/locales/en.json +++ b/dbm-ui/frontend/src/locales/en.json @@ -1292,8 +1292,6 @@ "Zookeeper节点规格": "Zookeeper node specifications", "不支持修改": "Cannot modify", "与目标容量不匹配": "Does not match the target capacity", - "专用 DB": "Specially for DB", - "专用业务": "Specially for business", "克隆": "Clone", "克隆规格": "Clone specification", "内存(G)": "Memory(G)", @@ -1388,8 +1386,8 @@ "请输入 IP 用,分割": "Please enter the IP to use, split", "请输入操作人或选择条件搜索": "Please enter the operator or select the criteria to search", "请选择 Agent 状态": "Please select an Agent Status", - "请选择专用 DB": "Please select a dedicated DB", - "请选择专用业务": "Please select a dedicated business", + "请选择所属DB类型": "Please select a dedicated DB", + "请选择所属业务": "Please select a dedicated business", "请选择城市": "Please choose the city", "请选择机型": "Please select a model", "请选择磁盘挂载点": "Please select a disk mount point", diff --git a/dbm-ui/frontend/src/locales/zh-cn.json b/dbm-ui/frontend/src/locales/zh-cn.json index d550a30814..4335aaf966 100644 --- a/dbm-ui/frontend/src/locales/zh-cn.json +++ b/dbm-ui/frontend/src/locales/zh-cn.json @@ -3436,5 +3436,26 @@ "支持 %(指代任意长度字符串), ?(指代单个字符串), *(指代全部)三个通配符": "支持 %(指代任意长度字符串), ?(指代单个字符串), *(指代全部)三个通配符", "包含通配符时, 每一单元格只允许输入单个对象。% ? 不能独立使用, * 只能单独使用": "包含通配符时, 每一单元格只允许输入单个对象。% ? 不能独立使用, * 只能单独使用", "复制所属集群": "复制所属集群", + "公共资源池": "公共资源池", + "统计视图": "统计视图", + "规格类型": "规格类型", + "机型(硬盘)": "机型(硬盘)", + "CPU 内存": "CPU 内存", + "园区分布(台)": "园区分布(台)", + "地域 - 园区": "地域 - 园区", + "所属DB类型": "所属DB类型", + "请选择所属业务": "请选择所属业务", + "请选择所属DB类型": "请选择所属DB类型", + "总数(台)": "总数(台)", + "聚合维度": "聚合维度", + "导出列表内容": "导出列表内容", + "数量(台)": "数量(台)", + "主机列表": "主机列表", + "资源分布统计": "资源分布统计", + "地域 + 规格": "地域 + 规格", + "地域 + 机型(硬盘)": "地域 + 机型(硬盘)", + "资源分布统计(地域 + 规格)": "资源分布统计(地域 + 规格)", + "资源分布统计(地域 + 机型)": "资源分布统计(地域 + 机型)", + "主机数量 - 按DB类型统计": "主机数量 - 按DB类型统计", "这行勿动!新增翻译请在上一行添加!": "" } diff --git a/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts b/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts index 7a703f2bc1..61422ca573 100644 --- a/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts +++ b/dbm-ui/frontend/src/services/model/db-resource/DbResource.ts @@ -11,8 +11,12 @@ * the specific language governing permissions and limitations under the License. */ +import { DBTypeInfos, DBTypes } from '@common/const'; + import { bytePretty } from '@utils'; +import { t } from '@locales/index'; + export default class DbResource { agent_status: number; asset_id: string; @@ -29,10 +33,10 @@ export default class DbResource { consume_time: string; create_time: string; device_class: string; - for_bizs: Array<{ + for_biz: { bk_biz_id: number; bk_biz_name: string; - }>; + }; ip: string; label: string; net_device_id: string; @@ -44,7 +48,7 @@ export default class DbResource { }; rack_id: string; raid: string; - resource_types: string[]; + resource_type: string; status: string; storage_device: { [key: string]: { @@ -75,7 +79,7 @@ export default class DbResource { this.consume_time = payload.consume_time; this.create_time = payload.create_time; this.device_class = payload.device_class; - this.for_bizs = payload.for_bizs || []; + this.for_biz = payload.for_biz; this.ip = payload.ip; this.label = payload.label; this.net_device_id = payload.net_device_id; @@ -85,7 +89,7 @@ export default class DbResource { this.permission = payload.permission; this.rack_id = payload.rack_id; this.raid = payload.raid; - this.resource_types = payload.resource_types || []; + this.resource_type = payload.resource_type; this.status = payload.status; this.storage_device = payload.storage_device || {}; this.sub_zone = payload.sub_zone; @@ -101,4 +105,18 @@ export default class DbResource { get isAbnormal() { return this.agent_status === 0; } + + get forBizDisplay() { + if (this.for_biz.bk_biz_id === 0 || !this.for_biz.bk_biz_name) { + return t('公共资源池'); + } + return this.for_biz.bk_biz_name; + } + + get resourceTypeDisplay() { + if (!this.resource_type || this.resource_type === 'PUBLIC') { + return t('通用'); + } + return DBTypeInfos[this.resource_type as DBTypes].name; + } } diff --git a/dbm-ui/frontend/src/services/model/db-resource/summary.ts b/dbm-ui/frontend/src/services/model/db-resource/summary.ts new file mode 100644 index 0000000000..9b03cc2f0e --- /dev/null +++ b/dbm-ui/frontend/src/services/model/db-resource/summary.ts @@ -0,0 +1,79 @@ +/* + * TencentBlueKing is pleased to support the open source community by making 蓝鲸智云-DB管理系统(BlueKing-BK-DBM) available. + * + * Copyright (C) 2017-2023 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on 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 { clusterTypeInfos, ClusterTypes, MachineTypes } from '@common/const'; + +export default class Summary { + dedicated_biz: number; + for_biz_name: string; + city: string; + spec_id?: number; + spec_name?: string; + spec_cluster_type?: ClusterTypes; + spec_machine_type?: MachineTypes; + device_class?: string; + disk_summary?: { + mount_point: string; + size: number; + file_type: string; + disk_type: string; + disk_id: string | number; + }[]; + cpu_mem_summary?: string; + count: number; + sub_zone_detail: Record< + number, + { + name: string; + count: number; + } + >; + + constructor(payload = {} as Summary) { + this.dedicated_biz = payload.dedicated_biz; + this.for_biz_name = payload.for_biz_name; + this.city = payload.city; + this.spec_id = payload.spec_id; + this.spec_name = payload.spec_name; + this.spec_cluster_type = payload.spec_cluster_type; + this.spec_machine_type = payload.spec_machine_type; + this.device_class = payload.device_class; + this.disk_summary = payload.disk_summary; + this.cpu_mem_summary = payload.cpu_mem_summary; + this.count = payload.count; + this.sub_zone_detail = payload.sub_zone_detail; + } + + get deviceDisplay() { + if (this.disk_summary && this.disk_summary?.length > 0) { + const diskInfo = this.disk_summary.map((item) => `${item.mount_point}:${item.size}G:${item.disk_type}`).join(';'); + return `${this.device_class} (${diskInfo})`; + } + return `${this.device_class}`; + } + + get specTypeDisplay() { + if (!this.spec_cluster_type || !this.spec_machine_type) { + return '--'; + } + const { name, machineList } = clusterTypeInfos[this.spec_cluster_type]; + const matchMachine = machineList.find(({ id }) => id === this.spec_machine_type); + return matchMachine ? `${name} - ${matchMachine.name}` : '--'; + } + + get subzoneDetailDisplay() { + return `${Object.values(this.sub_zone_detail) + .map((item) => `${item.name}: ${item.count}`) + .join(', ')};`; + } +} diff --git a/dbm-ui/frontend/src/services/model/resource-spec/resourceSpec.ts b/dbm-ui/frontend/src/services/model/resource-spec/resourceSpec.ts index 4217b007e6..61a2e7d899 100644 --- a/dbm-ui/frontend/src/services/model/resource-spec/resourceSpec.ts +++ b/dbm-ui/frontend/src/services/model/resource-spec/resourceSpec.ts @@ -12,6 +12,8 @@ */ import { differenceInSeconds } from 'date-fns'; +import type { ClusterTypes, DBTypes, MachineTypes } from '@common/const'; + import { utcDisplayTime } from '@utils'; export default class ResourceSpec { @@ -33,8 +35,9 @@ export default class ResourceSpec { creator: string; desc: string; enable: boolean; - spec_cluster_type: string; - spec_machine_type: string; + spec_db_type: DBTypes; + spec_cluster_type: ClusterTypes; + spec_machine_type: MachineTypes; spec_name: string; update_at: string; updater: string; @@ -60,6 +63,7 @@ export default class ResourceSpec { this.creator = payload.creator; this.desc = payload.desc; this.enable = payload.enable; + this.spec_db_type = payload.spec_db_type; this.spec_cluster_type = payload.spec_cluster_type; this.spec_machine_type = payload.spec_machine_type; this.spec_name = payload.spec_name; diff --git a/dbm-ui/frontend/src/services/source/dbresourceResource.ts b/dbm-ui/frontend/src/services/source/dbresourceResource.ts index 87b1a9617d..39ab16639e 100644 --- a/dbm-ui/frontend/src/services/source/dbresourceResource.ts +++ b/dbm-ui/frontend/src/services/source/dbresourceResource.ts @@ -13,8 +13,11 @@ import DbResourceModel from '@services/model/db-resource/DbResource'; import OperationModel from '@services/model/db-resource/Operation'; +import SummaryModel from '@services/model/db-resource/summary'; import type { HostInfo, ListBase } from '@services/types'; +import type { DBTypes } from '@common/const'; + import http, { type IRequestPayload } from '../http'; const path = '/apis/dbresource/resource'; @@ -47,19 +50,12 @@ export function fetchMountPoints() { return http.get(`${path}/get_mountpoints/`); } -/** - * 根据逻辑城市查询园区 - */ -export function fetchSubzones(params: { citys: string }) { - return http.get(`${path}/get_subzones/`, params); -} - /** * 资源池导入 */ export function importResource(params: { - for_bizs: number[]; - resource_types: string[]; + for_biz: number; + resource_type: string; hosts: Array<{ ip: string; host_id: number; @@ -169,11 +165,9 @@ export function getSpecResourceCount(params: { */ export function updateResource(params: { bk_host_ids: number[]; - for_bizs: number[]; + for_biz: number; rack_id: string; - resource_types: string[]; - set_empty_biz: boolean; - set_empty_resource_type: boolean; + resource_type: string; storage_device: Record; }) { return http.post(`${path}/update/`, params); @@ -185,3 +179,31 @@ export function updateResource(params: { export function getOsTypeList(params: { offset?: number; limit?: number }) { return http.get(`${path}/get_os_types/`, params); } + +/** + * 按照组件统计资源数量 + */ +export function getGroupCount() { + return http.post<{ rs_type: string; count: number }[]>(`${path}/resource_group_count/`); +} + +/** + * 按照条件聚合资源统计 + */ +export function getSummaryList(params: { + group_by: string; + for_biz?: number; + city?: string; + sub_zones?: string[]; + spec_param: { + db_type: DBTypes; + machine_type?: string; + cluster_type?: string; + spec_id_list?: number[]; + }; +}) { + return http.get(`${path}/resource_summary/`, params).then((data) => ({ + count: data.length || 0, + results: data.map((item) => new SummaryModel(item)), + })); +} diff --git a/dbm-ui/frontend/src/services/source/infras.ts b/dbm-ui/frontend/src/services/source/infras.ts index 7974f14744..013abe8892 100644 --- a/dbm-ui/frontend/src/services/source/infras.ts +++ b/dbm-ui/frontend/src/services/source/infras.ts @@ -29,6 +29,20 @@ export function getInfrasCities() { >(`${path}/cities/`); } +/** + * 查询城市园区信息 + */ +export function getInfrasSubzonesByCity(params: { city_code: string }) { + return http.get< + { + bk_city: number; + bk_city_code: string; + bk_sub_zone_id: number; + bk_sub_zone: string; + }[] + >(`${path}/cities/list_subzones/`, params); +} + /** * redis 容量列表 */ diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/slave-rebuild/pages/page1/components/new-host/components/resource-pool-manual-selector/components/table/Index.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/slave-rebuild/pages/page1/components/new-host/components/resource-pool-manual-selector/components/table/Index.vue index 170c5fc46f..9a13d5223f 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/slave-rebuild/pages/page1/components/new-host/components/resource-pool-manual-selector/components/table/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/slave-rebuild/pages/page1/components/new-host/components/resource-pool-manual-selector/components/table/Index.vue @@ -140,26 +140,16 @@ render: ({ data }: {data: DbResourceModel}) => , }, { - label: t('专用业务'), - field: 'for_bizs', + label: t('所属业务'), + field: 'for_biz', width: 170, - render: ({ data }: {data: DbResourceModel}) => { - if (data.for_bizs.length < 1) { - return t('无限制'); - } - return data.for_bizs.map(item => item.bk_biz_name).join(','); - }, + render: ({ data }: {data: DbResourceModel}) => data.for_biz.bk_biz_name || t('无限制'), }, { - label: t('专用 DB'), - field: 'resource_types', + label: t('所属DB类型'), + field: 'resource_type', width: 150, - render: ({ data }: {data: DbResourceModel}) => { - if (data.resource_types.length < 1) { - return t('无限制'); - } - return data.resource_types.join(','); - }, + render: ({ data }: {data: DbResourceModel}) => data.resource_type || t('无限制'), }, { label: t('机型'), @@ -208,14 +198,14 @@ fields: columns.filter(item => item.field).map(item => ({ label: item.label, field: item.field, - disabled: ['ip', 'for_bizs', 'resource_types'].includes(item.field as string), + disabled: ['ip', 'for_biz', 'resource_type'].includes(item.field as string), })), checked: [ 'ip', 'bk_cloud_name', 'agent_status', - 'for_bizs', - 'resource_types', + 'for_biz', + 'resource_type', ], size: 'small', }; diff --git a/dbm-ui/frontend/src/views/quick-search/components/ResourcePool.vue b/dbm-ui/frontend/src/views/quick-search/components/ResourcePool.vue index ee64259631..e367428712 100644 --- a/dbm-ui/frontend/src/views/quick-search/components/ResourcePool.vue +++ b/dbm-ui/frontend/src/views/quick-search/components/ResourcePool.vue @@ -85,15 +85,13 @@ const deviceClassSet = new Set(); props.data.forEach((dataItem) => { - dataItem.for_bizs.forEach((forBizItem) => { - if (!bizNameMap[forBizItem.bk_biz_id]) { - bizNameMap[forBizItem.bk_biz_id] = currentBizNameMap[forBizItem.bk_biz_id]; + if (!bizNameMap[dataItem.for_biz.bk_biz_id]) { + bizNameMap[dataItem.for_biz.bk_biz_id] = currentBizNameMap[dataItem.for_biz.bk_biz_id]; } - }); - dataItem.resource_types.forEach((resourceTypesItem) => { - resourceTypesSet.add(resourceTypesItem); - }); + if(dataItem.resource_type) { + resourceTypesSet.add(dataItem.resource_type); + } if (dataItem.device_class) { deviceClassSet.add(dataItem.device_class); @@ -162,8 +160,8 @@ render: ({ data }: { data: DbResourceModel }) => , }, { - label: t('专用业务'), - field: 'for_bizs', + label: t('所属业务'), + field: 'for_biz', width: 100, filter: { list: Object.entries(filterMap.value.bizNameMap).map(bizItem => ({ @@ -174,19 +172,14 @@ if (checked.length === 0) { return true; } - return checked.some(checkedItem => row.for_bizs.some(forBizItem => forBizItem.bk_biz_id === checkedItem)); + return checked.some(checkedItem => row.for_biz.bk_biz_id === checkedItem); }, }, - render: ({ data }: { data: DbResourceModel }) => { - if (data.for_bizs.length < 1) { - return t('无限制'); - } - return data.for_bizs.map(item => {item.bk_biz_name}); - }, + render: ({ data }: { data: DbResourceModel }) => data.for_biz.bk_biz_id ? {data.for_biz.bk_biz_name} : t('无限制'), }, { - label: t('专用DB'), - field: 'resource_types', + label: t('所属DB类型'), + field: 'resource_type', filter: { list: Array.from(filterMap.value.resourceTypesSet).map(resourceTypeItem => ({ value: resourceTypeItem, @@ -196,16 +189,10 @@ if (checked.length === 0) { return true; } - return checked.some(checkedItem => row.resource_types - .some(resourceTypeItem => resourceTypeItem === checkedItem)); + return checked.some(checkedItem => row.resource_type === checkedItem); }, }, - render: ({ data }: { data: DbResourceModel }) => { - if (data.resource_types.length < 1) { - return t('无限制'); - } - return data.resource_types.map(typeItem => {typeItem}); - }, + render: ({ data }: { data: DbResourceModel }) => data.resource_type ? {data.resource_type} : t('无限制'), }, { label: t('机型'), @@ -263,8 +250,8 @@ 'ip', 'bk_cloud_id', 'agent_status', - 'for_bizs', - 'resource_types', + 'for_biz', + 'resource_type', 'device_class', 'city', 'sub_zone', diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/Index.vue b/dbm-ui/frontend/src/views/resource-manage/pool/Index.vue index 5dffe2d9ba..5e716d0494 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/Index.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/Index.vue @@ -12,346 +12,85 @@ --> - - diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/City.vue b/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/City.vue deleted file mode 100644 index d4d5a45249..0000000000 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/City.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/SpecId.vue b/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/SpecId.vue deleted file mode 100644 index 9f76911619..0000000000 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/SpecId.vue +++ /dev/null @@ -1,382 +0,0 @@ - - - - - diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Subzones.vue b/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Subzones.vue deleted file mode 100644 index 70fd2819e0..0000000000 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Subzones.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/host-list/Index.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/Index.vue new file mode 100644 index 0000000000..716697dc82 --- /dev/null +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/Index.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/ImportHostBtn.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/ImportHostBtn.vue similarity index 100% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/ImportHostBtn.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/ImportHostBtn.vue diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/RenderTable.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/RenderTable.vue similarity index 93% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/RenderTable.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/RenderTable.vue index f751330827..c9b237efc8 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/RenderTable.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/RenderTable.vue @@ -78,6 +78,36 @@ export interface IPaginationExtra { small?: boolean; } + + interface Props { + columns: InstanceType['$props']['columns']; + dataSource: (params: any, payload?: IRequestPayload) => Promise; + fixedPagination?: boolean; + clearSelection?: boolean; + paginationExtra?: IPaginationExtra; + selectable?: boolean; + disableSelectMethod?: (data: any) => boolean | string; + // data 数据的主键 + primaryKey?: string; + } + + interface Emits { + (e: 'requestSuccess', value: any): void; + (e: 'requestFinished', value: any[]): void; + (e: 'clearSearch'): void; + (e: 'selection', key: string[], list: any[]): void; + (e: 'selection', key: number[], list: any[]): void; + } + + interface Exposes { + fetchData: (params: Record, baseParams: Record) => void; + getData: () => Array; + clearSelected: () => void; + loading: Ref; + bkTableRef: Ref>; + updateTableKey: () => void; + removeSelectByKey: (key: string) => void; + } + diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Cpu.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Cpu.vue similarity index 99% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Cpu.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Cpu.vue index e38fd3b4d0..17549d5f53 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Cpu.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Cpu.vue @@ -35,15 +35,19 @@ defaultValue?: [number, number]; model: Record; } + interface Emits { (e: 'change', value: Props['defaultValue']): void; } const props = defineProps(); + const emits = defineEmits(); + defineOptions({ inheritAttrs: false, }); + const min = ref(); const max = ref(); diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DeviceClass.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DeviceClass.vue similarity index 99% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DeviceClass.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DeviceClass.vue index a72c70c134..d133e72f41 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DeviceClass.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DeviceClass.vue @@ -37,15 +37,19 @@ interface Props { defaultValue?: string; } + interface Emits { (e: 'change', value: string): void; } defineProps(); + const emits = defineEmits(); + defineOptions({ inheritAttrs: false, }); + const { t } = useI18n(); const { data } = useRequest(fetchDeviceClass, { diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Disk.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Disk.vue similarity index 99% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Disk.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Disk.vue index 436b603ff4..9d2f5f0ae5 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/Disk.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/Disk.vue @@ -35,15 +35,19 @@ defaultValue?: [number, number]; model: Record; } + interface Emits { (e: 'change', value: Props['defaultValue']): void; } const props = defineProps(); + const emits = defineEmits(); + defineOptions({ inheritAttrs: false, }); + const min = ref(); const max = ref(); diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DiskType.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DiskType.vue similarity index 90% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DiskType.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DiskType.vue index 97af5873ec..7bf7d24d35 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/DiskType.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/DiskType.vue @@ -38,15 +38,19 @@ defaultValue?: string; model: Record; } + interface Emits { (e: 'change', value: Props['defaultValue']): void; } - const props = defineProps(); + defineProps(); + const emits = defineEmits(); + defineOptions({ inheritAttrs: false, }); + const { t } = useI18n(); const { data } = useRequest(fetchDiskTypes, { @@ -56,16 +60,4 @@ const handleChange = (value: Props['defaultValue']) => { emits('change', value); }; - - watch( - () => props.model, - () => { - if (props.model.spec_id) { - handleChange(''); - } - }, - { - immediate: true, - }, - ); diff --git a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/ForBizs.vue b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/ForBiz.vue similarity index 71% rename from dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/ForBizs.vue rename to dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/ForBiz.vue index 291e001da7..25b4d31b16 100644 --- a/dbm-ui/frontend/src/views/resource-manage/pool/components/search-box/components/com-factory/components/ForBizs.vue +++ b/dbm-ui/frontend/src/views/resource-manage/pool/host-list/components/search-box/components/com-factory/components/ForBiz.vue @@ -13,28 +13,17 @@ - diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderMaster.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderMaster.vue index 9a7b5a3c6c..f0096710ba 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderMaster.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderMaster.vue @@ -47,10 +47,12 @@ } interface Exposes { - getValue: (field: string) => Promise<{ - bk_host_id: number; - ip: string; - bk_cloud_id: number; + getValue: () => Promise<{ + master: { + bk_host_id: number; + ip: string; + bk_cloud_id: number; + }; }>; } @@ -76,7 +78,7 @@ }, { validator: () => - checkInstance({ + checkInstance({ bk_biz_id: window.PROJECT_CONFIG.BIZ_ID, instance_addresses: [localValue.value], }).then((data) => { diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderSlave.vue index 2c29213e04..facb47748c 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/RenderSlave.vue @@ -43,7 +43,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise<{ slave: ISlaveHost }>; } interface ISlaveHost { diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/Row.vue index 38be1e7356..75df618876 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-failover/pages/page1/components/RenderData/Row.vue @@ -29,7 +29,7 @@ - diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue index ca9f0e8957..ac522bd366 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue @@ -42,7 +42,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise<{ slave: ISlaveHost }>; } interface ISlaveHost { diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/Row.vue index e1afba4818..fc78d88201 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/master-slave-swap/pages/page1/components/RenderData/Row.vue @@ -29,7 +29,7 @@ diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/RenderOldSlave.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/RenderOldSlave.vue index 1550c2faf1..db04f6a458 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/RenderOldSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/RenderOldSlave.vue @@ -24,7 +24,6 @@ import { ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; - import SqlServerHaInstanceModel from '@services/model/sqlserver/sqlserver-ha-instance'; import { checkInstance } from '@services/source/dbbase'; import { ipv4 } from '@common/regex'; @@ -63,7 +62,7 @@ }, { validator: (value: string) => - checkInstance({ + checkInstance({ bk_biz_id: window.PROJECT_CONFIG.BIZ_ID, instance_addresses: [value], }).then((data) => { diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue index bcdb70dbd9..da6d08c0f9 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/new-host/components/RenderData/Row.vue @@ -22,7 +22,8 @@ + :data="localOldSlave" + role="slave" /> diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderCluster.vue index 1277da7ad9..aac6e4f808 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderCluster.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderCluster.vue @@ -25,7 +25,6 @@ import { useI18n } from 'vue-i18n'; import { useRequest } from 'vue-request'; - import SqlServerHaInstanceModel from '@services/model/sqlserver/sqlserver-ha-instance'; import { checkInstance } from '@services/source/dbbase'; import TableEditInput from '@views/db-manage/tendb-cluster/common/edit/Input.vue'; @@ -45,12 +44,12 @@ const { t } = useI18n(); const editInputRef = ref(); - const localInstanceData = shallowRef>[number]>(); + const localInstanceData = shallowRef[number]>(); - const { loading: isLoading, run: fetchCheckInstances } = useRequest(checkInstance, { + const { loading: isLoading, run: fetchCheckInstances } = useRequest(checkInstance, { manual: true, onSuccess(data) { - [localInstanceData.value] = data; + [localInstanceData.value] = data.filter((item) => item.role === 'slave'); }, }); diff --git a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderSlave.vue index f57afc29d9..4f9de50c13 100644 --- a/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/sqlserver/slave-rebuild/pages/page1/components/original-host/components/RenderData/RenderSlave.vue @@ -27,7 +27,6 @@ import { ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; - import SqlServerHaInstanceModel from '@services/model/sqlserver/sqlserver-ha-instance'; import { checkInstance } from '@services/source/dbbase'; import { ipPort } from '@common/regex'; @@ -37,7 +36,7 @@ import type { IDataRow } from './Row.vue'; interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise<{ slave: any }>; } const { t } = useI18n(); @@ -59,7 +58,7 @@ }, { validator: (value: string) => - checkInstance({ + checkInstance({ bk_biz_id: window.PROJECT_CONFIG.BIZ_ID, instance_addresses: [value], }).then((data) => { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderCluster.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderCluster.vue deleted file mode 100644 index eacc0c1b49..0000000000 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderCluster.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - - - diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderMaster.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderMaster.vue index 275276abf6..e489817243 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderMaster.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderMaster.vue @@ -58,7 +58,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise; } const props = defineProps(); diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderSlave.vue index 2c7b644e30..3cb31b99bf 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/RenderSlave.vue @@ -36,7 +36,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise<{ slave: ISlaveHost }>; } interface ISlaveHost { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/Row.vue index e70c4e86d2..dab64fc479 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-failover/pages/page1/components/RenderData/Row.vue @@ -28,7 +28,7 @@ + :data="localMasterData" /> - diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue index 432f16b0fd..818a2622eb 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/RenderSlave.vue @@ -36,7 +36,7 @@ } interface Exposes { - getValue: (field: string) => Promise; + getValue: () => Promise<{ slave: ISlaveHost }>; } interface ISlaveHost { diff --git a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/Row.vue index 81fcf24d7b..6e4ebea80f 100644 --- a/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/tendb-cluster/master-slave-swap/pages/page1/components/RenderData/Row.vue @@ -28,7 +28,7 @@ + :data="localMasterData" />