diff --git a/.ci/cloudbuild.yaml b/.ci/cloudbuild.yaml index bda91a7..79a8fe6 100644 --- a/.ci/cloudbuild.yaml +++ b/.ci/cloudbuild.yaml @@ -25,6 +25,8 @@ steps: "MYSQL_IAM_USER", "MYSQL_PASS", "MYSQL_DB", + "MYSQL_MCP_CONNECTION_NAME", + "MYSQL_MCP_PASS", "POSTGRES_CONNECTION_NAME", "POSTGRES_USER", "POSTGRES_IAM_USER", @@ -62,6 +64,10 @@ availableSecrets: env: "MYSQL_PASS" - versionName: "projects/$PROJECT_ID/secrets/MYSQL_DB/versions/latest" env: "MYSQL_DB" + - versionName: "projects/$PROJECT_ID/secrets/MYSQL_MCP_CONNECTION_NAME/versions/latest" + env: "MYSQL_MCP_CONNECTION_NAME" + - versionName: "projects/$PROJECT_ID/secrets/MYSQL_MCP_PASS/versions/latest" + env: "MYSQL_MCP_PASS" - versionName: "projects/$PROJECT_ID/secrets/POSTGRES_CONNECTION_NAME/versions/latest" env: "POSTGRES_CONNECTION_NAME" - versionName: "projects/$PROJECT_ID/secrets/POSTGRES_USER/versions/latest" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7d4185b..57e3900 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -152,6 +152,8 @@ jobs: MYSQL_IAM_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_USER_IAM_NODE MYSQL_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_PASS MYSQL_DB:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_DB + MYSQL_MCP_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_MCP_CONNECTION_NAME + MYSQL_MCP_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/MYSQL_MCP_PASS POSTGRES_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CONNECTION_NAME POSTGRES_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER POSTGRES_IAM_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_USER_IAM_NODE @@ -183,6 +185,8 @@ jobs: MYSQL_IAM_USER: "${{ steps.secrets.outputs.MYSQL_IAM_USER }}" MYSQL_PASS: "${{ steps.secrets.outputs.MYSQL_PASS }}" MYSQL_DB: "${{ steps.secrets.outputs.MYSQL_DB }}" + MYSQL_MCP_CONNECTION_NAME: "${{ steps.secrets.outputs.MYSQL_MCP_CONNECTION_NAME }}" + MYSQL_MCP_PASS: "${{ steps.secrets.outputs.MYSQL_MCP_PASS }}" POSTGRES_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_CONNECTION_NAME }}" POSTGRES_USER: "${{ steps.secrets.outputs.POSTGRES_USER }}" POSTGRES_IAM_USER: "${{ steps.secrets.outputs.POSTGRES_IAM_USER }}" diff --git a/system-test/mysql2-connect.cjs b/system-test/mysql2-connect.cjs index 0a91361..fe72a8d 100644 --- a/system-test/mysql2-connect.cjs +++ b/system-test/mysql2-connect.cjs @@ -58,3 +58,46 @@ t.test('open IAM connection and run basic mysql commands', async t => { await conn.end(); connector.close(); }); + +t.test('open connection to MCP instance and run basic mysql commands', async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: process.env.MYSQL_MCP_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', + authType: 'PASSWORD', + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: process.env.MYSQL_USER, + password: process.env.MYSQL_MCP_PASS, + database: process.env.MYSQL_DB, + }); + + const [[result]] = await conn.query('SELECT NOW();'); + const returnedDate = result['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +}); + +t.test('open IAM connection to MCP instance and run basic mysql commands', async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: process.env.MYSQL_MCP_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', + authType: 'IAM', + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: process.env.MYSQL_IAM_USER, + database: process.env.MYSQL_DB, + }); + + const [[result]] = await conn.query('SELECT NOW();'); + const returnedDate = result['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +}); diff --git a/system-test/mysql2-connect.mjs b/system-test/mysql2-connect.mjs index 86a6f89..b207b86 100644 --- a/system-test/mysql2-connect.mjs +++ b/system-test/mysql2-connect.mjs @@ -58,3 +58,46 @@ t.test('open IAM connection and run basic mysql commands', async t => { await conn.end(); connector.close(); }); + +t.test('open connection and run basic mysql commands', async t => { + const connector = new Connector(); + const clientOpts = await connector.getOptions({ + instanceConnectionName: process.env.MYSQL_MCP_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', + authType: 'PASSWORD', + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: process.env.MYSQL_USER, + password: process.env.MYSQL_MCP_PASS, + database: process.env.MYSQL_DB, + }); + + const [[result]] = await conn.query('SELECT NOW();'); + const returnedDate = result['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +}); + +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_MCP_CONNECTION_NAME, + ipType: process.env.IP_TYPE || 'PUBLIC', + authType: 'IAM', + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: process.env.MYSQL_IAM_USER, + database: process.env.MYSQL_DB, + }); + + const [[result]] = await conn.query('SELECT NOW();'); + const returnedDate = result['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +}); diff --git a/system-test/mysql2-connect.ts b/system-test/mysql2-connect.ts index a7e24e0..3b0aaef 100644 --- a/system-test/mysql2-connect.ts +++ b/system-test/mysql2-connect.ts @@ -67,3 +67,46 @@ t.test('open IAM connection and run basic mysql commands', async t => { await conn.end(); connector.close(); }); + +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_MCP_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: String(process.env.MYSQL_USER), + password: String(process.env.MYSQL_MCP_PASS), + database: String(process.env.MYSQL_DB), + }); + + const [result] = await conn.query('SELECT NOW();'); + const [row] = result; + const returnedDate = row['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +}); + +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_MCP_CONNECTION_NAME), + ipType: process.env.IP_TYPE || IpAddressTypes.PUBLIC, + authType: AuthTypes.IAM, + }); + const conn = await mysql.createConnection({ + ...clientOpts, + user: String(process.env.MYSQL_IAM_USER), + database: String(process.env.MYSQL_DB), + }); + + const [[result]] = await conn.query('SELECT NOW();'); + const returnedDate = result['NOW()']; + t.ok(returnedDate.getTime(), 'should have valid returned date object'); + + await conn.end(); + connector.close(); +});