From 664611b6bfb9f17c894f3a1aef378033afdd83a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=B6=85?= Date: Tue, 30 Jun 2026 16:18:49 +0800 Subject: [PATCH 1/5] Refine datasource password handling and use backend config for save-time connection checks --- .../api/service/DataSourceService.java | 4 +- .../service/impl/DataSourceServiceImpl.java | 14 +- .../src/main/resources/application.yaml | 2 + .../api/service/DataSourceServiceTest.java | 124 ++++++++++++++++++ 4 files changed, 141 insertions(+), 3 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java index 5546d91e045f..6ba30684f37e 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java @@ -36,7 +36,7 @@ public interface DataSourceService { * @param loginUser login user * @param datasourceParam datasource configuration DTO * @return created {@link DataSource} entity (sensitive fields masked) - * @throws ServiceException if permission denied, security check fails, or connection test fails + * @throws ServiceException if permission denied, security check fails, or configured connection test fails */ DataSource createDataSource(User loginUser, BaseDataSourceParamDTO datasourceParam); @@ -46,7 +46,7 @@ public interface DataSourceService { * @param loginUser login user * @param dataSourceParam datasource params * @return updated {@link DataSource} entity (sensitive fields masked) - * @throws ServiceException if permission denied, security check fails, or connection test fails + * @throws ServiceException if permission denied, security check fails, or configured connection test fails */ DataSource updateDataSource(User loginUser, BaseDataSourceParamDTO dataSourceParam); diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java index 65b749376201..5e27cebe15e9 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java @@ -59,6 +59,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -77,6 +78,9 @@ public class DataSourceServiceImpl extends BaseServiceImpl implements DataSource @Autowired private DataSourceUserDao datasourceUserDao; + @Value("${datasource.connection-test-on-save:false}") + private boolean connectionTestOnSaveEnabled; + private static final String TABLE = "TABLE"; private static final String VIEW = "VIEW"; private static final String[] TABLE_TYPES = new String[]{TABLE, VIEW}; @@ -99,6 +103,10 @@ public DataSource createDataSource(User loginUser, BaseDataSourceParamDTO dataso } ConnectionParam connectionParam = DataSourceUtils.buildConnectionParams(datasourceParam); + if (connectionTestOnSaveEnabled) { + checkConnection(datasourceParam.getType(), connectionParam); + } + // build datasource DataSource dataSource = new DataSource(); Date now = new Date(); @@ -151,6 +159,10 @@ public DataSource updateDataSource(User loginUser, BaseDataSourceParamDTO dataSo connectionParam.setPassword(oldParams.path(Constants.PASSWORD).asText()); } + if (connectionTestOnSaveEnabled) { + checkConnection(dataSourceParam.getType(), connectionParam); + } + Date now = new Date(); dataSource.setName(dataSourceParam.getName().trim()); @@ -191,7 +203,7 @@ public BaseDataSourceParamDTO queryDataSource(int id, User loginUser) { baseDataSourceParamDTO.setId(dataSource.getId()); baseDataSourceParamDTO.setName(dataSource.getName()); baseDataSourceParamDTO.setNote(dataSource.getNote()); - baseDataSourceParamDTO.setPassword(getHiddenPassword()); + baseDataSourceParamDTO.setPassword(""); return baseDataSourceParamDTO; } diff --git a/dolphinscheduler-api/src/main/resources/application.yaml b/dolphinscheduler-api/src/main/resources/application.yaml index 9d3bb1c6a57a..85321c962421 100644 --- a/dolphinscheduler-api/src/main/resources/application.yaml +++ b/dolphinscheduler-api/src/main/resources/application.yaml @@ -264,6 +264,8 @@ casdoor: # Doplhinscheduler login url redirect-url: "" +datasource: + connection-test-on-save: false # Override by profile diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java index f6daee50b704..3133ed23db98 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java @@ -74,6 +74,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; +import org.springframework.test.util.ReflectionTestUtils; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -237,6 +238,129 @@ public void updateDataSourceTest() { } } + @Test + public void createDataSourceChecksConnectionWhenConfigured() { + User loginUser = getAdminUser(); + PostgreSQLDataSourceParamDTO postgreSqlDatasourceParam = new PostgreSQLDataSourceParamDTO(); + postgreSqlDatasourceParam.setDatabase("dolphinscheduler"); + postgreSqlDatasourceParam.setNote("test dataSource"); + postgreSqlDatasourceParam.setHost("172.16.133.200"); + postgreSqlDatasourceParam.setPort(5432); + postgreSqlDatasourceParam.setUserName("postgres"); + postgreSqlDatasourceParam.setPassword("postgres"); + postgreSqlDatasourceParam.setName("dataSource01"); + + ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", true); + passResourcePermissionCheckService(); + when(dataSourceDao.queryDataSourceByName(postgreSqlDatasourceParam.getName().trim())).thenReturn(null); + + try ( + MockedStatic mockedStaticDataSourceUtils = + Mockito.mockStatic(DataSourceUtils.class, Mockito.CALLS_REAL_METHODS)) { + DataSourceProcessor dataSourceProcessor = Mockito.mock(DataSourceProcessor.class); + ConnectionParam connectionParam = Mockito.mock(ConnectionParam.class); + mockedStaticDataSourceUtils.when(() -> DataSourceUtils.getDatasourceProcessor(Mockito.any())) + .thenReturn(dataSourceProcessor); + when(dataSourceProcessor.createConnectionParams(Mockito.any(BaseDataSourceParamDTO.class))) + .thenReturn(connectionParam); + when(dataSourceProcessor.checkDataSourceConnectivity(Mockito.any())).thenReturn(false); + + assertThrowsServiceException(Status.CONNECTION_TEST_FAILURE, + () -> dataSourceService.createDataSource(loginUser, postgreSqlDatasourceParam)); + } + } + + @Test + public void updateDataSourceChecksConnectionWhenConfigured() { + User loginUser = getAdminUser(); + int dataSourceId = 12; + PostgreSQLDataSourceParamDTO postgreSqlDatasourceParam = new PostgreSQLDataSourceParamDTO(); + postgreSqlDatasourceParam.setId(dataSourceId); + postgreSqlDatasourceParam.setDatabase("dolphinscheduler"); + postgreSqlDatasourceParam.setNote("test dataSource"); + postgreSqlDatasourceParam.setHost("172.16.133.200"); + postgreSqlDatasourceParam.setPort(5432); + postgreSqlDatasourceParam.setUserName("postgres"); + postgreSqlDatasourceParam.setPassword("postgres"); + postgreSqlDatasourceParam.setName("dataSource01-update"); + + DataSource dataSource = new DataSource(); + dataSource.setId(dataSourceId); + dataSource.setName("dataSource01"); + dataSource.setType(DbType.POSTGRESQL); + + ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", true); + passResourcePermissionCheckService(); + when(dataSourceDao.queryById(dataSourceId)).thenReturn(dataSource); + when(dataSourceDao.queryDataSourceByName(postgreSqlDatasourceParam.getName())).thenReturn(null); + + try ( + MockedStatic mockedStaticDataSourceUtils = + Mockito.mockStatic(DataSourceUtils.class, Mockito.CALLS_REAL_METHODS)) { + DataSourceProcessor dataSourceProcessor = Mockito.mock(DataSourceProcessor.class); + ConnectionParam connectionParam = Mockito.mock(ConnectionParam.class); + mockedStaticDataSourceUtils.when(() -> DataSourceUtils.getDatasourceProcessor(Mockito.any())) + .thenReturn(dataSourceProcessor); + when(connectionParam.getPassword()).thenReturn("postgres"); + when(dataSourceProcessor.createConnectionParams(Mockito.any(BaseDataSourceParamDTO.class))) + .thenReturn(connectionParam); + when(dataSourceProcessor.checkDataSourceConnectivity(Mockito.any())).thenReturn(false); + + assertThrowsServiceException(Status.CONNECTION_TEST_FAILURE, + () -> dataSourceService.updateDataSource(loginUser, postgreSqlDatasourceParam)); + } + } + + @Test + public void dataSourceDoesNotCheckConnectionByDefault() { + User loginUser = getAdminUser(); + int dataSourceId = 12; + PostgreSQLDataSourceParamDTO createDatasourceParam = new PostgreSQLDataSourceParamDTO(); + createDatasourceParam.setDatabase("dolphinscheduler"); + createDatasourceParam.setNote("test dataSource"); + createDatasourceParam.setHost("172.16.133.200"); + createDatasourceParam.setPort(5432); + createDatasourceParam.setUserName("postgres"); + createDatasourceParam.setPassword("postgres"); + createDatasourceParam.setName("dataSource01"); + + PostgreSQLDataSourceParamDTO updateDatasourceParam = new PostgreSQLDataSourceParamDTO(); + updateDatasourceParam.setId(dataSourceId); + updateDatasourceParam.setDatabase("dolphinscheduler"); + updateDatasourceParam.setNote("test dataSource"); + updateDatasourceParam.setHost("172.16.133.200"); + updateDatasourceParam.setPort(5432); + updateDatasourceParam.setUserName("postgres"); + updateDatasourceParam.setPassword("postgres"); + updateDatasourceParam.setName("dataSource01-update"); + + DataSource dataSource = new DataSource(); + dataSource.setId(dataSourceId); + dataSource.setName("dataSource01"); + dataSource.setType(DbType.POSTGRESQL); + + ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", false); + passResourcePermissionCheckService(); + when(dataSourceDao.queryById(dataSourceId)).thenReturn(dataSource); + when(dataSourceDao.queryDataSourceByName(Mockito.anyString())).thenReturn(null); + + try ( + MockedStatic mockedStaticDataSourceUtils = + Mockito.mockStatic(DataSourceUtils.class, Mockito.CALLS_REAL_METHODS)) { + DataSourceProcessor dataSourceProcessor = Mockito.mock(DataSourceProcessor.class); + ConnectionParam connectionParam = Mockito.mock(ConnectionParam.class); + mockedStaticDataSourceUtils.when(() -> DataSourceUtils.getDatasourceProcessor(Mockito.any())) + .thenReturn(dataSourceProcessor); + when(connectionParam.getPassword()).thenReturn("postgres"); + when(dataSourceProcessor.createConnectionParams(Mockito.any(BaseDataSourceParamDTO.class))) + .thenReturn(connectionParam); + + assertDoesNotThrow(() -> dataSourceService.createDataSource(loginUser, createDatasourceParam)); + assertDoesNotThrow(() -> dataSourceService.updateDataSource(loginUser, updateDatasourceParam)); + Mockito.verify(dataSourceProcessor, Mockito.never()).checkDataSourceConnectivity(Mockito.any()); + } + } + @Test public void testQueryDataSourceListPaging() { From d311d512d9c916a707ffc03abba87f5c8514fd12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=B6=85?= Date: Tue, 30 Jun 2026 17:23:49 +0800 Subject: [PATCH 2/5] Added a configuration option to toggle the data source test. --- deploy/kubernetes/dolphinscheduler/values.yaml | 3 +++ .../test/resources/docker/ldap-login/application.yaml | 2 ++ .../test/resources/docker/oidc-login/application.yaml | 2 ++ .../dolphinscheduler/api/configuration/ApiConfig.java | 2 ++ .../api/service/impl/DataSourceServiceImpl.java | 10 +++++----- .../src/main/resources/application.yaml | 4 ++-- .../api/service/DataSourceServiceTest.java | 11 +++++++---- .../src/test/resources/application.yaml | 2 ++ .../src/main/resources/application.yaml | 2 ++ 9 files changed, 27 insertions(+), 11 deletions(-) diff --git a/deploy/kubernetes/dolphinscheduler/values.yaml b/deploy/kubernetes/dolphinscheduler/values.yaml index c5d0fdc4b3a1..ca3c993b1954 100644 --- a/deploy/kubernetes/dolphinscheduler/values.yaml +++ b/deploy/kubernetes/dolphinscheduler/values.yaml @@ -965,6 +965,9 @@ api: # jackson: # time-zone: UTC # date-format: "yyyy-MM-dd HH:mm:ss" + # api: + # # Whether to test datasource connectivity before creating or updating a datasource. + # datasource-connection-enable: false # -- Periodic probe of container liveness. Container will be restarted if the probe fails. # More info: [container-probes](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes) livenessProbe: diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/ldap-login/application.yaml b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/ldap-login/application.yaml index 54198a54cc7b..0a0fee5528ff 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/ldap-login/application.yaml +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/ldap-login/application.yaml @@ -218,6 +218,8 @@ alert: api: audit-enable: false + # Whether to test datasource connectivity before creating or updating a datasource. + datasource-connection-enable: false # Traffic control, if you turn on this config, the maximum number of request/s will be limited. # global max request number per second # default tenant-level max request number diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/oidc-login/application.yaml b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/oidc-login/application.yaml index 5de70a7a5067..068b64a1261d 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/oidc-login/application.yaml +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/oidc-login/application.yaml @@ -162,6 +162,8 @@ api: base-url: http://localhost:12345/dolphinscheduler ui-url: http://localhost:5173 audit-enable: false + # Whether to test datasource connectivity before creating or updating a datasource. + datasource-connection-enable: false traffic-control: global-switch: false max-global-qps-rate: 300 diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/ApiConfig.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/ApiConfig.java index 2ba09ee37b0d..6d9f4606e0d1 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/ApiConfig.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/ApiConfig.java @@ -44,6 +44,7 @@ public class ApiConfig implements Validator { private String baseUrl; private String uiUrl; private boolean auditEnable = false; + private boolean datasourceConnectionEnable = false; private TrafficConfiguration trafficControl = new TrafficConfiguration(); @@ -70,6 +71,7 @@ private void printConfig() { log.info("API config: baseUrl -> {} ", baseUrl); log.info("API config: uiUrl -> {} ", uiUrl); log.info("API config: auditEnable -> {} ", auditEnable); + log.info("API config: datasourceConnectionEnable -> {} ", datasourceConnectionEnable); log.info("API config: trafficControl -> {} ", trafficControl); log.info("API config: pythonGateway -> {} ", pythonGateway); } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java index 5e27cebe15e9..52dabef88963 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java @@ -20,6 +20,7 @@ import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.DATASOURCE_DELETE; import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.DATASOURCE_UPDATE; +import org.apache.dolphinscheduler.api.configuration.ApiConfig; import org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant; import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.exceptions.ServiceException; @@ -59,7 +60,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -78,8 +78,8 @@ public class DataSourceServiceImpl extends BaseServiceImpl implements DataSource @Autowired private DataSourceUserDao datasourceUserDao; - @Value("${datasource.connection-test-on-save:false}") - private boolean connectionTestOnSaveEnabled; + @Autowired + private ApiConfig apiConfig; private static final String TABLE = "TABLE"; private static final String VIEW = "VIEW"; @@ -103,7 +103,7 @@ public DataSource createDataSource(User loginUser, BaseDataSourceParamDTO dataso } ConnectionParam connectionParam = DataSourceUtils.buildConnectionParams(datasourceParam); - if (connectionTestOnSaveEnabled) { + if (apiConfig.isDatasourceConnectionEnable()) { checkConnection(datasourceParam.getType(), connectionParam); } @@ -159,7 +159,7 @@ public DataSource updateDataSource(User loginUser, BaseDataSourceParamDTO dataSo connectionParam.setPassword(oldParams.path(Constants.PASSWORD).asText()); } - if (connectionTestOnSaveEnabled) { + if (apiConfig.isDatasourceConnectionEnable()) { checkConnection(dataSourceParam.getType(), connectionParam); } diff --git a/dolphinscheduler-api/src/main/resources/application.yaml b/dolphinscheduler-api/src/main/resources/application.yaml index 85321c962421..ca4aa107b867 100644 --- a/dolphinscheduler-api/src/main/resources/application.yaml +++ b/dolphinscheduler-api/src/main/resources/application.yaml @@ -142,6 +142,8 @@ api: base-url: http://127.0.0.1:12345/dolphinscheduler ui-url: http://127.0.0.1:5173 audit-enable: false + # Whether to test datasource connectivity before creating or updating a datasource. + datasource-connection-enable: false # Traffic control, if you turn on this config, the maximum number of request/s will be limited. # global max request number per second # default tenant-level max request number @@ -264,8 +266,6 @@ casdoor: # Doplhinscheduler login url redirect-url: "" -datasource: - connection-test-on-save: false # Override by profile diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java index 3133ed23db98..2a0f6a49c80a 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java @@ -22,6 +22,7 @@ import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.DATASOURCE; import static org.mockito.Mockito.when; +import org.apache.dolphinscheduler.api.configuration.ApiConfig; import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.permission.ResourcePermissionCheckService; import org.apache.dolphinscheduler.api.service.impl.BaseServiceImpl; @@ -74,7 +75,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; -import org.springframework.test.util.ReflectionTestUtils; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -97,6 +97,9 @@ public class DataSourceServiceTest { @Mock private ResourcePermissionCheckService resourcePermissionCheckService; + @Mock + private ApiConfig apiConfig; + @Mock private IPage dataSourceList; @@ -250,7 +253,7 @@ public void createDataSourceChecksConnectionWhenConfigured() { postgreSqlDatasourceParam.setPassword("postgres"); postgreSqlDatasourceParam.setName("dataSource01"); - ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", true); + when(apiConfig.isDatasourceConnectionEnable()).thenReturn(true); passResourcePermissionCheckService(); when(dataSourceDao.queryDataSourceByName(postgreSqlDatasourceParam.getName().trim())).thenReturn(null); @@ -289,7 +292,7 @@ public void updateDataSourceChecksConnectionWhenConfigured() { dataSource.setName("dataSource01"); dataSource.setType(DbType.POSTGRESQL); - ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", true); + when(apiConfig.isDatasourceConnectionEnable()).thenReturn(true); passResourcePermissionCheckService(); when(dataSourceDao.queryById(dataSourceId)).thenReturn(dataSource); when(dataSourceDao.queryDataSourceByName(postgreSqlDatasourceParam.getName())).thenReturn(null); @@ -339,7 +342,7 @@ public void dataSourceDoesNotCheckConnectionByDefault() { dataSource.setName("dataSource01"); dataSource.setType(DbType.POSTGRESQL); - ReflectionTestUtils.setField(dataSourceService, "connectionTestOnSaveEnabled", false); + when(apiConfig.isDatasourceConnectionEnable()).thenReturn(false); passResourcePermissionCheckService(); when(dataSourceDao.queryById(dataSourceId)).thenReturn(dataSource); when(dataSourceDao.queryDataSourceByName(Mockito.anyString())).thenReturn(null); diff --git a/dolphinscheduler-api/src/test/resources/application.yaml b/dolphinscheduler-api/src/test/resources/application.yaml index b5c3373d6561..bb840c397c89 100644 --- a/dolphinscheduler-api/src/test/resources/application.yaml +++ b/dolphinscheduler-api/src/test/resources/application.yaml @@ -58,6 +58,8 @@ registry: api: audit-enable: true + # Whether to test datasource connectivity before creating or updating a datasource. + datasource-connection-enable: false # Traffic control, if you turn on this config, the maximum number of request/s will be limited. # global max request number per second # default tenant-level max request number diff --git a/dolphinscheduler-standalone-server/src/main/resources/application.yaml b/dolphinscheduler-standalone-server/src/main/resources/application.yaml index bd13f0632185..9ae08ccbba24 100644 --- a/dolphinscheduler-standalone-server/src/main/resources/application.yaml +++ b/dolphinscheduler-standalone-server/src/main/resources/application.yaml @@ -260,6 +260,8 @@ alert: api: audit-enable: false + # Whether to test datasource connectivity before creating or updating a datasource. + datasource-connection-enable: false # Traffic control, if you turn on this config, the maximum number of request/s will be limited. # global max request number per second # default tenant-level max request number From a759e4cf38945492afd22db8dd74798a6e42e06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=B6=85?= Date: Tue, 30 Jun 2026 20:00:45 +0800 Subject: [PATCH 3/5] add unit test --- .../dolphinscheduler/api/configuration/ApiConfigTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/configuration/ApiConfigTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/configuration/ApiConfigTest.java index 35650fea1e0d..7236ebb4ecfb 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/configuration/ApiConfigTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/configuration/ApiConfigTest.java @@ -35,6 +35,11 @@ public void testIsAuditEnable() { Assertions.assertTrue(apiConfig.isAuditEnable()); } + @Test + public void testIsDatasourceConnectionEnable() { + Assertions.assertFalse(apiConfig.isDatasourceConnectionEnable()); + } + @Test public void testGetTrafficControlConfig() { ApiConfig.TrafficConfiguration trafficControl = apiConfig.getTrafficControl(); From 23d5b1c0da0219bcdce62bd9aad7cde4be61ef3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=B6=85?= Date: Tue, 30 Jun 2026 20:23:04 +0800 Subject: [PATCH 4/5] add configuration doc --- docs/docs/en/architecture/configuration.md | 1 + docs/docs/zh/architecture/configuration.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/docs/en/architecture/configuration.md b/docs/docs/en/architecture/configuration.md index b0c7dbd5d586..b38345a37366 100644 --- a/docs/docs/en/architecture/configuration.md +++ b/docs/docs/en/architecture/configuration.md @@ -260,6 +260,7 @@ Location: `api-server/conf/application.yaml` | casdoor.organization-name | | organization name in Casdoor | | casdoor.application-name | | application name in Casdoor | | casdoor.redirect-url | | doplhinscheduler login url | +| api.datasource-connection-enable | false | Whether to test datasource connectivity before creating or updating a datasource | | api.traffic.control.global.switch | false | traffic control global switch | | api.traffic.control.max-global-qps-rate | 300 | global max request number per second | | api.traffic.control.tenant-switch | false | traffic control tenant switch | diff --git a/docs/docs/zh/architecture/configuration.md b/docs/docs/zh/architecture/configuration.md index 8417b6bc663f..430b90571adc 100644 --- a/docs/docs/zh/architecture/configuration.md +++ b/docs/docs/zh/architecture/configuration.md @@ -260,6 +260,7 @@ common.properties配置文件目前主要是配置hadoop/s3/yarn/applicationId | casdoor.organization-name | | Casdoor中的组织名称 | | casdoor.application-name | | Casdoor中的应用名称 | | casdoor.redirect-url | | dolphinscheduler登录URL | +| api.datasource-connection-enable | false | 在创建或更新数据源时是否需要提前测试其连接性 | | api.traffic.control.global.switch | false | 流量控制全局开关 | | api.traffic.control.max-global-qps-rate | 300 | 全局最大请求数/秒 | | api.traffic.control.tenant-switch | false | 流量控制租户开关 | From 8e8601ce7e638464c2b031982bf48f5dea28221d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=B6=85?= Date: Thu, 2 Jul 2026 14:00:17 +0800 Subject: [PATCH 5/5] update configuration.md --- docs/docs/zh/architecture/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/zh/architecture/configuration.md b/docs/docs/zh/architecture/configuration.md index 430b90571adc..83a78487865d 100644 --- a/docs/docs/zh/architecture/configuration.md +++ b/docs/docs/zh/architecture/configuration.md @@ -260,7 +260,7 @@ common.properties配置文件目前主要是配置hadoop/s3/yarn/applicationId | casdoor.organization-name | | Casdoor中的组织名称 | | casdoor.application-name | | Casdoor中的应用名称 | | casdoor.redirect-url | | dolphinscheduler登录URL | -| api.datasource-connection-enable | false | 在创建或更新数据源时是否需要提前测试其连接性 | +| api.datasource-connection-enable | false | 在创建或更新数据源时是否需要强制测试其连接性 | | api.traffic.control.global.switch | false | 流量控制全局开关 | | api.traffic.control.max-global-qps-rate | 300 | 全局最大请求数/秒 | | api.traffic.control.tenant-switch | false | 流量控制租户开关 |