Skip to content

Commit f24d64b

Browse files
committed
feat: Configure connectors with DNS Name.
1 parent 7f75770 commit f24d64b

File tree

7 files changed

+458
-157
lines changed

7 files changed

+458
-157
lines changed

.github/workflows/tests.yml

+20-4
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,15 @@ jobs:
154154
MYSQL_DB:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_DB
155155
POSTGRES_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CONNECTION_NAME
156156
POSTGRES_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER
157-
POSTGRES_IAM_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER_IAM_NODE
157+
POSTGRES_USER_IAM_NODE:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER_IAM_NODE
158158
POSTGRES_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_PASS
159159
POSTGRES_DB:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_DB
160160
POSTGRES_CAS_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CAS_CONNECTION_NAME
161161
POSTGRES_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CAS_PASS
162162
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_CONNECTION_NAME
163163
POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS
164+
POSTGRES_CUSTOMER_CAS_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_DOMAIN_NAME
165+
POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME
164166
SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME
165167
SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER
166168
SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS
@@ -181,13 +183,15 @@ jobs:
181183
MYSQL_DB: "${{ steps.secrets.outputs.MYSQL_DB }}"
182184
POSTGRES_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CONNECTION_NAME }}"
183185
POSTGRES_USER: "${{ steps.secrets.outputs.POSTGRES_USER }}"
184-
POSTGRES_IAM_USER: "${{ steps.secrets.outputs.POSTGRES_IAM_USER }}"
186+
POSTGRES_USER_IAM_NODE: "${{ steps.secrets.outputs.POSTGRES_USER_IAM_NODE }}"
185187
POSTGRES_PASS: "${{ steps.secrets.outputs.POSTGRES_PASS }}"
186188
POSTGRES_DB: "${{ steps.secrets.outputs.POSTGRES_DB }}"
187189
POSTGRES_CAS_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CAS_CONNECTION_NAME }}"
188190
POSTGRES_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CAS_PASS }}"
189191
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME }}"
190192
POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}"
193+
POSTGRES_CUSTOMER_CAS_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME }}"
194+
POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME }}"
191195
SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}"
192196
SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}"
193197
SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}"
@@ -275,9 +279,15 @@ jobs:
275279
MYSQL_DB:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_DB
276280
POSTGRES_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CONNECTION_NAME
277281
POSTGRES_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER
278-
POSTGRES_IAM_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER_IAM_NODE
282+
POSTGRES_USER_IAM_NODE:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER_IAM_NODE
279283
POSTGRES_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_PASS
280284
POSTGRES_DB:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_DB
285+
POSTGRES_CAS_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CAS_CONNECTION_NAME
286+
POSTGRES_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CAS_PASS
287+
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_CONNECTION_NAME
288+
POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS
289+
POSTGRES_CUSTOMER_CAS_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_DOMAIN_NAME
290+
POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME
281291
SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME
282292
SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER
283293
SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS
@@ -292,9 +302,15 @@ jobs:
292302
MYSQL_DB: "${{ steps.secrets.outputs.MYSQL_DB }}"
293303
POSTGRES_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CONNECTION_NAME }}"
294304
POSTGRES_USER: "${{ steps.secrets.outputs.POSTGRES_USER }}"
295-
POSTGRES_IAM_USER: "${{ steps.secrets.outputs.POSTGRES_IAM_USER }}"
305+
POSTGRES_IAM_USER: "${{ steps.secrets.outputs.POSTGRES_USER_IAM_NODE }}"
296306
POSTGRES_PASS: "${{ steps.secrets.outputs.POSTGRES_PASS }}"
297307
POSTGRES_DB: "${{ steps.secrets.outputs.POSTGRES_DB }}"
308+
POSTGRES_CAS_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CAS_CONNECTION_NAME }}"
309+
POSTGRES_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CAS_PASS }}"
310+
POSTGRES_CUSTOMER_CAS_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME }}"
311+
POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}"
312+
POSTGRES_CUSTOMER_CAS_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME }}"
313+
POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME }}"
298314
SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}"
299315
SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}"
300316
SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}"

src/cloud-sql-instance.ts

+17-13
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import {IpAddressTypes, selectIpAddress} from './ip-addresses';
1616
import {InstanceConnectionInfo} from './instance-connection-info';
17-
import {parseInstanceConnectionName} from './parse-instance-connection-name';
17+
import {resolveInstanceName} from './parse-instance-connection-name';
1818
import {InstanceMetadata} from './sqladmin-fetcher';
1919
import {generateKeys} from './crypto';
2020
import {RSAKeys} from './rsa-keys';
@@ -54,7 +54,10 @@ export class CloudSQLInstance {
5454
static async getCloudSQLInstance(
5555
options: CloudSQLInstanceOptions
5656
): Promise<CloudSQLInstance> {
57-
const instance = new CloudSQLInstance(options);
57+
const instance = new CloudSQLInstance({
58+
options: options,
59+
instanceInfo: await resolveInstanceName(options.instanceConnectionName),
60+
});
5861
await instance.refresh();
5962
return instance;
6063
}
@@ -80,17 +83,17 @@ export class CloudSQLInstance {
8083
public dnsName = '';
8184

8285
constructor({
83-
ipType,
84-
authType,
85-
instanceConnectionName,
86-
sqlAdminFetcher,
87-
limitRateInterval = 30 * 1000, // 30s default
88-
}: CloudSQLInstanceOptions) {
89-
this.authType = authType;
90-
this.instanceInfo = parseInstanceConnectionName(instanceConnectionName);
91-
this.ipType = ipType;
92-
this.limitRateInterval = limitRateInterval;
93-
this.sqlAdminFetcher = sqlAdminFetcher;
86+
options,
87+
instanceInfo,
88+
}: {
89+
options: CloudSQLInstanceOptions;
90+
instanceInfo: InstanceConnectionInfo;
91+
}) {
92+
this.instanceInfo = instanceInfo;
93+
this.authType = options.authType || AuthTypes.PASSWORD;
94+
this.ipType = options.ipType || IpAddressTypes.PUBLIC;
95+
this.limitRateInterval = options.limitRateInterval || 30 * 1000; // 30 seconds
96+
this.sqlAdminFetcher = options.sqlAdminFetcher;
9497
}
9598

9699
// p-throttle library has to be initialized in an async scope in order to
@@ -284,6 +287,7 @@ export class CloudSQLInstance {
284287
}
285288

286289
cancelRefresh(): void {
290+
// If refresh has not yet started, then cancel the setTimeout
287291
if (this.scheduledRefreshID) {
288292
clearTimeout(this.scheduledRefreshID);
289293
}

src/connector.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export class Connector {
229229
privateKey,
230230
serverCaCert,
231231
serverCaMode,
232-
dnsName,
232+
dnsName: instanceInfo.domainName || dnsName, // use the configured domain name, or the instance dnsName.
233233
});
234234
tlsSocket.once('error', () => {
235235
cloudSqlInstance.forceRefresh();

system-test/pg-connect.cjs

+113-29
Original file line numberDiff line numberDiff line change
@@ -20,77 +20,88 @@ const {Client} = pg;
2020
t.test('open connection and retrieves standard pg tables', async t => {
2121
const connector = new Connector();
2222
const clientOpts = await connector.getOptions({
23-
instanceConnectionName: process.env.POSTGRES_CONNECTION_NAME,
24-
ipType: 'PUBLIC',
25-
authType: 'PASSWORD',
23+
instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME),
2624
});
2725
const client = new Client({
2826
...clientOpts,
29-
user: process.env.POSTGRES_USER,
30-
password: process.env.POSTGRES_PASS,
31-
database: process.env.POSTGRES_DB,
27+
user: String(process.env.POSTGRES_USER),
28+
password: String(process.env.POSTGRES_PASS),
29+
database: String(process.env.POSTGRES_DB),
3230
});
33-
client.connect();
31+
t.after(async ()=>{
32+
try {
33+
await client.end();
34+
} catch (e){}
35+
connector.close();
36+
})
37+
38+
await client.connect();
3439

3540
const {
3641
rows: [result],
3742
} = await client.query('SELECT NOW();');
3843
const returnedDate = result['now'];
3944
t.ok(returnedDate.getTime(), 'should have valid returned date object');
4045

41-
await client.end();
42-
connector.close();
4346
});
4447

4548
t.test('open IAM connection and retrieves standard pg tables', async t => {
4649
const connector = new Connector();
4750
const clientOpts = await connector.getOptions({
48-
instanceConnectionName: process.env.POSTGRES_CONNECTION_NAME,
49-
ipType: 'PUBLIC',
50-
authType: 'IAM',
51+
instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME),
52+
ipType: "PUBLIC",
53+
authType: "IAM",
5154
});
5255
const client = new Client({
5356
...clientOpts,
54-
user: process.env.POSTGRES_IAM_USER,
55-
database: process.env.POSTGRES_DB,
57+
user: String(process.env.POSTGRES_USER_IAM_NODE),
58+
database: String(process.env.POSTGRES_DB),
5659
});
57-
client.connect();
60+
t.after(async ()=>{
61+
try {
62+
await client.end();
63+
} catch (e){}
64+
connector.close();
65+
})
66+
await client.connect();
5867

5968
const {
6069
rows: [result],
6170
} = await client.query('SELECT NOW();');
6271
const returnedDate = result['now'];
6372
t.ok(returnedDate.getTime(), 'should have valid returned date object');
6473

65-
await client.end();
66-
connector.close();
6774
});
6875

6976
t.test(
7077
'open connection to CAS-based CA instance and retrieves standard pg tables',
7178
async t => {
7279
const connector = new Connector();
7380
const clientOpts = await connector.getOptions({
74-
instanceConnectionName: process.env.POSTGRES_CAS_CONNECTION_NAME,
75-
ipType: 'PUBLIC',
76-
authType: 'PASSWORD',
81+
instanceConnectionName: String(process.env.POSTGRES_CAS_CONNECTION_NAME),
7782
});
7883
const client = new Client({
7984
...clientOpts,
80-
user: process.env.POSTGRES_USER,
81-
password: process.env.POSTGRES_CAS_PASS,
82-
database: process.env.POSTGRES_DB,
85+
user: String(process.env.POSTGRES_USER),
86+
password: String(process.env.POSTGRES_CAS_PASS),
87+
database: String(process.env.POSTGRES_DB),
8388
});
84-
client.connect();
89+
t.after(async ()=>{
90+
try {
91+
await client.end();
92+
} catch (e){}
93+
connector.close();
94+
})
95+
96+
await client.connect();
8597

8698
const {
8799
rows: [result],
88100
} = await client.query('SELECT NOW();');
89101
const returnedDate = result['now'];
90102
t.ok(returnedDate.getTime(), 'should have valid returned date object');
91103

92-
await client.end();
93-
connector.close();
104+
94105
}
95106
);
96107

@@ -109,13 +120,86 @@ t.test(
109120
password: String(process.env.POSTGRES_CUSTOMER_CAS_PASS),
110121
database: String(process.env.POSTGRES_DB),
111122
});
112-
client.connect();
123+
t.after(async ()=>{
124+
try {
125+
await client.end();
126+
} catch (e){}
127+
connector.close();
128+
})
129+
130+
await client.connect();
113131
const {
114132
rows: [result],
115133
} = await client.query('SELECT NOW();');
116134
const returnedDate = result['now'];
117135
t.ok(returnedDate.getTime(), 'should have valid returned date object');
118-
await client.end();
119-
connector.close();
136+
137+
}
138+
);
139+
140+
t.test(
141+
'open connection to Domain Name instance retrieves standard pg tables',
142+
async t => {
143+
const connector = new Connector();
144+
const clientOpts = await connector.getOptions({
145+
instanceConnectionName: String(
146+
process.env.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME
147+
),
148+
});
149+
const client = new Client({
150+
...clientOpts,
151+
user: String(process.env.POSTGRES_USER),
152+
password: String(process.env.POSTGRES_CUSTOMER_CAS_PASS),
153+
database: String(process.env.POSTGRES_DB),
154+
});
155+
t.after(async ()=>{
156+
try {
157+
await client.end();
158+
} catch (e){}
159+
connector.close();
160+
})
161+
162+
await client.connect();
163+
const {
164+
rows: [result],
165+
} = await client.query('SELECT NOW();');
166+
const returnedDate = result['now'];
167+
t.ok(returnedDate.getTime(), 'should have valid returned date object');
168+
169+
}
170+
);
171+
172+
t.test(
173+
'open connection to Domain Name invalid domain name rejects connection',
174+
async t => {
175+
const connector = new Connector();
176+
const clientOpts = await connector.getOptions({
177+
instanceConnectionName: String(
178+
process.env.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME
179+
),
180+
});
181+
const client = new Client({
182+
...clientOpts,
183+
user: String(process.env.POSTGRES_USER),
184+
password: String(process.env.POSTGRES_CUSTOMER_CAS_PASS),
185+
database: String(process.env.POSTGRES_DB),
186+
});
187+
t.after(async ()=>{
188+
console.log("Ending...")
189+
try {
190+
await client.end();
191+
} catch (e){}
192+
connector.close();
193+
console.log("Ended...")
194+
195+
})
196+
try{
197+
await client.connect()
198+
t.fail("Should throw exception")
199+
} catch (e){
200+
t.same(e.code, 'ERR_TLS_CERT_ALTNAME_INVALID')
201+
} finally {
202+
t.end()
203+
}
120204
}
121205
);

0 commit comments

Comments
 (0)