Skip to content

Commit f340413

Browse files
committed
Resolve conflicts
1 parent 8184290 commit f340413

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
@@ -45,6 +45,9 @@ sourceSets {
4545
srcDir file('src/integration-test/java')
4646
include '**/com/scalar/db/common/*.java'
4747
include '**/com/scalar/db/storage/dynamo/*.java'
48+
exclude '**/com/scalar/db/storage/dynamo/DynamoPermissionTestUtils.java'
49+
exclude '**/com/scalar/db/storage/dynamo/DynamoPermissionIntegrationTest.java'
50+
exclude '**/com/scalar/db/storage/dynamo/DynamoAdminPermissionIntegrationTest.java'
4851
}
4952
resources.srcDir file('src/integration-test/resources')
5053
}
@@ -84,6 +87,20 @@ sourceSets {
8487
}
8588
resources.srcDir file('src/integration-test/resources')
8689
}
90+
integrationTestDynamoPermission {
91+
java {
92+
compileClasspath += main.output + test.output
93+
runtimeClasspath += main.output + test.output
94+
srcDir file('src/integration-test/java')
95+
include '**/com/scalar/db/common/*.java'
96+
include '**/com/scalar/db/storage/dynamo/DynamoPermissionTestUtils.java'
97+
include '**/com/scalar/db/storage/dynamo/DynamoAdminTestUtils.java'
98+
include '**/com/scalar/db/storage/dynamo/DynamoEnv.java'
99+
include '**/com/scalar/db/storage/dynamo/DynamoPermissionIntegrationTest.java'
100+
include '**/com/scalar/db/storage/dynamo/DynamoAdminPermissionIntegrationTest.java'
101+
}
102+
resources.srcDir file('src/integration-test/resources')
103+
}
87104
}
88105

89106
configurations {
@@ -108,6 +125,9 @@ configurations {
108125
integrationTestCassandraPermissionImplementation.extendsFrom testImplementation
109126
integrationTestCassandraPermissionRuntimeOnly.extendsFrom testRuntimeOnly
110127
integrationTestCassandraPermissionCompileOnly.extendsFrom testCompileOnly
128+
integrationTestDynamoPermissionImplementation.extendsFrom testImplementation
129+
integrationTestDynamoPermissionRuntimeOnly.extendsFrom testRuntimeOnly
130+
integrationTestDynamoPermissionCompileOnly.extendsFrom testCompileOnly
111131
}
112132

113133
dependencies {
@@ -120,6 +140,8 @@ dependencies {
120140
implementation platform("software.amazon.awssdk:bom:${awssdkVersion}")
121141
implementation 'software.amazon.awssdk:applicationautoscaling'
122142
implementation 'software.amazon.awssdk:dynamodb'
143+
testImplementation 'software.amazon.awssdk:iam'
144+
testImplementation 'software.amazon.awssdk:iam-policy-builder'
123145
implementation "org.apache.commons:commons-dbcp2:${commonsDbcp2Version}"
124146
implementation "com.mysql:mysql-connector-j:${mysqlDriverVersion}"
125147
implementation "org.postgresql:postgresql:${postgresqlDriverVersion}"
@@ -231,6 +253,17 @@ task integrationTestCassandraPermission(type: Test) {
231253
}
232254
}
233255

256+
task integrationTestDynamoPermission(type: Test) {
257+
description = 'Runs the integration tests for DynamoDB permissions.'
258+
group = 'verification'
259+
testClassesDirs = sourceSets.integrationTestDynamoPermission.output.classesDirs
260+
classpath = sourceSets.integrationTestDynamoPermission.runtimeClasspath
261+
outputs.upToDateWhen { false } // ensures integration tests are run every time when called
262+
options {
263+
systemProperties(System.getProperties().findAll { it.key.toString().startsWith("scalardb") })
264+
}
265+
}
266+
234267
spotless {
235268
java {
236269
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,25 +32,27 @@ 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, "true");
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, "true");
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,
4953
DatabaseConfig.DEFAULT_SYSTEM_NAMESPACE_NAME + "_" + testName);
5054

51-
return props;
55+
return properties;
5256
}
5357

5458
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)