From 8fdbedf3e3e7017d3bb623da25f264c5864e5bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Or=C3=A7un=20=C3=87olak?= <90305879+orcunc@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:42:19 +0300 Subject: [PATCH] Use azure edge container on ARM architecture for testing (#1139) GitOrigin-RevId: 7a76c21d86053952e1f5648d25f259a914a939b0 --- .../MSSQLSchemaJdbcSqlConnectorTest.java | 2 - .../MSSQLSinkIntoJdbcSqlConnectorTest.java | 2 - .../com/hazelcast/jet/TestedVersions.java | 4 ++ .../jdbc/AzureSQLEdgeContainerProvider.java | 50 +++++++++++++++++++ .../test/jdbc/MSSQLDatabaseProvider.java | 37 ++++++++++---- 5 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 hazelcast/src/test/java/com/hazelcast/test/jdbc/AzureSQLEdgeContainerProvider.java diff --git a/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSchemaJdbcSqlConnectorTest.java b/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSchemaJdbcSqlConnectorTest.java index 124dc158cf553..00e7ab89cf330 100644 --- a/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSchemaJdbcSqlConnectorTest.java +++ b/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSchemaJdbcSqlConnectorTest.java @@ -27,8 +27,6 @@ public class MSSQLSchemaJdbcSqlConnectorTest extends SchemaJdbcConnectorTest { @BeforeClass public static void beforeClass() { - //There is no arm64 image for mssql server - assumeNoArm64Architecture(); initialize(new MSSQLDatabaseProvider()); } diff --git a/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSinkIntoJdbcSqlConnectorTest.java b/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSinkIntoJdbcSqlConnectorTest.java index 8549e96f8e175..9f39768b903f1 100644 --- a/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSinkIntoJdbcSqlConnectorTest.java +++ b/hazelcast-sql/src/test/java/com/hazelcast/jet/sql/impl/connector/jdbc/mssql/MSSQLSinkIntoJdbcSqlConnectorTest.java @@ -27,8 +27,6 @@ public class MSSQLSinkIntoJdbcSqlConnectorTest extends SinkJdbcSqlConnectorTest @BeforeClass public static void beforeClass() { - //There is no arm64 image for mssql server - assumeNoArm64Architecture(); initialize(new MSSQLDatabaseProvider()); } } diff --git a/hazelcast/src/test/java/com/hazelcast/jet/TestedVersions.java b/hazelcast/src/test/java/com/hazelcast/jet/TestedVersions.java index 38adbd9bbae47..1e3dfa14292c3 100644 --- a/hazelcast/src/test/java/com/hazelcast/jet/TestedVersions.java +++ b/hazelcast/src/test/java/com/hazelcast/jet/TestedVersions.java @@ -31,4 +31,8 @@ public final class TestedVersions { public static final String DEFAULT_ORACLE_IMAGE_NAME = "gvenzl/oracle-xe:21-slim-faststart"; public static final String ORACLE_PROPERTY_NAME = "test.oracle.version"; public static final String TEST_ORACLE_VERSION = System.getProperty(ORACLE_PROPERTY_NAME, DEFAULT_ORACLE_IMAGE_NAME); + + public static final String TEST_AZURE_SQL_EDGE_VERSION = System.getProperty("test.azuresqledge.version", "1.0.7"); + + public static final String TEST_MSSQLSERVER_VERSION = System.getProperty("test.mssqlserver.version", "2022-latest"); } diff --git a/hazelcast/src/test/java/com/hazelcast/test/jdbc/AzureSQLEdgeContainerProvider.java b/hazelcast/src/test/java/com/hazelcast/test/jdbc/AzureSQLEdgeContainerProvider.java new file mode 100644 index 0000000000000..aa3e8be2a1407 --- /dev/null +++ b/hazelcast/src/test/java/com/hazelcast/test/jdbc/AzureSQLEdgeContainerProvider.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hazelcast.test.jdbc; + +import org.testcontainers.containers.JdbcDatabaseContainerProvider; +import org.testcontainers.containers.MSSQLServerContainer; +import org.testcontainers.utility.DockerImageName; + +import static com.hazelcast.jet.TestedVersions.TEST_AZURE_SQL_EDGE_VERSION; + +/** + * Uses a {@link MSSQLServerContainer} with a `mcr.microsoft.com/azure-sql-edge` image in place of + * the standard ` mcr.microsoft.com/mssql/server` image + */ +class AzureSQLEdgeContainerProvider extends JdbcDatabaseContainerProvider { + + private static final String NAME = "azuresqledge"; + + @Override + public boolean supports(String databaseType) { + return databaseType.equals(NAME); + } + + @Override + public MSSQLServerContainer newInstance() { + return newInstance(TEST_AZURE_SQL_EDGE_VERSION); + } + + @Override + public MSSQLServerContainer newInstance(String tag) { + var taggedImageName = DockerImageName.parse("mcr.microsoft.com/azure-sql-edge") + .withTag(tag) + .asCompatibleSubstituteFor("mcr.microsoft.com/mssql/server"); + return new MSSQLServerContainer<>(taggedImageName); + } +} diff --git a/hazelcast/src/test/java/com/hazelcast/test/jdbc/MSSQLDatabaseProvider.java b/hazelcast/src/test/java/com/hazelcast/test/jdbc/MSSQLDatabaseProvider.java index f73a1513d6cb1..a27714a295f4f 100644 --- a/hazelcast/src/test/java/com/hazelcast/test/jdbc/MSSQLDatabaseProvider.java +++ b/hazelcast/src/test/java/com/hazelcast/test/jdbc/MSSQLDatabaseProvider.java @@ -16,6 +16,7 @@ package com.hazelcast.test.jdbc; +import com.hazelcast.internal.tpcengine.util.OS; import com.microsoft.sqlserver.jdbc.SQLServerDataSource; import com.microsoft.sqlserver.jdbc.SQLServerXADataSource; import org.testcontainers.containers.MSSQLServerContainer; @@ -23,26 +24,40 @@ import javax.annotation.Nonnull; import javax.sql.DataSource; -import static com.hazelcast.test.HazelcastTestSupport.assumeNoArm64Architecture; +import static com.hazelcast.jet.TestedVersions.TEST_MSSQLSERVER_VERSION; public class MSSQLDatabaseProvider extends JdbcDatabaseProvider> { - public static final String TEST_MSSQLSERVER_VERSION = System.getProperty("test.mssqlserver.version", "2022-latest"); - MSSQLServerContainer createContainer(String dbName) { - assumeNoArm64Architecture(); - // withDatabaseName() throws UnsupportedOperationException - MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:" + TEST_MSSQLSERVER_VERSION); + MSSQLServerContainer mssqlServerContainer; + if (isArmArchitecture()) { + mssqlServerContainer = createAzureSQLEdgeContainer(); + } else { + mssqlServerContainer = createMSSQLContainer(); + } mssqlServerContainer.acceptLicense() - // See https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver16 - // "To use java.sql.Time with the time SQL Server type, you must set the sendTimeAsDatetime - // connection property to false." + // See https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver16 + // "To use java.sql.Time with the time SQL Server type, you must set the sendTimeAsDatetime + // connection property to false." .withUrlParam("sendTimeAsDateTime", "false") .withUrlParam("user", mssqlServerContainer.getUsername()) .withUrlParam("password", mssqlServerContainer.getPassword()); return mssqlServerContainer; } + private boolean isArmArchitecture() { + return "aarch64".equals(OS.osArch()); + } + + private MSSQLServerContainer createAzureSQLEdgeContainer() { + return new AzureSQLEdgeContainerProvider().newInstance(); + } + + private MSSQLServerContainer createMSSQLContainer() { + // withDatabaseName() throws UnsupportedOperationException + return new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:" + TEST_MSSQLSERVER_VERSION); + } + @Override public DataSource createDataSource(boolean xa) { if (xa) { @@ -82,8 +97,8 @@ public String getDatabaseName() { @Override public String noAuthJdbcUrl() { return container.getJdbcUrl() - .replaceAll(";user=" + user(), "") - .replaceAll(";password=" + password(), ""); + .replaceAll(";user=" + user(), "") + .replaceAll(";password=" + password(), ""); } @Override