diff --git a/.changeset/pretty-worms-walk.md b/.changeset/pretty-worms-walk.md new file mode 100644 index 0000000000..890b0dca5b --- /dev/null +++ b/.changeset/pretty-worms-walk.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Allow passing IP type to use with cloud-sql-connector diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index aa97313921..438790a177 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -429,6 +429,10 @@ export interface Config { * The instance connection name for the cloudsql instance, e.g. `project:region:instance` */ instance: string; + /** + * The ip address type to use for the connection. Defaults to 'PUBLIC' + */ + ipAddressType?: 'PUBLIC' | 'PRIVATE' | 'PSC'; } | { /** diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts index 1a3691c83b..254bdf6c9d 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts @@ -221,6 +221,63 @@ describe('postgres', () => { }); }); + it('passes default settings to cloud-sql-connector', async () => { + const { Connector } = jest.requireMock( + '@google-cloud/cloud-sql-connector', + ) as jest.Mocked; + + const mockStream = (): any => {}; + Connector.prototype.getOptions.mockResolvedValue({ stream: mockStream }); + + await buildPgDatabaseConfig( + new ConfigReader({ + client: 'pg', + connection: { + type: 'cloudsql', + user: 'ben@gke.com', + instance: 'project:region:instance', + port: 5423, + }, + }), + { connection: { database: 'other_db' } }, + ); + + expect(Connector.prototype.getOptions).toHaveBeenCalledWith({ + authType: 'IAM', + instanceConnectionName: 'project:region:instance', + ipType: 'PUBLIC', + }); + }); + + it('passes ip settings to cloud-sql-connector', async () => { + const { Connector } = jest.requireMock( + '@google-cloud/cloud-sql-connector', + ) as jest.Mocked; + + const mockStream = (): any => {}; + Connector.prototype.getOptions.mockResolvedValue({ stream: mockStream }); + + await buildPgDatabaseConfig( + new ConfigReader({ + client: 'pg', + connection: { + type: 'cloudsql', + user: 'ben@gke.com', + instance: 'project:region:instance', + ipAddressType: 'PRIVATE', + port: 5423, + }, + }), + { connection: { database: 'other_db' } }, + ); + + expect(Connector.prototype.getOptions).toHaveBeenCalledWith({ + authType: 'IAM', + instanceConnectionName: 'project:region:instance', + ipType: 'PRIVATE', + }); + }); + it('throws an error when the connection type is not supported', async () => { await expect( buildPgDatabaseConfig( diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts index 3583049a7d..4adf77a2f6 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts @@ -107,7 +107,7 @@ export async function buildPgDatabaseConfig( const connector = new CloudSqlConnector(); const clientOpts = await connector.getOptions({ instanceConnectionName: config.connection.instance, - ipType: IpAddressTypes.PUBLIC, + ipType: config.connection.ipAddressType ?? IpAddressTypes.PUBLIC, authType: AuthTypes.IAM, });