This is an automated email from the ASF dual-hosted git repository. imaxon pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 0729764841c54adf579c02024f2226c249135c2c Author: Ian Maxon <[email protected]> AuthorDate: Thu Sep 18 08:43:08 2025 -0700 [ASTERIXDB-3640][TEST]Use s3mock in testcontainers - user model changes: no - storage format changes: no - interface changes: no Details: - Refactor all tests that use Adobe S3 Mock to use the containerized version instead of using it as a Java dependency - Make the cloud storage configuration templated to deal with the fact testcontainers listens on a random ephemeral port each time - Add compensating drop statements to some test suites that were previously leaking entities into the Default namespace Ext-ref: MB-68268 Change-Id: Iad1a6f9331fd844f3e3c04b8f56e811e4117f83a Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20280 Integration-Tests: Jenkins <[email protected]> Reviewed-by: Michael Blow <[email protected]> Tested-by: Ian Maxon <[email protected]> Reviewed-by: Ian Maxon <[email protected]> --- asterixdb/asterix-app/pom.xml | 14 ++-- .../api/common/CloudStorageIntegrationUtil.java | 9 ++- .../apache/asterix/api/common/LocalCloudUtil.java | 10 ++- .../api/common/LocalCloudUtilAdobeMock.java | 90 +++++++++++++++------- .../AtomicMetadataTransactionWithoutWALTest.java | 8 +- .../AtomicStatementsCancellationTest.java | 23 ++++-- .../test/cloud_storage/CloudPythonTest.java | 19 ++++- .../test/cloud_storage/CloudStorageAzTest.java | 5 +- .../test/cloud_storage/CloudStorageGCSTest.java | 5 +- .../test/cloud_storage/CloudStorageSparseTest.java | 21 +++-- .../test/cloud_storage/CloudStorageTest.java | 27 ++++--- .../cloud_storage/CloudStorageUnstableTest.java | 10 ++- .../cloud_storage/GCSCloudStorageUnstableTest.java | 6 +- .../apache/asterix/test/common/TestConstants.java | 1 + .../apache/asterix/test/common/TestExecutor.java | 13 +++- ...orage-sparse.conf => cc-cloud-storage-main.ftl} | 6 +- ...parse.conf => cc-cloud-storage-sparse.conf.ftl} | 2 +- ...orage-sparse.conf => cc-cloud-storage.conf.ftl} | 4 +- .../post-non-query/post-non-query.099.post.http} | 10 ++- ... => array_slice_bracket_notation.099.ddl.sqlpp} | 3 +- .../array_slice_bracket_notation.1.ddl.sqlpp | 0 .../array_slice_bracket_notation.2.update.sqlpp | 0 .../array_slice_bracket_notation.3.query.sqlpp | 0 .../array_slice_bracket_notation.4.ddl.sqlpp | 0 .../external-collection/test.010.ddl.sqlpp | 8 +- .../hash_join_exchange.099.ddl.sqlpp} | 7 +- .../hash_join_exchange_1.099.ddl.sqlpp} | 7 +- .../join-with-empty-dataset.099.ddl.sqlpp} | 5 +- ...uery.sqlpp => limit_after_offset.099.ddl.sqlpp} | 3 +- .../limit_after_offset.1.ddl.sqlpp} | 4 +- .../limit_after_offset.2.query.sqlpp} | 5 +- .../api/post-non-query/post-non-query.099.adm | 1 + .../runtimets/testsuite_cloud_storage.xml | 2 + asterixdb/pom.xml | 10 +-- 34 files changed, 226 insertions(+), 112 deletions(-) diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml index d5d1c792f2..f1bbb375f9 100644 --- a/asterixdb/asterix-app/pom.xml +++ b/asterixdb/asterix-app/pom.xml @@ -1137,14 +1137,8 @@ </dependency> <dependency> <groupId>com.adobe.testing</groupId> - <artifactId>s3mock</artifactId> + <artifactId>s3mock-testcontainers</artifactId> <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-logging</artifactId> - </exclusion> - </exclusions> </dependency> <!-- Mock for AWS S3 --> <dependency> @@ -1201,5 +1195,11 @@ <artifactId>hadoop-client-runtime</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.freemarker</groupId> + <artifactId>freemarker</artifactId> + <version>2.3.31</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/CloudStorageIntegrationUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/CloudStorageIntegrationUtil.java index d49fe266a8..b86730b07d 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/CloudStorageIntegrationUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/CloudStorageIntegrationUtil.java @@ -19,18 +19,25 @@ package org.apache.asterix.api.common; import static org.apache.asterix.api.common.AsterixHyracksIntegrationUtil.LoggerHolder.LOGGER; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.MOCK_SERVER_HOSTNAME_FRAGMENT; import static org.apache.hyracks.util.file.FileUtil.joinPath; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + public class CloudStorageIntegrationUtil extends AsterixHyracksIntegrationUtil { public static final String RESOURCES_PATH = joinPath(getProjectPath().toString(), "src", "test", "resources"); public static final String CONFIG_FILE = joinPath(RESOURCES_PATH, "cc-cloud-storage-main.conf"); + public static final String CONFIG_FILE_TEMPLATE = joinPath(RESOURCES_PATH, "cc-cloud-storage-main.ftl"); public static void main(String[] args) throws Exception { boolean cleanStart = Boolean.getBoolean("cleanup.start"); LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart); final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil(); - try { + try (S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart)) { + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE); integrationUtil.run(cleanStart, Boolean.getBoolean("cleanup.shutdown"), System.getProperty("external.lib", ""), CONFIG_FILE); } catch (Exception e) { diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtil.java index d33617b736..289658ead1 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtil.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtil.java @@ -21,14 +21,18 @@ package org.apache.asterix.api.common; import static org.apache.hyracks.util.file.FileUtil.joinPath; import java.io.File; +import java.net.URI; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import io.findify.s3mock.S3Mock; +import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; @@ -73,7 +77,11 @@ public class LocalCloudUtil { s3MockServer.start(); LOGGER.info("S3 mock server started successfully"); - S3Client client = LocalCloudUtilAdobeMock.getS3Client(); + S3ClientBuilder builder = S3Client.builder(); + URI endpoint = URI.create(MOCK_SERVER_ENDPOINT); // endpoint pointing to S3 mock server + builder.region(Region.of(MOCK_SERVER_REGION)).credentialsProvider(AnonymousCredentialsProvider.create()) + .endpointOverride(endpoint); + S3Client client = builder.build(); client.createBucket(CreateBucketRequest.builder().bucket(CLOUD_STORAGE_BUCKET).build()); LOGGER.info("Created bucket {} for cloud storage", CLOUD_STORAGE_BUCKET); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtilAdobeMock.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtilAdobeMock.java index 8790632416..8509afff0f 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtilAdobeMock.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/LocalCloudUtilAdobeMock.java @@ -18,87 +18,121 @@ */ package org.apache.asterix.api.common; -import static org.apache.asterix.api.common.LocalCloudUtil.MOCK_SERVER_ENDPOINT; import static org.apache.asterix.api.common.LocalCloudUtil.MOCK_SERVER_REGION; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; import java.net.URI; -import java.util.HashMap; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.adobe.testing.s3mock.S3MockApplication; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3ClientBuilder; +import software.amazon.awssdk.services.s3.S3Configuration; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.HeadBucketRequest; +import software.amazon.awssdk.services.s3.model.NoSuchBucketException; -// With adobe mock, the s3 objects will be found in /tmp or /var folder +// This runs Adobe S3Mock in a docker container, with the bucket storage directory under target/s3mock. // Search for line "Successfully created {} as root folder" in the info log file -// or else just call the aws cli on localhost:8001 -// eg: aws s3 ls --endpoint http://localhost:8001 +// A randomized port is chosen each time for the S3 endpoint, but it is always on localhost. +// You can inspect the real port mapping (e.g. 45799 -> 9090) via 'docker ps' +// Then to connect, normal S3 utilities work, such as aws s3 ls --endpoint http://localhost:45799 public class LocalCloudUtilAdobeMock { private static final Logger LOGGER = LogManager.getLogger(); - private static final int MOCK_SERVER_PORT = 8001; - private static final int MOCK_SERVER_PORT_HTTPS = 8002; public static final String CLOUD_STORAGE_BUCKET = "cloud-storage-container"; + public static final String S3MOCK_VERSION_TAG = "4.7.0"; public static final String PLAYGROUND_BUCKET = "playground"; - private static S3MockApplication s3Mock; + public static final String CLOUD_URL_KEY = "cloudUrl"; + private static S3MockContainer s3Mock; private LocalCloudUtilAdobeMock() { throw new AssertionError("Do not instantiate"); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { String cleanStartString = System.getProperty("cleanup.start", "true"); boolean cleanStart = Boolean.parseBoolean(cleanStartString); // Change to 'true' if you want to delete "s3mock" folder on start startS3CloudEnvironment(cleanStart); } - public static S3MockApplication startS3CloudEnvironment(boolean cleanStart) { + public static S3MockContainer startS3CloudEnvironment(boolean cleanStart) throws IOException { return startS3CloudEnvironment(cleanStart, false); } - public static S3MockApplication startS3CloudEnvironment(boolean cleanStart, boolean createPlaygroundContainer) { + public static S3MockContainer startS3CloudEnvironment(boolean cleanStart, boolean createPlaygroundContainer) + throws IOException { // Starting S3 mock server to be used instead of real S3 server LOGGER.info("Starting S3 mock server"); - - Map<String, Object> properties = new HashMap<>(); - properties.put(S3MockApplication.PROP_HTTP_PORT, MOCK_SERVER_PORT); - properties.put(S3MockApplication.PROP_HTTPS_PORT, MOCK_SERVER_PORT_HTTPS); - properties.put(S3MockApplication.PROP_SILENT, false); - LocalCloudUtil.stopS3MockServer(); - s3Mock = S3MockApplication.start(properties); - + s3Mock = new S3MockContainer(S3MOCK_VERSION_TAG).withRetainFilesOnExit(!cleanStart); + if (!cleanStart) { + Path s3MockDataDir = Path.of("target", "s3mock"); + boolean existingData = s3MockDataDir.toFile().exists(); + if (!existingData) { + Files.createDirectory(s3MockDataDir); + } + //be VERY careful with this path. the last component will be entirely deleted + //if RetainFilesOnExist is false + s3Mock.withVolumeAsRoot(s3MockDataDir.toAbsolutePath()); + } + s3Mock.start(); LOGGER.info("S3 mock server started successfully"); S3ClientBuilder builder = S3Client.builder(); - URI endpoint = URI.create(MOCK_SERVER_ENDPOINT); // endpoint pointing to S3 mock server + URI endpoint = URI.create(s3Mock.getHttpEndpoint()); // endpoint pointing to S3 mock server builder.region(Region.of(MOCK_SERVER_REGION)).credentialsProvider(AnonymousCredentialsProvider.create()) .endpointOverride(endpoint); - S3Client client = builder.build(); - client.createBucket(CreateBucketRequest.builder().bucket(CLOUD_STORAGE_BUCKET).build()); - LOGGER.info("Created bucket {} for cloud storage", CLOUD_STORAGE_BUCKET); - + S3Client client = + builder.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()).build(); + createIfNotExists(CLOUD_STORAGE_BUCKET, client); if (createPlaygroundContainer) { - client.createBucket(CreateBucketRequest.builder().bucket(PLAYGROUND_BUCKET).build()); - LOGGER.info("Created bucket {}", PLAYGROUND_BUCKET); + createIfNotExists(PLAYGROUND_BUCKET, client); } client.close(); return s3Mock; } + public static void createIfNotExists(String bucketName, S3Client client) { + try { + client.headBucket(HeadBucketRequest.builder().bucket(bucketName).build()); + } catch (NoSuchBucketException nsbe) { + //i don't want to use exceptions as control flow, yet here we are + client.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + LOGGER.info("Created bucket {}", bucketName); + } + } + + public static void fillConfigTemplate(String cloudUrl, String templatePath, String configPath) + throws IOException, TemplateException { + try (FileReader tmplt = new FileReader(templatePath); Writer result = new FileWriter(configPath)) { + Template cfg = new Template("cc.conf", tmplt, new Configuration(Configuration.VERSION_2_3_31)); + cfg.process(Map.of(CLOUD_URL_KEY, cloudUrl), result); + } + + } + public static void shutdownSilently() { if (s3Mock != null) { try { LOGGER.info("test cleanup, stopping S3 mock server"); s3Mock.stop(); + s3Mock.close(); LOGGER.info("test cleanup, stopped S3 mock server"); } catch (Exception ex) { // do nothing @@ -109,7 +143,7 @@ public class LocalCloudUtilAdobeMock { public static S3Client getS3Client() { S3ClientBuilder builder = S3Client.builder(); - URI endpoint = URI.create(MOCK_SERVER_ENDPOINT); + URI endpoint = URI.create(s3Mock.getHttpEndpoint()); builder.region(Region.of(MOCK_SERVER_REGION)).credentialsProvider(AnonymousCredentialsProvider.create()) .endpointOverride(endpoint); S3Client client = builder.build(); diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicMetadataTransactionWithoutWALTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicMetadataTransactionWithoutWALTest.java index b38d82b0f4..debe200367 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicMetadataTransactionWithoutWALTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicMetadataTransactionWithoutWALTest.java @@ -18,6 +18,9 @@ */ package org.apache.asterix.test.atomic_statements; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.CONFIG_FILE_TEMPLATE; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.MOCK_SERVER_HOSTNAME_FRAGMENT; import static org.apache.hyracks.util.file.FileUtil.joinPath; import java.io.InputStream; @@ -36,6 +39,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -55,7 +59,9 @@ public class AtomicMetadataTransactionWithoutWALTest { @Before public void setUp() throws Exception { boolean cleanStart = Boolean.getBoolean("cleanup.start"); - LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE); integrationUtil.setGracefulShutdown(false); integrationUtil.init(true, CONFIG_FILE); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicStatementsCancellationTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicStatementsCancellationTest.java index 02e9fd0d28..9227534a2d 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicStatementsCancellationTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/atomic_statements/AtomicStatementsCancellationTest.java @@ -19,10 +19,9 @@ package org.apache.asterix.test.atomic_statements; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; import static org.apache.asterix.api.http.server.QueryServiceRequestParameters.Parameter.CLIENT_ID; -import static org.apache.hyracks.util.file.FileUtil.joinPath; -import java.io.File; import java.io.InputStream; import java.net.URI; import java.util.ArrayList; @@ -38,7 +37,9 @@ import java.util.concurrent.Future; import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil; import org.apache.asterix.api.common.LocalCloudUtilAdobeMock; import org.apache.asterix.common.TestDataUtil; +import org.apache.asterix.common.config.GlobalConfig; import org.apache.asterix.common.utils.Servlets; +import org.apache.asterix.test.common.TestConstants; import org.apache.asterix.test.common.TestExecutor; import org.apache.asterix.testframework.context.TestCaseContext; import org.apache.asterix.testframework.xml.ParameterTypeEnum; @@ -49,27 +50,33 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + public class AtomicStatementsCancellationTest { private final ExecutorService executor = Executors.newSingleThreadExecutor(); - private static final String TEST_CONFIG_FILE_NAME = "cc-cloud-storage.conf"; + public static final String CONFIG_FILE_TEMPLATE = "src/test/resources/cc-cloud-storage.conf.ftl"; + public static final String CONFIG_FILE = "target/cc-cloud-storage.conf"; private static final TestExecutor TEST_EXECUTOR = new TestExecutor(); - private static final String TEST_CONFIG_PATH = - joinPath(System.getProperty("user.dir"), "src", "test", "resources");; - private static final String TEST_CONFIG_FILE_PATH = TEST_CONFIG_PATH + File.separator + TEST_CONFIG_FILE_NAME; private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil(); private static final String DATASET_NAME = "ds_0"; private static final int BATCH_SIZE = 20000; private static final int NUM_UPSERTS = 100; + public static final String MOCK_SERVER_HOSTNAME_FRAGMENT = "http://127.0.0.1:"; @Before public void setUp() throws Exception { boolean cleanStart = true; - LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(cleanStart); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE); + System.setProperty(TestConstants.S3_SERVICE_ENDPOINT_KEY, + MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); integrationUtil.setGracefulShutdown(true); - integrationUtil.init(true, TEST_CONFIG_FILE_PATH); + integrationUtil.init(true, CONFIG_FILE); + System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, CONFIG_FILE); createDatasets(); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudPythonTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudPythonTest.java index e9695197d6..00dab0eeb3 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudPythonTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudPythonTest.java @@ -18,6 +18,8 @@ */ package org.apache.asterix.test.cloud_storage; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.MOCK_SERVER_HOSTNAME_FRAGMENT; import static org.apache.asterix.test.runtime.ExternalPythonFunctionIT.setNcEndpoints; import java.util.Collection; @@ -25,6 +27,7 @@ import java.util.List; import org.apache.asterix.api.common.LocalCloudUtilAdobeMock; import org.apache.asterix.common.config.GlobalConfig; +import org.apache.asterix.test.common.TestConstants; import org.apache.asterix.test.common.TestExecutor; import org.apache.asterix.test.runtime.LangExecutionUtil; import org.apache.asterix.testframework.context.TestCaseContext; @@ -42,6 +45,8 @@ import org.junit.runners.MethodSorters; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + /** * Run tests in cloud deployment environment */ @@ -54,8 +59,9 @@ public class CloudPythonTest { private final TestCaseContext tcCtx; private static final String SUITE_TESTS = "testsuite_it_python.xml"; private static final String ONLY_TESTS = "testsuite_cloud_storage_only.xml"; - private static final String CONFIG_FILE_NAME = "src/test/resources/cc-cloud-storage.conf"; private static final String DELTA_RESULT_PATH = "results_cloud"; + public static final String CONFIG_FILE_TEMPLATE = "src/test/resources/cc-cloud-storage.conf.ftl"; + public static final String CONFIG_FILE = "target/cc-cloud-storage.conf"; private static final String EXCLUDED_TESTS = "MP"; public CloudPythonTest(TestCaseContext tcCtx) { @@ -64,18 +70,23 @@ public class CloudPythonTest { @BeforeClass public static void setUp() throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE); + System.setProperty(TestConstants.S3_SERVICE_ENDPOINT_KEY, + MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); TestExecutor testExecutor = new TestExecutor(DELTA_RESULT_PATH); testExecutor.executorId = "cloud"; testExecutor.stripSubstring = "//DB:"; - LangExecutionUtil.setUp(CONFIG_FILE_NAME, testExecutor); + LangExecutionUtil.setUp(CONFIG_FILE, testExecutor); setNcEndpoints(testExecutor); - System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, CONFIG_FILE_NAME); + System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, CONFIG_FILE); } @AfterClass public static void tearDown() throws Exception { LangExecutionUtil.tearDown(); + LocalCloudUtilAdobeMock.shutdownSilently(); } @Parameters(name = "CloudPythonTest {index}: {0}") diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageAzTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageAzTest.java index 2db2ef5348..d3f766e9d1 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageAzTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageAzTest.java @@ -19,6 +19,7 @@ package org.apache.asterix.test.cloud_storage; import static org.apache.asterix.api.common.LocalCloudUtil.CLOUD_STORAGE_BUCKET; +import static org.apache.asterix.test.cloud_storage.CloudStorageGCSTest.S3_ONLY; import java.util.ArrayList; import java.util.Collection; @@ -71,7 +72,6 @@ public class CloudStorageAzTest { @BeforeClass public static void setUp() throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true, true); String endpointString = "http://127.0.0.1:15055/devstoreaccount1/" + CLOUD_STORAGE_BUCKET; final String accKey = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="; @@ -120,7 +120,8 @@ public class CloudStorageAzTest { @Test public void test() throws Exception { List<TestCase.CompilationUnit> cu = tcCtx.getTestCase().getCompilationUnit(); - Assume.assumeTrue(cu.size() > 1 || !EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription()))); + Assume.assumeTrue(cu.size() > 1 || (!EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription())) + && !S3_ONLY.equals(getText(cu.get(0).getDescription())))); LangExecutionUtil.test(tcCtx); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageGCSTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageGCSTest.java index 8c071f08a1..23321289a9 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageGCSTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageGCSTest.java @@ -70,6 +70,7 @@ public class CloudStorageGCSTest { private static final String CONFIG_FILE_NAME = "src/test/resources/cc-cloud-storage-gcs.conf"; private static final String DELTA_RESULT_PATH = "results_cloud"; private static final String EXCLUDED_TESTS = "MP"; + public static final String S3_ONLY = "S3Only"; public static final String MOCK_SERVER_HOSTNAME = "http://127.0.0.1:24443"; private static final String MOCK_SERVER_PROJECT_ID = "asterixdb-gcs-test-project-id"; @@ -79,7 +80,6 @@ public class CloudStorageGCSTest { @BeforeClass public static void setUp() throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true, true); Storage storage = StorageOptions.newBuilder().setHost(MOCK_SERVER_HOSTNAME) .setCredentials(NoCredentials.getInstance()).setProjectId(MOCK_SERVER_PROJECT_ID).build().getService(); cleanup(storage); @@ -120,7 +120,8 @@ public class CloudStorageGCSTest { @Test public void test() throws Exception { List<TestCase.CompilationUnit> cu = tcCtx.getTestCase().getCompilationUnit(); - Assume.assumeTrue(cu.size() > 1 || !EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription()))); + Assume.assumeTrue(cu.size() > 1 || (!EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription())) + && !S3_ONLY.equals(getText(cu.get(0).getDescription())))); LangExecutionUtil.test(tcCtx); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageSparseTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageSparseTest.java index b930b660f5..4973c0bf90 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageSparseTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageSparseTest.java @@ -18,6 +18,9 @@ */ package org.apache.asterix.test.cloud_storage; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.createIfNotExists; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; + import java.net.URI; import java.util.Collection; import java.util.List; @@ -27,6 +30,7 @@ import org.apache.asterix.common.api.IDatasetLifecycleManager; import org.apache.asterix.common.api.INcApplicationContext; import org.apache.asterix.common.config.GlobalConfig; import org.apache.asterix.common.storage.StorageIOStats; +import org.apache.asterix.test.common.TestConstants; import org.apache.asterix.test.common.TestExecutor; import org.apache.asterix.test.runtime.ExecutionTestUtil; import org.apache.asterix.test.runtime.LangExecutionUtil; @@ -49,11 +53,12 @@ import org.junit.runners.MethodSorters; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3ClientBuilder; -import software.amazon.awssdk.services.s3.model.CreateBucketRequest; /** * Run tests in cloud deployment environment @@ -68,13 +73,13 @@ public class CloudStorageSparseTest { public static final String SUITE_TESTS = "testsuite_cloud_storage.xml"; public static final String ONLY_TESTS = "testsuite_cloud_storage_only.xml"; public static final String CONFIG_FILE_NAME = "src/test/resources/cc-cloud-storage-sparse.conf"; + public static final String CONFIG_FILE_TEMPLATE = "src/test/resources/cc-cloud-storage-sparse.conf.ftl"; public static final String DELTA_RESULT_PATH = "results_cloud"; public static final String EXCLUDED_TESTS = "MP"; public static final String PLAYGROUND_CONTAINER = "playground"; public static final String MOCK_SERVER_REGION = "us-west-2"; - public static final int MOCK_SERVER_PORT = 8001; - public static final String MOCK_SERVER_HOSTNAME = "http://127.0.0.1:" + MOCK_SERVER_PORT; + public static final String MOCK_SERVER_HOSTNAME_FRAGMENT = "http://127.0.0.1:"; public CloudStorageSparseTest(TestCaseContext tcCtx) { this.tcCtx = tcCtx; @@ -87,7 +92,11 @@ public class CloudStorageSparseTest { } public static void setupEnv(TestExecutor testExecutor) throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE_NAME); + System.setProperty(TestConstants.S3_SERVICE_ENDPOINT_KEY, + MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); testExecutor.executorId = "cloud"; testExecutor.stripSubstring = "//DB:"; LangExecutionUtil.setUp(CONFIG_FILE_NAME, testExecutor); @@ -95,11 +104,11 @@ public class CloudStorageSparseTest { // create the playground bucket and leave it empty, just for external collection-based tests S3ClientBuilder builder = S3Client.builder(); - URI endpoint = URI.create(MOCK_SERVER_HOSTNAME); // endpoint pointing to S3 mock server + URI endpoint = URI.create(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); // endpoint pointing to S3 mock server builder.region(Region.of(MOCK_SERVER_REGION)).credentialsProvider(AnonymousCredentialsProvider.create()) .endpointOverride(endpoint); S3Client client = builder.build(); - client.createBucket(CreateBucketRequest.builder().bucket(PLAYGROUND_CONTAINER).build()); + createIfNotExists(PLAYGROUND_CONTAINER, client); client.close(); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java index 340583810e..dc65daa6b4 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageTest.java @@ -18,12 +18,16 @@ */ package org.apache.asterix.test.cloud_storage; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.createIfNotExists; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; + import java.net.URI; import java.util.Collection; import java.util.List; import org.apache.asterix.api.common.LocalCloudUtilAdobeMock; import org.apache.asterix.common.config.GlobalConfig; +import org.apache.asterix.test.common.TestConstants; import org.apache.asterix.test.common.TestExecutor; import org.apache.asterix.test.runtime.LangExecutionUtil; import org.apache.asterix.testframework.context.TestCaseContext; @@ -41,11 +45,12 @@ import org.junit.runners.MethodSorters; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3ClientBuilder; -import software.amazon.awssdk.services.s3.model.CreateBucketRequest; /** * Run tests in cloud deployment environment @@ -59,14 +64,14 @@ public class CloudStorageTest { private final TestCaseContext tcCtx; public static final String SUITE_TESTS = "testsuite_cloud_storage.xml"; public static final String ONLY_TESTS = "testsuite_cloud_storage_only.xml"; - public static final String CONFIG_FILE_NAME = "src/test/resources/cc-cloud-storage.conf"; + public static final String CONFIG_FILE_TEMPLATE = "src/test/resources/cc-cloud-storage.conf.ftl"; + public static final String CONFIG_FILE = "target/cc-cloud-storage.conf"; public static final String DELTA_RESULT_PATH = "results_cloud"; public static final String EXCLUDED_TESTS = "MP"; public static final String PLAYGROUND_CONTAINER = "playground"; public static final String MOCK_SERVER_REGION = "us-west-2"; - public static final int MOCK_SERVER_PORT = 8001; - public static final String MOCK_SERVER_HOSTNAME = "http://127.0.0.1:" + MOCK_SERVER_PORT; + public static final String MOCK_SERVER_HOSTNAME_FRAGMENT = "http://127.0.0.1:"; public CloudStorageTest(TestCaseContext tcCtx) { this.tcCtx = tcCtx; @@ -79,19 +84,23 @@ public class CloudStorageTest { } public static void setupEnv(TestExecutor testExecutor) throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(true); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE); + System.setProperty(TestConstants.S3_SERVICE_ENDPOINT_KEY, + MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); testExecutor.executorId = "cloud"; testExecutor.stripSubstring = "//DB:"; - LangExecutionUtil.setUp(CONFIG_FILE_NAME, testExecutor); - System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, CONFIG_FILE_NAME); + LangExecutionUtil.setUp(CONFIG_FILE, testExecutor); + System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, CONFIG_FILE); // create the playground bucket and leave it empty, just for external collection-based tests S3ClientBuilder builder = S3Client.builder(); - URI endpoint = URI.create(MOCK_SERVER_HOSTNAME); // endpoint pointing to S3 mock server + URI endpoint = URI.create(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort()); // endpoint pointing to S3 mock server builder.region(Region.of(MOCK_SERVER_REGION)).credentialsProvider(AnonymousCredentialsProvider.create()) .endpointOverride(endpoint); S3Client client = builder.build(); - client.createBucket(CreateBucketRequest.builder().bucket(PLAYGROUND_CONTAINER).build()); + createIfNotExists(PLAYGROUND_CONTAINER, client); client.close(); } diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageUnstableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageUnstableTest.java index 29087f37a1..ccb6984491 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageUnstableTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/CloudStorageUnstableTest.java @@ -18,6 +18,10 @@ */ package org.apache.asterix.test.cloud_storage; +import static org.apache.asterix.api.common.LocalCloudUtilAdobeMock.fillConfigTemplate; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.CONFIG_FILE_TEMPLATE; +import static org.apache.asterix.test.cloud_storage.CloudStorageTest.MOCK_SERVER_HOSTNAME_FRAGMENT; + import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -43,6 +47,8 @@ import org.junit.runners.MethodSorters; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import com.adobe.testing.s3mock.testcontainers.S3MockContainer; + /** * Run tests in cloud deployment environment with simulated unstable connection */ @@ -66,7 +72,9 @@ public class CloudStorageUnstableTest { @BeforeClass public static void setUp() throws Exception { System.setProperty(CloudRetryableRequestUtil.CLOUD_UNSTABLE_MODE, "true"); - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true, true); + S3MockContainer s3Mock = LocalCloudUtilAdobeMock.startS3CloudEnvironment(true, true); + fillConfigTemplate(MOCK_SERVER_HOSTNAME_FRAGMENT + s3Mock.getHttpServerPort(), CONFIG_FILE_TEMPLATE, + CONFIG_FILE_NAME); TestExecutor testExecutor = new TestExecutor(DELTA_RESULT_PATH); testExecutor.executorId = "cloud"; testExecutor.stripSubstring = "//DB:"; diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/GCSCloudStorageUnstableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/GCSCloudStorageUnstableTest.java index c97e459fe3..72f5cff885 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/GCSCloudStorageUnstableTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/GCSCloudStorageUnstableTest.java @@ -21,11 +21,11 @@ package org.apache.asterix.test.cloud_storage; import static org.apache.asterix.api.common.LocalCloudUtil.CLOUD_STORAGE_BUCKET; import static org.apache.asterix.api.common.LocalCloudUtil.MOCK_SERVER_REGION; +import static org.apache.asterix.test.cloud_storage.CloudStorageGCSTest.S3_ONLY; import java.util.Collection; import java.util.List; -import org.apache.asterix.api.common.LocalCloudUtilAdobeMock; import org.apache.asterix.common.api.IDatasetLifecycleManager; import org.apache.asterix.common.api.INcApplicationContext; import org.apache.asterix.common.config.GlobalConfig; @@ -83,7 +83,6 @@ public class GCSCloudStorageUnstableTest { @BeforeClass public static void setUp() throws Exception { - LocalCloudUtilAdobeMock.startS3CloudEnvironment(true, true); System.setProperty(CloudRetryableRequestUtil.CLOUD_UNSTABLE_MODE, "true"); Storage storage = StorageOptions.newBuilder().setHost(MOCK_SERVER_HOSTNAME) .setCredentials(NoCredentials.getInstance()).setProjectId(MOCK_SERVER_PROJECT_ID).build().getService(); @@ -111,7 +110,8 @@ public class GCSCloudStorageUnstableTest { @Test public void test() throws Exception { List<TestCase.CompilationUnit> cu = tcCtx.getTestCase().getCompilationUnit(); - Assume.assumeTrue(cu.size() > 1 || !EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription()))); + Assume.assumeTrue(cu.size() > 1 || (!EXCLUDED_TESTS.equals(getText(cu.get(0).getDescription())) + && !S3_ONLY.equals(getText(cu.get(0).getDescription())))); LangExecutionUtil.test(tcCtx); for (NodeControllerService nc : ExecutionTestUtil.integrationUtil.ncs) { IDatasetLifecycleManager lifecycleManager = diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestConstants.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestConstants.java index 8c59c56950..e8d9f34443 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestConstants.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestConstants.java @@ -28,6 +28,7 @@ public class TestConstants { public static final String S3_REGION_DEFAULT = "us-west-2"; public static final String S3_SERVICE_ENDPOINT_PLACEHOLDER = "%serviceEndpoint%"; public static final String S3_SERVICE_ENDPOINT_DEFAULT = "http://127.0.0.1:8001"; + public static final String S3_SERVICE_ENDPOINT_KEY = "s3mockEndpoint"; public static final String S3_TEMPLATE = "(\"accessKeyId\"=\"" + S3_ACCESS_KEY_ID_DEFAULT + "\"),\n" + "(\"secretAccessKey\"=\"" + S3_SECRET_ACCESS_KEY_DEFAULT + "\"),\n" + "(\"region\"=\"" + S3_REGION_PLACEHOLDER + "\"),\n" + "(\"serviceEndpoint\"=\"" + S3_SERVICE_ENDPOINT_PLACEHOLDER + "\")"; diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index 58c92fb3ee..32d6e170ec 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -19,6 +19,9 @@ package org.apache.asterix.test.common; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.asterix.test.common.TestConstants.S3_ACCESS_KEY_ID_DEFAULT; +import static org.apache.asterix.test.common.TestConstants.S3_REGION_DEFAULT; +import static org.apache.asterix.test.common.TestConstants.S3_SECRET_ACCESS_KEY_DEFAULT; import static org.apache.asterix.test.common.TestConstants.Azure.ACCOUNT_KEY_PLACEHOLDER; import static org.apache.asterix.test.common.TestConstants.Azure.ACCOUNT_NAME_PLACEHOLDER; import static org.apache.asterix.test.common.TestConstants.Azure.AZURITE_ACCOUNT_KEY_DEFAULT; @@ -288,6 +291,7 @@ public class TestExecutor { protected String deltaPath = null; public String stripSubstring = null; public String executorId = null; + private String s3mockTemplate = null; public TestExecutor() { this(Collections.singletonList( @@ -2532,7 +2536,14 @@ public class TestExecutor { protected String setS3TemplateDefault(String str) { if (str.contains("%template%")) { - return str.replace("%template%", TestConstants.S3_TEMPLATE_DEFAULT); + String s3mockEndpoint = System.getProperty(TestConstants.S3_SERVICE_ENDPOINT_KEY); + if (s3mockEndpoint != null && s3mockTemplate == null) { + s3mockTemplate = "(\"accessKeyId\"=\"" + S3_ACCESS_KEY_ID_DEFAULT + "\"),\n" + "(\"secretAccessKey\"=\"" + + S3_SECRET_ACCESS_KEY_DEFAULT + "\"),\n" + "(\"region\"=\"" + S3_REGION_DEFAULT + "\"),\n" + + "(\"serviceEndpoint\"=\"" + s3mockEndpoint + "\")"; + } + return str.replace("%template%", + s3mockTemplate == null ? TestConstants.S3_TEMPLATE_DEFAULT : s3mockTemplate); } else { return str.replace("%template_colons%", TestConstants.S3_TEMPLATE_DEFAULT_NO_PARENTHESES_WITH_COLONS); } diff --git a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-main.ftl similarity index 95% copy from asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf copy to asterixdb/asterix-app/src/test/resources/cc-cloud-storage-main.ftl index 0842e0179b..8271bfd9a3 100644 --- a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf +++ b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-main.ftl @@ -42,7 +42,6 @@ jvm.args=-Xmx4096m --add-opens=jdk.management/com.sun.management.internal=ALL-UN storage.buffercache.size=128MB storage.memorycomponent.globalbudget=512MB storage.max.columns.in.zeroth.segment=800 -storage.page.zero.writer=sparse [cc] address = 127.0.0.1 @@ -60,7 +59,6 @@ compiler.groupmemory=160KB compiler.joinmemory=256KB compiler.textsearchmemory=160KB compiler.windowmemory=192KB -compiler.ordered.fields=false compiler.internal.sanitycheck=true messaging.frame.size=4096 messaging.frame.count=512 @@ -70,8 +68,8 @@ storage.partitioning=static cloud.storage.scheme=s3 cloud.storage.bucket=cloud-storage-container cloud.storage.region=us-west-2 -cloud.storage.endpoint=http://127.0.0.1:8001 +cloud.storage.endpoint=${cloudUrl} cloud.storage.anonymous.auth=true cloud.storage.cache.policy=selective cloud.max.write.requests.per.second=2000 -cloud.max.read.requests.per.second=4000 +cloud.max.read.requests.per.second=4000 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf.ftl similarity index 98% copy from asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf copy to asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf.ftl index 0842e0179b..fa5c146fa1 100644 --- a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf +++ b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf.ftl @@ -70,7 +70,7 @@ storage.partitioning=static cloud.storage.scheme=s3 cloud.storage.bucket=cloud-storage-container cloud.storage.region=us-west-2 -cloud.storage.endpoint=http://127.0.0.1:8001 +cloud.storage.endpoint=${cloudUrl} cloud.storage.anonymous.auth=true cloud.storage.cache.policy=selective cloud.max.write.requests.per.second=2000 diff --git a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf.ftl similarity index 97% rename from asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf rename to asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf.ftl index 0842e0179b..74c557a8a9 100644 --- a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage-sparse.conf +++ b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf.ftl @@ -42,7 +42,7 @@ jvm.args=-Xmx4096m --add-opens=jdk.management/com.sun.management.internal=ALL-UN storage.buffercache.size=128MB storage.memorycomponent.globalbudget=512MB storage.max.columns.in.zeroth.segment=800 -storage.page.zero.writer=sparse +storage.page.zero.writer=default [cc] address = 127.0.0.1 @@ -70,7 +70,7 @@ storage.partitioning=static cloud.storage.scheme=s3 cloud.storage.bucket=cloud-storage-container cloud.storage.region=us-west-2 -cloud.storage.endpoint=http://127.0.0.1:8001 +cloud.storage.endpoint=${cloudUrl} cloud.storage.anonymous.auth=true cloud.storage.cache.policy=selective cloud.max.write.requests.per.second=2000 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.099.post.http old mode 100755 new mode 100644 similarity index 79% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.099.post.http index 8103562527..6dd6f5e6c5 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/api/post-non-query/post-non-query.099.post.http @@ -16,6 +16,10 @@ * specific language governing permissions and limitations * under the License. */ - -CREATE TYPE openType AS {id: int}; -CREATE DATASET ds(openType) primary key id; \ No newline at end of file +/* + * Description: testing passing a non-query statement using POST with readonly set to false + * Result: success + */ +-- extractstatus +/query/service +--body={"statement": "DROP TYPE t1;", "readonly": false} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.099.ddl.sqlpp old mode 100755 new mode 100644 similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.099.ddl.sqlpp index a9171ce01a..056fbcdcc1 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.099.ddl.sqlpp @@ -17,4 +17,5 @@ * under the License. */ -UPSERT INTO ds {"id": 1, "arr": [0, 1, 2, 3, 4, 5]}; \ No newline at end of file +DROP TYPE openType IF EXISTS; +DROP DATASET ds IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp old mode 100755 new mode 100644 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp old mode 100755 new mode 100644 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.3.query.sqlpp old mode 100755 new mode 100644 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.4.ddl.sqlpp old mode 100755 new mode 100644 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/storage-size/datasource-function/external-collection/test.010.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/storage-size/datasource-function/external-collection/test.010.ddl.sqlpp index 5ae3310c8d..ada7b9fec6 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/storage-size/datasource-function/external-collection/test.010.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cloud_storage/storage-size/datasource-function/external-collection/test.010.ddl.sqlpp @@ -26,12 +26,8 @@ CREATE COLLECTION testCollection PRIMARY KEY (id: int); CREATE TYPE test AS open {}; -CREATE EXTERNAL DATASET testExternalCollection(test) USING S3 ( -("accessKeyId"="dummyAccessKey"), -("secretAccessKey"="dummySecretKey"), -("sessionToken"="dummySessionToken"), -("region"="us-west-2"), -("serviceEndpoint"="http://127.0.0.1:8001"), +CREATE EXTERNAL DATASET testExternalCollection(test) USING %adapter% ( +%template%, ("container"="playground"), ("definition"="json-data/reviews/single-line/json"), ("format"="json") diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange/hash_join_exchange.099.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange/hash_join_exchange.099.ddl.sqlpp index 349b762cba..86b1e4366d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange/hash_join_exchange.099.ddl.sqlpp @@ -17,7 +17,8 @@ * under the License. */ -//success +DROP DATASET customer IF EXISTS; +DROP DATASET orders IF EXISTS; +DROP TYPE cust_type IF EXISTS; +DROP TYPE orders_type IF EXISTS; -create dataset ds primary key (id:string); -SELECT id FROM ds OFFSET 1 LIMIT 5; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange_1/hash_join_exchange_1.099.ddl.sqlpp similarity index 88% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange_1/hash_join_exchange_1.099.ddl.sqlpp index 349b762cba..31870c9032 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/hash_join_exchange_1/hash_join_exchange_1.099.ddl.sqlpp @@ -17,7 +17,8 @@ * under the License. */ -//success +DROP DATASET A IF EXISTS; +DROP DATASET B IF EXISTS; +DROP TYPE A_TYPE IF EXISTS; +DROP TYPE B_TYPE IF EXISTS; -create dataset ds primary key (id:string); -SELECT id FROM ds OFFSET 1 LIMIT 5; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/join-with-empty-dataset/join-with-empty-dataset.099.ddl.sqlpp old mode 100755 new mode 100644 similarity index 90% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/join-with-empty-dataset/join-with-empty-dataset.099.ddl.sqlpp index 8103562527..af498e5478 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/join/join-with-empty-dataset/join-with-empty-dataset.099.ddl.sqlpp @@ -17,5 +17,6 @@ * under the License. */ -CREATE TYPE openType AS {id: int}; -CREATE DATASET ds(openType) primary key id; \ No newline at end of file +drop dataset ds1 if exists; +drop dataset ds2 if exists; +drop type openType if exists; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.099.ddl.sqlpp similarity index 91% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.099.ddl.sqlpp index 349b762cba..69c1a2f489 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.099.ddl.sqlpp @@ -19,5 +19,4 @@ //success -create dataset ds primary key (id:string); -SELECT id FROM ds OFFSET 1 LIMIT 5; \ No newline at end of file +drop dataset ds; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.ddl.sqlpp old mode 100755 new mode 100644 similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.ddl.sqlpp index a9171ce01a..da0963d61a --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.1.ddl.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -UPSERT INTO ds {"id": 1, "arr": [0, 1, 2, 3, 4, 5]}; \ No newline at end of file +//success + +create dataset ds primary key (id:string); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.2.query.sqlpp old mode 100755 new mode 100644 similarity index 94% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.4.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.2.query.sqlpp index 43604c69f6..6b2c90cbce --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_bracket_notation/array_slice_bracket_notation.4.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/limit_after_offset/limit_after_offset.2.query.sqlpp @@ -17,5 +17,6 @@ * under the License. */ -DROP DATASET ds; -DROP TYPE openType; \ No newline at end of file +//success + +SELECT id FROM ds OFFSET 1 LIMIT 5; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.099.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.099.adm new file mode 100644 index 0000000000..4063cf103a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/post-non-query/post-non-query.099.adm @@ -0,0 +1 @@ +"success" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_cloud_storage.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_cloud_storage.xml index 4a612f77cf..683c348f4a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_cloud_storage.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_cloud_storage.xml @@ -76,6 +76,8 @@ </test-case> <test-case FilePath="cloud_storage/storage-size/datasource-function"> <compilation-unit name="external-collection"> + <description>S3Only</description> + <placeholder name="adapter" value="S3" /> <output-dir compare="Clean-JSON">external-collection</output-dir> <expected-error>Retrieving storage size is not applicable to type: EXTERNAL.</expected-error> </compilation-unit> diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml index bb4e476e92..74f4271b70 100644 --- a/asterixdb/pom.xml +++ b/asterixdb/pom.xml @@ -1577,15 +1577,9 @@ <!-- Mock for Adobe AWS S3 --> <dependency> <groupId>com.adobe.testing</groupId> - <artifactId>s3mock</artifactId> - <version>2.17.0</version> + <artifactId>s3mock-testcontainers</artifactId> + <version>4.7.0</version> <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-logging</artifactId> - </exclusion> - </exclusions> </dependency> <!-- Mock for AWS S3 --> <dependency>
