|
|
|
/*
|
|
|
|
* 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.api.service;
|
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
import org.apache.dolphinscheduler.api.enums.Status;
|
|
|
|
import org.apache.dolphinscheduler.api.utils.PageInfo;
|
|
|
|
import org.apache.dolphinscheduler.api.utils.Result;
|
|
|
|
import org.apache.dolphinscheduler.common.Constants;
|
|
|
|
import org.apache.dolphinscheduler.common.enums.DbConnectType;
|
|
|
|
import org.apache.dolphinscheduler.common.enums.DbType;
|
|
|
|
import org.apache.dolphinscheduler.common.utils.CommonUtils;
|
|
|
|
import org.apache.dolphinscheduler.common.utils.*;
|
|
|
|
import org.apache.dolphinscheduler.dao.datasource.*;
|
|
|
|
import org.apache.dolphinscheduler.dao.entity.DataSource;
|
|
|
|
import org.apache.dolphinscheduler.dao.entity.Resource;
|
|
|
|
import org.apache.dolphinscheduler.dao.entity.User;
|
|
|
|
import org.apache.dolphinscheduler.dao.mapper.DataSourceMapper;
|
|
|
|
import org.apache.dolphinscheduler.dao.mapper.DataSourceUserMapper;
|
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
import java.sql.Connection;
|
|
|
|
import java.sql.DriverManager;
|
|
|
|
import java.sql.SQLException;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
import static org.apache.dolphinscheduler.common.utils.PropertyUtils.getString;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* datasource service
|
|
|
|
*/
|
|
|
|
@Service
|
|
|
|
public class DataSourceService extends BaseService {
|
|
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DataSourceService.class);
|
|
|
|
|
|
|
|
public static final String NAME = "name";
|
|
|
|
public static final String NOTE = "note";
|
|
|
|
public static final String TYPE = "type";
|
|
|
|
public static final String HOST = "host";
|
|
|
|
public static final String PORT = "port";
|
|
|
|
public static final String PRINCIPAL = "principal";
|
|
|
|
public static final String DATABASE = "database";
|
|
|
|
public static final String USER_NAME = "userName";
|
|
|
|
public static final String OTHER = "other";
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private DataSourceMapper dataSourceMapper;
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private DataSourceUserMapper datasourceUserMapper;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* create data source
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param name data source name
|
|
|
|
* @param desc data source description
|
|
|
|
* @param type data source type
|
|
|
|
* @param parameter datasource parameters
|
|
|
|
* @return create result code
|
|
|
|
*/
|
|
|
|
public Map<String, Object> createDataSource(User loginUser, String name, String desc, DbType type, String parameter) {
|
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
// check name can use or not
|
|
|
|
if (checkName(name)) {
|
|
|
|
putMsg(result, Status.DATASOURCE_EXIST);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
Boolean isConnection = checkConnection(type, parameter);
|
|
|
|
if (!isConnection) {
|
|
|
|
logger.info("connect failed, type:{}, parameter:{}", type, parameter);
|
|
|
|
putMsg(result, Status.DATASOURCE_CONNECT_FAILED);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
BaseDataSource datasource = DataSourceFactory.getDatasource(type, parameter);
|
|
|
|
if (datasource == null) {
|
|
|
|
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, parameter);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
// build datasource
|
|
|
|
DataSource dataSource = new DataSource();
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
|
|
dataSource.setName(name.trim());
|
|
|
|
dataSource.setNote(desc);
|
|
|
|
dataSource.setUserId(loginUser.getId());
|
|
|
|
dataSource.setUserName(loginUser.getUserName());
|
|
|
|
dataSource.setType(type);
|
|
|
|
dataSource.setConnectionParams(parameter);
|
|
|
|
dataSource.setCreateTime(now);
|
|
|
|
dataSource.setUpdateTime(now);
|
|
|
|
dataSourceMapper.insert(dataSource);
|
|
|
|
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* updateProcessInstance datasource
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param name data source name
|
|
|
|
* @param desc data source description
|
|
|
|
* @param type data source type
|
|
|
|
* @param parameter datasource parameters
|
|
|
|
* @param id data source id
|
|
|
|
* @return update result code
|
|
|
|
*/
|
|
|
|
public Map<String, Object> updateDataSource(int id, User loginUser, String name, String desc, DbType type, String parameter) {
|
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
// determine whether the data source exists
|
|
|
|
DataSource dataSource = dataSourceMapper.selectById(id);
|
|
|
|
if (dataSource == null) {
|
|
|
|
putMsg(result, Status.RESOURCE_NOT_EXIST);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!hasPerm(loginUser, dataSource.getUserId())) {
|
|
|
|
putMsg(result, Status.USER_NO_OPERATION_PERM);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
//check name can use or not
|
|
|
|
if (!name.trim().equals(dataSource.getName()) && checkName(name)) {
|
|
|
|
putMsg(result, Status.DATASOURCE_EXIST);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
//check password,if the password is not updated, set to the old password.
|
|
|
|
ObjectNode paramObject = JSONUtils.parseObject(parameter);
|
|
|
|
String password = paramObject.path(Constants.PASSWORD).asText();
|
|
|
|
if (StringUtils.isBlank(password)) {
|
|
|
|
String oldConnectionParams = dataSource.getConnectionParams();
|
|
|
|
ObjectNode oldParams = JSONUtils.parseObject(oldConnectionParams);
|
|
|
|
paramObject.put(Constants.PASSWORD, oldParams.path(Constants.PASSWORD).asText());
|
|
|
|
}
|
|
|
|
// connectionParams json
|
|
|
|
String connectionParams = paramObject.toString();
|
|
|
|
|
|
|
|
Boolean isConnection = checkConnection(type, connectionParams);
|
|
|
|
if (!isConnection) {
|
|
|
|
logger.info("connect failed, type:{}, parameter:{}", type, parameter);
|
|
|
|
putMsg(result, Status.DATASOURCE_CONNECT_FAILED);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
|
|
dataSource.setName(name.trim());
|
|
|
|
dataSource.setNote(desc);
|
|
|
|
dataSource.setUserName(loginUser.getUserName());
|
|
|
|
dataSource.setType(type);
|
|
|
|
dataSource.setConnectionParams(connectionParams);
|
|
|
|
dataSource.setUpdateTime(now);
|
|
|
|
dataSourceMapper.updateById(dataSource);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean checkName(String name) {
|
|
|
|
List<DataSource> queryDataSource = dataSourceMapper.queryDataSourceByName(name.trim());
|
|
|
|
return queryDataSource != null && queryDataSource.size() > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* updateProcessInstance datasource
|
|
|
|
*
|
|
|
|
* @param id datasource id
|
|
|
|
* @return data source detail
|
|
|
|
*/
|
|
|
|
public Map<String, Object> queryDataSource(int id) {
|
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<String, Object>(5);
|
|
|
|
DataSource dataSource = dataSourceMapper.selectById(id);
|
|
|
|
if (dataSource == null) {
|
|
|
|
putMsg(result, Status.RESOURCE_NOT_EXIST);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
// type
|
|
|
|
String dataSourceType = dataSource.getType().toString();
|
|
|
|
// name
|
|
|
|
String dataSourceName = dataSource.getName();
|
|
|
|
// desc
|
|
|
|
String desc = dataSource.getNote();
|
|
|
|
// parameter
|
|
|
|
String parameter = dataSource.getConnectionParams();
|
|
|
|
|
|
|
|
BaseDataSource datasourceForm = DataSourceFactory.getDatasource(dataSource.getType(), parameter);
|
|
|
|
DbConnectType connectType = null;
|
|
|
|
String hostSeperator = Constants.DOUBLE_SLASH;
|
|
|
|
if (DbType.ORACLE.equals(dataSource.getType())) {
|
|
|
|
connectType = ((OracleDataSource) datasourceForm).getConnectType();
|
|
|
|
if (DbConnectType.ORACLE_SID.equals(connectType)) {
|
|
|
|
hostSeperator = Constants.AT_SIGN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
String database = datasourceForm.getDatabase();
|
|
|
|
// jdbc connection params
|
|
|
|
String other = datasourceForm.getOther();
|
|
|
|
String address = datasourceForm.getAddress();
|
|
|
|
|
|
|
|
String[] hostsPorts = getHostsAndPort(address, hostSeperator);
|
|
|
|
// ip host
|
|
|
|
String host = hostsPorts[0];
|
|
|
|
// prot
|
|
|
|
String port = hostsPorts[1];
|
|
|
|
String separator = "";
|
|
|
|
|
|
|
|
switch (dataSource.getType()) {
|
|
|
|
case HIVE:
|
|
|
|
case SQLSERVER:
|
|
|
|
separator = ";";
|
|
|
|
break;
|
|
|
|
case MYSQL:
|
|
|
|
case POSTGRESQL:
|
|
|
|
case CLICKHOUSE:
|
|
|
|
case ORACLE:
|
|
|
|
case PRESTO:
|
|
|
|
separator = "&";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
separator = "&";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, String> otherMap = new LinkedHashMap<String, String>();
|
|
|
|
if (other != null) {
|
|
|
|
String[] configs = other.split(separator);
|
|
|
|
for (String config : configs) {
|
|
|
|
otherMap.put(config.split("=")[0], config.split("=")[1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(10);
|
|
|
|
map.put(NAME, dataSourceName);
|
|
|
|
map.put(NOTE, desc);
|
|
|
|
map.put(TYPE, dataSourceType);
|
|
|
|
if (connectType != null) {
|
|
|
|
map.put(Constants.ORACLE_DB_CONNECT_TYPE, connectType);
|
|
|
|
}
|
|
|
|
|
|
|
|
map.put(HOST, host);
|
|
|
|
map.put(PORT, port);
|
|
|
|
map.put(PRINCIPAL, datasourceForm.getPrincipal());
|
|
|
|
map.put(DATABASE, database);
|
|
|
|
map.put(USER_NAME, datasourceForm.getUser());
|
|
|
|
map.put(OTHER, otherMap);
|
|
|
|
result.put(Constants.DATA_LIST, map);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* query datasource list by keyword
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param searchVal search value
|
|
|
|
* @param pageNo page number
|
|
|
|
* @param pageSize page size
|
|
|
|
* @return data source list page
|
|
|
|
*/
|
|
|
|
public Map<String, Object> queryDataSourceListPaging(User loginUser, String searchVal, Integer pageNo, Integer pageSize) {
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
IPage<DataSource> dataSourceList = null;
|
|
|
|
Page<DataSource> dataSourcePage = new Page(pageNo, pageSize);
|
|
|
|
|
|
|
|
if (isAdmin(loginUser)) {
|
|
|
|
dataSourceList = dataSourceMapper.selectPaging(dataSourcePage, 0, searchVal);
|
|
|
|
} else {
|
|
|
|
dataSourceList = dataSourceMapper.selectPaging(dataSourcePage, loginUser.getId(), searchVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<DataSource> dataSources = dataSourceList != null ? dataSourceList.getRecords() : new ArrayList<>();
|
|
|
|
handlePasswd(dataSources);
|
|
|
|
PageInfo pageInfo = new PageInfo<Resource>(pageNo, pageSize);
|
|
|
|
pageInfo.setTotalCount((int) (dataSourceList != null ? dataSourceList.getTotal() : 0L));
|
|
|
|
pageInfo.setLists(dataSources);
|
|
|
|
result.put(Constants.DATA_LIST, pageInfo);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* handle datasource connection password for safety
|
|
|
|
*
|
|
|
|
* @param dataSourceList
|
|
|
|
*/
|
|
|
|
private void handlePasswd(List<DataSource> dataSourceList) {
|
|
|
|
|
|
|
|
for (DataSource dataSource : dataSourceList) {
|
|
|
|
|
|
|
|
String connectionParams = dataSource.getConnectionParams();
|
|
|
|
ObjectNode object = JSONUtils.parseObject(connectionParams);
|
|
|
|
object.put(Constants.PASSWORD, Constants.XXXXXX);
|
|
|
|
dataSource.setConnectionParams(object.toString());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* query data resource list
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param type data source type
|
|
|
|
* @return data source list page
|
|
|
|
*/
|
|
|
|
public Map<String, Object> queryDataSourceList(User loginUser, Integer type) {
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
|
|
|
List<DataSource> datasourceList;
|
|
|
|
|
|
|
|
if (isAdmin(loginUser)) {
|
|
|
|
datasourceList = dataSourceMapper.listAllDataSourceByType(type);
|
|
|
|
} else {
|
|
|
|
datasourceList = dataSourceMapper.queryDataSourceByType(loginUser.getId(), type);
|
|
|
|
}
|
|
|
|
|
|
|
|
result.put(Constants.DATA_LIST, datasourceList);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* verify datasource exists
|
|
|
|
*
|
|
|
|
* @param name datasource name
|
|
|
|
* @return true if data datasource not exists, otherwise return false
|
|
|
|
*/
|
|
|
|
public Result verifyDataSourceName(String name) {
|
|
|
|
Result result = new Result();
|
|
|
|
List<DataSource> dataSourceList = dataSourceMapper.queryDataSourceByName(name);
|
|
|
|
if (dataSourceList != null && dataSourceList.size() > 0) {
|
|
|
|
logger.error("datasource name:{} has exist, can't create again.", name);
|
|
|
|
putMsg(result, Status.DATASOURCE_EXIST);
|
|
|
|
} else {
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get connection
|
|
|
|
*
|
|
|
|
* @param dbType datasource type
|
|
|
|
* @param parameter parameter
|
|
|
|
* @return connection for datasource
|
|
|
|
*/
|
|
|
|
private Connection getConnection(DbType dbType, String parameter) {
|
|
|
|
Connection connection = null;
|
|
|
|
BaseDataSource datasource = null;
|
|
|
|
try {
|
|
|
|
switch (dbType) {
|
|
|
|
case POSTGRESQL:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, PostgreDataSource.class);
|
|
|
|
Class.forName(Constants.ORG_POSTGRESQL_DRIVER);
|
|
|
|
break;
|
|
|
|
case MYSQL:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, MySQLDataSource.class);
|
|
|
|
Class.forName(Constants.COM_MYSQL_JDBC_DRIVER);
|
|
|
|
break;
|
|
|
|
case HIVE:
|
|
|
|
case SPARK:
|
|
|
|
if (CommonUtils.getKerberosStartupState()) {
|
|
|
|
System.setProperty(org.apache.dolphinscheduler.common.Constants.JAVA_SECURITY_KRB5_CONF,
|
|
|
|
getString(org.apache.dolphinscheduler.common.Constants.JAVA_SECURITY_KRB5_CONF_PATH));
|
|
|
|
Configuration configuration = new Configuration();
|
|
|
|
configuration.set(org.apache.dolphinscheduler.common.Constants.HADOOP_SECURITY_AUTHENTICATION, "kerberos");
|
|
|
|
UserGroupInformation.setConfiguration(configuration);
|
|
|
|
UserGroupInformation.loginUserFromKeytab(getString(org.apache.dolphinscheduler.common.Constants.LOGIN_USER_KEY_TAB_USERNAME),
|
|
|
|
getString(org.apache.dolphinscheduler.common.Constants.LOGIN_USER_KEY_TAB_PATH));
|
|
|
|
}
|
|
|
|
if (dbType == DbType.HIVE) {
|
|
|
|
datasource = JSONUtils.parseObject(parameter, HiveDataSource.class);
|
|
|
|
} else if (dbType == DbType.SPARK) {
|
|
|
|
datasource = JSONUtils.parseObject(parameter, SparkDataSource.class);
|
|
|
|
}
|
|
|
|
Class.forName(Constants.ORG_APACHE_HIVE_JDBC_HIVE_DRIVER);
|
|
|
|
break;
|
|
|
|
case CLICKHOUSE:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, ClickHouseDataSource.class);
|
|
|
|
Class.forName(Constants.COM_CLICKHOUSE_JDBC_DRIVER);
|
|
|
|
break;
|
|
|
|
case ORACLE:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, OracleDataSource.class);
|
|
|
|
Class.forName(Constants.COM_ORACLE_JDBC_DRIVER);
|
|
|
|
break;
|
|
|
|
case SQLSERVER:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, SQLServerDataSource.class);
|
|
|
|
Class.forName(Constants.COM_SQLSERVER_JDBC_DRIVER);
|
|
|
|
break;
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
case DB2:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, DB2ServerDataSource.class);
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
Class.forName(Constants.COM_DB2_JDBC_DRIVER);
|
|
|
|
break;
|
|
|
|
case PRESTO:
|
|
|
|
datasource = JSONUtils.parseObject(parameter, PrestoDataSource.class);
|
|
|
|
Class.forName(Constants.COM_PRESTO_JDBC_DRIVER);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
|
|
|
|
if (datasource != null) {
|
|
|
|
connection = DriverManager.getConnection(datasource.getJdbcUrl(), datasource.getUser(), datasource.getPassword());
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
return connection;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* check connection
|
|
|
|
*
|
|
|
|
* @param type data source type
|
|
|
|
* @param parameter data source parameters
|
|
|
|
* @return true if connect successfully, otherwise false
|
|
|
|
*/
|
|
|
|
public boolean checkConnection(DbType type, String parameter) {
|
|
|
|
Boolean isConnection = false;
|
|
|
|
Connection con = getConnection(type, parameter);
|
|
|
|
if (con != null) {
|
|
|
|
isConnection = true;
|
|
|
|
try {
|
|
|
|
con.close();
|
|
|
|
} catch (SQLException e) {
|
|
|
|
logger.error("close connection fail at DataSourceService::checkConnection()", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return isConnection;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* test connection
|
|
|
|
*
|
|
|
|
* @param id datasource id
|
|
|
|
* @return connect result code
|
|
|
|
*/
|
|
|
|
public boolean connectionTest(int id) {
|
|
|
|
DataSource dataSource = dataSourceMapper.selectById(id);
|
|
|
|
if (dataSource != null) {
|
|
|
|
return checkConnection(dataSource.getType(), dataSource.getConnectionParams());
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* build paramters
|
|
|
|
*
|
|
|
|
* @param type data source type
|
|
|
|
* @param host data source host
|
|
|
|
* @param port data source port
|
|
|
|
* @param database data source database name
|
|
|
|
* @param userName user name
|
|
|
|
* @param password password
|
|
|
|
* @param other other parameters
|
|
|
|
* @param principal principal
|
|
|
|
* @return datasource parameter
|
|
|
|
*/
|
|
|
|
public String buildParameter(DbType type, String host,
|
|
|
|
String port, String database, String principal, String userName,
|
|
|
|
String password, DbConnectType connectType, String other) {
|
|
|
|
|
|
|
|
String address = buildAddress(type, host, port, connectType);
|
|
|
|
Map<String, Object> parameterMap = new LinkedHashMap<String, Object>(6);
|
|
|
|
String jdbcUrl = address + "/" + database;
|
|
|
|
if (Constants.ORACLE.equals(type.name())) {
|
|
|
|
parameterMap.put(Constants.ORACLE_DB_CONNECT_TYPE, connectType);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CommonUtils.getKerberosStartupState() &&
|
|
|
|
(type == DbType.HIVE || type == DbType.SPARK)) {
|
|
|
|
jdbcUrl += ";principal=" + principal;
|
|
|
|
}
|
|
|
|
|
|
|
|
String separator = "";
|
|
|
|
if (Constants.MYSQL.equals(type.name())
|
|
|
|
|| Constants.POSTGRESQL.equals(type.name())
|
|
|
|
|| Constants.CLICKHOUSE.equals(type.name())
|
|
|
|
|| Constants.ORACLE.equals(type.name())
|
|
|
|
|| Constants.PRESTO.equals(type.name())) {
|
|
|
|
separator = "&";
|
|
|
|
} else if (Constants.HIVE.equals(type.name())
|
|
|
|
|| Constants.SPARK.equals(type.name())
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
|| Constants.DB2.equals(type.name())
|
|
|
|
|| Constants.SQLSERVER.equals(type.name())) {
|
|
|
|
separator = ";";
|
|
|
|
}
|
|
|
|
|
|
|
|
parameterMap.put(TYPE, connectType);
|
|
|
|
parameterMap.put(Constants.ADDRESS, address);
|
|
|
|
parameterMap.put(Constants.DATABASE, database);
|
|
|
|
parameterMap.put(Constants.JDBC_URL, jdbcUrl);
|
|
|
|
parameterMap.put(Constants.USER, userName);
|
|
|
|
parameterMap.put(Constants.PASSWORD, CommonUtils.encodePassword(password));
|
|
|
|
if (CommonUtils.getKerberosStartupState() &&
|
|
|
|
(type == DbType.HIVE || type == DbType.SPARK)) {
|
|
|
|
parameterMap.put(Constants.PRINCIPAL, principal);
|
|
|
|
}
|
|
|
|
if (other != null && !"".equals(other)) {
|
|
|
|
Map<String, String> map = JSONUtils.toMap(other);
|
|
|
|
if (map.size() > 0) {
|
|
|
|
StringBuilder otherSb = new StringBuilder();
|
|
|
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
|
|
|
otherSb.append(String.format("%s=%s%s", entry.getKey(), entry.getValue(), separator));
|
|
|
|
}
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
if (!Constants.DB2.equals(type.name())) {
|
|
|
|
otherSb.deleteCharAt(otherSb.length() - 1);
|
|
|
|
}
|
|
|
|
parameterMap.put(Constants.OTHER, otherSb);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (logger.isDebugEnabled()) {
|
|
|
|
logger.info("parameters map:{}", JSONUtils.toJsonString(parameterMap));
|
|
|
|
}
|
|
|
|
return JSONUtils.toJsonString(parameterMap);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private String buildAddress(DbType type, String host, String port, DbConnectType connectType) {
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
if (Constants.MYSQL.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_MYSQL);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.POSTGRESQL.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_POSTGRESQL);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.HIVE.equals(type.name()) || Constants.SPARK.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_HIVE_2);
|
|
|
|
String[] hostArray = host.split(",");
|
|
|
|
if (hostArray.length > 0) {
|
|
|
|
for (String zkHost : hostArray) {
|
|
|
|
sb.append(String.format("%s:%s,", zkHost, port));
|
|
|
|
}
|
|
|
|
sb.deleteCharAt(sb.length() - 1);
|
|
|
|
}
|
|
|
|
} else if (Constants.CLICKHOUSE.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_CLICKHOUSE);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.ORACLE.equals(type.name())) {
|
|
|
|
if (connectType == DbConnectType.ORACLE_SID) {
|
|
|
|
sb.append(Constants.JDBC_ORACLE_SID);
|
|
|
|
} else {
|
|
|
|
sb.append(Constants.JDBC_ORACLE_SERVICE_NAME);
|
|
|
|
}
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.SQLSERVER.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_SQLSERVER);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.DB2.equals(type.name())) {
|
merge dev-db to dev (#1426)
* [dolphinscheduler-1345] [newfeature] Add DB2 Datasource (#1391)
* Fix the problem that the 'queueId' is not present when creating a tenant based on the default queue. (#1409)
* dolphinscheduler-#1403][bug]improve the check rules (#1408)
1. When check failed, we don’t know whitch parameter has is wrong, Because username、password、email and phone were checks together. I refactored the check method ,Now it will return failed msg by each field.
2. The email check regex support [_|\-|\.]?) in createUser.vue, But it do not support in backend server , I fix it, Now they have the same check regex both in frontend and backend
* jcip-annotations define version information and maven-assembly-plugin add groupId (#1413)
* "v-for" add key (#1419)
* [dolphinscheduler-#1397] [bug]Resources can not be previewed or updated (#1406)
When create an resource the name will add the suffix, But When rename the resource there is no suffix add to the name, So When update resource name without suffix just like "test.sh" => "test" , Then the bug reproduced.
To fix this bug i add the logic bellow:
When rename, if the name without suffix then add it ,else use the origin name
* simply server module configs (#1424)
* move updateTaskState into try/catch block in case of exception
* fix NPE
* using conf.getInt instead of getString
* for AbstractZKClient, remove the log, for it will print the same log message in createZNodePath.
for AlertDao, correct the spelling.
* duplicate
* refactor getTaskWorkerGroupId
* add friendly log
* update hearbeat thread num = 1
* fix the bug when worker execute task using queue. and remove checking Tenant user anymore in TaskScheduleThread
* 1. move verifyTaskInstanceIsNull after taskInstance
2. keep verifyTenantIsNull/verifyTaskInstanceIsNull clean and readable
* fix the message
* delete before check to avoid KeeperException$NoNodeException
* fix the message
* check processInstance state before delete tenant
* check processInstance state before delete worker group
* refactor
* merge api constants into common constatns
* update the resource perm
* update the dataSource perm
* fix CheckUtils.checkUserParams method
* update AlertGroupService, extends from BaseService, remove duplicate methods
* refactor
* modify method name
* add hasProjectAndPerm method
* using checkProject instead of getResultStatus
* delete checkAuth method, using hasProjectAndPerm instead.
* correct spelling
* add transactional for deleteWorkerGroupById
* add Transactional for deleteProcessInstanceById method
* change sqlSessionTemplate singleton
* change sqlSessionTemplate singleton and reformat code
* fix unsuitable error message
* update shutdownhook methods
* fix worker log bug
* fix api server debug mode bug
* upgrade zk version
* delete this line ,for zkClient.close() will do the whole thing
* fix master server shutdown error
* degrade zk version and add FourLetterWordMain class
* fix PathChildrenCache not close
* add Transactional for createSession method
* add more message for java-doc
* delete App, let spring manage connectionFactory
* add license
* add class Application for test support
* refactor masterServer and workerServer
* add args
* fix the spring transaction not work bug
* remove author
* delete @Bean annotation
* delete master/worker properties
* updates
* rename application.properties to application-dao.properties
* delete this class
* delete master/worker properties and refactory master/worker
* delete unused imports
* merge
* delete unused config
5 years ago
|
|
|
sb.append(Constants.JDBC_DB2);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
} else if (Constants.PRESTO.equals(type.name())) {
|
|
|
|
sb.append(Constants.JDBC_PRESTO);
|
|
|
|
sb.append(host).append(":").append(port);
|
|
|
|
}
|
|
|
|
|
|
|
|
return sb.toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* delete datasource
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param datasourceId data source id
|
|
|
|
* @return delete result code
|
|
|
|
*/
|
|
|
|
@Transactional(rollbackFor = RuntimeException.class)
|
|
|
|
public Result delete(User loginUser, int datasourceId) {
|
|
|
|
Result result = new Result();
|
|
|
|
try {
|
|
|
|
//query datasource by id
|
|
|
|
DataSource dataSource = dataSourceMapper.selectById(datasourceId);
|
|
|
|
if (dataSource == null) {
|
|
|
|
logger.error("resource id {} not exist", datasourceId);
|
|
|
|
putMsg(result, Status.RESOURCE_NOT_EXIST);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
if (!hasPerm(loginUser, dataSource.getUserId())) {
|
|
|
|
putMsg(result, Status.USER_NO_OPERATION_PERM);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
dataSourceMapper.deleteById(datasourceId);
|
|
|
|
datasourceUserMapper.deleteByDatasourceId(datasourceId);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("delete datasource error", e);
|
|
|
|
throw new RuntimeException("delete datasource error");
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* unauthorized datasource
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param userId user id
|
|
|
|
* @return unauthed data source result code
|
|
|
|
*/
|
|
|
|
public Map<String, Object> unauthDatasource(User loginUser, Integer userId) {
|
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
//only admin operate
|
|
|
|
if (!isAdmin(loginUser)) {
|
|
|
|
putMsg(result, Status.USER_NO_OPERATION_PERM);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* query all data sources except userId
|
|
|
|
*/
|
|
|
|
List<DataSource> resultList = new ArrayList<>();
|
|
|
|
List<DataSource> datasourceList = dataSourceMapper.queryDatasourceExceptUserId(userId);
|
|
|
|
Set<DataSource> datasourceSet = null;
|
|
|
|
if (datasourceList != null && datasourceList.size() > 0) {
|
|
|
|
datasourceSet = new HashSet<>(datasourceList);
|
|
|
|
|
|
|
|
List<DataSource> authedDataSourceList = dataSourceMapper.queryAuthedDatasource(userId);
|
|
|
|
|
|
|
|
Set<DataSource> authedDataSourceSet = null;
|
|
|
|
if (authedDataSourceList != null && authedDataSourceList.size() > 0) {
|
|
|
|
authedDataSourceSet = new HashSet<>(authedDataSourceList);
|
|
|
|
datasourceSet.removeAll(authedDataSourceSet);
|
|
|
|
|
|
|
|
}
|
|
|
|
resultList = new ArrayList<>(datasourceSet);
|
|
|
|
}
|
|
|
|
result.put(Constants.DATA_LIST, resultList);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* authorized datasource
|
|
|
|
*
|
|
|
|
* @param loginUser login user
|
|
|
|
* @param userId user id
|
|
|
|
* @return authorized result code
|
|
|
|
*/
|
|
|
|
public Map<String, Object> authedDatasource(User loginUser, Integer userId) {
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
|
|
|
|
|
if (!isAdmin(loginUser)) {
|
|
|
|
putMsg(result, Status.USER_NO_OPERATION_PERM);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
List<DataSource> authedDatasourceList = dataSourceMapper.queryAuthedDatasource(userId);
|
|
|
|
result.put(Constants.DATA_LIST, authedDatasourceList);
|
|
|
|
putMsg(result, Status.SUCCESS);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get host and port by address
|
|
|
|
*
|
|
|
|
* @param address address
|
|
|
|
* @return sting array: [host,port]
|
|
|
|
*/
|
|
|
|
private String[] getHostsAndPort(String address) {
|
|
|
|
return getHostsAndPort(address, Constants.DOUBLE_SLASH);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get host and port by address
|
|
|
|
*
|
|
|
|
* @param address address
|
|
|
|
* @param separator separator
|
|
|
|
* @return sting array: [host,port]
|
|
|
|
*/
|
|
|
|
private String[] getHostsAndPort(String address, String separator) {
|
|
|
|
String[] result = new String[2];
|
|
|
|
String[] tmpArray = address.split(separator);
|
|
|
|
String hostsAndPorts = tmpArray[tmpArray.length - 1];
|
|
|
|
StringBuilder hosts = new StringBuilder();
|
|
|
|
String[] hostPortArray = hostsAndPorts.split(Constants.COMMA);
|
|
|
|
String port = hostPortArray[0].split(Constants.COLON)[1];
|
|
|
|
for (String hostPort : hostPortArray) {
|
|
|
|
hosts.append(hostPort.split(Constants.COLON)[0]).append(Constants.COMMA);
|
|
|
|
}
|
|
|
|
hosts.deleteCharAt(hosts.length() - 1);
|
|
|
|
result[0] = hosts.toString();
|
|
|
|
result[1] = port;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|