From 35d8e8ac172fac7b992b8d60d2a875aefccaa652 Mon Sep 17 00:00:00 2001 From: He Wang Date: Tue, 7 Mar 2023 10:12:58 +0800 Subject: [PATCH] [Feature][DataSource] add oceanbase datasource (#13675) Co-authored-by: Jay Chung --- .dlc.json | 2 +- docs/configs/docsdev.js | 40 ++++ docs/docs/en/guide/datasource/oceanbase.md | 24 +++ docs/docs/zh/guide/datasource/oceanbase.md | 21 ++ docs/img/new_ui/dev/datasource/oceanbase.png | Bin 0 -> 135476 bytes .../common/constants/DataSourceConstants.java | 2 + .../dolphinscheduler-datasource-all/pom.xml | 5 + .../pom.xml | 43 ++++ .../oceanbase/OceanBaseDataSourceChannel.java | 31 +++ .../OceanBaseDataSourceChannelFactory.java | 37 ++++ .../oceanbase/OceanBaseDataSourceClient.java | 29 +++ .../param/OceanBaseConnectionParam.java | 28 +++ .../param/OceanBaseDataSourceParamDTO.java | 39 ++++ .../param/OceanBaseDataSourceProcessor.java | 191 ++++++++++++++++++ dolphinscheduler-datasource-plugin/pom.xml | 1 + .../dolphinscheduler/spi/enums/DbType.java | 3 +- .../src/locales/en_US/datasource.ts | 2 + .../src/locales/zh_CN/datasource.ts | 2 + .../src/service/modules/data-source/types.ts | 3 + .../src/views/datasource/list/detail.tsx | 16 ++ .../src/views/datasource/list/use-form.ts | 8 + 21 files changed, 525 insertions(+), 2 deletions(-) create mode 100644 docs/docs/en/guide/datasource/oceanbase.md create mode 100644 docs/docs/zh/guide/datasource/oceanbase.md create mode 100644 docs/img/new_ui/dev/datasource/oceanbase.png create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java create mode 100644 dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java diff --git a/.dlc.json b/.dlc.json index 2dcead4686..8d1d9ab6ef 100644 --- a/.dlc.json +++ b/.dlc.json @@ -35,5 +35,5 @@ "retryOn429": true, "retryCount": 10, "fallbackRetryDelay": "1000s", - "aliveStatusCodes": [200, 401, 0] + "aliveStatusCodes": [200, 401, 403, 0] } diff --git a/docs/configs/docsdev.js b/docs/configs/docsdev.js index 22968f0c3a..690d9ce883 100644 --- a/docs/configs/docsdev.js +++ b/docs/configs/docsdev.js @@ -303,6 +303,22 @@ export default { title: 'Azure SQL Database', link: '/en-us/docs/dev/user_doc/guide/datasource/azure-sql.html', }, + { + title: 'Trino', + link: '/en-us/docs/dev/user_doc/guide/datasource/trino.html', + }, + { + title: 'StarRocks', + link: '/en-us/docs/dev/user_doc/guide/datasource/starrocks.html', + }, + { + title: 'DAMENG', + link: '/en-us/docs/dev/user_doc/guide/datasource/dameng.html', + }, + { + title: 'OceanBase', + link: '/en-us/docs/dev/user_doc/guide/datasource/oceanbase.html', + }, ], }, { @@ -948,6 +964,30 @@ export default { title: 'Azure SQL Database', link: '/zh-cn/docs/dev/user_doc/guide/datasource/azure-sql.html', }, + { + title: 'Redshift', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/redshift.html', + }, + { + title: 'Oracle', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/oracle.html', + }, + { + title: 'Trino', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/trino.html', + }, + { + title: 'StarRocks', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/starrocks.html', + }, + { + title: 'DAMENG', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/dameng.html', + }, + { + title: 'OceanBase', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/oceanbase.html', + }, ], }, { diff --git a/docs/docs/en/guide/datasource/oceanbase.md b/docs/docs/en/guide/datasource/oceanbase.md new file mode 100644 index 0000000000..57eed20355 --- /dev/null +++ b/docs/docs/en/guide/datasource/oceanbase.md @@ -0,0 +1,24 @@ +# OceanBase + +![oceanbase](../../../../img/new_ui/dev/datasource/oceanbase.png) + +## Datasource Parameters + +| **Datasource** | **Description** | +|----------------------------|--------------------------------------------------------------| +| Datasource | Select OCEANBASE. | +| Datasource name | Enter the name of the DataSource. | +| Description | Enter a description of the DataSource. | +| IP/Host name | Enter the OceanBase service IP. | +| Port | Enter the OceanBase service port. | +| Username | Set the username for OceanBase connection. | +| Password | Set the password for OceanBase connection. | +| Database name | Enter the database name of the OceanBase connection. | +| Compatible mode | Set the compatible mode of the OceanBase connection. | +| Jdbc connection parameters | Parameter settings for OceanBase connection, in JSON format. | + +## Native Supported + +No, you need to import the OceanBase jdbc driver [oceanbase-client](https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client) first, refer to the section example in [datasource-setting](../howto/datasource-setting.md) `DataSource Center` section. + +The compatible mode of the datasource can be 'mysql' or 'oracle', if you only use OceanBase with 'mysql' mode, you can also treat OceanBase as MySQL and manage the datasource referring to [mysql datasource](mysql.md) diff --git a/docs/docs/zh/guide/datasource/oceanbase.md b/docs/docs/zh/guide/datasource/oceanbase.md new file mode 100644 index 0000000000..59caffdb02 --- /dev/null +++ b/docs/docs/zh/guide/datasource/oceanbase.md @@ -0,0 +1,21 @@ +# OceanBase 数据源 + +![oceanbase](../../../../img/new_ui/dev/datasource/oceanbase.png) + +- 数据源:选择 OCEANBASE +- 数据源名称:输入数据源的名称 +- 描述:输入数据源的描述 +- IP 主机名:输入连接 OceanBase 的 IP +- 端口:输入连接 OceanBase 的端口 +- 用户名:设置连接 OceanBase 的用户名 +- 密码:设置连接 OceanBase 的密码 +- 数据库名:输入连接 OceanBase 的数据库名称 +- 兼容模式:输入连接 OceanBase 的兼容模式 +- Jdbc 连接参数:用于 OceanBase 连接的参数设置,以 JSON 形式填写 + +## 是否原生支持 + +否,使用前需要先引入 OceanBase 的 JDBC 驱动 [oceanbase-client](https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client),请参考 [数据源配置](../howto/datasource-setting.md) 中的 "数据源中心" 章节。 + +OceanBase 数据源的兼容模式可以是 'mysql' 或 'oracle',如果你只使用 mysql 模式,你也可以选择将 OceanBase 数据源当作 MySQL 数据源来使用,请参考 [MySQL 数据源](mysql.md) + diff --git a/docs/img/new_ui/dev/datasource/oceanbase.png b/docs/img/new_ui/dev/datasource/oceanbase.png new file mode 100644 index 0000000000000000000000000000000000000000..46ef0a592b9b0a1e66053e473a43444664292d5a GIT binary patch literal 135476 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 <59H^aa1*TIiG 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 z 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≠uFyG2%d`uKqN6 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 X&+~c#{pam{z`r}{dbg3cY$N{<-L;#| literal 0 HcmV?d00001 diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java index 58602ba3b2..f2f580a8b8 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java @@ -37,6 +37,7 @@ public class DataSourceConstants { public static final String COM_ATHENA_JDBC_DRIVER = "com.simba.athena.jdbc.Driver"; public static final String COM_TRINO_JDBC_DRIVER = "io.trino.jdbc.TrinoDriver"; public static final String COM_DAMENG_JDBC_DRIVER = "dm.jdbc.driver.DmDriver"; + public static final String COM_OCEANBASE_JDBC_DRIVER = "com.oceanbase.jdbc.Driver"; /** * validation Query @@ -71,6 +72,7 @@ public class DataSourceConstants { public static final String JDBC_ATHENA = "jdbc:awsathena://"; public static final String JDBC_TRINO = "jdbc:trino://"; public static final String JDBC_DAMENG = "jdbc:dm://"; + public static final String JDBC_OCEANBASE = "jdbc:oceanbase://"; /** * database type diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml index 4030b07bd6..28b2f21ec9 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml @@ -47,6 +47,11 @@ dolphinscheduler-datasource-mysql ${project.version} + + org.apache.dolphinscheduler + dolphinscheduler-datasource-oceanbase + ${project.version} + org.apache.dolphinscheduler dolphinscheduler-datasource-oracle diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml new file mode 100644 index 0000000000..37e228c9e6 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml @@ -0,0 +1,43 @@ + + + + 4.0.0 + + org.apache.dolphinscheduler + dolphinscheduler-datasource-plugin + dev-SNAPSHOT + + + dolphinscheduler-datasource-oceanbase + jar + ${project.artifactId} + + + + org.apache.dolphinscheduler + dolphinscheduler-spi + provided + + + org.apache.dolphinscheduler + dolphinscheduler-datasource-api + ${project.version} + + + diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java new file mode 100644 index 0000000000..0dac1d768c --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel; +import org.apache.dolphinscheduler.spi.datasource.DataSourceClient; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceChannel implements DataSourceChannel { + + @Override + public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) { + return new OceanBaseDataSourceClient(baseConnectionParam, dbType); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java new file mode 100644 index 0000000000..a69d6b3ae5 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel; +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannelFactory; + +import com.google.auto.service.AutoService; + +@AutoService(DataSourceChannelFactory.class) +public class OceanBaseDataSourceChannelFactory implements DataSourceChannelFactory { + + @Override + public String getName() { + return "oceanbase"; + } + + @Override + public DataSourceChannel create() { + return new OceanBaseDataSourceChannel(); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java new file mode 100644 index 0000000000..4097ae47d2 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient; +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceClient extends CommonDataSourceClient { + + public OceanBaseDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) { + super(baseConnectionParam, dbType); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java new file mode 100644 index 0000000000..c645179b64 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; + +import lombok.Data; + +@Data +public class OceanBaseConnectionParam extends BaseConnectionParam { + + protected String compatibleMode; +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java new file mode 100644 index 0000000000..9758d2d1c7 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.BaseDataSourceParamDTO; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceParamDTO extends BaseDataSourceParamDTO { + + protected String compatibleMode; + + public String getCompatibleMode() { + return compatibleMode; + } + + public void setCompatibleMode(String compatibleMode) { + this.compatibleMode = compatibleMode; + } + + @Override + public DbType getType() { + return DbType.OCEANBASE; + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java new file mode 100644 index 0000000000..795dcb35a8 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.common.constants.Constants; +import org.apache.dolphinscheduler.common.constants.DataSourceConstants; +import org.apache.dolphinscheduler.common.utils.JSONUtils; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.AbstractDataSourceProcessor; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.BaseDataSourceParamDTO; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.DataSourceProcessor; +import org.apache.dolphinscheduler.plugin.datasource.api.utils.PasswordUtils; +import org.apache.dolphinscheduler.spi.datasource.ConnectionParam; +import org.apache.dolphinscheduler.spi.enums.DbType; + +import org.apache.commons.collections4.MapUtils; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lombok.extern.slf4j.Slf4j; + +import com.google.auto.service.AutoService; + +@Slf4j +@AutoService(DataSourceProcessor.class) +public class OceanBaseDataSourceProcessor extends AbstractDataSourceProcessor { + + private static final String ALLOW_LOAD_LOCAL_IN_FILE_NAME = "allowLoadLocalInfile"; + + private static final String AUTO_DESERIALIZE = "autoDeserialize"; + + private static final String ALLOW_LOCAL_IN_FILE_NAME = "allowLocalInfile"; + + private static final String ALLOW_URL_IN_LOCAL_IN_FILE_NAME = "allowUrlInLocalInfile"; + + private static final String APPEND_PARAMS = + "allowLoadLocalInfile=false&autoDeserialize=false&allowLocalInfile=false&allowUrlInLocalInfile=false"; + + @Override + public BaseDataSourceParamDTO castDatasourceParamDTO(String paramJson) { + return JSONUtils.parseObject(paramJson, OceanBaseDataSourceParamDTO.class); + } + + @Override + public BaseDataSourceParamDTO createDatasourceParamDTO(String connectionJson) { + OceanBaseConnectionParam connectionParams = (OceanBaseConnectionParam) createConnectionParams(connectionJson); + OceanBaseDataSourceParamDTO dataSourceParamDTO = new OceanBaseDataSourceParamDTO(); + dataSourceParamDTO.setUserName(connectionParams.getUser()); + dataSourceParamDTO.setDatabase(connectionParams.getDatabase()); + dataSourceParamDTO.setOther(connectionParams.getOther()); + + String address = connectionParams.getAddress(); + String[] hostSeparator = address.split(Constants.DOUBLE_SLASH); + String[] hostPortArray = hostSeparator[hostSeparator.length - 1].split(Constants.COMMA); + dataSourceParamDTO.setPort(Integer.parseInt(hostPortArray[0].split(Constants.COLON)[1])); + dataSourceParamDTO.setHost(hostPortArray[0].split(Constants.COLON)[0]); + return dataSourceParamDTO; + } + + @Override + public ConnectionParam createConnectionParams(BaseDataSourceParamDTO datasourceParam) { + OceanBaseDataSourceParamDTO obDataSourceParamDTO = (OceanBaseDataSourceParamDTO) datasourceParam; + String address = String.format("%s%s:%s", DataSourceConstants.JDBC_OCEANBASE, obDataSourceParamDTO.getHost(), + obDataSourceParamDTO.getPort()); + String jdbcUrl = String.format("%s/%s", address, obDataSourceParamDTO.getDatabase()); + + OceanBaseConnectionParam connectionParam = new OceanBaseConnectionParam(); + connectionParam.setJdbcUrl(jdbcUrl); + connectionParam.setDatabase(obDataSourceParamDTO.getDatabase()); + connectionParam.setAddress(address); + connectionParam.setUser(obDataSourceParamDTO.getUserName()); + connectionParam.setPassword(PasswordUtils.encodePassword(obDataSourceParamDTO.getPassword())); + connectionParam.setCompatibleMode(obDataSourceParamDTO.getCompatibleMode()); + connectionParam.setDriverClassName(getDatasourceDriver()); + connectionParam.setValidationQuery(getValidationQuery(connectionParam.getCompatibleMode())); + connectionParam.setOther(obDataSourceParamDTO.getOther()); + return connectionParam; + } + + @Override + public ConnectionParam createConnectionParams(String connectionJson) { + return JSONUtils.parseObject(connectionJson, OceanBaseConnectionParam.class); + } + + @Override + public String getDatasourceDriver() { + return DataSourceConstants.COM_OCEANBASE_JDBC_DRIVER; + } + + @Override + public String getValidationQuery() { + throw new UnsupportedOperationException("Can't get validation query without compatible mode"); + } + + public String getValidationQuery(String compatibleMode) { + if (compatibleMode != null) { + switch (compatibleMode.trim().toLowerCase()) { + case "mysql": + return DataSourceConstants.MYSQL_VALIDATION_QUERY; + case "oracle": + return DataSourceConstants.ORACLE_VALIDATION_QUERY; + } + } + throw new UnsupportedOperationException("Invalid compatible mode: " + compatibleMode); + + } + + @Override + public String getJdbcUrl(ConnectionParam connectionParam) { + OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam; + String jdbcUrl = obConnectionParam.getJdbcUrl(); + if (MapUtils.isNotEmpty(obConnectionParam.getOther())) { + return String.format("%s?%s&%s", jdbcUrl, transformOther(obConnectionParam.getOther()), APPEND_PARAMS); + } + return String.format("%s?%s", jdbcUrl, APPEND_PARAMS); + } + + private String transformOther(Map paramMap) { + if (MapUtils.isEmpty(paramMap)) { + return null; + } + Map otherMap = new HashMap<>(); + paramMap.forEach((k, v) -> { + if (!checkKeyIsLegitimate(k)) { + return; + } + otherMap.put(k, v); + }); + if (MapUtils.isEmpty(otherMap)) { + return null; + } + List otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); + } + + private static boolean checkKeyIsLegitimate(String key) { + return !key.contains(ALLOW_LOAD_LOCAL_IN_FILE_NAME) + && !key.contains(AUTO_DESERIALIZE) + && !key.contains(ALLOW_LOCAL_IN_FILE_NAME) + && !key.contains(ALLOW_URL_IN_LOCAL_IN_FILE_NAME); + } + + @Override + public Connection getConnection(ConnectionParam connectionParam) throws ClassNotFoundException, SQLException, IOException { + OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam; + Class.forName(getDatasourceDriver()); + String user = obConnectionParam.getUser(); + if (user.contains(AUTO_DESERIALIZE)) { + log.warn("sensitive param : {} in username field is filtered", AUTO_DESERIALIZE); + user = user.replace(AUTO_DESERIALIZE, ""); + } + String password = PasswordUtils.decodePassword(obConnectionParam.getPassword()); + if (password.contains(AUTO_DESERIALIZE)) { + log.warn("sensitive param : {} in password field is filtered", AUTO_DESERIALIZE); + password = password.replace(AUTO_DESERIALIZE, ""); + } + return DriverManager.getConnection(getJdbcUrl(connectionParam), user, password); + } + + @Override + public DbType getDbType() { + return DbType.OCEANBASE; + } + + @Override + public DataSourceProcessor create() { + return new OceanBaseDataSourceProcessor(); + } +} diff --git a/dolphinscheduler-datasource-plugin/pom.xml b/dolphinscheduler-datasource-plugin/pom.xml index f9f82f8736..767d54b449 100644 --- a/dolphinscheduler-datasource-plugin/pom.xml +++ b/dolphinscheduler-datasource-plugin/pom.xml @@ -33,6 +33,7 @@ dolphinscheduler-datasource-db2 dolphinscheduler-datasource-hive dolphinscheduler-datasource-mysql + dolphinscheduler-datasource-oceanbase dolphinscheduler-datasource-oracle dolphinscheduler-datasource-postgresql dolphinscheduler-datasource-spark diff --git a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java index c2d4977bf5..7eb8855b73 100644 --- a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java +++ b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java @@ -43,7 +43,8 @@ public enum DbType { TRINO(12, "trino"), STARROCKS(13, "starrocks"), AZURESQL(14, "azuresql"), - DAMENG(15, "dameng"); + DAMENG(15, "dameng"), + OCEANBASE(16, "oceanbase"); private static final Map DB_TYPE_MAP = Arrays.stream(DbType.values()).collect(toMap(DbType::getCode, Functions.identity())); diff --git a/dolphinscheduler-ui/src/locales/en_US/datasource.ts b/dolphinscheduler-ui/src/locales/en_US/datasource.ts index dfa8e6d01d..f001dc145a 100644 --- a/dolphinscheduler-ui/src/locales/en_US/datasource.ts +++ b/dolphinscheduler-ui/src/locales/en_US/datasource.ts @@ -56,6 +56,8 @@ export default { oracle_connect_type_tips: 'Please select serviceName or SID', oracle_service_name: 'ServiceName', oracle_sid: 'SID', + compatible_mode: 'Compatible Mode', + compatible_mode_tips: 'Please enter compatible mode', jdbc_connect_parameters: 'jdbc connect parameters', principal_tips: 'Please enter Principal', krb5_conf_tips: diff --git a/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts b/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts index 749647270d..702ad9d6dd 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts @@ -56,6 +56,8 @@ export default { oracle_connect_type_tips: '请选择服务名或SID', oracle_service_name: '服务名', oracle_sid: 'SID', + compatible_mode: '兼容模式', + compatible_mode_tips: '请输入兼容模式', jdbc_connect_parameters: 'jdbc连接参数', principal_tips: '请输入Principal', krb5_conf_tips: '请输入kerberos认证参数 java.security.krb5.conf', diff --git a/dolphinscheduler-ui/src/service/modules/data-source/types.ts b/dolphinscheduler-ui/src/service/modules/data-source/types.ts index aa43909bc4..4da8d63724 100644 --- a/dolphinscheduler-ui/src/service/modules/data-source/types.ts +++ b/dolphinscheduler-ui/src/service/modules/data-source/types.ts @@ -31,6 +31,7 @@ type IDataBase = | 'AZURESQL' | 'STARROCKS' | 'DAMENG' + | 'OCEANBASE' type IDataBaseLabel = | 'MYSQL' @@ -48,6 +49,7 @@ type IDataBaseLabel = | 'AZURESQL' | 'STARROCKS' | 'DAMENG' +| 'OCEANBASE' interface IDataSource { id?: number @@ -73,6 +75,7 @@ interface IDataSource { endpoint?: string MSIClientId?: string dbUser?: string + compatibleMode?: string } interface ListReq { diff --git a/dolphinscheduler-ui/src/views/datasource/list/detail.tsx b/dolphinscheduler-ui/src/views/datasource/list/detail.tsx index 0d9dd6235a..cef9bab214 100644 --- a/dolphinscheduler-ui/src/views/datasource/list/detail.tsx +++ b/dolphinscheduler-ui/src/views/datasource/list/detail.tsx @@ -158,6 +158,7 @@ const DetailModal = defineComponent({ showHost, showPort, showAwsRegion, + showCompatibleMode, showConnectType, showPrincipal, showMode, @@ -568,6 +569,21 @@ const DetailModal = defineComponent({ + + +