Skip to content

Commit 769b065

Browse files
committed
chore: add domainName to InstanceConnectionInfo, part of DNS Config.
1 parent 0d0adaf commit 769b065

File tree

4 files changed

+45
-14
lines changed

4 files changed

+45
-14
lines changed

src/instance-connection-info.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ export interface InstanceConnectionInfo {
1616
projectId: string;
1717
regionId: string;
1818
instanceId: string;
19+
domainName: string | undefined;
1920
}

src/parse-instance-connection-name.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@
1515
import {InstanceConnectionInfo} from './instance-connection-info';
1616
import {CloudSQLConnectorError} from './errors';
1717

18+
const connectionNameRegex =
19+
/^(?<projectId>[^:]+(:[^:]+)?):(?<regionId>[^:]+):(?<instanceId>[^:]+)$/;
20+
21+
// The domain name pattern in accordance with RFC 1035, RFC 1123 and RFC 2181.
22+
// From Go Connector:
23+
const domainNameRegex =
24+
/^(?:[_a-z0-9](?:[_a-z0-9-]{0,61}[a-z0-9])?\.)+(?:[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?)?$/;
25+
26+
export function isValidDomainName(name: string): boolean {
27+
const matches = String(name).match(domainNameRegex);
28+
return Boolean(matches);
29+
}
30+
31+
export function isInstanceConnectionName(name: string): boolean {
32+
const matches = String(name).match(connectionNameRegex);
33+
return Boolean(matches);
34+
}
35+
1836
export function parseInstanceConnectionName(
1937
instanceConnectionName: string | undefined
2038
): InstanceConnectionInfo {
@@ -26,20 +44,8 @@ export function parseInstanceConnectionName(
2644
});
2745
}
2846

29-
const connectionNameRegex =
30-
/(?<projectId>[^:]+(:[^:]+)?):(?<regionId>[^:]+):(?<instanceId>[^:]+)/;
3147
const matches = String(instanceConnectionName).match(connectionNameRegex);
32-
if (!matches) {
33-
throw new CloudSQLConnectorError({
34-
message:
35-
'Malformed instance connection name provided: expected format ' +
36-
`of "PROJECT:REGION:INSTANCE", got ${instanceConnectionName}`,
37-
code: 'EBADCONNECTIONNAME',
38-
});
39-
}
40-
41-
const unmatchedItems = matches[0] !== matches.input;
42-
if (unmatchedItems || !matches.groups) {
48+
if (!matches || !matches.groups) {
4349
throw new CloudSQLConnectorError({
4450
message:
4551
'Malformed instance connection name provided: expected format ' +
@@ -52,5 +58,6 @@ export function parseInstanceConnectionName(
5258
projectId: matches.groups.projectId,
5359
regionId: matches.groups.regionId,
5460
instanceId: matches.groups.instanceId,
61+
domainName: undefined,
5562
};
5663
}

test/cloud-sql-instance.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ t.test('CloudSQLInstance', async t => {
8080
projectId: 'my-project',
8181
regionId: 'us-east1',
8282
instanceId: 'my-instance',
83+
domainName: undefined,
8384
},
8485
'should have expected connection info'
8586
);

test/parse-instance-connection-name.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
// limitations under the License.
1414

1515
import t from 'tap';
16-
import {parseInstanceConnectionName} from '../src/parse-instance-connection-name';
16+
import {
17+
parseInstanceConnectionName,
18+
isValidDomainName,
19+
isInstanceConnectionName,
20+
} from '../src/parse-instance-connection-name';
1721

1822
t.throws(
1923
() => parseInstanceConnectionName(undefined),
@@ -71,6 +75,7 @@ t.same(
7175
projectId: 'my-project',
7276
regionId: 'region-1',
7377
instanceId: 'my-instance',
78+
domainName: undefined,
7479
},
7580
'should be able to parse standard data'
7681
);
@@ -81,6 +86,23 @@ t.same(
8186
projectId: 'google.com:PROJECT',
8287
regionId: 'region-02',
8388
instanceId: 'my-instance',
89+
domainName: undefined,
8490
},
8591
'should support legacy domain scoped project id'
8692
);
93+
94+
t.same(isValidDomainName('project.example.com'), true, 'valid domain name');
95+
96+
t.same(isValidDomainName('google.com:PROJECT'), false, 'invalid domain name');
97+
98+
t.same(
99+
isInstanceConnectionName('my-project:region-1:my-instance'),
100+
true,
101+
'invalid domain name'
102+
);
103+
104+
t.same(
105+
isInstanceConnectionName('project.example.com'),
106+
false,
107+
'should validate domain name'
108+
);

0 commit comments

Comments
 (0)