Skip to content

Commit efbd88c

Browse files
authored
fix: correctly distinguish RDS TAZ vs MAZ and SAZ deployment (#510)
1 parent 748b74b commit efbd88c

File tree

7 files changed

+45
-36
lines changed

7 files changed

+45
-36
lines changed

common/lib/utils/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ export function maskProperties(props: Map<string, any>) {
8686
if (maskedProperties.has(WrapperProperties.PASSWORD.name)) {
8787
maskedProperties.set(WrapperProperties.PASSWORD.name, "***");
8888
}
89+
if (maskedProperties.has("ssl")) {
90+
// Mask SSL configuration to avoid logging long certificates.
91+
maskedProperties.set("ssl", "***");
92+
}
8993
// Remove connectionProvider property before displaying. AwsMysqlPoolClient.targetPool throws
9094
// "TypeError: Converting circular structure to JSON" when sent to JSON.stringify.
9195
maskedProperties.delete(WrapperProperties.CONNECTION_PROVIDER.name);

mysql/lib/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { AwsWrapperError, UnsupportedMethodError } from "../../common/lib/utils/
2828
import { Messages } from "../../common/lib/utils/messages";
2929
import { ClientWrapper } from "../../common/lib/client_wrapper";
3030
import { ClientUtils } from "../../common/lib/utils/client_utils";
31-
import { RdsMultiAZMySQLDatabaseDialect } from "./dialect/rds_multi_az_mysql_database_dialect";
31+
import { RdsMultiAZClusterMySQLDatabaseDialect } from "./dialect/rds_multi_az_mysql_database_dialect";
3232
import { TelemetryTraceLevel } from "../../common/lib/utils/telemetry/telemetry_trace_level";
3333
import { MySQL2DriverDialect } from "./dialect/mysql2_driver_dialect";
3434
import { isDialectTopologyAware } from "../../common/lib/utils/utils";
@@ -38,7 +38,7 @@ export class AwsMySQLClient extends AwsClient {
3838
[DatabaseDialectCodes.MYSQL, new MySQLDatabaseDialect()],
3939
[DatabaseDialectCodes.RDS_MYSQL, new RdsMySQLDatabaseDialect()],
4040
[DatabaseDialectCodes.AURORA_MYSQL, new AuroraMySQLDatabaseDialect()],
41-
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZMySQLDatabaseDialect()]
41+
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZClusterMySQLDatabaseDialect()]
4242
]);
4343

4444
constructor(config: any) {

mysql/lib/dialect/rds_multi_az_mysql_database_dialect.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { WrapperProperties } from "../../../common/lib/wrapper_property";
3030
import { PluginService } from "../../../common/lib/plugin_service";
3131
import { MonitoringRdsHostListProvider } from "../../../common/lib/host_list_provider/monitoring/monitoring_host_list_provider";
3232

33-
export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect implements TopologyAwareDatabaseDialect {
33+
export class RdsMultiAZClusterMySQLDatabaseDialect extends MySQLDatabaseDialect implements TopologyAwareDatabaseDialect {
3434
private static readonly TOPOLOGY_QUERY: string = "SELECT id, endpoint, port FROM mysql.rds_topology";
3535
private static readonly TOPOLOGY_TABLE_EXIST_QUERY: string =
3636
"SELECT 1 AS tmp FROM information_schema.tables WHERE" + " table_schema = 'mysql' AND table_name = 'rds_topology'";
@@ -43,13 +43,13 @@ export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect impleme
4343
private static readonly IS_READER_QUERY_COLUMN_NAME: string = "is_reader";
4444

4545
async isDialect(targetClient: ClientWrapper): Promise<boolean> {
46-
let res = await targetClient.query(RdsMultiAZMySQLDatabaseDialect.TOPOLOGY_TABLE_EXIST_QUERY).catch(() => false);
46+
let res = await targetClient.query(RdsMultiAZClusterMySQLDatabaseDialect.TOPOLOGY_TABLE_EXIST_QUERY).catch(() => false);
4747

4848
if (!res) {
4949
return false;
5050
}
5151

52-
res = await targetClient.query(RdsMultiAZMySQLDatabaseDialect.TOPOLOGY_QUERY).catch(() => false);
52+
res = await targetClient.query(RdsMultiAZClusterMySQLDatabaseDialect.TOPOLOGY_QUERY).catch(() => false);
5353
if (!res) {
5454
return false;
5555
}
@@ -81,14 +81,14 @@ export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect impleme
8181
try {
8282
let writerHostId: string = await this.executeTopologyRelatedQuery(
8383
targetClient,
84-
RdsMultiAZMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY,
85-
RdsMultiAZMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
84+
RdsMultiAZClusterMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY,
85+
RdsMultiAZClusterMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
8686
);
8787
if (!writerHostId) {
8888
writerHostId = await this.identifyConnection(targetClient);
8989
}
9090

91-
const res = await targetClient.query(RdsMultiAZMySQLDatabaseDialect.TOPOLOGY_QUERY);
91+
const res = await targetClient.query(RdsMultiAZClusterMySQLDatabaseDialect.TOPOLOGY_QUERY);
9292
const rows: any[] = res[0];
9393
return this.processTopologyQueryResults(hostListProvider, writerHostId, rows);
9494
} catch (error: any) {
@@ -146,8 +146,8 @@ export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect impleme
146146
async getHostRole(client: ClientWrapper): Promise<HostRole> {
147147
return (await this.executeTopologyRelatedQuery(
148148
client,
149-
RdsMultiAZMySQLDatabaseDialect.IS_READER_QUERY,
150-
RdsMultiAZMySQLDatabaseDialect.IS_READER_QUERY_COLUMN_NAME
149+
RdsMultiAZClusterMySQLDatabaseDialect.IS_READER_QUERY,
150+
RdsMultiAZClusterMySQLDatabaseDialect.IS_READER_QUERY_COLUMN_NAME
151151
)) == "0"
152152
? HostRole.WRITER
153153
: HostRole.READER;
@@ -157,8 +157,8 @@ export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect impleme
157157
try {
158158
const writerHostId: string = await this.executeTopologyRelatedQuery(
159159
targetClient,
160-
RdsMultiAZMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY,
161-
RdsMultiAZMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
160+
RdsMultiAZClusterMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY,
161+
RdsMultiAZClusterMySQLDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
162162
);
163163
// The above query returns the writer host id if it is a reader, nothing if the writer.
164164
if (!writerHostId) {
@@ -174,8 +174,8 @@ export class RdsMultiAZMySQLDatabaseDialect extends MySQLDatabaseDialect impleme
174174
async identifyConnection(client: ClientWrapper): Promise<string> {
175175
return await this.executeTopologyRelatedQuery(
176176
client,
177-
RdsMultiAZMySQLDatabaseDialect.HOST_ID_QUERY,
178-
RdsMultiAZMySQLDatabaseDialect.HOST_ID_QUERY_COLUMN_NAME
177+
RdsMultiAZClusterMySQLDatabaseDialect.HOST_ID_QUERY,
178+
RdsMultiAZClusterMySQLDatabaseDialect.HOST_ID_QUERY_COLUMN_NAME
179179
);
180180
}
181181

pg/lib/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { AuroraPgDatabaseDialect } from "./dialect/aurora_pg_database_dialect";
2525
import { AwsWrapperError, UnsupportedMethodError } from "../../common/lib/utils/errors";
2626
import { Messages } from "../../common/lib/utils/messages";
2727
import { ClientWrapper } from "../../common/lib/client_wrapper";
28-
import { RdsMultiAZPgDatabaseDialect } from "./dialect/rds_multi_az_pg_database_dialect";
28+
import { RdsMultiAZClusterPgDatabaseDialect } from "./dialect/rds_multi_az_pg_database_dialect";
2929
import { HostInfo } from "../../common/lib/host_info";
3030
import { TelemetryTraceLevel } from "../../common/lib/utils/telemetry/telemetry_trace_level";
3131
import { NodePostgresDriverDialect } from "./dialect/node_postgres_driver_dialect";
@@ -37,7 +37,7 @@ export class AwsPGClient extends AwsClient {
3737
[DatabaseDialectCodes.PG, new PgDatabaseDialect()],
3838
[DatabaseDialectCodes.RDS_PG, new RdsPgDatabaseDialect()],
3939
[DatabaseDialectCodes.AURORA_PG, new AuroraPgDatabaseDialect()],
40-
[DatabaseDialectCodes.RDS_MULTI_AZ_PG, new RdsMultiAZPgDatabaseDialect()]
40+
[DatabaseDialectCodes.RDS_MULTI_AZ_PG, new RdsMultiAZClusterPgDatabaseDialect()]
4141
]);
4242

4343
constructor(config: any) {

pg/lib/dialect/rds_multi_az_pg_database_dialect.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ import { WrapperProperties } from "../../../common/lib/wrapper_property";
3131
import { PluginService } from "../../../common/lib/plugin_service";
3232
import { MonitoringRdsHostListProvider } from "../../../common/lib/host_list_provider/monitoring/monitoring_host_list_provider";
3333

34-
export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements TopologyAwareDatabaseDialect {
34+
export class RdsMultiAZClusterPgDatabaseDialect extends PgDatabaseDialect implements TopologyAwareDatabaseDialect {
3535
constructor() {
3636
super();
3737
}
3838
private static readonly VERSION = process.env.npm_package_version;
39-
private static readonly TOPOLOGY_QUERY: string = `SELECT id, endpoint, port FROM rds_tools.show_topology('aws_advanced_nodejs_wrapper-"${RdsMultiAZPgDatabaseDialect.VERSION}"')`;
39+
private static readonly TOPOLOGY_QUERY: string = `SELECT id, endpoint, port FROM rds_tools.show_topology('aws_advanced_nodejs_wrapper-"${RdsMultiAZClusterPgDatabaseDialect.VERSION}"')`;
4040
private static readonly WRITER_HOST_FUNC_EXIST_QUERY: string =
4141
"SELECT 1 AS tmp FROM information_schema.routines WHERE routine_schema='rds_tools' AND routine_name='multi_az_db_cluster_source_dbi_resource_id'";
4242
private static readonly FETCH_WRITER_HOST_QUERY: string =
@@ -48,13 +48,18 @@ export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements To
4848
private static readonly IS_READER_QUERY_COLUMN_NAME: string = "is_reader";
4949

5050
async isDialect(targetClient: ClientWrapper): Promise<boolean> {
51-
const res = await targetClient.query(RdsMultiAZPgDatabaseDialect.WRITER_HOST_FUNC_EXIST_QUERY).catch(() => false);
51+
const res = await targetClient.query(RdsMultiAZClusterPgDatabaseDialect.WRITER_HOST_FUNC_EXIST_QUERY).catch(() => false);
5252

5353
if (!res) {
5454
return false;
5555
}
5656

57-
return !!(await targetClient.query(RdsMultiAZPgDatabaseDialect.FETCH_WRITER_HOST_QUERY).catch(() => false));
57+
try {
58+
const res = await targetClient.query(RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY);
59+
return res.rows[0][RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME] != null;
60+
} catch (e: any) {
61+
return false;
62+
}
5863
}
5964

6065
getHostListProvider(props: Map<string, any>, originalUrl: string, hostListProviderService: HostListProviderService): HostListProvider {
@@ -68,14 +73,14 @@ export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements To
6873
try {
6974
let writerHostId: string = await this.executeTopologyRelatedQuery(
7075
targetClient,
71-
RdsMultiAZPgDatabaseDialect.FETCH_WRITER_HOST_QUERY,
72-
RdsMultiAZPgDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
76+
RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY,
77+
RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
7378
);
7479
if (!writerHostId) {
7580
writerHostId = await this.identifyConnection(targetClient);
7681
}
7782

78-
const res = await targetClient.query(RdsMultiAZPgDatabaseDialect.TOPOLOGY_QUERY);
83+
const res = await targetClient.query(RdsMultiAZClusterPgDatabaseDialect.TOPOLOGY_QUERY);
7984
const rows: any[] = res.rows;
8085
return this.processTopologyQueryResults(hostListProvider, writerHostId, rows);
8186
} catch (error: any) {
@@ -133,8 +138,8 @@ export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements To
133138
async getHostRole(client: ClientWrapper): Promise<HostRole> {
134139
return (await this.executeTopologyRelatedQuery(
135140
client,
136-
RdsMultiAZPgDatabaseDialect.IS_READER_QUERY,
137-
RdsMultiAZPgDatabaseDialect.IS_READER_QUERY_COLUMN_NAME
141+
RdsMultiAZClusterPgDatabaseDialect.IS_READER_QUERY,
142+
RdsMultiAZClusterPgDatabaseDialect.IS_READER_QUERY_COLUMN_NAME
138143
)) === false
139144
? HostRole.WRITER
140145
: HostRole.READER;
@@ -144,8 +149,8 @@ export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements To
144149
try {
145150
const writerHostId: string = await this.executeTopologyRelatedQuery(
146151
targetClient,
147-
RdsMultiAZPgDatabaseDialect.FETCH_WRITER_HOST_QUERY,
148-
RdsMultiAZPgDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
152+
RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY,
153+
RdsMultiAZClusterPgDatabaseDialect.FETCH_WRITER_HOST_QUERY_COLUMN_NAME
149154
);
150155
const currentConnection = await this.identifyConnection(targetClient);
151156

@@ -162,8 +167,8 @@ export class RdsMultiAZPgDatabaseDialect extends PgDatabaseDialect implements To
162167
async identifyConnection(client: ClientWrapper): Promise<string> {
163168
return await this.executeTopologyRelatedQuery(
164169
client,
165-
RdsMultiAZPgDatabaseDialect.HOST_ID_QUERY,
166-
RdsMultiAZPgDatabaseDialect.HOST_ID_QUERY_COLUMN_NAME
170+
RdsMultiAZClusterPgDatabaseDialect.HOST_ID_QUERY,
171+
RdsMultiAZClusterPgDatabaseDialect.HOST_ID_QUERY_COLUMN_NAME
167172
);
168173
}
169174

tests/unit/database_dialect.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import { WrapperProperties } from "../../common/lib/wrapper_property";
2929
import { HostInfoBuilder } from "../../common/lib/host_info_builder";
3030
import { SimpleHostAvailabilityStrategy } from "../../common/lib/host_availability/simple_host_availability_strategy";
3131
import { ClientWrapper } from "../../common/lib/client_wrapper";
32-
import { RdsMultiAZMySQLDatabaseDialect } from "../../mysql/lib/dialect/rds_multi_az_mysql_database_dialect";
33-
import { RdsMultiAZPgDatabaseDialect } from "../../pg/lib/dialect/rds_multi_az_pg_database_dialect";
32+
import { RdsMultiAZClusterMySQLDatabaseDialect } from "../../mysql/lib/dialect/rds_multi_az_mysql_database_dialect";
33+
import { RdsMultiAZClusterPgDatabaseDialect } from "../../pg/lib/dialect/rds_multi_az_pg_database_dialect";
3434
import { DatabaseDialectManager } from "../../common/lib/database_dialect/database_dialect_manager";
3535
import { NodePostgresDriverDialect } from "../../pg/lib/dialect/node_postgres_driver_dialect";
3636
import { mock } from "ts-mockito";
@@ -44,14 +44,14 @@ const mysqlDialects: Map<DatabaseDialectCodes, DatabaseDialect> = new Map([
4444
[DatabaseDialectCodes.MYSQL, new MySQLDatabaseDialect()],
4545
[DatabaseDialectCodes.RDS_MYSQL, new RdsMySQLDatabaseDialect()],
4646
[DatabaseDialectCodes.AURORA_MYSQL, new AuroraMySQLDatabaseDialect()],
47-
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZMySQLDatabaseDialect()]
47+
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZClusterMySQLDatabaseDialect()]
4848
]);
4949

5050
const pgDialects: Map<DatabaseDialectCodes, DatabaseDialect> = new Map([
5151
[DatabaseDialectCodes.PG, new PgDatabaseDialect()],
5252
[DatabaseDialectCodes.RDS_PG, new RdsPgDatabaseDialect()],
5353
[DatabaseDialectCodes.AURORA_PG, new AuroraPgDatabaseDialect()],
54-
[DatabaseDialectCodes.RDS_MULTI_AZ_PG, new RdsMultiAZPgDatabaseDialect()]
54+
[DatabaseDialectCodes.RDS_MULTI_AZ_PG, new RdsMultiAZClusterPgDatabaseDialect()]
5555
]);
5656

5757
const MYSQL_QUERY = "SHOW VARIABLES LIKE 'version_comment'";
@@ -109,7 +109,7 @@ const tazMySQLResult = [
109109
},
110110
{
111111
Variable_name: "port",
112-
Value: "3306s"
112+
Value: "3306"
113113
}
114114
]
115115
];

tests/unit/plugin_service.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { DatabaseDialectCodes } from "../../common/lib/database_dialect/database
2323
import { MySQLDatabaseDialect } from "../../mysql/lib/dialect/mysql_database_dialect";
2424
import { RdsMySQLDatabaseDialect } from "../../mysql/lib/dialect/rds_mysql_database_dialect";
2525
import { AuroraMySQLDatabaseDialect } from "../../mysql/lib/dialect/aurora_mysql_database_dialect";
26-
import { RdsMultiAZMySQLDatabaseDialect } from "../../mysql/lib/dialect/rds_multi_az_mysql_database_dialect";
26+
import { RdsMultiAZClusterMySQLDatabaseDialect } from "../../mysql/lib/dialect/rds_multi_az_mysql_database_dialect";
2727
import { MySQL2DriverDialect } from "../../mysql/lib/dialect/mysql2_driver_dialect";
2828
import { AllowedAndBlockedHosts } from "../../common/lib/AllowedAndBlockedHosts";
2929
import { HostInfoBuilder } from "../../common/lib/host_info_builder";
@@ -55,7 +55,7 @@ const knownDialectsByCode: Map<string, DatabaseDialect> = new Map([
5555
[DatabaseDialectCodes.MYSQL, new MySQLDatabaseDialect()],
5656
[DatabaseDialectCodes.RDS_MYSQL, new RdsMySQLDatabaseDialect()],
5757
[DatabaseDialectCodes.AURORA_MYSQL, new AuroraMySQLDatabaseDialect()],
58-
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZMySQLDatabaseDialect()]
58+
[DatabaseDialectCodes.RDS_MULTI_AZ_MYSQL, new RdsMultiAZClusterMySQLDatabaseDialect()]
5959
]);
6060

6161
const mockAwsClient: AwsClient = mock(AwsClient);

0 commit comments

Comments
 (0)