Skip to content

Commit 4b980ad

Browse files
labbombdevosend
andauthored
feat: add AZURESQL datasource (#13200)
* feat: add AZURESQL datasource * fix form validate bug * feat: Adjusted the password display form, added AZURESQL type * feat: Order of adjustment Co-authored-by: devosend <devosend@gmail.com>
1 parent f0dd4f0 commit 4b980ad

6 files changed

Lines changed: 257 additions & 7 deletions

File tree

dolphinscheduler-ui/src/locales/en_US/datasource.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,18 @@ export default {
7272
user_password_tips: 'Please enter your password',
7373
aws_region: 'Aws Region',
7474
aws_region_tips: 'Please enter AwsRegion',
75+
validation: 'Validation',
76+
mode_tips: 'Please select a mode',
7577
jdbc_format_tips: 'jdbc connection parameters is not a correct JSON format',
7678
datasource_test_flag_tips: 'Please select a data source definition',
77-
datasource_bind_test_id_tips: 'Please bind the test data source'
79+
datasource_bind_test_id_tips: 'Please bind the test data source',
80+
database_username: 'Database Username',
81+
database_password: 'Database Password',
82+
Azure_AD_username: 'Azure AD username',
83+
Azure_AD_password: 'Azure AD password',
84+
MSIClientId: 'MSI ClientId',
85+
clientId: 'ClientId',
86+
clientSecret: 'ClientSecret',
87+
OAuth_token_endpoint: 'OAuth 2.0 token endpoint',
88+
endpoint_tips: 'Please enter OAuth Token',
7889
}

dolphinscheduler-ui/src/locales/zh_CN/datasource.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,18 @@ export default {
6969
user_password_tips: '请输入密码',
7070
aws_region: 'AwsRegion',
7171
aws_region_tips: '请输入AwsRegion',
72+
validation: '验证',
73+
mode_tips: '请选择验证模式',
7274
jdbc_format_tips: 'jdbc连接参数不是一个正确的JSON格式',
7375
datasource_test_flag_tips: '请选择数据源定义',
74-
datasource_bind_test_id_tips: '请绑定测试数据源'
76+
datasource_bind_test_id_tips: '请绑定测试数据源',
77+
database_username: '数据库用户名',
78+
database_password: '数据库密码',
79+
Azure_AD_username: 'Azure AD用户名',
80+
Azure_AD_password: 'Azure AD密码',
81+
MSIClientId: 'MSI ClientId',
82+
clientId: 'ClientId',
83+
clientSecret: 'ClientSecret',
84+
OAuth_token_endpoint: 'OAuth 2.0 token endpoint',
85+
endpoint_tips: '请输入OAuth'
7586
}

dolphinscheduler-ui/src/service/modules/data-source/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type IDataBase =
2828
| 'REDSHIFT'
2929
| 'ATHENA'
3030
| 'TRINO'
31+
| 'AZURESQL'
3132
| 'STARROCKS'
3233

3334
type IDataBaseLabel =
@@ -43,6 +44,7 @@ type IDataBaseLabel =
4344
| 'REDSHIFT'
4445
| 'ATHENA'
4546
| 'TRINO'
47+
| 'AZURESQL'
4648
| 'STARROCKS'
4749

4850
interface IDataSource {
@@ -57,6 +59,7 @@ interface IDataSource {
5759
javaSecurityKrb5Conf?: string
5860
loginUserKeytabUsername?: string
5961
loginUserKeytabPath?: string
62+
mode?: string
6063
userName?: string
6164
password?: string
6265
awsRegion?: string
@@ -65,6 +68,8 @@ interface IDataSource {
6568
other?: object
6669
testFlag?: number
6770
bindTestId?: number
71+
endpoint?: string
72+
MSIClientId?: string
6873
}
6974

7075
interface ListReq {

dolphinscheduler-ui/src/views/datasource/list/detail.tsx

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ const DetailModal = defineComponent({
160160
showAwsRegion,
161161
showConnectType,
162162
showPrincipal,
163+
showMode,
164+
modeOptions,
163165
loading,
164166
saving,
165167
testing,
@@ -279,6 +281,156 @@ const DetailModal = defineComponent({
279281
placeholder={t('datasource.krb5_conf_tips')}
280282
/>
281283
</NFormItem>
284+
{/* 验证条件选择 */}
285+
<NFormItem
286+
v-show={showMode}
287+
label={t('datasource.validation')}
288+
path='mode'
289+
show-require-mark
290+
>
291+
<NSelect
292+
v-model={[detailForm.mode, 'value']}
293+
options={modeOptions}
294+
></NSelect>
295+
</NFormItem>
296+
{/* SqlPassword */}
297+
<NFormItem
298+
v-show={showMode && detailForm.mode === 'SqlPassword'}
299+
label={t('datasource.database_username')}
300+
path='userName'
301+
show-require-mark
302+
>
303+
<NInput
304+
allowInput={this.trim}
305+
v-model={[detailForm.userName, 'value']}
306+
type='text'
307+
placeholder={t('datasource.database_username')}
308+
/>
309+
</NFormItem>
310+
<NFormItem
311+
v-show={showMode && detailForm.mode === 'SqlPassword'}
312+
label={t('datasource.database_password')}
313+
path='password'
314+
show-require-mark
315+
>
316+
<NInput
317+
allowInput={this.trim}
318+
v-model={[detailForm.password, 'value']}
319+
type='password'
320+
placeholder={t('datasource.database_password')}
321+
/>
322+
</NFormItem>
323+
{/* ActiveDirectoryPassword */}
324+
<NFormItem
325+
v-show={showMode && detailForm.mode === 'ActiveDirectoryPassword'}
326+
label={t('datasource.Azure_AD_username')}
327+
path='userName'
328+
show-require-mark
329+
>
330+
<NInput
331+
allowInput={this.trim}
332+
v-model={[detailForm.userName, 'value']}
333+
type='text'
334+
placeholder={t('datasource.Azure_AD_username')}
335+
/>
336+
</NFormItem>
337+
<NFormItem
338+
v-show={showMode && detailForm.mode === 'ActiveDirectoryPassword'}
339+
label={t('datasource.Azure_AD_password')}
340+
path='password'
341+
show-require-mark
342+
>
343+
<NInput
344+
allowInput={this.trim}
345+
v-model={[detailForm.password, 'value']}
346+
type='password'
347+
placeholder={t('datasource.Azure_AD_password')}
348+
/>
349+
</NFormItem>
350+
{/* ActiveDirectoryMSI */}
351+
<NFormItem
352+
v-show={showMode && detailForm.mode === 'ActiveDirectoryMSI'}
353+
label={t('datasource.MSIClientId')}
354+
path='MSIClientId'
355+
>
356+
<NInput
357+
allowInput={this.trim}
358+
v-model={[detailForm.MSIClientId, 'value']}
359+
type='password'
360+
placeholder={t('datasource.MSIClientId')}
361+
/>
362+
</NFormItem>
363+
{/* ActiveDirectoryServicePrincipal */}
364+
<NFormItem
365+
v-show={showMode && detailForm.mode === 'ActiveDirectoryServicePrincipal'}
366+
label={t('datasource.clientId')}
367+
path='userName'
368+
show-require-mark
369+
>
370+
<NInput
371+
allowInput={this.trim}
372+
v-model={[detailForm.userName, 'value']}
373+
type='text'
374+
placeholder={t('datasource.clientId')}
375+
/>
376+
</NFormItem>
377+
<NFormItem
378+
v-show={showMode && detailForm.mode === 'ActiveDirectoryServicePrincipal'}
379+
label={t('datasource.clientSecret')}
380+
path='password'
381+
show-require-mark
382+
>
383+
<NInput
384+
allowInput={this.trim}
385+
v-model={[detailForm.password, 'value']}
386+
type='password'
387+
placeholder={t('datasource.clientSecret')}
388+
/>
389+
</NFormItem>
390+
{/* accessToken */}
391+
<NFormItem
392+
v-show={showMode && detailForm.mode === 'accessToken'}
393+
label={t('datasource.clientId')}
394+
path='userName'
395+
show-require-mark
396+
>
397+
<NInput
398+
allowInput={this.trim}
399+
v-model={[detailForm.userName, 'value']}
400+
type='text'
401+
placeholder={t('datasource.clientId')}
402+
/>
403+
</NFormItem>
404+
<NFormItem
405+
v-show={showMode && detailForm.mode === 'accessToken'}
406+
label={t('datasource.clientSecret')}
407+
path='password'
408+
show-require-mark
409+
>
410+
<NInput
411+
allowInput={this.trim}
412+
v-model={[detailForm.password, 'value']}
413+
type='password'
414+
placeholder={t('datasource.clientSecret')}
415+
/>
416+
</NFormItem>
417+
<NFormItem
418+
v-show={showMode && detailForm.mode === 'accessToken'}
419+
label={t('datasource.OAuth_token_endpoint')}
420+
path='endpoint'
421+
show-require-mark
422+
>
423+
<NInput
424+
allowInput={this.trim}
425+
v-model={[detailForm.endpoint, 'value']}
426+
type='text'
427+
placeholder={t('datasource.OAuth_token_endpoint')}
428+
/>
429+
</NFormItem>
430+
431+
432+
433+
282434
<NFormItem
283435
v-show={showPrincipal}
284436
label='keytab.username'
@@ -304,6 +456,7 @@ const DetailModal = defineComponent({
304456
/>
305457
</NFormItem>
306458
<NFormItem
459+
v-show={!showMode}
307460
label={t('datasource.user_name')}
308461
path='userName'
309462
show-require-mark
@@ -318,6 +471,7 @@ const DetailModal = defineComponent({
318471
/>
319472
</NFormItem>
320473
<NFormItem
474+
v-show={!showMode}
321475
label={t('datasource.user_password')}
322476
path='password'
323477
>

dolphinscheduler-ui/src/views/datasource/list/use-form.ts

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,16 @@ export function useForm(id?: number) {
4545
javaSecurityKrb5Conf: '',
4646
loginUserKeytabUsername: '',
4747
loginUserKeytabPath: '',
48+
mode: '',
4849
userName: '',
4950
password: '',
5051
database: '',
5152
connectType: '',
5253
other: '',
5354
testFlag: -1,
54-
bindTestId: undefined
55+
bindTestId: undefined,
56+
endpoint: '',
57+
MSIClientId: ''
5558
} as IDataSourceDetail
5659

5760
const state = reactive({
@@ -63,6 +66,7 @@ export function useForm(id?: number) {
6366
showAwsRegion: false,
6467
showConnectType: false,
6568
showPrincipal: false,
69+
showMode: false,
6670
bindTestDataSourceExample: [] as { label: string; value: number }[],
6771
rules: {
6872
name: {
@@ -97,10 +101,21 @@ export function useForm(id?: number) {
97101
}
98102
}
99103
},
104+
mode: {
105+
trigger: ['blur'],
106+
validator() {
107+
if (!state.detailForm.mode && state.showMode) {
108+
return new Error(t('datasource.mode_tips'))
109+
}
110+
}
111+
},
100112
userName: {
101113
trigger: ['input'],
102114
validator() {
103-
if (!state.detailForm.userName) {
115+
if (
116+
!state.detailForm.userName &&
117+
state.detailForm.type !== 'AZURESQL'
118+
) {
104119
return new Error(t('datasource.user_name_tips'))
105120
}
106121
}
@@ -152,8 +167,50 @@ export function useForm(id?: number) {
152167
return new Error(t('datasource.datasource_bind_test_id_tips'))
153168
}
154169
}
155-
}
156-
} as FormRules
170+
},
171+
endpoint: {
172+
trigger: ['input'],
173+
validator() {
174+
if (
175+
!state.detailForm.endpoint &&
176+
state.detailForm.type === 'AZURESQL' &&
177+
state.detailForm.mode === 'accessToken'
178+
) {
179+
return new Error(t('datasource.endpoint_tips'))
180+
}
181+
}
182+
},
183+
// databaseUserName: {
184+
// trigger: ['input'],
185+
// validator() {
186+
// if (!state.detailForm.userName) {
187+
// return new Error(t('datasource.user_name_tips'))
188+
// }
189+
// }
190+
// },
191+
} as FormRules,
192+
modeOptions: [
193+
{
194+
label: "SqlPassword",
195+
value: 'SqlPassword',
196+
},
197+
{
198+
label: "ActiveDirectoryPassword",
199+
value: 'ActiveDirectoryPassword',
200+
},
201+
{
202+
label: "ActiveDirectoryMSI",
203+
value: 'ActiveDirectoryMSI',
204+
},
205+
{
206+
label: "ActiveDirectoryServicePrincipal",
207+
value: 'ActiveDirectoryServicePrincipal',
208+
},
209+
{
210+
label: "accessToken",
211+
value: 'accessToken',
212+
},
213+
]
157214
})
158215

159216
const changeType = async (type: IDataBase, options: IDataBaseOption) => {
@@ -165,6 +222,7 @@ export function useForm(id?: number) {
165222
state.showHost = type !== 'ATHENA'
166223
state.showPort = type !== 'ATHENA'
167224
state.showAwsRegion = type === 'ATHENA'
225+
state.showMode = type === 'AZURESQL'
168226

169227
if (type === 'ORACLE' && !id) {
170228
state.detailForm.connectType = 'ORACLE_SERVICE_NAME'
@@ -226,6 +284,7 @@ export function useForm(id?: number) {
226284

227285
const getFieldsValue = () => state.detailForm
228286

287+
229288
return {
230289
state,
231290
changeType,
@@ -299,6 +358,11 @@ export const datasourceType: IDataBaseOptionKeys = {
299358
label: 'TRINO',
300359
defaultPort: 8080
301360
},
361+
AZURESQL: {
362+
value: 'AZURESQL',
363+
label: 'AZURESQL',
364+
defaultPort: 1433
365+
},
302366
STARROCKS: {
303367
value: 'STARROCKS',
304368
label: 'STARROCKS',

dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-datasource.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,12 @@ export function useDatasource(
102102
id: 13,
103103
code: 'STARROCKS',
104104
disabled: false
105-
}
105+
},
106+
{
107+
id: 14,
108+
code: 'AZURESQL',
109+
disabled: false
110+
},
106111
]
107112

108113
const getDatasourceTypes = async () => {

0 commit comments

Comments
 (0)