Skip to content

Commit 9dbf4a8

Browse files
KodaiDkomamitsubrfrn169
committed
Add JDBC database permission test (Part 2) (#2923)
Co-authored-by: Mitsunori Komatsu <[email protected]> Co-authored-by: Toshihiro Suzuki <[email protected]>
1 parent 94146f7 commit 9dbf4a8

File tree

7 files changed

+286
-18
lines changed

7 files changed

+286
-18
lines changed

.github/workflows/permission-check.yaml

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,3 +619,201 @@ jobs:
619619
with:
620620
name: sqlserver_2022_permission_integration_test_reports
621621
path: core/build/reports/tests/integrationTestJdbcPermission
622+
623+
integration-test-permission-jdbc-mariadb-10-11:
624+
name: MariaDB 10.11 Permission Integration Test
625+
runs-on: ubuntu-latest
626+
627+
steps:
628+
- name: Run MariaDB 10.11
629+
run: |
630+
docker run -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mariadb:10.11 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
631+
632+
- uses: actions/checkout@v4
633+
634+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
635+
uses: actions/setup-java@v4
636+
with:
637+
java-version: ${{ env.JAVA_VERSION }}
638+
distribution: ${{ env.JAVA_VENDOR }}
639+
640+
- name: Setup Gradle
641+
uses: gradle/actions/setup-gradle@v4
642+
643+
- name: Execute Gradle 'integrationTestJdbcPermission' task
644+
run: ./gradlew integrationTestJdbcPermission -Dscalardb.jdbc.url=jdbc:mariadb://localhost:3306 -Dscalardb.jdbc.username=root -Dscalardb.jdbc.password=mysql
645+
646+
- name: Upload Gradle test reports
647+
if: always()
648+
uses: actions/upload-artifact@v4
649+
with:
650+
name: mariadb_10.11_permission_integration_test_reports
651+
path: core/build/reports/tests/integrationTestJdbcPermission
652+
653+
integration-test-permission-jdbc-mariadb-11-4:
654+
name: MariaDB 11.4 Permission Integration Test
655+
runs-on: ubuntu-latest
656+
657+
steps:
658+
- name: Run MariaDB 11.4
659+
run: |
660+
docker run -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mariadb:11.4 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
661+
662+
- uses: actions/checkout@v4
663+
664+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
665+
uses: actions/setup-java@v4
666+
with:
667+
java-version: ${{ env.JAVA_VERSION }}
668+
distribution: ${{ env.JAVA_VENDOR }}
669+
670+
- name: Setup Gradle
671+
uses: gradle/actions/setup-gradle@v4
672+
673+
- name: Execute Gradle 'integrationTestJdbcPermission' task
674+
run: ./gradlew integrationTestJdbcPermission -Dscalardb.jdbc.url=jdbc:mariadb://localhost:3306 -Dscalardb.jdbc.username=root -Dscalardb.jdbc.password=mysql
675+
676+
- name: Upload Gradle test reports
677+
if: always()
678+
uses: actions/upload-artifact@v4
679+
with:
680+
name: mariadb_11.4_permission_integration_test_reports
681+
path: core/build/reports/tests/integrationTestJdbcPermission
682+
683+
integration-test-permission-jdbc-yugabytedb-2:
684+
name: YugabyteDB 2 Permission Integration Test
685+
runs-on: ubuntu-latest
686+
687+
steps:
688+
- name: Run YugabyteDB 2
689+
run: |
690+
docker run -p 5433:5433 -e YSQL_USER=yugabyte -e YSQL_PASSWORD=yugabyte -d yugabytedb/yugabyte:2.20.4.0-b50 bin/yugabyted start --background=false --master_flag="ysql_enable_db_catalog_version_mode=false" --tserver_flags="ysql_enable_db_catalog_version_mode=false"
691+
692+
- uses: actions/checkout@v4
693+
694+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
695+
uses: actions/setup-java@v4
696+
with:
697+
java-version: ${{ env.JAVA_VERSION }}
698+
distribution: ${{ env.JAVA_VENDOR }}
699+
700+
- name: Setup Gradle
701+
uses: gradle/actions/setup-gradle@v4
702+
703+
- name: Execute Gradle 'integrationTestJdbcPermission' task
704+
run: ./gradlew integrationTestJdbcPermission -Dscalardb.jdbc.url=jdbc:yugabytedb://localhost:5433/yugabyte?load-balance=any -Dscalardb.jdbc.username=yugabyte -Dscalardb.jdbc.password=yugabyte -Dscalar.db.jdbc.connection_pool.max_total=12 -Dscalar.db.jdbc.table_metadata.connection_pool.max_total=4 -Dscalar.db.jdbc.admin.connection_pool.max_total=4
705+
706+
- name: Upload Gradle test reports
707+
if: always()
708+
uses: actions/upload-artifact@v4
709+
with:
710+
name: yugabytedb_2_permission_integration_test_reports
711+
path: core/build/reports/tests/integrationTestJdbcPermission
712+
713+
integration-test-permission-jdbc-db2-11-5:
714+
name: Db2 11.5 Permission Integration Test
715+
runs-on: ubuntu-latest
716+
717+
services:
718+
db2:
719+
image: icr.io/db2_community/db2:11.5.9.0
720+
env:
721+
DB2INSTANCE: db2inst1
722+
DB2INST1_PASSWORD: db2inst1
723+
DBNAME: test_db
724+
LICENSE: accept
725+
ports:
726+
- 50000:50000
727+
options: --privileged --name db2
728+
729+
steps:
730+
- uses: actions/checkout@v4
731+
732+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
733+
uses: actions/setup-java@v4
734+
with:
735+
java-version: ${{ env.JAVA_VERSION }}
736+
distribution: ${{ env.JAVA_VENDOR }}
737+
738+
- name: Setup Gradle
739+
uses: gradle/actions/setup-gradle@v4
740+
741+
- name: Wait for the container to be ready
742+
timeout-minutes: 10
743+
run: |
744+
while ! docker logs db2 2>&1 | grep -q "Setup has completed"
745+
do
746+
echo "Container is not yet ready"
747+
sleep 5s
748+
done
749+
echo "Container is ready"
750+
751+
- name: Create OS user for Db2
752+
run: |
753+
docker exec db2 bash -c "useradd -m -s /bin/bash test"
754+
docker exec db2 bash -c "echo \"test:test\" | sudo chpasswd"
755+
docker exec db2 bash -c "usermod -aG db2iadm1 test"
756+
757+
- name: Execute Gradle 'integrationTestJdbcPermission' task
758+
run: ./gradlew integrationTestJdbcPermission -Dscalardb.jdbc.url="jdbc:db2://localhost:50000/test_db" -Dscalardb.jdbc.username=db2inst1 -Dscalardb.jdbc.password=db2inst1
759+
760+
- name: Upload Gradle test reports
761+
if: always()
762+
uses: actions/upload-artifact@v4
763+
with:
764+
name: db2_11.5_permission_integration_test_reports
765+
path: core/build/reports/tests/integrationTestJdbcPermission
766+
767+
integration-test-permission-jdbc-db2-12-1:
768+
name: Db2 12.1 Permission Integration Test
769+
runs-on: ubuntu-latest
770+
771+
services:
772+
db2:
773+
image: icr.io/db2_community/db2:12.1.1.0
774+
env:
775+
DB2INSTANCE: db2inst1
776+
DB2INST1_PASSWORD: db2inst1
777+
DBNAME: test_db
778+
LICENSE: accept
779+
ports:
780+
- 50000:50000
781+
options: --privileged --name db2
782+
783+
steps:
784+
- uses: actions/checkout@v4
785+
786+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
787+
uses: actions/setup-java@v4
788+
with:
789+
java-version: ${{ env.JAVA_VERSION }}
790+
distribution: ${{ env.JAVA_VENDOR }}
791+
792+
- name: Setup Gradle
793+
uses: gradle/actions/setup-gradle@v4
794+
795+
- name: Wait for the container to be ready
796+
timeout-minutes: 10
797+
run: |
798+
while ! docker logs db2 2>&1 | grep -q "Setup has completed"
799+
do
800+
echo "Container is not yet ready"
801+
sleep 5s
802+
done
803+
echo "Container is ready"
804+
805+
- name: Create OS user for Db2
806+
run: |
807+
docker exec db2 bash -c "useradd -m -s /bin/bash test"
808+
docker exec db2 bash -c "echo \"test:test\" | sudo chpasswd"
809+
docker exec db2 bash -c "usermod -aG db2iadm1 test"
810+
811+
- name: Execute Gradle 'integrationTestJdbcPermission' task
812+
run: ./gradlew integrationTestJdbcPermission -Dscalardb.jdbc.url="jdbc:db2://localhost:50000/test_db" -Dscalardb.jdbc.username=db2inst1 -Dscalardb.jdbc.password=db2inst1
813+
814+
- name: Upload Gradle test reports
815+
if: always()
816+
uses: actions/upload-artifact@v4
817+
with:
818+
name: db2_12.1_permission_integration_test_reports
819+
path: core/build/reports/tests/integrationTestJdbcPermission

core/src/integration-test/java/com/scalar/db/storage/cassandra/CassandraPermissionIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ protected Map<String, String> getCreationOptions() {
4040
}
4141

4242
@Override
43-
protected void waitForTableCreation() {
43+
protected void waitForDdlCompletion() {
4444
try {
4545
AdminTestUtils utils = getAdminTestUtils(TEST_NAME);
4646
int retryCount = 0;

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminPermissionIntegrationTest.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package com.scalar.db.storage.jdbc;
22

3+
import static com.scalar.db.storage.jdbc.JdbcPermissionTestUtils.DDL_WAIT_SECONDS;
4+
5+
import com.google.common.util.concurrent.Uninterruptibles;
36
import com.scalar.db.api.DistributedStorageAdminPermissionIntegrationTestBase;
7+
import com.scalar.db.config.DatabaseConfig;
48
import com.scalar.db.util.AdminTestUtils;
59
import com.scalar.db.util.PermissionTestUtils;
610
import java.util.Properties;
11+
import java.util.concurrent.TimeUnit;
712

813
public class JdbcAdminPermissionIntegrationTest
914
extends DistributedStorageAdminPermissionIntegrationTestBase {
15+
private RdbEngineStrategy rdbEngine;
16+
1017
@Override
1118
protected Properties getProperties(String testName) {
12-
return JdbcEnv.getProperties(testName);
19+
Properties properties = JdbcEnv.getProperties(testName);
20+
rdbEngine = RdbEngineFactory.create(new JdbcConfig(new DatabaseConfig(properties)));
21+
return properties;
1322
}
1423

1524
@Override
@@ -26,4 +35,37 @@ protected AdminTestUtils getAdminTestUtils(String testName) {
2635
protected PermissionTestUtils getPermissionTestUtils(String testName) {
2736
return new JdbcPermissionTestUtils(getProperties(testName));
2837
}
38+
39+
@Override
40+
protected void waitForTableCreation() {
41+
waitForDdlCompletion();
42+
}
43+
44+
@Override
45+
protected void waitForNamespaceCreation() {
46+
waitForDdlCompletion();
47+
}
48+
49+
@Override
50+
protected void waitForTableDeletion() {
51+
waitForDdlCompletion();
52+
}
53+
54+
@Override
55+
protected void waitForNamespaceDeletion() {
56+
waitForDdlCompletion();
57+
}
58+
59+
@Override
60+
protected void sleepBetweenTests() {
61+
// Sleep to ensure the DDL operations executed as ACT are completed before the next setup.
62+
waitForDdlCompletion();
63+
}
64+
65+
private void waitForDdlCompletion() {
66+
if (JdbcTestUtils.isYugabyte(rdbEngine)) {
67+
// This is needed to avoid schema or catalog version mismatch database errors.
68+
Uninterruptibles.sleepUninterruptibly(DDL_WAIT_SECONDS, TimeUnit.SECONDS);
69+
}
70+
}
2971
}

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcPermissionIntegrationTest.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
package com.scalar.db.storage.jdbc;
22

3+
import static com.scalar.db.storage.jdbc.JdbcPermissionTestUtils.DDL_WAIT_SECONDS;
4+
5+
import com.google.common.util.concurrent.Uninterruptibles;
36
import com.scalar.db.api.DistributedStoragePermissionIntegrationTestBase;
7+
import com.scalar.db.config.DatabaseConfig;
48
import com.scalar.db.util.AdminTestUtils;
59
import com.scalar.db.util.PermissionTestUtils;
610
import java.util.Properties;
11+
import java.util.concurrent.TimeUnit;
712

813
public class JdbcPermissionIntegrationTest extends DistributedStoragePermissionIntegrationTestBase {
14+
private RdbEngineStrategy rdbEngine;
15+
916
@Override
1017
protected Properties getProperties(String testName) {
11-
return JdbcEnv.getProperties(testName);
18+
Properties properties = JdbcEnv.getProperties(testName);
19+
rdbEngine = RdbEngineFactory.create(new JdbcConfig(new DatabaseConfig(properties)));
20+
return properties;
1221
}
1322

1423
@Override
@@ -25,4 +34,12 @@ protected PermissionTestUtils getPermissionTestUtils(String testName) {
2534
protected AdminTestUtils getAdminTestUtils(String testName) {
2635
return new JdbcAdminTestUtils(getProperties(testName));
2736
}
37+
38+
@Override
39+
protected void waitForDdlCompletion() {
40+
if (JdbcTestUtils.isYugabyte(rdbEngine)) {
41+
// This is needed to avoid schema or catalog version mismatch database errors.
42+
Uninterruptibles.sleepUninterruptibly(DDL_WAIT_SECONDS, TimeUnit.SECONDS);
43+
}
44+
}
2845
}

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcPermissionTestUtils.java

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.apache.commons.dbcp2.BasicDataSource;
1010

1111
public class JdbcPermissionTestUtils implements PermissionTestUtils {
12+
public static final int DDL_WAIT_SECONDS = 1;
1213
private final RdbEngineStrategy rdbEngine;
1314
private final BasicDataSource dataSource;
1415

@@ -20,25 +21,29 @@ public JdbcPermissionTestUtils(Properties properties) {
2021

2122
@Override
2223
public void createNormalUser(String userName, String password) {
23-
try (Connection connection = dataSource.getConnection()) {
24-
String createUserSql = getCreateUserSql(userName, password);
25-
try (Statement statement = connection.createStatement()) {
26-
statement.execute(createUserSql);
24+
if (!JdbcTestUtils.isDb2(rdbEngine)) {
25+
try (Connection connection = dataSource.getConnection()) {
26+
String createUserSql = getCreateUserSql(userName, password);
27+
try (Statement statement = connection.createStatement()) {
28+
statement.execute(createUserSql);
29+
}
30+
} catch (SQLException e) {
31+
throw new RuntimeException("Failed to create user: " + userName, e);
2732
}
28-
} catch (SQLException e) {
29-
throw new RuntimeException("Failed to create user: " + userName, e);
3033
}
3134
}
3235

3336
@Override
3437
public void dropNormalUser(String userName) {
35-
try (Connection connection = dataSource.getConnection()) {
36-
String dropUserSql = getDropUserSql(userName);
37-
try (Statement statement = connection.createStatement()) {
38-
statement.execute(dropUserSql);
38+
if (!JdbcTestUtils.isDb2(rdbEngine)) {
39+
try (Connection connection = dataSource.getConnection()) {
40+
String dropUserSql = getDropUserSql(userName);
41+
try (Statement statement = connection.createStatement()) {
42+
statement.execute(dropUserSql);
43+
}
44+
} catch (SQLException e) {
45+
throw new RuntimeException("Failed to drop user: " + userName, e);
3946
}
40-
} catch (SQLException e) {
41-
throw new RuntimeException("Failed to drop user: " + userName, e);
4247
}
4348
}
4449

@@ -128,6 +133,11 @@ private String[] getGrantPermissionStatements(String userName) {
128133
String.format("ALTER ROLE [db_datareader] ADD MEMBER %s", userName),
129134
String.format("ALTER ROLE [db_datawriter] ADD MEMBER %s", userName)
130135
};
136+
} else if (JdbcTestUtils.isDb2(rdbEngine)) {
137+
return new String[] {
138+
String.format("GRANT DBADM ON DATABASE TO USER %s", userName),
139+
String.format("GRANT DATAACCESS ON DATABASE TO USER %s", userName)
140+
};
131141
} else {
132142
throw new UnsupportedOperationException(
133143
"Granting permissions is not supported for " + rdbEngine);

integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminPermissionIntegrationTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public abstract class DistributedStorageAdminPermissionIntegrationTestBase {
3838
TableMetadata.newBuilder()
3939
.addColumn(COL_NAME1, DataType.INT)
4040
.addColumn(COL_NAME2, DataType.TEXT)
41-
.addColumn(COL_NAME3, DataType.TEXT)
41+
.addColumn(COL_NAME3, DataType.INT)
4242
.addColumn(COL_NAME4, DataType.INT)
4343
.addPartitionKey(COL_NAME1)
4444
.addClusteringKey(COL_NAME2, Scan.Ordering.Order.ASC)

0 commit comments

Comments
 (0)