Skip to content

Commit 45220d4

Browse files
feeblefakieKodaiD
andauthored
Backport to branch(3.12) : Add DynamoDB permission test (#2856)
Co-authored-by: Kodai Doki <[email protected]>
1 parent 51a2919 commit 45220d4

File tree

8 files changed

+381
-42
lines changed

8 files changed

+381
-42
lines changed

.github/workflows/permission-check.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ env:
77
TERM: dumb
88
JAVA_VERSION: '8'
99
JAVA_VENDOR: 'temurin'
10+
DYNAMO_ACCESS_KEY_ID: ${{ secrets.DYNAMO_ACCESS_KEY }}
11+
DYNAMO_SECRET_ACCESS_KEY: ${{ secrets.DYNAMO_SECRET_ACCESS_KEY }}
1012

1113
jobs:
1214
integration-test-permission-cassandra-3-0:
@@ -86,3 +88,29 @@ jobs:
8688
with:
8789
name: cassandra_3.11_permission_integration_test_reports
8890
path: core/build/reports/tests/integrationTestCassandraPermission
91+
92+
integration-test-permission-dynamo:
93+
name: DynamoDB Permission Integration Test
94+
runs-on: ubuntu-latest
95+
96+
steps:
97+
- uses: actions/checkout@v4
98+
99+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
100+
uses: actions/setup-java@v4
101+
with:
102+
java-version: ${{ env.JAVA_VERSION }}
103+
distribution: ${{ env.JAVA_VENDOR }}
104+
105+
- name: Setup Gradle
106+
uses: gradle/actions/setup-gradle@v4
107+
108+
- name: Execute Gradle 'integrationTestDynamoPermission' task
109+
run: ./gradlew integrationTestDynamoPermission -Dscalardb.dynamo.emulator_used=false -Dscalardb.dynamo.region=ap-northeast-1 -Dscalardb.dynamo.access_key_id=${{ env.DYNAMO_ACCESS_KEY_ID }} -Dscalardb.dynamo.secret_access_key=${{ env.DYNAMO_SECRET_ACCESS_KEY }}
110+
111+
- name: Upload Gradle test reports
112+
if: always()
113+
uses: actions/upload-artifact@v4
114+
with:
115+
name: dynamo_permission_integration_test_reports
116+
path: core/build/reports/tests/integrationTestDynamoPermission

core/build.gradle

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ sourceSets {
4242
runtimeClasspath += main.output + test.output
4343
srcDir file('src/integration-test/java')
4444
include '**/com/scalar/db/storage/dynamo/*.java'
45+
exclude '**/com/scalar/db/storage/dynamo/DynamoPermissionTestUtils.java'
46+
exclude '**/com/scalar/db/storage/dynamo/DynamoPermissionIntegrationTest.java'
47+
exclude '**/com/scalar/db/storage/dynamo/DynamoAdminPermissionIntegrationTest.java'
4548
}
4649
resources.srcDir file('src/integration-test/resources')
4750
}
@@ -79,6 +82,20 @@ sourceSets {
7982
}
8083
resources.srcDir file('src/integration-test/resources')
8184
}
85+
integrationTestDynamoPermission {
86+
java {
87+
compileClasspath += main.output + test.output
88+
runtimeClasspath += main.output + test.output
89+
srcDir file('src/integration-test/java')
90+
include '**/com/scalar/db/common/*.java'
91+
include '**/com/scalar/db/storage/dynamo/DynamoPermissionTestUtils.java'
92+
include '**/com/scalar/db/storage/dynamo/DynamoAdminTestUtils.java'
93+
include '**/com/scalar/db/storage/dynamo/DynamoEnv.java'
94+
include '**/com/scalar/db/storage/dynamo/DynamoPermissionIntegrationTest.java'
95+
include '**/com/scalar/db/storage/dynamo/DynamoAdminPermissionIntegrationTest.java'
96+
}
97+
resources.srcDir file('src/integration-test/resources')
98+
}
8299
}
83100

84101
configurations {
@@ -103,6 +120,9 @@ configurations {
103120
integrationTestCassandraPermissionImplementation.extendsFrom testImplementation
104121
integrationTestCassandraPermissionRuntimeOnly.extendsFrom testRuntimeOnly
105122
integrationTestCassandraPermissionCompileOnly.extendsFrom testCompileOnly
123+
integrationTestDynamoPermissionImplementation.extendsFrom testImplementation
124+
integrationTestDynamoPermissionRuntimeOnly.extendsFrom testRuntimeOnly
125+
integrationTestDynamoPermissionCompileOnly.extendsFrom testCompileOnly
106126
}
107127

108128
dependencies {
@@ -116,6 +136,8 @@ dependencies {
116136
implementation platform("software.amazon.awssdk:bom:${awssdkVersion}")
117137
implementation 'software.amazon.awssdk:applicationautoscaling'
118138
implementation 'software.amazon.awssdk:dynamodb'
139+
testImplementation 'software.amazon.awssdk:iam'
140+
testImplementation 'software.amazon.awssdk:iam-policy-builder'
119141
implementation "org.apache.commons:commons-dbcp2:${commonsDbcp2Version}"
120142
implementation "com.mysql:mysql-connector-j:${mysqlDriverVersion}"
121143
implementation "org.postgresql:postgresql:${postgresqlDriverVersion}"
@@ -221,6 +243,17 @@ task integrationTestCassandraPermission(type: Test) {
221243
}
222244
}
223245

246+
task integrationTestDynamoPermission(type: Test) {
247+
description = 'Runs the integration tests for DynamoDB permissions.'
248+
group = 'verification'
249+
testClassesDirs = sourceSets.integrationTestDynamoPermission.output.classesDirs
250+
classpath = sourceSets.integrationTestDynamoPermission.runtimeClasspath
251+
outputs.upToDateWhen { false } // ensures integration tests are run every time when called
252+
options {
253+
systemProperties(System.getProperties().findAll { it.key.toString().startsWith("scalardb") })
254+
}
255+
}
256+
224257
spotless {
225258
java {
226259
target 'src/*/java/**/*.java'
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.scalar.db.storage.dynamo;
2+
3+
import static com.scalar.db.storage.dynamo.DynamoPermissionTestUtils.SLEEP_BETWEEN_TESTS_SECONDS;
4+
5+
import com.google.common.collect.ImmutableMap;
6+
import com.google.common.util.concurrent.Uninterruptibles;
7+
import com.scalar.db.api.DistributedStorageAdminPermissionIntegrationTestBase;
8+
import com.scalar.db.util.AdminTestUtils;
9+
import com.scalar.db.util.PermissionTestUtils;
10+
import java.util.Map;
11+
import java.util.Properties;
12+
import java.util.concurrent.TimeUnit;
13+
import org.junit.jupiter.api.Disabled;
14+
import org.junit.jupiter.api.Test;
15+
16+
public class DynamoAdminPermissionIntegrationTest
17+
extends DistributedStorageAdminPermissionIntegrationTestBase {
18+
@Override
19+
protected Properties getProperties(String testName) {
20+
return DynamoEnv.getProperties(testName);
21+
}
22+
23+
@Override
24+
protected Properties getPropertiesForNormalUser(String testName) {
25+
return DynamoEnv.getProperties(testName);
26+
}
27+
28+
@Override
29+
protected Map<String, String> getCreationOptions() {
30+
return ImmutableMap.of(DynamoAdmin.NO_SCALING, "false", DynamoAdmin.NO_BACKUP, "false");
31+
}
32+
33+
@Override
34+
protected AdminTestUtils getAdminTestUtils(String testName) {
35+
return new DynamoAdminTestUtils(getProperties(testName));
36+
}
37+
38+
@Override
39+
protected PermissionTestUtils getPermissionTestUtils(String testName) {
40+
return new DynamoPermissionTestUtils(getProperties(testName));
41+
}
42+
43+
@Override
44+
protected void sleepBetweenTests() {
45+
Uninterruptibles.sleepUninterruptibly(SLEEP_BETWEEN_TESTS_SECONDS, TimeUnit.SECONDS);
46+
}
47+
48+
@Test
49+
@Override
50+
@Disabled("Import-related functionality is not supported in DynamoDB")
51+
public void getImportTableMetadata_WithSufficientPermission_ShouldSucceed() {}
52+
53+
@Test
54+
@Override
55+
@Disabled("Import-related functionality is not supported in DynamoDB")
56+
public void addRawColumnToTable_WithSufficientPermission_ShouldSucceed() {}
57+
58+
@Test
59+
@Override
60+
@Disabled("Import-related functionality is not supported in DynamoDB")
61+
public void importTable_WithSufficientPermission_ShouldSucceed() {}
62+
}

core/src/integration-test/java/com/scalar/db/storage/dynamo/DynamoEnv.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ public final class DynamoEnv {
1010
private static final String PROP_DYNAMO_REGION = "scalardb.dynamo.region";
1111
private static final String PROP_DYNAMO_ACCESS_KEY_ID = "scalardb.dynamo.access_key_id";
1212
private static final String PROP_DYNAMO_SECRET_ACCESS_KEY = "scalardb.dynamo.secret_access_key";
13+
private static final String PROP_DYNAMO_EMULATOR_USED = "scalardb.dynamo.emulator_used";
1314
private static final String PROP_DYNAMO_CREATE_OPTIONS = "scalardb.dynamo.create_options";
1415

1516
private static final String DEFAULT_DYNAMO_ENDPOINT_OVERRIDE = "http://localhost:8000";
1617
private static final String DEFAULT_DYNAMO_REGION = "us-west-2";
1718
private static final String DEFAULT_DYNAMO_ACCESS_KEY_ID = "fakeMyKeyId";
1819
private static final String DEFAULT_DYNAMO_SECRET_ACCESS_KEY = "fakeSecretAccessKey";
20+
private static final String DEFAULT_DYNAMO_EMULATOR_USED = "true";
1921

2022
private static final ImmutableMap<String, String> DEFAULT_DYNAMO_CREATE_OPTIONS =
2123
ImmutableMap.of(DynamoAdmin.NO_SCALING, "true", DynamoAdmin.NO_BACKUP, "true");
@@ -30,24 +32,26 @@ public static Properties getProperties(String testName) {
3032
System.getProperty(PROP_DYNAMO_ACCESS_KEY_ID, DEFAULT_DYNAMO_ACCESS_KEY_ID);
3133
String secretAccessKey =
3234
System.getProperty(PROP_DYNAMO_SECRET_ACCESS_KEY, DEFAULT_DYNAMO_SECRET_ACCESS_KEY);
35+
String isEmulatorUsed =
36+
System.getProperty(PROP_DYNAMO_EMULATOR_USED, DEFAULT_DYNAMO_EMULATOR_USED);
3337

34-
Properties props = new Properties();
35-
if (endpointOverride != null) {
36-
props.setProperty(DynamoConfig.ENDPOINT_OVERRIDE, endpointOverride);
38+
Properties properties = new Properties();
39+
if (Boolean.parseBoolean(isEmulatorUsed) && endpointOverride != null) {
40+
properties.setProperty(DynamoConfig.ENDPOINT_OVERRIDE, endpointOverride);
3741
}
38-
props.setProperty(DatabaseConfig.CONTACT_POINTS, region);
39-
props.setProperty(DatabaseConfig.USERNAME, accessKeyId);
40-
props.setProperty(DatabaseConfig.PASSWORD, secretAccessKey);
41-
props.setProperty(DatabaseConfig.STORAGE, "dynamo");
42-
props.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN, "true");
43-
props.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN_FILTERING, "false");
44-
props.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN_ORDERING, "false");
42+
properties.setProperty(DatabaseConfig.CONTACT_POINTS, region);
43+
properties.setProperty(DatabaseConfig.USERNAME, accessKeyId);
44+
properties.setProperty(DatabaseConfig.PASSWORD, secretAccessKey);
45+
properties.setProperty(DatabaseConfig.STORAGE, "dynamo");
46+
properties.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN, "true");
47+
properties.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN_FILTERING, "false");
48+
properties.setProperty(DatabaseConfig.CROSS_PARTITION_SCAN_ORDERING, "false");
4549

4650
// Add testName as a metadata namespace suffix
47-
props.setProperty(
51+
properties.setProperty(
4852
DynamoConfig.TABLE_METADATA_NAMESPACE, DynamoAdmin.METADATA_NAMESPACE + "_" + testName);
4953

50-
return props;
54+
return properties;
5155
}
5256

5357
public static Map<String, String> getCreationOptions() {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.scalar.db.storage.dynamo;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import com.scalar.db.api.DistributedStoragePermissionIntegrationTestBase;
5+
import com.scalar.db.util.AdminTestUtils;
6+
import com.scalar.db.util.PermissionTestUtils;
7+
import java.util.Map;
8+
import java.util.Properties;
9+
10+
public class DynamoPermissionIntegrationTest
11+
extends DistributedStoragePermissionIntegrationTestBase {
12+
@Override
13+
protected Properties getProperties(String testName) {
14+
return DynamoEnv.getProperties(testName);
15+
}
16+
17+
@Override
18+
protected Properties getPropertiesForNormalUser(String testName) {
19+
return DynamoEnv.getProperties(testName);
20+
}
21+
22+
@Override
23+
protected Map<String, String> getCreationOptions() {
24+
return ImmutableMap.of(DynamoAdmin.NO_SCALING, "false", DynamoAdmin.NO_BACKUP, "false");
25+
}
26+
27+
@Override
28+
protected PermissionTestUtils getPermissionTestUtils(String testName) {
29+
return new DynamoPermissionTestUtils(getProperties(testName));
30+
}
31+
32+
@Override
33+
protected AdminTestUtils getAdminTestUtils(String testName) {
34+
return new DynamoAdminTestUtils(getProperties(testName));
35+
}
36+
}

0 commit comments

Comments
 (0)