From 5d57d86ead2cc0d7eaa81e63ecd83fcd5db856b1 Mon Sep 17 00:00:00 2001 From: Karen <64801825+karenc-bq@users.noreply.github.com> Date: Tue, 26 Nov 2024 15:55:30 -0800 Subject: [PATCH] fix: autoscaling tests (#316) --- .github/workflows/run-autoscaling-tests.yml | 13 ++-- .../plugins/read_write_splitting_plugin.ts | 5 +- common/lib/utils/locales/en.json | 4 +- pg/lib/abstract_pg_error_handler.ts | 2 +- .../container/tests/aurora_failover.test.ts | 5 +- .../container/tests/autoscaling.test.ts | 70 +++++++++++-------- .../tests/basic_connectivity.test.ts | 3 +- .../tests/iam_authentication.test.ts | 7 +- .../container/tests/performance.test.ts | 3 +- .../tests/read_write_splitting.test.ts | 7 +- .../tests/utils/aurora_test_utility.ts | 58 ++++++++++----- .../container/tests/utils/driver_helper.ts | 8 +-- tests/integration/host/build.gradle.kts | 26 +++++++ 13 files changed, 145 insertions(+), 66 deletions(-) diff --git a/.github/workflows/run-autoscaling-tests.yml b/.github/workflows/run-autoscaling-tests.yml index 2014fe3e..e34b3b8e 100644 --- a/.github/workflows/run-autoscaling-tests.yml +++ b/.github/workflows/run-autoscaling-tests.yml @@ -11,6 +11,10 @@ jobs: autoscaling-tests: name: Run Autoscaling Tests runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + dbEngine: [ "mysql", "postgres" ] steps: - name: Clone repository uses: actions/checkout@v4 @@ -46,17 +50,16 @@ jobs: echo "TEMP_AWS_SESSION_TOKEN=${creds[2]}" >> $GITHUB_ENV - name: Run integration tests run: | - ./gradlew --no-parallel --no-daemon test-autoscaling --info + ./gradlew --no-parallel --no-daemon test-autoscaling-${{ matrix.dbEngine }} --info env: - AURORA_CLUSTER_DOMAIN: ${{ secrets.DB_CONN_SUFFIX }} - AURORA_DB_REGION: ${{ secrets.AWS_DEFAULT_REGION }} + RDS_CLUSTER_DOMAIN: ${{ secrets.DB_CONN_SUFFIX }} + RDS_DB_REGION: ${{ secrets.AWS_DEFAULT_REGION }} AWS_ACCESS_KEY_ID: ${{ env.TEMP_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ env.TEMP_AWS_SECRET_ACCESS_KEY }} AWS_SESSION_TOKEN: ${{ env.TEMP_AWS_SESSION_TOKEN }} NUM_INSTANCES: 5 AURORA_MYSQL_DB_ENGINE_VERSION: "default" - AURORA_PG_ENGINE_VERSION: "default" - FILTER: "autoscaling" + AURORA_PG_DB_ENGINE_VERSION: "default" - name: "Get Github Action IP" if: always() id: ip diff --git a/common/lib/plugins/read_write_splitting_plugin.ts b/common/lib/plugins/read_write_splitting_plugin.ts index b00334c4..56d3a110 100644 --- a/common/lib/plugins/read_write_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting_plugin.ts @@ -29,7 +29,6 @@ import { SqlMethodUtils } from "../utils/sql_method_utils"; import { ClientWrapper } from "../client_wrapper"; import { getWriter, logAndThrowError } from "../utils/utils"; import { CanReleaseResources } from "../can_release_resources"; -import { InternalPooledConnectionProvider } from "../internal_pooled_connection_provider"; import { PoolClientWrapper } from "../pool_client_wrapper"; export class ReadWriteSplittingPlugin extends AbstractConnectionPlugin implements CanReleaseResources { @@ -209,7 +208,7 @@ export class ReadWriteSplittingPlugin extends AbstractConnectionPlugin implement async switchClientIfRequired(readOnly: boolean) { const currentClient = this.pluginService.getCurrentClient(); if (!(await currentClient.isValid())) { - logAndThrowError(Messages.get("ReadWriteSplittingPlugin.setReadOnlyOnClosedClient")); + logAndThrowError(Messages.get("ReadWriteSplittingPlugin.setReadOnlyOnClosedClient", currentClient.targetClient?.id ?? "undefined client")); } try { await this.pluginService.refreshHostList(); @@ -257,7 +256,7 @@ export class ReadWriteSplittingPlugin extends AbstractConnectionPlugin implement if (newClientHost && newTargetClient) { try { await this.pluginService.setCurrentClient(newTargetClient, newClientHost); - logger.debug(Messages.get("ReadWriteSplittingPlugin.settingCurrentClient", newClientHost.url)); + logger.debug(Messages.get("ReadWriteSplittingPlugin.settingCurrentClient", newTargetClient.id, newClientHost.url)); } catch (error) { // pass } diff --git a/common/lib/utils/locales/en.json b/common/lib/utils/locales/en.json index 4da6a0da..d800e041 100644 --- a/common/lib/utils/locales/en.json +++ b/common/lib/utils/locales/en.json @@ -71,7 +71,7 @@ "AuroraStaleDnsHelper.writerHostSpec": "Writer host: '%s'.", "AuroraStaleDnsHelper.writerInetAddress": "Writer host address: '%s'", "AuroraStaleDnsHelper.staleDnsDetected": "Stale DNS data detected. Opening a connection to '%s'.", - "ReadWriteSplittingPlugin.setReadOnlyOnClosedClient": "setReadOnly cannot be called on a closed client.", + "ReadWriteSplittingPlugin.setReadOnlyOnClosedClient": "setReadOnly cannot be called on a closed client '%s'.", "ReadWriteSplittingPlugin.errorSwitchingToCachedReader": "An error occurred while trying to switch to a cached reader client: '%s'. The driver will attempt to establish a new reader client.", "ReadWriteSplittingPlugin.errorSwitchingToReader": "An error occurred while trying to switch to a reader client: '%s'.", "ReadWriteSplittingPlugin.errorSwitchingToWriter": "An error occurred while trying to switch to a writer client: '%s'.", @@ -83,7 +83,7 @@ "ReadWriteSplittingPlugin.fallbackToWriter": "Failed to switch to a reader; the current writer will be used as a fallback: '%s'", "ReadWriteSplittingPlugin.switchedFromWriterToReader": "Switched from a writer to a reader host. New reader host: '%s'", "ReadWriteSplittingPlugin.switchedFromReaderToWriter": "Switched from a reader to a writer host. New writer host: '%s'", - "ReadWriteSplittingPlugin.settingCurrentClient": "Setting the current client to '%s'", + "ReadWriteSplittingPlugin.settingCurrentClient": "Setting the current client to '%s' - '%s'", "ReadWriteSplittingPlugin.noWriterFound": "No writer was found in the current host list.", "ReadWriteSplittingPlugin.noReadersFound": "A reader instance was requested via setReadOnly, but there are no readers in the host list. The current writer will be used as a fallback: '%s'", "ReadWriteSplittingPlugin.emptyHostList": "Host list is empty.", diff --git a/pg/lib/abstract_pg_error_handler.ts b/pg/lib/abstract_pg_error_handler.ts index 06e08478..59d8b2c0 100644 --- a/pg/lib/abstract_pg_error_handler.ts +++ b/pg/lib/abstract_pg_error_handler.ts @@ -85,7 +85,7 @@ export abstract class AbstractPgErrorHandler implements ErrorHandler { if (!clientWrapper || !clientWrapper.client) { return; } - clientWrapper.client.removeListener("error", this.noOpListener); + clientWrapper.client.removeListener("error", this.trackingListener); clientWrapper.client.on("error", this.noOpListener); } } diff --git a/tests/integration/container/tests/aurora_failover.test.ts b/tests/integration/container/tests/aurora_failover.test.ts index 4e88b2cb..5dfbb3db 100644 --- a/tests/integration/container/tests/aurora_failover.test.ts +++ b/tests/integration/container/tests/aurora_failover.test.ts @@ -27,7 +27,10 @@ import { features, instanceCount } from "./config"; import { TestEnvironmentFeatures } from "./utils/test_environment_features"; const itIf = - features.includes(TestEnvironmentFeatures.FAILOVER_SUPPORTED) && !features.includes(TestEnvironmentFeatures.PERFORMANCE) && instanceCount >= 2 + features.includes(TestEnvironmentFeatures.FAILOVER_SUPPORTED) && + !features.includes(TestEnvironmentFeatures.PERFORMANCE) && + !features.includes(TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY) && + instanceCount >= 2 ? it : it.skip; const itIfTwoInstance = instanceCount == 2 ? itIf : it.skip; diff --git a/tests/integration/container/tests/autoscaling.test.ts b/tests/integration/container/tests/autoscaling.test.ts index 3e6cd0a8..bf690c17 100644 --- a/tests/integration/container/tests/autoscaling.test.ts +++ b/tests/integration/container/tests/autoscaling.test.ts @@ -33,6 +33,7 @@ const itIf = instanceCount >= 2 ? it : it.skip; +const itIfMinFiveInstance = instanceCount >= 5 ? itIf : it.skip; let env: TestEnvironment; let driver; @@ -42,6 +43,7 @@ let newInstance: TestInstanceInfo; let newInstanceClient: any; let auroraTestUtility: AuroraTestUtility; let provider: InternalPooledConnectionProvider | null; +const instanceId: string = "auto-scaling-instance"; async function initDefaultConfig(host: string, port: number, provider: InternalPooledConnectionProvider): Promise { let config: any = { @@ -55,7 +57,8 @@ async function initDefaultConfig(host: string, port: number, provider: InternalP enableTelemetry: true, telemetryTracesBackend: "OTLP", telemetryMetricsBackend: "OTLP", - readerHostSelectorStrategy: "leastConnections" + readerHostSelectorStrategy: "leastConnections", + clusterTopologyRefreshRateMs: 5000 }; config = DriverHelper.addDriverSpecificConfiguration(config, env.engine); @@ -75,7 +78,8 @@ async function initConfigWithFailover(host: string, port: number, provider: Inte enableTelemetry: true, telemetryTracesBackend: "OTLP", telemetryMetricsBackend: "OTLP", - readerHostSelectorStrategy: "leastConnections" + readerHostSelectorStrategy: "leastConnections", + clusterTopologyRefreshRateMs: 5000 }; config = DriverHelper.addDriverSpecificConfiguration(config, env.engine); @@ -93,6 +97,7 @@ describe("pooled connection autoscaling", () => { connectionsSet = new Set(); provider = null; + await auroraTestUtility.deleteInstance(instanceId); await TestEnvironment.verifyClusterStatus(); }, 1320000); @@ -107,16 +112,27 @@ describe("pooled connection autoscaling", () => { logger.info(`Test finished: ${expect.getState().currentTestName}`); }, 1320000); - itIf( + itIfMinFiveInstance( "set read only on old connection", async () => { // Test setup. const totalInstances: number = await auroraTestUtility.getNumberOfInstances(); const instances: TestInstanceInfo[] = env.databaseInfo.instances; const numInstances: number = instances.length; + const idleTimeoutMillis = 10 * 60 * 1000; // 10 minutes + const poolExpirationNanos = BigInt(3 * 60 * 1000_000_000); // 3 minutes + const poolCleanupNanos = BigInt(10 * 60 * 1000_000_000); // 10 minutes // Set provider. - provider = new InternalPooledConnectionProvider(new AwsPoolConfig({ maxConnections: numInstances })); + provider = new InternalPooledConnectionProvider( + new AwsPoolConfig({ + maxConnections: numInstances, + idleTimeoutMillis: idleTimeoutMillis + }), + undefined, + poolExpirationNanos, + poolCleanupNanos + ); // Initialize clients. try { @@ -126,18 +142,12 @@ describe("pooled connection autoscaling", () => { if (host && port) { const config: any = await initDefaultConfig(host, port, provider); const client = initClientFunc(config); - client.on("error", (error: any): void => { - logger.debug(`event emitter threw error: ${error.message}`); - logger.debug(error.stack); - }); - await client.connect(); connectionsSet.add(client); } } // Create new instance. - const instanceId: string = "auto-scaling-instance"; newInstance = await auroraTestUtility.createInstance(instanceId); if (!newInstance?.instanceId || !newInstance?.host || !newInstance?.port) { fail("Instance not returned."); @@ -149,6 +159,7 @@ describe("pooled connection autoscaling", () => { newInstanceClient = initClientFunc(config); await newInstanceClient.connect(); connectionsSet.add(newInstanceClient); + const writerInstance = await auroraTestUtility.queryInstanceId(newInstanceClient); // Should connect to created instance. await newInstanceClient.setReadOnly(true); @@ -156,25 +167,28 @@ describe("pooled connection autoscaling", () => { expect(await auroraTestUtility.queryInstanceId(newInstanceClient)).toBe(newInstance.instanceId); await newInstanceClient.setReadOnly(false); + expect(await auroraTestUtility.queryInstanceId(newInstanceClient)).toBe(writerInstance); } finally { - await auroraTestUtility.deleteInstance(newInstance.instanceId ? newInstance.instanceId : instanceId); - } - - // Ensure instance has deleted. - const waitTilTime: number = Date.now() + 5 * 60 * 1000; // 5 minutes - while ((await auroraTestUtility.getNumberOfInstances()) !== totalInstances && waitTilTime > Date.now()) { - await sleep(5000); - } - if (await auroraTestUtility.instanceExists(instanceId)) { - fail(`The instance ${instanceId} was not deleted.`); + const instance = newInstance.instanceId ? newInstance.instanceId : instanceId; + let deleted = false; + setTimeout(async () => { + const stopTime = Date.now() + 5 * 60 * 1000; + while (!deleted && Date.now() < stopTime) { + await auroraTestUtility.queryInstanceId(newInstanceClient); + await sleep(3000); + } + }, 3000); + await auroraTestUtility.deleteInstance(instance); + deleted = true; } // Should have removed the pool with the deleted instance. await newInstanceClient.setReadOnly(true); + const readerId = await auroraTestUtility.queryInstanceId(newInstanceClient); expect(newInstance.instanceId).not.toBe(readerId); expect(await provider.containsHost(newInstance.host)).toBe(false); - expect(provider.getHostCount()).toBe(instances.length); + expect(provider.getHostCount()).toBeLessThanOrEqual(instances.length); } finally { for (const connection of connectionsSet) { try { @@ -188,7 +202,7 @@ describe("pooled connection autoscaling", () => { 1320000 ); - itIf( + itIfMinFiveInstance( "failover from deleted reader", async () => { // Test setup. @@ -196,7 +210,7 @@ describe("pooled connection autoscaling", () => { const numInstances: number = instances.length; // Set provider. - provider = new InternalPooledConnectionProvider(new AwsPoolConfig({ maxConnections: numInstances })); + provider = new InternalPooledConnectionProvider(new AwsPoolConfig({ maxConnections: numInstances * 5 })); // Initialize clients. try { @@ -206,10 +220,9 @@ describe("pooled connection autoscaling", () => { if (host && port) { const config: any = await initConfigWithFailover(host, port, provider); const client = initClientFunc(config); - client.on("error", (error: any): void => { - logger.debug(`event emitter threw error: ${error.message}`); - logger.debug(error.stack); - }); + const newClient = initClientFunc(config); + await newClient.connect(); + connectionsSet.add(newClient); await client.connect(); connectionsSet.add(client); @@ -217,7 +230,6 @@ describe("pooled connection autoscaling", () => { } // Create new instance. - const instanceId: string = "auto-scaling-instance"; newInstance = await auroraTestUtility.createInstance(instanceId); if (!newInstance?.instanceId || !newInstance?.host || !newInstance?.port) { fail("Instance not returned."); @@ -225,7 +237,7 @@ describe("pooled connection autoscaling", () => { // Connect to instance. try { - const config = await initConfigWithFailover(newInstance.host, newInstance.port, provider); + const config = await initConfigWithFailover(env.databaseInfo.writerInstanceEndpoint, env.databaseInfo.instanceEndpointPort, provider); newInstanceClient = initClientFunc(config); await newInstanceClient.connect(); connectionsSet.add(newInstanceClient); diff --git a/tests/integration/container/tests/basic_connectivity.test.ts b/tests/integration/container/tests/basic_connectivity.test.ts index d4e0253b..6b2c4828 100644 --- a/tests/integration/container/tests/basic_connectivity.test.ts +++ b/tests/integration/container/tests/basic_connectivity.test.ts @@ -24,7 +24,8 @@ import { TestEnvironmentFeatures } from "./utils/test_environment_features"; import { features } from "./config"; import { DatabaseEngineDeployment } from "./utils/database_engine_deployment"; -const itIf = !features.includes(TestEnvironmentFeatures.PERFORMANCE) ? it : it.skip; +const itIf = + !features.includes(TestEnvironmentFeatures.PERFORMANCE) && !features.includes(TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY) ? it : it.skip; let client: any; let auroraTestUtility: AuroraTestUtility; diff --git a/tests/integration/container/tests/iam_authentication.test.ts b/tests/integration/container/tests/iam_authentication.test.ts index 1c04d58a..cf7c976b 100644 --- a/tests/integration/container/tests/iam_authentication.test.ts +++ b/tests/integration/container/tests/iam_authentication.test.ts @@ -27,7 +27,12 @@ import { logger } from "../../../../common/logutils"; import { TestEnvironmentFeatures } from "./utils/test_environment_features"; import { features } from "./config"; -const itIf = !features.includes(TestEnvironmentFeatures.PERFORMANCE) && features.includes(TestEnvironmentFeatures.IAM) ? it : it.skip; +const itIf = + !features.includes(TestEnvironmentFeatures.PERFORMANCE) && + !features.includes(TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY) && + features.includes(TestEnvironmentFeatures.IAM) + ? it + : it.skip; let env: TestEnvironment; let driver; diff --git a/tests/integration/container/tests/performance.test.ts b/tests/integration/container/tests/performance.test.ts index 7d595b5b..37bd586d 100644 --- a/tests/integration/container/tests/performance.test.ts +++ b/tests/integration/container/tests/performance.test.ts @@ -30,7 +30,8 @@ import { PerfTestUtility } from "./utils/perf_util"; const itIf = features.includes(TestEnvironmentFeatures.FAILOVER_SUPPORTED) && features.includes(TestEnvironmentFeatures.PERFORMANCE) && - features.includes(TestEnvironmentFeatures.NETWORK_OUTAGES_ENABLED) + features.includes(TestEnvironmentFeatures.NETWORK_OUTAGES_ENABLED) && + !features.includes(TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY) ? it : it.skip; diff --git a/tests/integration/container/tests/read_write_splitting.test.ts b/tests/integration/container/tests/read_write_splitting.test.ts index bf470ca1..c890047c 100644 --- a/tests/integration/container/tests/read_write_splitting.test.ts +++ b/tests/integration/container/tests/read_write_splitting.test.ts @@ -31,7 +31,12 @@ import { InternalPoolMapping } from "../../../../common/lib/utils/internal_pool_ import { HostInfo } from "../../../../common/lib/host_info"; const itIf = - !features.includes(TestEnvironmentFeatures.PERFORMANCE) && features.includes(TestEnvironmentFeatures.IAM) && instanceCount >= 2 ? it : it.skip; + !features.includes(TestEnvironmentFeatures.PERFORMANCE) && + features.includes(TestEnvironmentFeatures.IAM) && + !features.includes(TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY) && + instanceCount >= 2 + ? it + : it.skip; const itIfMinThreeInstance = instanceCount >= 3 ? itIf : it.skip; const itIfMinFiveInstance = instanceCount >= 5 ? itIf : it.skip; diff --git a/tests/integration/container/tests/utils/aurora_test_utility.ts b/tests/integration/container/tests/utils/aurora_test_utility.ts index 324d49f3..b4cd0eac 100644 --- a/tests/integration/container/tests/utils/aurora_test_utility.ts +++ b/tests/integration/container/tests/utils/aurora_test_utility.ts @@ -17,10 +17,13 @@ import { CreateDBInstanceCommand, CreateDBInstanceCommandOutput, + DBInstanceAlreadyExistsFault, + DBInstanceNotFoundFault, DeleteDBInstanceCommand, DescribeDBClustersCommand, DescribeDBInstancesCommand, FailoverDBClusterCommand, + InvalidDBInstanceStateFault, RDSClient, RebootDBInstanceCommand } from "@aws-sdk/client-rds"; @@ -70,11 +73,17 @@ export class AuroraTestUtility { let status = instanceInfo["DBInstanceStatus"]; const waitTilTime: number = Date.now() + 15 * 60 * 1000; // 15 minutes while (status && !allowedStatuses.includes(status.toLowerCase()) && waitTilTime > Date.now()) { - await sleep(1000); - instanceInfo = await this.getDbInstance(instanceId); - if (instanceInfo !== null) { - status = instanceInfo["DBInstanceStatus"]; - logger.info(`Instance ${instanceId} status: ${status.toLowerCase()}`); + await sleep(5000); + try { + instanceInfo = await this.getDbInstance(instanceId); + if (instanceInfo !== null) { + status = instanceInfo["DBInstanceStatus"]; + logger.info(`Instance ${instanceId} status: ${status.toLowerCase()}`); + } + } catch (e: any) { + if (e instanceof DBInstanceNotFoundFault) { + // Wait for instance to be created. + } } } @@ -258,9 +267,12 @@ export class AuroraTestUtility { Engine: info.databaseEngine, EngineVersion: info.databaseEngineVersion }); - const response: CreateDBInstanceCommandOutput = await this.client.send(command); - if (!response.DBInstance) { - throw new Error(`The CreateDBInstanceCommand request for newly created instance ${instanceId} did not return an instance.`); + try { + await this.client.send(command); + } catch (e: any) { + if (!(e instanceof DBInstanceAlreadyExistsFault)) { + throw new Error(`The CreateDBInstanceCommand request for ${instanceId} failed: ${e.message}`); + } } await this.waitUntilInstanceHasRightState( instanceId, @@ -285,19 +297,31 @@ export class AuroraTestUtility { } // set up stop time - const current = new Date(); - const stopTime = current.setMinutes(current.getMinutes() + 15 * 60); + const current = Date.now(); + const stopTime = current + 15 * 60 * 1000; // create and send command to delete - const command = new DeleteDBInstanceCommand({ - DBInstanceIdentifier: instanceId, - SkipFinalSnapshot: true - }); - await this.client.send(command); + try { + const command = new DeleteDBInstanceCommand({ + DBInstanceIdentifier: instanceId, + SkipFinalSnapshot: true + }); + await this.client.send(command); + } catch (e: any) { + if (e instanceof InvalidDBInstanceStateFault) { + // Instance is already being deleted. + } else { + throw e; + } + } // wait for it to delete - while ((await this.instanceExists(instanceId)) && new Date().getTime() < stopTime) { - await sleep(3000); + while ((await this.instanceExists(instanceId)) && Date.now() < stopTime) { + await sleep(5000); + } + + if (await this.instanceExists(instanceId)) { + throw new Error(`The instance ${instanceId} was not deleted within the allotted time.`); } } diff --git a/tests/integration/container/tests/utils/driver_helper.ts b/tests/integration/container/tests/utils/driver_helper.ts index 464d8386..0eda2edf 100644 --- a/tests/integration/container/tests/utils/driver_helper.ts +++ b/tests/integration/container/tests/utils/driver_helper.ts @@ -113,11 +113,11 @@ export class DriverHelper { props["ssl"] = { rejectUnauthorized: false }; } else if (engine === DatabaseEngine.PG && performance) { props["query_timeout"] = 120000; - props["connectionTimeoutMillis"] = 400; - props["monitoring_query_timeout"] = 400; + props["connectionTimeoutMillis"] = 3000; + props["monitoring_query_timeout"] = 3000; } else if (engine === DatabaseEngine.MYSQL && performance) { - props["connectTimeout"] = 400; - props["monitoring_mysqlQueryTimeout"] = 400; + props["connectTimeout"] = 3000; + props["monitoring_mysqlQueryTimeout"] = 3000; props["mysqlQueryTimeout"] = 120000; } return props; diff --git a/tests/integration/host/build.gradle.kts b/tests/integration/host/build.gradle.kts index bec517fd..3ce5acbb 100644 --- a/tests/integration/host/build.gradle.kts +++ b/tests/integration/host/build.gradle.kts @@ -182,6 +182,32 @@ tasks.register("test-autoscaling") { } } +tasks.register("test-autoscaling-mysql") { + group = "verification" + filter.includeTestsMatching("integration.host.TestRunner.runTests") + doFirst { + systemProperty("exclude-docker", "true") + systemProperty("exclude-performance", "true") + systemProperty("exclude-multi-az", "true") + systemProperty("exclude-pg-driver", "true") + systemProperty("exclude-pg-engine", "true") + systemProperty("test-autoscaling", "true") + } +} + +tasks.register("test-autoscaling-postgres") { + group = "verification" + filter.includeTestsMatching("integration.host.TestRunner.runTests") + doFirst { + systemProperty("exclude-docker", "true") + systemProperty("exclude-performance", "true") + systemProperty("exclude-multi-az", "true") + systemProperty("exclude-mysql-driver", "true") + systemProperty("exclude-mysql-engine", "true") + systemProperty("test-autoscaling", "true") + } +} + // Debug tasks.register("debug-all-environments") {