Skip to content

Commit 90b4bf2

Browse files
JustaCattthLinx
authored andcommitted
feat(frontend): 工具箱支持资源池协议变更_验收问题处理 #8076
# Reviewed, transaction id: 32593
1 parent 6a5a9bf commit 90b4bf2

File tree

30 files changed

+373
-584
lines changed

30 files changed

+373
-584
lines changed

dbm-ui/frontend/src/locales/zh-cn.json

+1
Original file line numberDiff line numberDiff line change
@@ -4138,5 +4138,6 @@
41384138
"集群无只读主机": "集群无只读主机",
41394139
"IP 重复": "IP 重复",
41404140
"新只读主机不能为空": "新只读主机不能为空",
4141+
"添加资源标签": "添加资源标签",
41414142
"这行勿动!新增翻译请在上一行添加!": ""
41424143
}

dbm-ui/frontend/src/services/source/mysqlCluster.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const getRootPath = () => `/apis/mysql/bizs/${window.PROJECT_CONFIG.BIZ_ID}/clus
2121
/**
2222
* 通过集群查询同机关联集群
2323
*/
24-
export function findRelatedClustersByClusterIds(params: { bk_biz_id: number; cluster_ids: number[] }) {
24+
export function findRelatedClustersByClusterIds(params: { bk_biz_id: number; cluster_ids: number[]; role?: string }) {
2525
return http.post<
2626
Array<{
2727
cluster_id: number;

dbm-ui/frontend/src/types/biz-components.d.ts

-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ declare module 'vue' {
3131
FunController: typeof import('@components/function-controller/FunController.vue').default;
3232
MoreActionExtend: typeof import('@components/more-action-extend/Index.vue').default;
3333
OperationColumn: typeof import('@views/db-manage/common/toolbox-field/column/operation-column/Index.vue').default;
34-
OperationColumn: typeof import('@views/db-manage/common/toolbox-field/column/operation-column/Index.vue').default;
35-
OperationRow: typeof import('@views/db-manage/common/toolbox-field/row/operation-row/Index.vue').default;
3634
ScrollFaker: typeof import('@components/scroll-faker/Index.vue').default;
3735
SmartAction: typeof import('@components/smart-action/Index.vue').default;
3836
}

dbm-ui/frontend/src/utils/createToolboxRoute.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ export function createToolboxRoute(dbType: DBTypes) {
66
const createRouteItem = (
77
ticketType: TicketTypes,
88
navName: string,
9-
meta: { navName?: string; fullscreen?: boolean; dbConsole?: string } = {},
9+
meta: { dbConsole?: string; fullscreen?: boolean; navName?: string } = {},
1010
) => ({
11-
name: ticketType,
12-
path: `${ticketType}/:page?`,
11+
component: () => import(`@views/db-manage/${dbToolbox}/${ticketType}/Index.vue`),
1312
meta: {
14-
navName,
1513
fullscreen: true,
14+
navName,
1615
...meta,
1716
},
18-
component: () => import(`@views/db-manage/${dbToolbox}/${ticketType}/Index.vue`),
17+
name: ticketType,
18+
path: `${ticketType}/:page?`,
1919
});
2020

2121
return {

dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_PROXY_ADD/Create.vue

+45-15
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@
3131
:key="index">
3232
<WithRelatedClustersColumn
3333
v-model="item.cluster"
34+
role="proxy"
3435
:selected="selected"
3536
@batch-edit="handleBatchEdit" />
3637
<SingleResourceHostColumn
37-
v-model="item.proxy"
38-
field="proxy.ip"
38+
v-model="item.new_proxy"
39+
field="new_proxy.ip"
3940
:label="t('新Proxy主机')"
4041
:params="{
4142
for_bizs: [currentBizId, 0],
@@ -94,7 +95,7 @@
9495
master_domain: string;
9596
}[];
9697
};
97-
proxy: {
98+
new_proxy: {
9899
bk_biz_id: number;
99100
bk_cloud_id: number;
100101
bk_host_id: number;
@@ -113,7 +114,7 @@
113114
master_domain: '',
114115
related_clusters: [],
115116
},
116-
proxy: data.proxy || {
117+
new_proxy: data.new_proxy || {
117118
bk_biz_id: window.PROJECT_CONFIG.BIZ_ID,
118119
bk_cloud_id: 0,
119120
bk_host_id: 0,
@@ -131,47 +132,76 @@
131132
const selected = computed(() => formData.tableData.filter((item) => item.cluster.id).map((item) => item.cluster));
132133
// 集群域名到自身及其下集群id、域名映射
133134
const clusterMap = computed(() => {
134-
const result = selected.value.reduce<Record<string, { ids: number[]; domains: string[] }>>((acc, cur) => {
135-
acc[cur.master_domain] = {
136-
ids: [cur.id, ...cur.related_clusters.map((item) => item.id)],
137-
domains: [cur.master_domain, ...cur.related_clusters.map((item) => item.master_domain)],
138-
};
135+
const result = selected.value.reduce<Record<string, { domains: string[]; ids: number[] }>>((acc, cur) => {
136+
Object.assign(acc, {
137+
[cur.master_domain]: {
138+
domains: [cur.master_domain, ...cur.related_clusters.map((item) => item.master_domain)],
139+
ids: [cur.id, ...cur.related_clusters.map((item) => item.id)],
140+
},
141+
});
139142
return acc;
140143
}, {});
141144
return result;
142145
});
146+
const newProxyCounter = computed(() => {
147+
return formData.tableData.reduce(
148+
(result, item) => {
149+
Object.assign(result, {
150+
[item.new_proxy.ip]: (result[item.new_proxy.ip] || 0) + 1,
151+
});
152+
return result;
153+
},
154+
{} as Record<string, number>,
155+
);
156+
});
143157

144158
const rules = {
145159
'cluster.master_domain': [
146160
{
161+
message: '',
162+
trigger: 'blur',
147163
validator: (value: string) => {
148164
const repeatTarget = Object.keys(clusterMap.value).find(
149165
(domain) => clusterMap.value[domain].domains.includes(value) && domain !== value,
150166
);
151167
return repeatTarget ? t('目标集群是集群target的关联集群_请勿重复添加', { target: repeatTarget }) : true;
152168
},
153-
message: '',
169+
},
170+
],
171+
'new_proxy.ip': [
172+
{
173+
message: t('IP 重复'),
154174
trigger: 'blur',
175+
validator: (value: string, rowData: RowData) => {
176+
return newProxyCounter.value[rowData.new_proxy.ip] <= 1;
177+
},
178+
},
179+
{
180+
message: t('IP 重复'),
181+
trigger: 'change',
182+
validator: (value: string, rowData: RowData) => {
183+
return newProxyCounter.value[rowData.new_proxy.ip] <= 1;
184+
},
155185
},
156186
],
157187
};
158188

159-
const { run: createTicketRun, loading: isSubmitting } = useCreateTicket<{
160-
ip_source: 'resource_pool';
189+
const { loading: isSubmitting, run: createTicketRun } = useCreateTicket<{
161190
infos: {
162191
cluster_ids: number[];
163192
resource_spec: {
164193
new_proxy: {
165-
spec_id: number;
166194
hosts: {
167195
bk_biz_id: number;
168196
bk_cloud_id: number;
169197
bk_host_id: number;
170198
ip: string;
171199
}[];
200+
spec_id: number;
172201
};
173202
};
174203
}[];
204+
ip_source: 'resource_pool';
175205
}>(TicketTypes.MYSQL_PROXY_ADD);
176206

177207
const handleSubmit = async () => {
@@ -181,16 +211,16 @@
181211
}
182212
createTicketRun({
183213
details: {
184-
ip_source: 'resource_pool',
185214
infos: formData.tableData.map((item) => ({
186215
cluster_ids: clusterMap.value[item.cluster.master_domain].ids,
187216
resource_spec: {
188217
new_proxy: {
218+
hosts: [item.new_proxy],
189219
spec_id: 0,
190-
hosts: [item.proxy],
191220
},
192221
},
193222
})),
223+
ip_source: 'resource_pool',
194224
},
195225
remark: formData.remark,
196226
});

dbm-ui/frontend/src/views/db-manage/mysql/MYSQL_PROXY_SWITCH/Create.vue

+16-17
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
:desc="t('只替换目标实例')"
2828
icon="rebuild"
2929
:title="t('实例替换')"
30-
:true-value="ProxyReplaceTypes.INSTANCE_REPLACE" />
30+
true-value="INSTANCE_REPLACE" />
3131
<CardCheckbox
3232
v-model="replaceType"
3333
class="ml-8"
3434
:desc="t('主机关联的所有实例一并替换')"
3535
icon="host"
3636
:title="t('整机替换')"
37-
:true-value="ProxyReplaceTypes.HOST_REPLACE" />
37+
true-value="HOST_REPLACE" />
3838
</div>
3939
</div>
4040
<BkForm
@@ -86,40 +86,42 @@
8686
createTickePayload,
8787
} from '@views/db-manage/common/toolbox-field/form-item/ticket-payload/Index.vue';
8888

89-
import HostTable from './components/HostTable.vue';
90-
import InstanceTable from './components/InstanceTable.vue';
91-
import { ProxyReplaceTypes } from './types';
89+
import HOST_REPLACE from './components/HOST_REPLACE/Index.vue';
90+
import INSTANCE_REPLACE from './components/INSTANCE_REPLACE/Index.vue';
9291

9392
const { t } = useI18n();
9493
const tableRef = useTemplateRef('table');
9594

9695
const defaultData = () => ({
97-
tableData: [],
9896
force: false,
97+
tableData: [],
9998
...createTickePayload(),
10099
});
101100

102101
const tableComponentMap = {
103-
[ProxyReplaceTypes.INSTANCE_REPLACE]: InstanceTable,
104-
[ProxyReplaceTypes.HOST_REPLACE]: HostTable,
102+
HOST_REPLACE,
103+
INSTANCE_REPLACE,
105104
};
106105

107-
const replaceType = ref(ProxyReplaceTypes.INSTANCE_REPLACE);
106+
const replaceType = ref<'INSTANCE_REPLACE' | 'HOST_REPLACE'>('INSTANCE_REPLACE');
108107
const formData = reactive(defaultData());
109108

110-
const { run: createTicketRun, loading: isSubmitting } = useCreateTicket<{
109+
const { loading: isSubmitting, run: createTicketRun } = useCreateTicket<{
111110
force: boolean;
112-
ip_source: 'resource_pool';
113111
infos: {
114112
cluster_ids: number[];
113+
display_info: {
114+
related_clusters: string[];
115+
type: typeof replaceType.value;
116+
};
115117
old_nodes: {
116118
origin_proxy: {
117119
bk_biz_id: number;
118120
bk_cloud_id: number;
119121
bk_host_id: number;
122+
instance_address?: string;
120123
ip: string;
121124
port?: number;
122-
instance_address?: string;
123125
}[];
124126
};
125127
resource_spec: {
@@ -132,11 +134,8 @@
132134
}[];
133135
};
134136
};
135-
display_info: {
136-
type: ProxyReplaceTypes;
137-
related_clusters: string[];
138-
};
139137
}[];
138+
ip_source: 'resource_pool';
140139
}>(TicketTypes.MYSQL_PROXY_SWITCH);
141140

142141
const handleSubmit = async () => {
@@ -145,8 +144,8 @@
145144
createTicketRun({
146145
details: {
147146
force: formData.force,
148-
ip_source: 'resource_pool',
149147
infos,
148+
ip_source: 'resource_pool',
150149
},
151150
remark: formData.remark,
152151
});

0 commit comments

Comments
 (0)