Files
doris/regression-test/suites/manager/test_manager_interface_3.groovy
zy-kkk 4a62d9e44b Revert "[2.1][improvement](jdbc catalog) Add catalog property to enable jdbc connection pool" (#42481)
Reverts apache/doris#42255

We have found that after closing the connection pool, there will be
class loading problems and connection release problems for some data
sources. We will remove this function first and re-add it after solving
and testing it completely.
2024-10-25 19:37:36 +08:00

614 lines
23 KiB
Groovy

// 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.
import org.apache.doris.regression.suite.ClusterOptions
import org.apache.doris.regression.util.NodeType
import java.time.LocalDateTime
import java.time.Duration
import java.time.format.DateTimeFormatter
suite('test_manager_interface_3',"p0") {
String jdbcUrl = context.config.jdbcUrl
def tokens = context.config.jdbcUrl.split('/')
jdbcUrl=tokens[0] + "//" + tokens[2] + "/" + "?"
String jdbcUser = context.config.jdbcUser
String jdbcPassword = context.config.jdbcPassword
String s3_endpoint = getS3Endpoint()
String bucket = getS3BucketName()
String driver_url = "https://${bucket}.${s3_endpoint}/regression/jdbc_driver/mysql-connector-java-8.0.25.jar"
//create role $role_name
//drop role $role_name
// create user $user_name identified by "$password" default role "$role_name"
// grant $privileges on $privilege_level to $user_name
// grant $privileges on $privilege_level to role $role_name
// grant "$role_name" to "$user_name"
// revoke $privileges on $privilege_level from "$user_name"
// revoke $privileges on $privilege_level from role $role_name
// set password for $user = PASSWORD("$password")
// revoke "$role_name" from "$user_name"
// show all grants
// show grants
// show roles
def test_role_grant = {
def user1 = 'test_manager_role_grant_user1'
def user2 = 'test_manager_role_grant_user2'
def role1 = 'test_manager_role_grant_role1'
def pwd = '123456'
def new_pwd = 'Ab1234567^'
def dbName = 'test_manager_role_grant_db'
def dbName2 = 'test_manager_role_grant_db2'
def tbName = 'test_manager_tb'
def url=tokens[0] + "//" + tokens[2] + "/" + dbName + "?"
sql """drop user if exists ${user1}"""
sql """drop user if exists ${user2}"""
sql """drop role if exists ${role1}"""
sql """DROP DATABASE IF EXISTS ${dbName}"""
sql """DROP DATABASE IF EXISTS ${dbName2}"""
sql """CREATE DATABASE ${dbName}"""
sql """CREATE DATABASE ${dbName2}"""
sql """ create table ${dbName}.${tbName}(
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1',
"bloom_filter_columns" = "k2"
) """
sql """ insert into ${dbName}.${tbName} values(1,"abc") """
sql """CREATE ROLE ${role1}"""
sql """grant SELECT_PRIV on ${dbName} TO ROLE '${role1}' """
sql """CREATE USER '${user1}' IDENTIFIED BY '${pwd}' default role '${role1}' """
sql """CREATE USER '${user2}' IDENTIFIED BY '${pwd}' """
connect(user=user1, password="${pwd}", url=url) {
test {
sql """ select 1"""
result(
[[1]]
)
}
test {
sql """ select * from ${dbName}.${tbName} """
result(
[[1,"abc"]]
)
}
test {
sql """ use ${dbName2} """
exception "Access denied for user"
}
test {
sql """ Drop table ${dbName}.${tbName} """
exception "Access denied; you need (at least one of) the (DROP) privilege(s) for this operation"
}
test {
sql """ create table test_manager_tb_2 (
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table_2"
DISTRIBUTED BY HASH(k1) BUCKETS 1;
"""
exception "Access denied; you need (at least one of) the (CREATE) privilege(s) for this operation"
}
test {
sql """ insert into test_manager_tb values(1,"2"); """
exception """LOAD command denied to user"""
}
}
sql """grant DROP_PRIV on ${dbName} TO ROLE '${role1}' """
sql """grant CREATE_PRIV on ${dbName} TO '${user1}' """
connect(user=user1, password="${pwd}", url=url) {
sql """ create table test_manager_tb_2 (
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table_2"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1');
"""
sql """ Drop table test_manager_tb_2 """
}
sql """grant LOAD_PRIV on ${dbName} TO '${user2}' """
sql """ grant "${role1}" to '${user2}' """
connect(user=user2, password="${pwd}", url=url) {
test {
sql """ create table test_manager_tb_2 (
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table_2"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1');
"""
exception "Access denied; you need (at least one of) the (CREATE) privilege(s) for this operation"
}
test {
sql """ select * from ${dbName}.${tbName} """
result(
[[1,"abc"]]
)
}
sql """ insert into ${tbName} values (2,"adc") """
sql """ insert into ${tbName} values (3,"ttt") """
test {
sql """ select * from ${dbName}.${tbName} order by k1"""
result(
[[1,"abc"],[2,"adc"],[3,"ttt"]]
)
}
test {
sql """ use ${dbName2} """
exception "Access denied for user"
}
}
List<List<Object>> result = sql """show all grants """
def x = 0
for(int i = 0;i < result.size(); i++ ) {
// Roles: test_manager_role_grant_role1
if ( result[i][3] == "${role1}") {
//UserIdentity:
logger.info("result[${i}][0] = ${result[i][0]}" )
if (result[i][0].contains("test_manager_role_grant_user1")){
//DatabasePrivs
assertTrue(result[i][6] == "internal.information_schema: Select_priv; internal.mysql: Select_priv; internal.test_manager_role_grant_db: Select_priv,Create_priv,Drop_priv")
x ++
}else if (result[i][0].contains("test_manager_role_grant_user2")) {
assertTrue(result[i][6] == "internal.information_schema: Select_priv; internal.mysql: Select_priv; internal.test_manager_role_grant_db: Select_priv,Load_priv,Drop_priv")
x ++
}else {
assertTrue(false." only ${user1} and ${user2}, no ${result[i][0]}")
}
}
else if ( result[i][3] =="admin"){
if (result[i][0] == """'admin'@'%'"""){
x++
}
} else if (result[i][3] =="operator") {
if (result[i][0] =="""'root'@'%'""" ){
x++
}
}
}
assertTrue(x == 4)
sql """ revoke CREATE_PRIV on ${dbName} from '${user1}' """
connect(user=user1, password="${pwd}", url=url) {
test {
sql """ create table test_manager_tb_2 (
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table_2"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1');
"""
exception "Access denied; you need (at least one of) the (CREATE) privilege(s) for this operation"
}
}
sql """ revoke LOAD_PRIV on ${dbName} from '${user2}' """
connect(user=user2, password="${pwd}", url=url) {
test{
sql """ insert into test_manager_tb values(1,"2"); """
exception """LOAD command denied to user"""
}
}
result = sql """show all grants """
x = 0
for(int i = 0;i < result.size(); i++ ) {
// Roles: test_manager_role_grant_role1
if ( result[i][3] == "${role1}") {
//UserIdentity:
logger.info("result[${i}][0] = ${result[i][0]}" )
if (result[i][0].contains("test_manager_role_grant_user1")){
//DatabasePrivs
assertTrue(result[i][6] == "internal.information_schema: Select_priv; internal.mysql: Select_priv; internal.test_manager_role_grant_db: Select_priv,Drop_priv")
x ++
}else if (result[i][0].contains("test_manager_role_grant_user2")) {
assertTrue(result[i][6].contains("internal.information_schema: Select_priv; internal.mysql: Select_priv; internal.test_manager_role_grant_db: Select_priv,Drop_priv"))
x ++
}else {
assertTrue(false." only ${user1} and ${user2}, no ${result[i][0]}")
}
}
else if ( result[i][3] =="admin"){
if (result[i][0] == """'admin'@'%'"""){
x++
}
} else if (result[i][3] =="operator") {
if (result[i][0] =="""'root'@'%'""" ){
x++
}
}
}
assertTrue(x == 4)
result = sql """show grants """
x = 0
for(int i = 0;i < result.size(); i++ ) {
if (result[i][3] =="operator") {
if (result[i][0] =="""'root'@'%'""" ){
if (result[i][6] == "internal.information_schema: Select_priv; internal.mysql: Select_priv"){
assertTrue(result[i][4]=="Node_priv,Admin_priv")
x++
}
}
}
}
assertTrue(x == 1)
result = sql """show roles """
x = 0
for(int i = 0;i < result.size(); i++ ) {
//NAME
assertTrue(result[i][0].toLowerCase() != "null")
if (result[i][0] =="test_manager_role_grant_role1") {
//Users
assertTrue(result[i][2].contains("test_manager_role_grant_user2'@'%"))
assertTrue(result[i][2].contains("test_manager_role_grant_user1'@'%"))
x ++
}else if (result[i][0] == "admin"){
assertTrue(result[i][2].contains("admin'@'%"))
x ++
}else if (result[i][0] == "operator"){
assertTrue(result[i][2].contains("root'@'%"))
x++
}
}
assertTrue(x == 3)
sql """revoke DROP_PRIV on ${dbName} FROM ROLE '${role1}' """
sql """create table ${dbName}.test_manager_tb_2 (
k1 TINYINT,
k2 CHAR(10) COMMENT "string column"
) COMMENT "manager_test_table_2"
DISTRIBUTED BY HASH(k1) BUCKETS 1
PROPERTIES ('replication_num' = '1');"""
connect(user=user1, password="${pwd}", url=url) {
test {
sql """ Drop table ${dbName}.test_manager_tb_2"""
exception "Access denied; you need (at least one of) the (DROP) privilege(s) for this operation"
}
}
connect(user=user2, password="${pwd}", url=url) {
test{
sql """ Drop table ${dbName}.test_manager_tb_2"""
exception "Access denied; you need (at least one of) the (DROP) privilege(s) for this operation"
}
}
sql """set password for '${user2}' = password('${new_pwd}')"""
try {
connect(user =user2, password = '${pwd}', url = url) {}
assertTrue(false. "should not be able to login")
} catch (Exception e) {
assertTrue(e.getMessage().contains("Access denied for user"), e.getMessage())
}
connect(user=user2, password="${new_pwd}", url=url) {
result = sql """ select k1 from ${dbName}.${tbName} order by k1 desc limit 1"""
assertTrue(result[0][0] == 3)
result = sql """ select * from ${dbName}.${tbName} order by k1"""
assertTrue(result[0][0] ==1)
assertTrue(result[0][1] =="abc")
assertTrue(result[1][0] ==2)
assertTrue(result[1][1] =="adc")
assertTrue(result[2][0] ==3)
assertTrue(result[2][1] =="ttt")
}
sql """ revoke "${role1}" from "${user2}" """
try {
connect(user =user2, password = '${pwd}', url = url) {}
assertTrue(false. "should not be able to login")
} catch (Exception e) {
assertTrue(e.getMessage().contains("Access denied for user"), e.getMessage())
}
sql """ drop database ${dbName} """
sql """ drop database ${dbName2} """
sql """drop user ${user1}"""
sql """drop user ${user2}"""
sql """drop role ${role1}"""
}
test_role_grant()
// grant $privileges on resource $resource_name to $user
// grant $privileges on resource $resource_name to role $role_name
// revoke $privileges on resource $resource_name from $user_name
def test_resource = {
def user = 'test_manager_resource_user'
def role = 'test_manager_resource_role'
def resource_name = "test_manager_resource_case"
def pwd = "123456"
def url=tokens[0] + "//" + tokens[2] + "/" + "?"
sql """ drop RESOURCE if exists ${resource_name} """
sql """ CREATE RESOURCE ${resource_name} PROPERTIES(
"user" = "${jdbcUser}",
"type" = "jdbc",
"password" = "${jdbcPassword}",
"jdbc_url" = "${url}",
"driver_url" = "${driver_url}",
"driver_class" = "com.mysql.cj.jdbc.Driver"
)"""
sql """drop user if exists ${user}"""
sql """drop role if exists ${role}"""
sql """CREATE ROLE ${role}"""
sql """grant USAGE_PRIV on RESOURCE ${resource_name} TO ROLE '${role}' """
sql """CREATE USER '${user}' IDENTIFIED BY '${pwd}' default role '${role}' """
List<List<Object>> result = sql """ show resources """
def x = 0
for(int i = 0;i<result.size();i++) {
assert(result[i][0].toLowerCase() != "null") //Name
if (result[i][0] == resource_name) {
x ++
}
}
assertTrue(x == 20)
connect(user=user, password="${pwd}", url=url) {
result = sql """ show resources """
x = 0
for(int i = 0;i<result.size();i++) {
assert(result[i][0].toLowerCase() != "null") //Name
if (result[i][0] == resource_name) {
x ++
}
}
assertTrue(x == 20)
}
result = sql """ show all grants"""
x = 0
for(int i = 0;i < result.size(); i++ ) {
if ( result[i][3] == "${role}") {
//UserIdentity:
if (result[i][0].contains(user)){
//DatabasePrivs
assertTrue(result[i][9] == "test_manager_resource_case: Usage_priv")
x ++
}
}
}
assertTrue(x == 1)
sql """ revoke USAGE_PRIV on RESOURCE ${resource_name} FROM ROLE '${role}' """
connect(user=user, password="${pwd}", url=url) {
result = sql """ show resources """
x = 0
for(int i = 0;i<result.size();i++) {
assert(result[i][0].toLowerCase() != "null") //Name
if (result[i][0] == resource_name) {
x ++
}
}
assertTrue(x == 0)
}
sql """grant USAGE_PRIV on RESOURCE ${resource_name} TO '${user}' """
connect(user=user, password="${pwd}", url=url) {
result = sql """ show resources """
x = 0
for(int i = 0;i<result.size();i++) {
assert(result[i][0].toLowerCase() != "null") //Name
if (result[i][0] == resource_name) {
x ++
}
}
assertTrue(x == 20)
}
sql """ drop RESOURCE if exists ${resource_name} """
sql """drop user if exists ${user}"""
sql """drop role if exists ${role}"""
/*
mysql> show resources where name = "test_manager_resource_case"\G ;
*************************** 1. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: test_connection
Value: true
*************************** 2. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: driver_class
Value: com.mysql.cj.jdbc.Driver
*************************** 3. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: connection_pool_max_size
Value: 10
*************************** 4. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: connection_pool_max_life_time
Value: 1800000
*************************** 5. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: create_time
Value: 2024-06-04 17:35:19.097481994
*************************** 6. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: meta_names_mapping
Value:
*************************** 7. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: only_specified_database
Value: false
*************************** 8. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: driver_url
Value: mysql-connector-java-8.0.25.jar
*************************** 9. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: type
Value: jdbc
*************************** 10. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: connection_pool_min_size
Value: 1
*************************** 11. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: jdbc_url
Value: jdbc:mysql://127.0.0.1:55557/?&yearIsDateType=false&tinyInt1isBit=false&useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf-8
*************************** 12. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: lower_case_meta_names
Value: false
*************************** 13. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: connection_pool_max_wait_time
Value: 5000
*************************** 14. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: password
Value:
*************************** 15. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: use_meta_cache
Value: false
*************************** 16. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: exclude_database_list
Value:
*************************** 17. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: include_database_list
Value:
*************************** 18. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: checksum
Value: fdf55dcef04b09f2eaf42b75e61ccc9a
*************************** 19. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: connection_pool_keep_alive
Value: false
*************************** 20. row ***************************
Name: test_manager_resource_case
ResourceType: jdbc
Item: user
Value: root
20 rows in set (0.00 sec)
*/
}
test_resource()
// show property like '%$resource_tag%'
// show property for $user like '%$resource_tag%'
// set property for $user 'resource_tags.location' = '$tags'
def test_property = {
def user = 'test_manager_property_user'
def pwd = "123456"
def url=tokens[0] + "//" + tokens[2] + "/" + "?"
sql """drop user if exists ${user}"""
sql """CREATE USER '${user}' IDENTIFIED BY '${pwd}'"""
connect(user=user, password="${pwd}", url=url) {
List<List<Object>> result = sql """ show property like "max_query_instances" """
assertTrue(result[0][0]=="max_query_instances")
assertTrue(result[0][1]=="-1")
}
List<List<Object>> result = sql """ show property for ${user} like "max_query_instances" """
assertTrue(result[0][0]=="max_query_instances")
assertTrue(result[0][1]=="-1")
sql """ set property for ${user} 'max_query_instances' ="100000"; """
result = sql """ show property for ${user} like "max_query_instances" """
assertTrue(result[0][0]=="max_query_instances")
assertTrue(result[0][1]=="100000")
sql """ drop user ${user} """
}
test_property()
}