@cumulus/db 18.2.2 → 18.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +15 -7
- package/dist/config.js +32 -19
- package/dist/connection.d.ts +4 -2
- package/dist/connection.js +4 -2
- package/dist/migrations/20240322161147_alter_async_operations_table_operation_type.d.ts +4 -0
- package/dist/migrations/20240322161147_alter_async_operations_table_operation_type.js +41 -0
- package/package.json +13 -10
package/dist/config.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import
|
|
3
|
+
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
4
4
|
import { Knex } from 'knex';
|
|
5
5
|
export declare const localStackConnectionEnv: {
|
|
6
|
+
PG_DATABASE: string;
|
|
6
7
|
PG_HOST: string;
|
|
7
|
-
PG_USER: string;
|
|
8
8
|
PG_PASSWORD: string;
|
|
9
|
-
PG_DATABASE: string;
|
|
10
9
|
PG_PORT: string;
|
|
10
|
+
PG_USER: string;
|
|
11
|
+
DISABLE_PG_SSL: string;
|
|
11
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Determines if Knex debugging is enabled based on environment variable.
|
|
15
|
+
*
|
|
16
|
+
* @param {NodeJS.ProcessEnv} env - The environment variables object, defaults to an empty object.
|
|
17
|
+
* @returns {boolean} Returns true if the KNEX_DEBUG environment variable is set to 'true',
|
|
18
|
+
* false otherwise.
|
|
19
|
+
*/
|
|
12
20
|
export declare const isKnexDebugEnabled: (env?: NodeJS.ProcessEnv) => boolean;
|
|
13
|
-
export declare const getSecretConnectionConfig: (SecretId: string, secretsManager:
|
|
21
|
+
export declare const getSecretConnectionConfig: (SecretId: string, secretsManager: SecretsManager) => Promise<Knex.PgConnectionConfig>;
|
|
14
22
|
export declare const getConnectionConfigEnv: (env: NodeJS.ProcessEnv) => Knex.PgConnectionConfig;
|
|
15
23
|
/**
|
|
16
24
|
* Return configuration to make a database connection.
|
|
@@ -18,14 +26,14 @@ export declare const getConnectionConfigEnv: (env: NodeJS.ProcessEnv) => Knex.Pg
|
|
|
18
26
|
* @param {Object} params
|
|
19
27
|
* @param {NodeJS.ProcessEnv} params.env
|
|
20
28
|
* Environment values for the operation
|
|
21
|
-
* @param {
|
|
29
|
+
* @param {SecretsManager} params.secretsManager
|
|
22
30
|
* An instance of an AWS Secrets Manager client
|
|
23
31
|
* @returns {Knex.PgConnectionConfig}
|
|
24
32
|
* Configuration to make a Postgres database connection.
|
|
25
33
|
*/
|
|
26
34
|
export declare const getConnectionConfig: ({ env, secretsManager, }: {
|
|
27
35
|
env: NodeJS.ProcessEnv;
|
|
28
|
-
secretsManager?:
|
|
36
|
+
secretsManager?: SecretsManager | undefined;
|
|
29
37
|
}) => Promise<Knex.PgConnectionConfig>;
|
|
30
38
|
/**
|
|
31
39
|
* Given a NodeJS.ProcessEnv with configuration values, build and return Knex
|
|
@@ -69,6 +77,6 @@ export declare const getConnectionConfig: ({ env, secretsManager, }: {
|
|
|
69
77
|
*/
|
|
70
78
|
export declare const getKnexConfig: ({ env, secretsManager, }?: {
|
|
71
79
|
env?: NodeJS.ProcessEnv | undefined;
|
|
72
|
-
secretsManager?:
|
|
80
|
+
secretsManager?: SecretsManager | undefined;
|
|
73
81
|
}) => Promise<Knex.Config>;
|
|
74
82
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.js
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.getKnexConfig = exports.getConnectionConfig = exports.getConnectionConfigEnv = exports.getSecretConnectionConfig = exports.isKnexDebugEnabled = exports.localStackConnectionEnv = void 0;
|
|
7
|
-
const
|
|
4
|
+
const aws_client_1 = require("@cumulus/aws-client");
|
|
8
5
|
const common_1 = require("@cumulus/common");
|
|
9
6
|
exports.localStackConnectionEnv = {
|
|
7
|
+
PG_DATABASE: 'postgres',
|
|
10
8
|
PG_HOST: 'localhost',
|
|
11
|
-
PG_USER: 'postgres',
|
|
12
9
|
PG_PASSWORD: 'password',
|
|
13
|
-
PG_DATABASE: 'postgres',
|
|
14
10
|
PG_PORT: '5432',
|
|
11
|
+
PG_USER: 'postgres',
|
|
12
|
+
DISABLE_PG_SSL: 'true',
|
|
15
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Determines if Knex debugging is enabled based on environment variable.
|
|
16
|
+
*
|
|
17
|
+
* @param {NodeJS.ProcessEnv} env - The environment variables object, defaults to an empty object.
|
|
18
|
+
* @returns {boolean} Returns true if the KNEX_DEBUG environment variable is set to 'true',
|
|
19
|
+
* false otherwise.
|
|
20
|
+
*/
|
|
16
21
|
const isKnexDebugEnabled = (env = {}) => env.KNEX_DEBUG === 'true';
|
|
17
22
|
exports.isKnexDebugEnabled = isKnexDebugEnabled;
|
|
18
23
|
const getSecretConnectionConfig = async (SecretId, secretsManager) => {
|
|
19
|
-
const response = await secretsManager.getSecretValue({ SecretId })
|
|
24
|
+
const response = await secretsManager.getSecretValue({ SecretId });
|
|
20
25
|
if (response.SecretString === undefined) {
|
|
21
26
|
throw new Error(`AWS Secret did not contain a stored value: ${SecretId}`);
|
|
22
27
|
}
|
|
@@ -26,22 +31,30 @@ const getSecretConnectionConfig = async (SecretId, secretsManager) => {
|
|
|
26
31
|
throw new Error(`AWS Secret ${SecretId} is missing required key '${key}'`);
|
|
27
32
|
}
|
|
28
33
|
});
|
|
34
|
+
const rejectUnauthorized = dbAccessMeta.rejectUnauthorized !== 'false' && dbAccessMeta.rejectUnauthorized !== false;
|
|
35
|
+
const disableSsl = dbAccessMeta.disableSSL === 'true' || dbAccessMeta.disableSSL === true;
|
|
29
36
|
return {
|
|
37
|
+
database: dbAccessMeta.database,
|
|
30
38
|
host: dbAccessMeta.host,
|
|
31
|
-
user: dbAccessMeta.username,
|
|
32
39
|
password: dbAccessMeta.password,
|
|
33
|
-
database: dbAccessMeta.database,
|
|
34
40
|
port: dbAccessMeta.port ?? 5432,
|
|
41
|
+
ssl: disableSsl ? undefined : { rejectUnauthorized },
|
|
42
|
+
user: dbAccessMeta.username,
|
|
35
43
|
};
|
|
36
44
|
};
|
|
37
45
|
exports.getSecretConnectionConfig = getSecretConnectionConfig;
|
|
38
|
-
const getConnectionConfigEnv = (env) =>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
const getConnectionConfigEnv = (env) => {
|
|
47
|
+
const rejectUnauthorized = env.REJECT_UNAUTHORIZED !== 'false';
|
|
48
|
+
const connectionConfigEnv = {
|
|
49
|
+
host: common_1.envUtils.getRequiredEnvVar('PG_HOST', env),
|
|
50
|
+
user: common_1.envUtils.getRequiredEnvVar('PG_USER', env),
|
|
51
|
+
password: common_1.envUtils.getRequiredEnvVar('PG_PASSWORD', env),
|
|
52
|
+
database: common_1.envUtils.getRequiredEnvVar('PG_DATABASE', env),
|
|
53
|
+
port: Number.parseInt(env.PG_PORT ?? '5432', 10),
|
|
54
|
+
ssl: env.DISABLE_PG_SSL === 'true' ? undefined : { rejectUnauthorized },
|
|
55
|
+
};
|
|
56
|
+
return connectionConfigEnv;
|
|
57
|
+
};
|
|
45
58
|
exports.getConnectionConfigEnv = getConnectionConfigEnv;
|
|
46
59
|
/**
|
|
47
60
|
* Return configuration to make a database connection.
|
|
@@ -49,12 +62,12 @@ exports.getConnectionConfigEnv = getConnectionConfigEnv;
|
|
|
49
62
|
* @param {Object} params
|
|
50
63
|
* @param {NodeJS.ProcessEnv} params.env
|
|
51
64
|
* Environment values for the operation
|
|
52
|
-
* @param {
|
|
65
|
+
* @param {SecretsManager} params.secretsManager
|
|
53
66
|
* An instance of an AWS Secrets Manager client
|
|
54
67
|
* @returns {Knex.PgConnectionConfig}
|
|
55
68
|
* Configuration to make a Postgres database connection.
|
|
56
69
|
*/
|
|
57
|
-
const getConnectionConfig = async ({ env, secretsManager =
|
|
70
|
+
const getConnectionConfig = async ({ env, secretsManager = aws_client_1.services.secretsManager(), }) => {
|
|
58
71
|
// Storing credentials in Secrets Manager
|
|
59
72
|
if (env.databaseCredentialSecretArn) {
|
|
60
73
|
return await (0, exports.getSecretConnectionConfig)(env.databaseCredentialSecretArn, secretsManager);
|
|
@@ -103,7 +116,7 @@ exports.getConnectionConfig = getConnectionConfig;
|
|
|
103
116
|
* connections
|
|
104
117
|
* @returns {Promise<Knex.Config>} a Knex configuration object
|
|
105
118
|
*/
|
|
106
|
-
const getKnexConfig = async ({ env = process.env, secretsManager =
|
|
119
|
+
const getKnexConfig = async ({ env = process.env, secretsManager = aws_client_1.services.secretsManager(), } = {}) => {
|
|
107
120
|
const knexConfig = {
|
|
108
121
|
client: 'pg',
|
|
109
122
|
connection: await (0, exports.getConnectionConfig)({ env, secretsManager }),
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
-
import
|
|
3
|
+
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
|
|
4
4
|
import { Knex } from 'knex';
|
|
5
5
|
import Logger from '@cumulus/logger';
|
|
6
6
|
/**
|
|
@@ -35,11 +35,13 @@ import Logger from '@cumulus/logger';
|
|
|
35
35
|
* acquireConnectionTimeout connection timeout
|
|
36
36
|
* @param {string} [params.env.migrationDir] - Directory to look in for
|
|
37
37
|
* migrations
|
|
38
|
+
* @param {SecretsManager} [params.secretsManager] - An instance of an AWS secrets manager client
|
|
39
|
+
* @param {Logger} [params.knexLogger] - a logger instance
|
|
38
40
|
* @returns {Promise<Knex>} a Knex configuration object that has returned at least one query
|
|
39
41
|
*/
|
|
40
42
|
export declare const getKnexClient: ({ env, secretsManager, knexLogger, }?: {
|
|
41
43
|
env?: NodeJS.ProcessEnv | undefined;
|
|
42
|
-
secretsManager?:
|
|
44
|
+
secretsManager?: SecretsManager | undefined;
|
|
43
45
|
knexLogger?: Logger | undefined;
|
|
44
46
|
}) => Promise<Knex>;
|
|
45
47
|
//# sourceMappingURL=connection.d.ts.map
|
package/dist/connection.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getKnexClient = void 0;
|
|
7
|
-
const
|
|
7
|
+
const aws_client_1 = require("@cumulus/aws-client");
|
|
8
8
|
const knex_1 = require("knex");
|
|
9
9
|
const logger_1 = __importDefault(require("@cumulus/logger"));
|
|
10
10
|
const config_1 = require("./config");
|
|
@@ -41,9 +41,11 @@ const log = new logger_1.default({ sender: '@cumulus/db/connection' });
|
|
|
41
41
|
* acquireConnectionTimeout connection timeout
|
|
42
42
|
* @param {string} [params.env.migrationDir] - Directory to look in for
|
|
43
43
|
* migrations
|
|
44
|
+
* @param {SecretsManager} [params.secretsManager] - An instance of an AWS secrets manager client
|
|
45
|
+
* @param {Logger} [params.knexLogger] - a logger instance
|
|
44
46
|
* @returns {Promise<Knex>} a Knex configuration object that has returned at least one query
|
|
45
47
|
*/
|
|
46
|
-
const getKnexClient = async ({ env = process.env, secretsManager =
|
|
48
|
+
const getKnexClient = async ({ env = process.env, secretsManager = aws_client_1.services.secretsManager(), knexLogger = log, } = {}) => {
|
|
47
49
|
if ((0, config_1.isKnexDebugEnabled)(env)) {
|
|
48
50
|
knexLogger.info('Initializing connection pool...');
|
|
49
51
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.down = exports.up = void 0;
|
|
4
|
+
const formatAlterTableEnumSql = (tableName, columnName, enums) => {
|
|
5
|
+
const constraintName = `${tableName}_${columnName}_check`;
|
|
6
|
+
return [
|
|
7
|
+
`ALTER TABLE ${tableName}`,
|
|
8
|
+
`DROP CONSTRAINT IF EXISTS ${constraintName};`,
|
|
9
|
+
`ALTER TABLE ${tableName} ADD CONSTRAINT ${constraintName} CHECK (${columnName} = ANY (ARRAY['${enums.join("'::text, '")}'::text]));`,
|
|
10
|
+
].join('\n');
|
|
11
|
+
};
|
|
12
|
+
const up = async (knex) => {
|
|
13
|
+
await knex.raw(formatAlterTableEnumSql('async_operations', 'operation_type', [
|
|
14
|
+
'ES Index',
|
|
15
|
+
'Bulk Granules',
|
|
16
|
+
'Bulk Granule Reingest',
|
|
17
|
+
'Bulk Granule Delete',
|
|
18
|
+
'Dead-Letter Processing',
|
|
19
|
+
'DLA Migration',
|
|
20
|
+
'Kinesis Replay',
|
|
21
|
+
'Reconciliation Report',
|
|
22
|
+
'Data Migration',
|
|
23
|
+
'SQS Replay',
|
|
24
|
+
]));
|
|
25
|
+
};
|
|
26
|
+
exports.up = up;
|
|
27
|
+
const down = async (knex) => {
|
|
28
|
+
await knex.raw(formatAlterTableEnumSql('async_operations', 'operation_type', [
|
|
29
|
+
'ES Index',
|
|
30
|
+
'Bulk Granules',
|
|
31
|
+
'Bulk Granule Reingest',
|
|
32
|
+
'Bulk Granule Delete',
|
|
33
|
+
'Dead-Letter Processing',
|
|
34
|
+
'Kinesis Replay',
|
|
35
|
+
'Reconciliation Report',
|
|
36
|
+
'Data Migration',
|
|
37
|
+
'SQS Replay',
|
|
38
|
+
]));
|
|
39
|
+
};
|
|
40
|
+
exports.down = down;
|
|
41
|
+
//# sourceMappingURL=20240322161147_alter_async_operations_table_operation_type.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cumulus/db",
|
|
3
|
-
"version": "18.
|
|
3
|
+
"version": "18.3.0",
|
|
4
4
|
"description": "Utilities for working with the Cumulus DB",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"tsc": "../../node_modules/.bin/tsc",
|
|
16
16
|
"tsc:listEmittedFiles": "../../node_modules/.bin/tsc --listEmittedFiles",
|
|
17
17
|
"test": "../../node_modules/.bin/ava",
|
|
18
|
+
"test:ci": "../../scripts/run_package_ci_unit.sh",
|
|
18
19
|
"test:coverage": "../../node_modules/.bin/nyc npm test",
|
|
19
20
|
"watch": "../../node_modules/.bin/tsc -w",
|
|
20
21
|
"coverage": "python ../../scripts/coverage_handler/coverage.py"
|
|
@@ -24,18 +25,20 @@
|
|
|
24
25
|
"tests/**"
|
|
25
26
|
],
|
|
26
27
|
"verbose": true,
|
|
27
|
-
"timeout": "5m"
|
|
28
|
+
"timeout": "5m",
|
|
29
|
+
"failFast": true
|
|
28
30
|
},
|
|
29
31
|
"engines": {
|
|
30
|
-
"node": ">=
|
|
32
|
+
"node": ">=20.12.2"
|
|
31
33
|
},
|
|
32
34
|
"dependencies": {
|
|
33
|
-
"@
|
|
34
|
-
"@cumulus/
|
|
35
|
-
"@cumulus/
|
|
36
|
-
"@cumulus/
|
|
37
|
-
"@cumulus/
|
|
38
|
-
"@cumulus/
|
|
35
|
+
"@aws-sdk/client-secrets-manager": "^3.447.0",
|
|
36
|
+
"@cumulus/aws-client": "18.3.0",
|
|
37
|
+
"@cumulus/common": "18.3.0",
|
|
38
|
+
"@cumulus/errors": "18.3.0",
|
|
39
|
+
"@cumulus/logger": "18.3.0",
|
|
40
|
+
"@cumulus/message": "18.3.0",
|
|
41
|
+
"@cumulus/types": "18.3.0",
|
|
39
42
|
"crypto-random-string": "^3.2.0",
|
|
40
43
|
"is-valid-hostname": "1.0.2",
|
|
41
44
|
"knex": "2.4.1",
|
|
@@ -47,5 +50,5 @@
|
|
|
47
50
|
"devDependencies": {
|
|
48
51
|
"@types/uuid": "^8.0.0"
|
|
49
52
|
},
|
|
50
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "e8731c150ac49c1bab058183a7a5d91464e1701c"
|
|
51
54
|
}
|