@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 CHANGED
@@ -1,16 +1,24 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import AWS from 'aws-sdk';
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: AWS.SecretsManager) => Promise<Knex.PgConnectionConfig>;
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 {AWS.SecretsManager} params.secretsManager
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?: AWS.SecretsManager | undefined;
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?: AWS.SecretsManager | undefined;
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 aws_sdk_1 = __importDefault(require("aws-sdk"));
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 }).promise();
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
- host: common_1.envUtils.getRequiredEnvVar('PG_HOST', env),
40
- user: common_1.envUtils.getRequiredEnvVar('PG_USER', env),
41
- password: common_1.envUtils.getRequiredEnvVar('PG_PASSWORD', env),
42
- database: common_1.envUtils.getRequiredEnvVar('PG_DATABASE', env),
43
- port: Number.parseInt(env.PG_PORT ?? '5432', 10),
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 {AWS.SecretsManager} params.secretsManager
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 = new aws_sdk_1.default.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 = new aws_sdk_1.default.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 }),
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import AWS from 'aws-sdk';
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?: AWS.SecretsManager | undefined;
44
+ secretsManager?: SecretsManager | undefined;
43
45
  knexLogger?: Logger | undefined;
44
46
  }) => Promise<Knex>;
45
47
  //# sourceMappingURL=connection.d.ts.map
@@ -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 aws_sdk_1 = __importDefault(require("aws-sdk"));
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 = new aws_sdk_1.default.SecretsManager(), knexLogger = log, } = {}) => {
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,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare const up: (knex: Knex) => Promise<void>;
3
+ export declare const down: (knex: Knex) => Promise<void>;
4
+ //# sourceMappingURL=20240322161147_alter_async_operations_table_operation_type.d.ts.map
@@ -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.2.2",
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": ">=16.19.0"
32
+ "node": ">=20.12.2"
31
33
  },
32
34
  "dependencies": {
33
- "@cumulus/aws-client": "18.2.2",
34
- "@cumulus/common": "18.2.2",
35
- "@cumulus/errors": "18.2.2",
36
- "@cumulus/logger": "18.2.2",
37
- "@cumulus/message": "18.2.2",
38
- "@cumulus/types": "18.2.2",
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": "d2f030f1d77b6d3072cb20f84261b10a7b160620"
53
+ "gitHead": "e8731c150ac49c1bab058183a7a5d91464e1701c"
51
54
  }