From 18a42eff512ab1d775fb1744ae8e30c133066272 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Mon, 20 Jul 2026 19:27:15 -0400 Subject: [PATCH 1/2] test: use NetworkTopologyStrategy for latest Scylla keyspaces Create generated test keyspaces with NetworkTopologyStrategy in dc1 on Scylla versions where SimpleStrategy keyspaces are restricted by tablets, and disable tablets for those generated keyspaces to keep existing LWT/CAS ITs stable. Keep SimpleStrategy elsewhere to avoid changing older Cassandra and Scylla test behavior. --- .../api/testinfra/session/SessionUtils.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionUtils.java b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionUtils.java index 7536c0ffdc0..ab34fd38c85 100644 --- a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionUtils.java +++ b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionUtils.java @@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.Version; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverConfigLoader; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; @@ -31,6 +32,8 @@ import com.datastax.oss.driver.api.core.session.Session; import com.datastax.oss.driver.api.core.session.SessionBuilder; import com.datastax.oss.driver.api.testinfra.CassandraResourceRule; +import com.datastax.oss.driver.api.testinfra.ccm.CcmBridge; +import com.datastax.oss.driver.api.testinfra.requirement.BackendType; import com.datastax.oss.driver.internal.core.loadbalancing.helper.NodeFilterToDistanceEvaluatorAdapter; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicInteger; @@ -69,6 +72,10 @@ public class SessionUtils { private static final Logger LOG = LoggerFactory.getLogger(SessionUtils.class); private static final AtomicInteger keyspaceId = new AtomicInteger(); private static final String DEFAULT_SESSION_CLASS_NAME = CqlSession.class.getName(); + private static final String DEFAULT_CCM_DATACENTER = "dc1"; + private static final Version SCYLLA_ENTERPRISE_TABLETS_DEFAULT_VERSION = + Version.parse("2024.2.0"); + private static final Version SCYLLA_OSS_TABLETS_DEFAULT_VERSION = Version.parse("6.1.0"); private static String getSessionBuilderClass() { return System.getProperty(SESSION_BUILDER_CLASS_PROPERTY, DEFAULT_SESSION_CLASS_NAME); @@ -195,16 +202,31 @@ public static CqlIdentifier uniqueKeyspaceId() { /** Creates a keyspace through the given session instance, with the given profile. */ public static void createKeyspace( Session session, CqlIdentifier keyspace, DriverExecutionProfile profile) { + String keyspaceOptions = + shouldUseScyllaTabletsWorkaroundForTestKeyspaces() + ? String.format( + "WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', '%s' : 1 } " + + "AND tablets = { 'enabled' : false }", + DEFAULT_CCM_DATACENTER) + : "WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }"; SimpleStatement createKeyspace = SimpleStatement.builder( - String.format( - "CREATE KEYSPACE %s WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };", - keyspace.asCql(false))) + String.format("CREATE KEYSPACE %s %s;", keyspace.asCql(false), keyspaceOptions)) .setExecutionProfile(profile) .build(); session.execute(createKeyspace, Statement.SYNC); } + private static boolean shouldUseScyllaTabletsWorkaroundForTestKeyspaces() { + if (!CcmBridge.isDistributionOf(BackendType.SCYLLA)) { + return false; + } + Version version = CcmBridge.getDistributionVersion(); + return CcmBridge.SCYLLA_ENTERPRISE + ? version.compareTo(SCYLLA_ENTERPRISE_TABLETS_DEFAULT_VERSION) >= 0 + : version.compareTo(SCYLLA_OSS_TABLETS_DEFAULT_VERSION) >= 0; + } + /** * Calls {@link #createKeyspace(Session, CqlIdentifier, DriverExecutionProfile)} with {@link * #slowProfile(Session)} as the third argument. From 751fa189129e846e63f3fd57f1d33861cca9e769 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Mon, 20 Jul 2026 19:27:15 -0400 Subject: [PATCH 2/2] test: configure Scylla auth superuser in latest ITs --- .../core/auth/PlainTextAuthProviderIT.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/auth/PlainTextAuthProviderIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/auth/PlainTextAuthProviderIT.java index 49f96489dd8..18b19088be5 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/auth/PlainTextAuthProviderIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/auth/PlainTextAuthProviderIT.java @@ -44,18 +44,34 @@ public class PlainTextAuthProviderIT { + private static final String USERNAME = "cassandra"; + private static final String PASSWORD = "cassandra"; + private static final Version SCYLLA_CUSTOM_SUPERUSER_VERSION = Version.parse("2026.2.0"); + private static final String SCYLLA_SALTED_PASSWORD = + "$6$java-driver-test$2JXL/pXZTuamSsYNH/kE9UUSQETMmKIcdP8Xgdu/fiHsTHSN.EhjmLrMHPVuQ3.4w0h8CDsP/f1trG0kujylG0"; + @ClassRule public static final CustomCcmRule CCM_RULE = getCCMRule(); private static CustomCcmRule getCCMRule() { CustomCcmRule.Builder builder = CustomCcmRule.builder() .withCassandraConfiguration("authenticator", "PasswordAuthenticator"); - if (!CcmBridge.isDistributionOf(BackendType.SCYLLA)) { + if (requiresExplicitScyllaSuperuser()) { + builder = + builder + .withCassandraConfiguration("auth_superuser_name", USERNAME) + .withCassandraConfiguration("auth_superuser_salted_password", SCYLLA_SALTED_PASSWORD); + } else if (!CcmBridge.isDistributionOf(BackendType.SCYLLA)) { builder = builder.withJvmArgs("-Dcassandra.superuser_setup_delay_ms=0"); } return builder.build(); } + private static boolean requiresExplicitScyllaSuperuser() { + return CcmBridge.isDistributionOf(BackendType.SCYLLA) + && CcmBridge.getDistributionVersion().compareTo(SCYLLA_CUSTOM_SUPERUSER_VERSION) >= 0; + } + @BeforeClass public static void sleepForAuth() { if (CCM_RULE.getCassandraVersion().compareTo(Version.V2_2_0) < 0) { @@ -69,8 +85,8 @@ public void should_connect_with_credentials() { DriverConfigLoader loader = SessionUtils.configLoaderBuilder() .withClass(DefaultDriverOption.AUTH_PROVIDER_CLASS, PlainTextAuthProvider.class) - .withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, "cassandra") - .withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, "cassandra") + .withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, USERNAME) + .withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, PASSWORD) .build(); try (CqlSession session = SessionUtils.newSession(CCM_RULE, loader)) { session.execute("select * from system.local where key='local'"); @@ -83,7 +99,7 @@ public void should_connect_with_programmatic_credentials() { SessionBuilder builder = SessionUtils.baseBuilder() .addContactEndPoints(CCM_RULE.getContactPoints()) - .withAuthCredentials("cassandra", "cassandra"); + .withAuthCredentials(USERNAME, PASSWORD); try (CqlSession session = (CqlSession) builder.build()) { session.execute("select * from system.local where key='local'"); @@ -93,7 +109,7 @@ public void should_connect_with_programmatic_credentials() { @Test public void should_connect_with_programmatic_provider() { - AuthProvider authProvider = new ProgrammaticPlainTextAuthProvider("cassandra", "cassandra"); + AuthProvider authProvider = new ProgrammaticPlainTextAuthProvider(USERNAME, PASSWORD); SessionBuilder builder = SessionUtils.baseBuilder() .addContactEndPoints(CCM_RULE.getContactPoints())