diff --git a/.ci/cloudbuild.yaml b/.ci/cloudbuild.yaml new file mode 100644 index 00000000..331559cd --- /dev/null +++ b/.ci/cloudbuild.yaml @@ -0,0 +1,78 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +steps: + - id: run integration tests + name: node:${_VERSION} + entrypoint: bash + env: + - "IP_TYPE=${_IP_TYPE}" + secretEnv: ['MYSQL_CONNECTION_NAME', 'MYSQL_USER', 'MYSQL_IAM_USER', 'MYSQL_PASS', 'MYSQL_DB', 'POSTGRES_CONNECTION_NAME', 'POSTGRES_USER', 'POSTGRES_IAM_USER', 'POSTGRES_PASS', 'POSTGRES_DB', 'POSTGRES_CAS_CONNECTION_NAME', 'POSTGRES_CAS_PASS', 'POSTGRES_CUSTOMER_CAS_CONNECTION_NAME', 'POSTGRES_CUSTOMER_CAS_PASS', 'POSTGRES_CUSTOMER_CAS_DOMAIN_NAME', 'POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME', 'SQLSERVER_CONNECTION_NAME', 'SQLSERVER_USER', 'SQLSERVER_PASS', 'SQLSERVER_DB'] + args: + - "-c" + - | + npm link + npm link @google-cloud/cloud-sql-connector + npx tap -c -t0 --disable-coverage --allow-empty-coverage system-test -o test_results.tap + timeout: 300s +availableSecrets: + secretManager: + - versionName: 'projects/$PROJECT_ID/secrets/MYSQL_CONNECTION_NAME/versions/latest' + env: 'MYSQL_CONNECTION_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/MYSQL_USER/versions/latest' + env: 'MYSQL_USER' + - versionName: 'projects/$PROJECT_ID/secrets/CLOUD_BUILD_MYSQL_IAM_USER/versions/latest' + env: 'MYSQL_IAM_USER' + - versionName: 'projects/$PROJECT_ID/secrets/MYSQL_PASS/versions/latest' + env: 'MYSQL_PASS' + - versionName: 'projects/$PROJECT_ID/secrets/MYSQL_DB/versions/latest' + env: 'MYSQL_DB' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CONNECTION_NAME/versions/latest' + env: 'POSTGRES_CONNECTION_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_USER/versions/latest' + env: 'POSTGRES_USER' + - versionName: 'projects/$PROJECT_ID/secrets/CLOUD_BUILD_POSTGRES_IAM_USER/versions/latest' + env: 'POSTGRES_IAM_USER' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_PASS/versions/latest' + env: 'POSTGRES_PASS' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_DB/versions/latest' + env: 'POSTGRES_DB' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CAS_CONNECTION_NAME/versions/latest' + env: 'POSTGRES_CAS_CONNECTION_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CAS_PASS/versions/latest' + env: 'POSTGRES_CAS_PASS' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CUSTOMER_CAS_CONNECTION_NAME/versions/latest' + env: 'POSTGRES_CUSTOMER_CAS_CONNECTION_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CUSTOMER_CAS_PASS/versions/latest' + env: 'POSTGRES_CUSTOMER_CAS_PASS' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CUSTOMER_CAS_DOMAIN_NAME/versions/latest' + env: 'POSTGRES_CUSTOMER_CAS_DOMAIN_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME/versions/latest' + env: 'POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/SQLSERVER_CONNECTION_NAME/versions/latest' + env: 'SQLSERVER_CONNECTION_NAME' + - versionName: 'projects/$PROJECT_ID/secrets/SQLSERVER_USER/versions/latest' + env: 'SQLSERVER_USER' + - versionName: 'projects/$PROJECT_ID/secrets/SQLSERVER_PASS/versions/latest' + env: 'SQLSERVER_PASS' + - versionName: 'projects/$PROJECT_ID/secrets/SQLSERVER_DB/versions/latest' + env: 'SQLSERVER_DB' +substitutions: + _VERSION: ${_VERSION} + _IP_TYPE: ${_IP_TYPE} +options: + dynamicSubstitutions: true + pool: + name: ${_POOL_NAME} + logging: CLOUD_LOGGING_ONLY diff --git a/.gitignore b/.gitignore index 8cc243e2..e5f3b799 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ !/.trampolinerc !/.kokoro !/tsconfig*.json +!/.ci diff --git a/system-test/mysql2-connect.cjs b/system-test/mysql2-connect.cjs index e7253f54..0a91361f 100644 --- a/system-test/mysql2-connect.cjs +++ b/system-test/mysql2-connect.cjs @@ -20,7 +20,7 @@ t.test('open connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.MYSQL_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'PASSWORD', }); const conn = await mysql.createConnection({ @@ -42,7 +42,7 @@ t.test('open IAM connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.MYSQL_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'IAM', }); const conn = await mysql.createConnection({ diff --git a/system-test/mysql2-connect.mjs b/system-test/mysql2-connect.mjs index 9811eb61..86a6f898 100644 --- a/system-test/mysql2-connect.mjs +++ b/system-test/mysql2-connect.mjs @@ -20,7 +20,7 @@ t.test('open connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.MYSQL_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'PASSWORD', }); const conn = await mysql.createConnection({ @@ -42,7 +42,7 @@ t.test('open IAM connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.MYSQL_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'IAM', }); const conn = await mysql.createConnection({ diff --git a/system-test/mysql2-connect.ts b/system-test/mysql2-connect.ts index 4da5b546..a7e24e06 100644 --- a/system-test/mysql2-connect.ts +++ b/system-test/mysql2-connect.ts @@ -29,6 +29,7 @@ t.test('open connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.MYSQL_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const conn = await mysql.createConnection({ ...clientOpts, @@ -50,7 +51,7 @@ t.test('open IAM connection and run basic mysql commands', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.MYSQL_CONNECTION_NAME), - ipType: IpAddressTypes.PUBLIC, + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, authType: AuthTypes.IAM, }); const conn = await mysql.createConnection({ diff --git a/system-test/pg-connect.cjs b/system-test/pg-connect.cjs index ddd86157..f100a6e7 100644 --- a/system-test/pg-connect.cjs +++ b/system-test/pg-connect.cjs @@ -21,6 +21,7 @@ t.test('open connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.POSTGRES_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -49,7 +50,7 @@ t.test('open IAM connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: process.env.POSTGRES_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'IAM', }); const client = new Client({ @@ -79,6 +80,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CAS_CONNECTION_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -112,6 +114,7 @@ t.test( instanceConnectionName: String( process.env.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME ), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -142,6 +145,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -172,6 +176,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, diff --git a/system-test/pg-connect.mjs b/system-test/pg-connect.mjs index 6860bdc7..ff41576f 100644 --- a/system-test/pg-connect.mjs +++ b/system-test/pg-connect.mjs @@ -22,6 +22,7 @@ t.test('open connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -50,7 +51,7 @@ t.test('open IAM connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME), - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', authType: 'IAM', }); const client = new Client({ @@ -80,6 +81,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CAS_CONNECTION_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -113,6 +115,7 @@ t.test( instanceConnectionName: String( process.env.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME ), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -143,6 +146,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, @@ -173,6 +177,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', }); const client = new Client({ ...clientOpts, diff --git a/system-test/pg-connect.ts b/system-test/pg-connect.ts index 60fe3076..0966aa3a 100644 --- a/system-test/pg-connect.ts +++ b/system-test/pg-connect.ts @@ -25,6 +25,7 @@ t.test('open connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const client = new Client({ ...clientOpts, @@ -53,7 +54,7 @@ t.test('open IAM connection and retrieves standard pg tables', async t => { const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CONNECTION_NAME), - ipType: IpAddressTypes.PUBLIC, + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, authType: AuthTypes.IAM, }); const client = new Client({ @@ -83,6 +84,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ instanceConnectionName: String(process.env.POSTGRES_CAS_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const client = new Client({ ...clientOpts, @@ -116,6 +118,7 @@ t.test( instanceConnectionName: String( process.env.POSTGRES_CUSTOMER_CAS_CONNECTION_NAME ), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const client = new Client({ ...clientOpts, @@ -146,6 +149,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const client = new Client({ ...clientOpts, @@ -176,6 +180,7 @@ t.test( const connector = new Connector(); const clientOpts = await connector.getOptions({ domainName: String(process.env.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const client = new Client({ ...clientOpts, diff --git a/system-test/tedious-connect.cjs b/system-test/tedious-connect.cjs index f2ead835..56cfadee 100644 --- a/system-test/tedious-connect.cjs +++ b/system-test/tedious-connect.cjs @@ -20,7 +20,7 @@ t.test('open connection and run basic sqlserver commands', async t => { const connector = new Connector(); const clientOpts = await connector.getTediousOptions({ instanceConnectionName: process.env.SQLSERVER_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', }); const connection = new Connection({ server: '0.0.0.0', diff --git a/system-test/tedious-connect.mjs b/system-test/tedious-connect.mjs index 9fd0aa73..a5414441 100644 --- a/system-test/tedious-connect.mjs +++ b/system-test/tedious-connect.mjs @@ -20,7 +20,7 @@ t.test('open connection and run basic sqlserver commands', async t => { const connector = new Connector(); const clientOpts = await connector.getTediousOptions({ instanceConnectionName: process.env.SQLSERVER_CONNECTION_NAME, - ipType: 'PUBLIC', + ipType: process.env.IP_TYPE || 'PUBLIC', }); const connection = new Connection({ server: '0.0.0.0', diff --git a/system-test/tedious-connect.ts b/system-test/tedious-connect.ts index e789e273..ad7d62a1 100644 --- a/system-test/tedious-connect.ts +++ b/system-test/tedious-connect.ts @@ -20,7 +20,7 @@ t.test('open connection and run basic sqlserver commands', async t => { const connector = new Connector(); const clientOpts = await connector.getTediousOptions({ instanceConnectionName: String(process.env.SQLSERVER_CONNECTION_NAME), - ipType: IpAddressTypes.PUBLIC, + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, }); const connection = new Connection({ server: '0.0.0.0',