Skip to content

Commit e559114

Browse files
authored
feat(firebolt): Switch to the new auth method (#8182)
* feat(firebolt): Switch to the new auth method * fix env test
1 parent a20f4b2 commit e559114

File tree

7 files changed

+59
-15
lines changed

7 files changed

+59
-15
lines changed

docs/pages/product/configuration/data-sources/firebolt.mdx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ their [Help Center][firebolt-help].
1414

1515
## Prerequisites
1616

17-
- The username/password for your [Firebolt][firebolt] account
17+
- The id/secret (client id/client secret) for your [Firebolt][firebolt] [service account][firebolt-service-accounts]
1818

1919
## Setup
2020

@@ -24,7 +24,7 @@ Add the following to a `.env` file in your Cube project:
2424

2525
```dotenv
2626
CUBEJS_DB_NAME=firebolt_database
27-
CUBEJS_DB_USER=[email protected]
27+
CUBEJS_DB_USER=aaaa-bbb-3244-wwssd
2828
CUBEJS_DB_PASS=**********
2929
CUBEJS_FIREBOLT_ACCOUNT=cube
3030
CUBEJS_FIREBOLT_ENGINE_NAME=engine_name
@@ -35,13 +35,14 @@ CUBEJS_FIREBOLT_ENGINE_NAME=engine_name
3535
| Environment Variable | Description | Possible Values | Required |
3636
| ------------------------------ | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | :------: |
3737
| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name ||
38-
| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username ||
39-
| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password ||
40-
| `CUBEJS_FIREBOLT_ACCOUNT` | Account name | An account name | - |
38+
| `CUBEJS_DB_USER` | A service account ID for accessing Firebolt programmatically | A valid service id ||
39+
| `CUBEJS_DB_PASS` | A service account secret for accessing Firebolt programmatically | A valid service secret ||
40+
| `CUBEJS_FIREBOLT_ACCOUNT` | Account name | An account name | |
4141
| `CUBEJS_FIREBOLT_ENGINE_NAME` | Engine name to connect to | A valid engine name ||
4242
| `CUBEJS_FIREBOLT_API_ENDPOINT` | Firebolt API endpoint. Used for authentication | `api.dev.firebolt.io`, `api.staging.firebolt.io`, `api.app.firebolt.io` | - |
4343
| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `5` | A valid number ||
4444
| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `20` | A valid number ||
4545

4646
[firebolt]: https://www.firebolt.io/
4747
[firebolt-help]: https://help.firebolt.io/
48+
[firebolt-service-accounts]: https://docs.firebolt.io/godocs/Guides/managing-your-organization/service-accounts.html

packages/cubejs-backend-shared/src/env.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,19 @@ const variables: Record<string, (...args: any) => any> = {
11281128
]
11291129
),
11301130

1131+
/**
1132+
* Firebolt account name.
1133+
*/
1134+
fireboltAccount: ({
1135+
dataSource
1136+
}: {
1137+
dataSource: string,
1138+
}) => (
1139+
process.env[
1140+
keyByDataSource('CUBEJS_FIREBOLT_ACCOUNT', dataSource)
1141+
]
1142+
),
1143+
11311144
/** ****************************************************************
11321145
* Hive Driver *
11331146
***************************************************************** */

packages/cubejs-backend-shared/test/db_env_single.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,23 @@ describe('Single datasources', () => {
10431043
expect(getEnv('fireboltEngineEndpoint', { dataSource: 'wrong' })).toBeUndefined();
10441044
});
10451045

1046+
test('getEnv("fireboltAccount")', () => {
1047+
process.env.CUBEJS_FIREBOLT_ACCOUNT = "default1";
1048+
expect(getEnv('fireboltAccount', { dataSource: 'default' })).toEqual('default1');
1049+
expect(getEnv('fireboltAccount', { dataSource: 'postgres' })).toEqual('default1');
1050+
expect(getEnv('fireboltAccount', { dataSource: 'wrong' })).toEqual('default1');
1051+
1052+
process.env.CUBEJS_FIREBOLT_ACCOUNT = "default2";
1053+
expect(getEnv('fireboltAccount', { dataSource: 'default' })).toEqual('default2');
1054+
expect(getEnv('fireboltAccount', { dataSource: 'postgres' })).toEqual('default2');
1055+
expect(getEnv('fireboltAccount', { dataSource: 'wrong' })).toEqual('default2');
1056+
1057+
delete process.env.CUBEJS_FIREBOLT_ACCOUNT;
1058+
expect(getEnv('fireboltAccount', { dataSource: 'default' })).toBeUndefined();
1059+
expect(getEnv('fireboltAccount', { dataSource: 'postgres' })).toBeUndefined();
1060+
expect(getEnv('fireboltAccount', { dataSource: 'wrong' })).toBeUndefined();
1061+
});
1062+
10461063
test('getEnv("hiveType")', () => {
10471064
process.env.CUBEJS_DB_HIVE_TYPE = 'default1';
10481065
expect(getEnv('hiveType', { dataSource: 'default' })).toEqual('default1');

packages/cubejs-firebolt-driver/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"@cubejs-backend/base-driver": "^0.35.26",
3232
"@cubejs-backend/schema-compiler": "^0.35.32",
3333
"@cubejs-backend/shared": "^0.35.2",
34-
"firebolt-sdk": "^0.1.14"
34+
"firebolt-sdk": "^1.2.0"
3535
},
3636
"license": "Apache-2.0",
3737
"devDependencies": {

packages/cubejs-firebolt-driver/src/FireboltDriver.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,19 @@ export class FireboltDriver extends BaseDriver implements DriverInterface {
8383
config.dataSource ||
8484
assertDataSource('default');
8585

86+
const username = getEnv('dbUser', { dataSource });
87+
const auth = username.includes('@')
88+
? { username, password: getEnv('dbPass', { dataSource }) }
89+
: { client_id: username, client_secret: getEnv('dbPass', { dataSource }) };
90+
8691
this.config = {
8792
readOnly: true,
8893
apiEndpoint: getEnv('fireboltApiEndpoint', { dataSource }),
8994
...config,
9095
connection: {
91-
username: getEnv('dbUser', { dataSource }),
92-
password: getEnv('dbPass', { dataSource }),
96+
auth,
9397
database: getEnv('dbName', { dataSource }),
94-
// The propery `account` is deprecated according to Firebolt SDK docs
95-
// and will be removed in the future.
96-
// account: <string>process.env.CUBEJS_FIREBOLT_ACCOUNT,
98+
account: getEnv('fireboltAccount', { dataSource }),
9799
engineName: getEnv('fireboltEngineName', { dataSource }),
98100
// engineEndpoint was deprecated in favor of engineName + account
99101
engineEndpoint: getEnv('fireboltEngineEndpoint', { dataSource }),
@@ -349,7 +351,7 @@ export class FireboltDriver extends BaseDriver implements DriverInterface {
349351
public async release() {
350352
if (this.connection) {
351353
const connection = await this.connection;
352-
connection.destroy();
354+
await connection.destroy();
353355
this.connection = null;
354356
}
355357
}

packages/cubejs-firebolt-driver/test/autostart.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ describe('FireboltDriver autostart', () => {
1616
driver.connection = {
1717
execute: jest.fn().mockRejectedValue({
1818
status: 404
19-
})
19+
}),
20+
destroy: jest.fn(),
2021
};
2122
driver.ensureEngineRunning = jest.fn();
2223
tests = new DriverTests(driver, { expectStringFields: true });

packages/cubejs-playground/src/shared/env-vars-db-map.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,19 @@ Upload a service account JSON keyfile to connect to BigQuery.<br/>Alternatively,
9797
],
9898
},
9999
{
100-
databases: [{ title: 'Firebolt', driver: 'firebolt', logo: logoFirebolt }],
100+
databases: [
101+
{
102+
title: 'Firebolt',
103+
driver: 'firebolt',
104+
logo: logoFirebolt,
105+
instructions: `
106+
Specify the Firebolt Service Account <a href="https://docs.firebolt.io/godocs/Guides/managing-your-organization/service-accounts.html" target="_blank">client ID and secret.</a>
107+
`,
108+
},
109+
],
101110
settings: [
102-
...BASE_CRED,
111+
{ env: 'CUBEJS_DB_USER', title: 'Client ID' },
112+
{ env: 'CUBEJS_DB_PASS', title: 'Client Secret' },
103113
DB_NAME,
104114
{ env: 'CUBEJS_FIREBOLT_ACCOUNT', title: 'Account' },
105115
{ env: 'CUBEJS_FIREBOLT_ENGINE_NAME', title: 'Engine name' },

0 commit comments

Comments
 (0)