From 56d08e57e2cfa7d84718eeea38d0b61acdcfca2e Mon Sep 17 00:00:00 2001 From: kgala2 Date: Thu, 10 Apr 2025 11:47:59 -0700 Subject: [PATCH 1/2] chore: add pg-tests for MCP instance --- .ci/cloudbuild.yaml | 110 ++++++++++++++++++++++-------------- .github/workflows/tests.yml | 4 ++ system-test/pg-connect.cjs | 28 +++++++++ system-test/pg-connect.mjs | 32 +++++++++++ system-test/pg-connect.ts | 29 ++++++++++ 5 files changed, 162 insertions(+), 41 deletions(-) diff --git a/.ci/cloudbuild.yaml b/.ci/cloudbuild.yaml index 331559cd..bda91a75 100644 --- a/.ci/cloudbuild.yaml +++ b/.ci/cloudbuild.yaml @@ -18,7 +18,31 @@ steps: 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'] + 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", + "POSTGRES_MCP_CONNECTION_NAME", + "POSTGRES_MCP_PASS", + "SQLSERVER_CONNECTION_NAME", + "SQLSERVER_USER", + "SQLSERVER_PASS", + "SQLSERVER_DB", + ] args: - "-c" - | @@ -28,46 +52,50 @@ steps: 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' + - 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/POSTGRES_MCP_CONNECTION_NAME/versions/latest" + env: "POSTGRES_MCP_CONNECTION_NAME" + - versionName: "projects/$PROJECT_ID/secrets/POSTGRES_MCP_PASS/versions/latest" + env: "POSTGRES_MCP_PASS" + - 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} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index da51b98f..7d4185b8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -163,6 +163,8 @@ jobs: POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS POSTGRES_CUSTOMER_CAS_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_DOMAIN_NAME POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME + POSTGRES_MCP_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_CONNECTION_NAME + POSTGRES_MCP_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_PASS SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS @@ -192,6 +194,8 @@ jobs: POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}" POSTGRES_CUSTOMER_CAS_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_DOMAIN_NAME }}" POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_INVALID_DOMAIN_NAME }}" + POSTGRES_MCP_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_MCP_CONNECTION_NAME }}" + POSTGRES_MCP_PASS: "${{ steps.secrets.outputs.POSTGRES_MCP_PASS }}" SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}" SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}" SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}" diff --git a/system-test/pg-connect.cjs b/system-test/pg-connect.cjs index f100a6e7..8c52b160 100644 --- a/system-test/pg-connect.cjs +++ b/system-test/pg-connect.cjs @@ -204,3 +204,31 @@ t.test( } ); +t.test('open connection to MCP instance retrieves standard pg tables', async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: process.env.POSTGRES_MCP_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', + }); + const client = new Client({ + ...clientOpts, + user: process.env.POSTGRES_USER, + password: process.env.POSTGRES_MCP_PASS, + database: process.env.POSTGRES_DB, + }); + t.after(async () => { + try { + await client.end(); + } finally { + connector.close(); + } + }); + + await client.connect(); + + const { + rows: [result], + } = await client.query('SELECT NOW();'); + const returnedDate = result['now']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); +}); diff --git a/system-test/pg-connect.mjs b/system-test/pg-connect.mjs index ff41576f..2476492d 100644 --- a/system-test/pg-connect.mjs +++ b/system-test/pg-connect.mjs @@ -204,3 +204,35 @@ t.test( } } ); + +t.test( + 'open connection to MCP instance retrieves standard pg tables', + async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: String(process.env.POSTGRES_MCP_CONNECTION_NAME), + ipType: process.env.IP_TYPE || 'PUBLIC', + }); + const client = new Client({ + ...clientOpts, + user: String(process.env.POSTGRES_USER), + password: String(process.env.POSTGRES_MCP_PASS), + database: String(process.env.POSTGRES_DB), + }); + t.after(async () => { + try { + await client.end(); + } finally { + connector.close(); + } + }); + + await client.connect(); + + const { + rows: [result], + } = await client.query('SELECT NOW();'); + const returnedDate = result['now']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + } +); diff --git a/system-test/pg-connect.ts b/system-test/pg-connect.ts index 0966aa3a..2dea7d26 100644 --- a/system-test/pg-connect.ts +++ b/system-test/pg-connect.ts @@ -207,3 +207,32 @@ t.test( } } ); + +t.test('open connection to MCP instance retrieves standard pg tables', async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: String(process.env.POSTGRES_MCP_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, + }); + const client = new Client({ + ...clientOpts, + user: String(process.env.POSTGRES_USER), + password: String(process.env.POSTGRES_MCP_PASS), + database: String(process.env.POSTGRES_DB), + }); + t.after(async () => { + try { + await client.end(); + } finally { + connector.close(); + } + }); + + await client.connect(); + + const { + rows: [result], + } = await client.query('SELECT NOW();'); + const returnedDate = result['now']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); +}); From 31e2e7d948d6c7d2b622a2c068658d0d4422687e Mon Sep 17 00:00:00 2001 From: kgala2 Date: Thu, 10 Apr 2025 12:51:26 -0700 Subject: [PATCH 2/2] chore: run lint --- system-test/pg-connect.ts | 55 +++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/system-test/pg-connect.ts b/system-test/pg-connect.ts index 2dea7d26..436504d6 100644 --- a/system-test/pg-connect.ts +++ b/system-test/pg-connect.ts @@ -208,31 +208,34 @@ t.test( } ); -t.test('open connection to MCP instance retrieves standard pg tables', async t => { - const connector = new Connector(); - const clientOpts = await connector.getOptions({ - instanceConnectionName: String(process.env.POSTGRES_MCP_CONNECTION_NAME), - ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, - }); - const client = new Client({ - ...clientOpts, - user: String(process.env.POSTGRES_USER), - password: String(process.env.POSTGRES_MCP_PASS), - database: String(process.env.POSTGRES_DB), - }); - t.after(async () => { - try { - await client.end(); - } finally { - connector.close(); - } - }); +t.test( + 'open connection to MCP instance retrieves standard pg tables', + async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: String(process.env.POSTGRES_MCP_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, + }); + const client = new Client({ + ...clientOpts, + user: String(process.env.POSTGRES_USER), + password: String(process.env.POSTGRES_MCP_PASS), + database: String(process.env.POSTGRES_DB), + }); + t.after(async () => { + try { + await client.end(); + } finally { + connector.close(); + } + }); - await client.connect(); + await client.connect(); - const { - rows: [result], - } = await client.query('SELECT NOW();'); - const returnedDate = result['now']; - t.ok(returnedDate.getTime(), 'should have valid returned date object'); -}); + const { + rows: [result], + } = await client.query('SELECT NOW();'); + const returnedDate = result['now']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + } +);