diff --git a/web/packages/shared/services/databases/databases.ts b/web/packages/shared/services/databases/databases.ts index e92c18c3d0922..c4a19efc5f9fc 100644 --- a/web/packages/shared/services/databases/databases.ts +++ b/web/packages/shared/services/databases/databases.ts @@ -43,7 +43,9 @@ export type DbProtocol = | 'cassandra' | 'elasticsearch' | 'opensearch' - | 'dynamodb'; + | 'dynamodb' + | 'clickhouse' + | 'clickhouse-http'; const formatProtocol = (input: DbProtocol) => { switch (input) { diff --git a/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.story.tsx b/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.story.tsx index 3ffd96b436556..1798e2303c716 100644 --- a/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.story.tsx +++ b/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.story.tsx @@ -24,7 +24,7 @@ export default { title: 'Teleport/Databases/Connect', }; -export const Connect = () => ( +export const ConnectDbNameFlagRequired = () => ( ( /> ); +export const ConnectDbNameFlagOptional = () => ( + null} + authType="local" + /> +); + +export const ConnectNoDbNameFlag = () => ( + null} + authType="local" + /> +); + +export const ConnectDynamodb = () => ( + null} + authType="local" + /> +); + export const ConnectWithRequestId = () => { return ( { render(); + // --db-name flag should be required const expectedOutput = - 'tsh db connect [--db-user=] [--db-name=] aurora'; + 'tsh db connect aurora --db-user= --db-name='; expect(screen.getByText(expectedOutput)).toBeInTheDocument(); }); @@ -34,8 +35,27 @@ test('correct connect command generated for postgres db', () => { test('correct connect command generated for mysql db', () => { render(); + // --db-name flag should be optional const expectedOutput = - 'tsh db connect [--db-user=] [--db-name=] aurora'; + 'tsh db connect aurora --db-user= [--db-name=]'; + + expect(screen.getByText(expectedOutput)).toBeInTheDocument(); +}); + +test('correct connect command generated for redis', () => { + render(); + + // There should be no --db-name flag + const expectedOutput = 'tsh db connect aurora --db-user='; + + expect(screen.getByText(expectedOutput)).toBeInTheDocument(); +}); + +test('correct connect command generated for dynamodb', () => { + render(); + + // Command should be `tsh proxy db --tunnel` instead of `tsh connect db` + const expectedOutput = 'tsh proxy db --tunnel aurora --db-user='; expect(screen.getByText(expectedOutput)).toBeInTheDocument(); }); diff --git a/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.tsx b/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.tsx index 505ef2034e3a1..7d6427d0d8b1c 100644 --- a/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.tsx +++ b/web/packages/teleport/src/Databases/ConnectDialog/ConnectDialog.tsx @@ -37,7 +37,40 @@ export default function ConnectDialog({ onClose, authType, accessRequestId, + dbProtocol, }: Props) { + // For dynamodb and clickhouse-http protocols, the command is `tsh proxy db --tunnel` instead of `tsh db connect`. + let connectCommand = + dbProtocol == 'dynamodb' || dbProtocol == 'clickhouse-http' + ? 'proxy db --tunnel' + : 'db connect'; + + // Adjust `--db-name` flag based on db protocol, as it's required for + // some, optional for some, and unsupported by some. + let dbNameFlag: string; + switch (dbProtocol) { + case 'postgres': + case 'sqlserver': + case 'oracle': + case 'mongodb': + // Required + dbNameFlag = ' --db-name='; + break; + case 'cassandra': + case 'clickhouse': + case 'clickhouse-http': + case 'dynamodb': + case 'opensearch': + case 'elasticsearch': + case 'redis': + // No flag + dbNameFlag = ''; + break; + default: + // Default to optional + dbNameFlag = ' [--db-name=]'; + } + return ( ({ @@ -71,26 +104,16 @@ export default function ConnectDialog({ Step 2 - {' - Retrieve credentials for the database'} - ] [--db-name=] ${dbName}`} - /> - - - - Step 3 - {' - Connect to the database'} ] [--db-name=] ${dbName}`} + text={`tsh ${connectCommand} ${dbName} --db-user= ${dbNameFlag}`} /> {accessRequestId && ( - Step 4 (Optional) + Step 3 (Optional) {' - When finished, drop the assumed role'} diff --git a/web/packages/teleport/src/Databases/ConnectDialog/__snapshots__/ConnectDialog.test.tsx.snap b/web/packages/teleport/src/Databases/ConnectDialog/__snapshots__/ConnectDialog.test.tsx.snap index 5f1ba482c8686..6bc6fca6cbcc1 100644 --- a/web/packages/teleport/src/Databases/ConnectDialog/__snapshots__/ConnectDialog.test.tsx.snap +++ b/web/packages/teleport/src/Databases/ConnectDialog/__snapshots__/ConnectDialog.test.tsx.snap @@ -291,42 +291,6 @@ exports[`render dialog with instructions to connect to database 1`] = ` class="c10" > Step 2 - - - Retrieve credentials for the database -
-
-
- $ -
-
- tsh db login [--db-user=<user>] [--db-name=<name>] aurora -
-
- -
- -
- - Step 3 - Connect to the database
- tsh db connect [--db-user=<user>] [--db-name=<name>] aurora + tsh db connect aurora --db-user=<user> --db-name=<name>
-
- -
- - Step 3 - Connect to the database
- tsh db connect [--db-user=<user>] [--db-name=<name>] aurora + tsh db connect aurora --db-user=<user> --db-name=<name>