From 2c2fb0c3a55a45dc1ba88d76b19f2b5842282c43 Mon Sep 17 00:00:00 2001 From: jennyhliu <34660846+jennyhliu@users.noreply.github.com> Date: Mon, 29 Jun 2026 13:51:36 -0400 Subject: [PATCH 01/10] CUMULUS-4982: Converted global_unique tables to HASH partitioned tables (#4523) * CUMULUS-4982: Converted granules_global_unique and files_global_unique tables to HASH partitioned tables * update default partition count * update migration doc * update db package test coverage * change-granule-collection-pg coverage not run * update integration postgres file write error * fix typo changelog * update test coverage number * update api-client test coverage * fix count retrieve * update description executions_total_years --- CHANGELOG.md | 14 ++ ...ion-to-partitioned-global-unique-tables.md | 63 ++++++++ example/data-persistence-tf/variables.tf | 16 ++- .../ingestGranule/IngestGranuleFailureSpec.js | 6 +- lambdas/db-migration/main.tf | 8 +- lambdas/db-migration/tests/test-index.js | 18 ++- lambdas/db-migration/variables.tf | 8 +- packages/api-client/.nycrc.json | 8 +- packages/db/.nycrc.json | 8 +- .../065_granules_global_unique.ts | 25 +++- .../075_files_global_unique.ts | 27 +++- ...141202_partition_granules_global_unique.ts | 79 ++++++++++ ...625161818_partition_files_global_unique.ts | 81 +++++++++++ ...5_migrate_and_verify_global_uniqueness.sql | 135 ++++++++++++++++++ tasks/add-unique-granuleID/.nycrc.json | 8 +- .../change-granule-collection-pg/.nycrc.json | 11 +- .../change-granule-collection-s3/.nycrc.json | 8 +- tf-modules/data-persistence/variables.tf | 20 ++- website/sidebars.js | 1 + 19 files changed, 491 insertions(+), 53 deletions(-) create mode 100644 docs/upgrade-notes/data-migration-to-partitioned-global-unique-tables.md create mode 100644 packages/db/src/migrations/20260625141202_partition_granules_global_unique.ts create mode 100644 packages/db/src/migrations/20260625161818_partition_files_global_unique.ts create mode 100644 packages/db/src/migrations/20260625_migrate_and_verify_global_uniqueness.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 7daa27da3704..97f40e14be80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [Unreleased] +#### Migration Notes + +- **CUMULUS-4982** + - You **must** completely stop all data ingestion workloads before initiating this deployment. + - If your database contains an estimated **1 million or more rows** in either the + `granules_global_unique` or `files_global_unique` tables, you must manually execute the data + migration script immediately following the stack deployment. Please follow the instructions found in the + [Data migration to partitioned global unique tables documentation](https://nasa.github.io/cumulus/docs/next/upgrade-notes/data-migration-to-partitioned-global-unique-tables). + ### Added - **CUMULUS-4842** @@ -15,6 +24,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - **CUMULUS-4986** - Added `storage_type` variable to `tf-modules/cumulus-rds-tf` module with default value `aurora`. +### Changed + +- **CUMULUS-4982** + - Converted granules_global_unique and files_global_unique tables to HASH partitioned tables + ### Fixed - **CUMULUS-5005** diff --git a/docs/upgrade-notes/data-migration-to-partitioned-global-unique-tables.md b/docs/upgrade-notes/data-migration-to-partitioned-global-unique-tables.md new file mode 100644 index 000000000000..09ca363c7ef4 --- /dev/null +++ b/docs/upgrade-notes/data-migration-to-partitioned-global-unique-tables.md @@ -0,0 +1,63 @@ +--- +id: data-migration-to-partitioned-global-unique-tables +title: Data migration to partitioned global unique tables +hide_title: false +--- + +## Background + +The deployment of db patches for +[CUMULUS-4982 Partition files_global_unique and granules_global_unique tables](https://bugs.earthdata.nasa.gov/browse/CUMULUS-4982) +creates the new HASH-partitioned structures and safely renames your active data to *_old_non_partitioned backup tables. +This guide covers how to manually transfer that data, verify it, and clean up the old tables. + +## Execution Steps + +1. Login into EC2 instance with database access. + + From AWS console: Go to EC2, pick a `-CumulusECSCluster` instance, click Connect, click Session Manager + and click the Connect button. + + From AWS CLI: aws ssm start-session --target `EC2 Instance ID`. + + :::note Remember to take a note on which instance you run the commands. + +2. Install tmux, postgres client and python packages + + ```sh + sudo yum install -y tmux + sudo dnf install -y postgresql17 + ``` + + Once installed, a `tmux` session is started with two windows, the Cumulus database is connected to each window + using the PostgreSQL client. The primary window is used for running the migration SQL script, while the secondary + window is used to monitor the database. The tmux session can be detached and reattached later as needed. + +3. Run Migration Script + + The database login credentials can be retrieved from the `_db_login` secret. + When the migration script is running, perform step 4 to monitor the commands. The migration script also prints out the progress messages. + + ```sh + curl -o /home/ssm-user/20260625_migrate_and_verify_global_uniqueness.sql https://raw.githubusercontent.com/nasa/cumulus/master/packages/db/src/migrations/20260625_migrate_and_verify_global_uniqueness.sql + + tmux new-session -s CumulusUpgrade -n migrateGlobalUnique + + psql -h -p -d -U -f /home/ssm-user/20260625_migrate_and_verify_global_uniqueness.sql -W + #e.g. psql -h cumulus-dev-rds-cluster.cluster-xxx.us-east-1.rds.amazonaws.com -p 5432 -d cumulus_test_db -U cumulus_test -f /home/ssm-user/20260625_migrate_and_verify_global_uniqueness.sql -W + ``` + +4. Monitor the Running Command + + ```sh + # From tmux CumulusUpgrade session, open another window + -b c + + psql -h -p -d -U -W + + select pid, query, state, wait_event_type, wait_event from pg_stat_activity where state = 'active'; + ``` + +5. Close the Session + + Close the tmux session after the task is complete by `exit` or `-b x`. diff --git a/example/data-persistence-tf/variables.tf b/example/data-persistence-tf/variables.tf index 4b0c0683ffaf..2b986c83bee7 100644 --- a/example/data-persistence-tf/variables.tf +++ b/example/data-persistence-tf/variables.tf @@ -99,15 +99,19 @@ variable "dbRecreation" { variable "db_partition_config" { type = object({ - executions_total_years = number - granules_count = number - files_count = number + executions_total_years = number + granules_count = number + files_count = number + granules_global_unique_count = number + files_global_unique_count = number }) description = "Partition configuration for this deployment" default = { - executions_total_years = 3 - granules_count = 4 - files_count = 4 + executions_total_years = 3 + granules_count = 4 + files_count = 4 + granules_global_unique_count = 4 + files_global_unique_count = 2 } } variable "use_bootstrap" { diff --git a/example/spec/parallel/ingestGranule/IngestGranuleFailureSpec.js b/example/spec/parallel/ingestGranule/IngestGranuleFailureSpec.js index fba8dd99af3c..fecca37b9fd3 100644 --- a/example/spec/parallel/ingestGranule/IngestGranuleFailureSpec.js +++ b/example/spec/parallel/ingestGranule/IngestGranuleFailureSpec.js @@ -252,8 +252,10 @@ describe('The Ingest Granule failure workflow', () => { const isSchemaValidationError = (error.Error === 'CumulusMessageAdapterExecutionError') && error.Cause.includes('jsonschema.exceptions.ValidationError'); const isPostgresWriteError = error.Error.includes('Failed writing files to PostgreSQL') && - error.Cause.includes('null value in column "bucket" of relation "files_global_unique" violates not-null constraint'); - expect(isSchemaValidationError || isPostgresWriteError).toBeTrue(); + /null value in column "bucket" of relation "files_global_unique(_p\d+)?" violates not-null constraint/.test(error.Cause); + expect(isSchemaValidationError || isPostgresWriteError).toBeTrue( + `Received unexpected error! Type: "${error.Error}", Cause: "${error.Cause}"` + ); }); }); }); diff --git a/lambdas/db-migration/main.tf b/lambdas/db-migration/main.tf index 76e03c2cb6a1..49ebe5869e56 100644 --- a/lambdas/db-migration/main.tf +++ b/lambdas/db-migration/main.tf @@ -77,9 +77,11 @@ resource "aws_lambda_function" "db_migration" { variables = { databaseCredentialSecretArn = var.rds_user_access_secret_arn - EXECUTIONS_PARTITION_TOTAL_YEARS = var.db_partition_config.executions_total_years - GRANULES_PARTITION_COUNT = var.db_partition_config.granules_count - FILES_PARTITION_COUNT = var.db_partition_config.files_count + EXECUTIONS_PARTITION_TOTAL_YEARS = var.db_partition_config.executions_total_years + GRANULES_PARTITION_COUNT = var.db_partition_config.granules_count + FILES_PARTITION_COUNT = var.db_partition_config.files_count + GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT = var.db_partition_config.granules_global_unique_count + FILES_GLOBAL_UNIQUE_PARTITION_COUNT = var.db_partition_config.files_global_unique_count USE_BOOTSTRAP = var.use_bootstrap } diff --git a/lambdas/db-migration/tests/test-index.js b/lambdas/db-migration/tests/test-index.js index f98be6cc7885..def32b53dffb 100644 --- a/lambdas/db-migration/tests/test-index.js +++ b/lambdas/db-migration/tests/test-index.js @@ -203,12 +203,14 @@ test.serial('handler can apply standard patches to a database previously created t.truthy(migrations.length > 0, 'The migrations table should contain entries from the patch-based files'); }); -test.serial('handler creates correct granules and files partitions based on env', async (t) => { +test.serial('handler creates correct hash partitions across tables based on env variables', async (t) => { const { testEnv } = t.context; // Set environment variables for this test process.env.GRANULES_PARTITION_COUNT = '16'; process.env.FILES_PARTITION_COUNT = '32'; + process.env.GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT = '8'; + process.env.FILES_GLOBAL_UNIQUE_PARTITION_COUNT = '4'; try { await handler({ command: 'latest', env: testEnv }); @@ -230,6 +232,20 @@ test.serial('handler creates correct granules and files partitions based on env' Number(process.env.FILES_PARTITION_COUNT), `Should have ${process.env.FILES_PARTITION_COUNT} file partitions` ); + + const granuleUniquePartitions = await getPartitionNames('granules_global_unique', t.context.testKnex); + t.is( + granuleUniquePartitions.length, + Number(process.env.GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT), + `Should have ${process.env.GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT} granules global unique partitions` + ); + + const fileUniquePartitions = await getPartitionNames('files_global_unique', t.context.testKnex); + t.is( + fileUniquePartitions.length, + Number(process.env.FILES_GLOBAL_UNIQUE_PARTITION_COUNT), + `Should have ${process.env.FILES_GLOBAL_UNIQUE_PARTITION_COUNT} files global unique partitions` + ); } finally { delete process.env.GRANULES_PARTITION_COUNT; delete process.env.FILES_PARTITION_COUNT; diff --git a/lambdas/db-migration/variables.tf b/lambdas/db-migration/variables.tf index 49014874ce87..e2ead54cff81 100644 --- a/lambdas/db-migration/variables.tf +++ b/lambdas/db-migration/variables.tf @@ -39,9 +39,11 @@ variable "vpc_id" { variable "db_partition_config" { type = object({ - executions_total_years = number - granules_count = number - files_count = number + executions_total_years = number + granules_count = number + files_count = number + granules_global_unique_count = number + files_global_unique_count = number }) description = "Partitioning settings for the database migration Lambda" } diff --git a/packages/api-client/.nycrc.json b/packages/api-client/.nycrc.json index 6115674046ec..aad52518ea1b 100644 --- a/packages/api-client/.nycrc.json +++ b/packages/api-client/.nycrc.json @@ -1,8 +1,8 @@ { "extends": "../../nyc.config.js", "exclude-after-remap": false, - "statements": 96.0, - "functions": 91.0, - "branches": 28, - "lines": 95.0 + "statements": 94.0, + "functions": 89.0, + "branches": 34.0, + "lines": 93.0 } diff --git a/packages/db/.nycrc.json b/packages/db/.nycrc.json index e31eed10c03e..e3c2d65d4dec 100644 --- a/packages/db/.nycrc.json +++ b/packages/db/.nycrc.json @@ -1,7 +1,7 @@ { "extends": "../../nyc.config.js", - "statements": 89.0, - "functions": 77.0, - "branches": 75.0, - "lines": 90.0 + "statements": 87.0, + "functions": 81.0, + "branches": 78.0, + "lines": 87.0 } diff --git a/packages/db/src/migrations-bootstrap/065_granules_global_unique.ts b/packages/db/src/migrations-bootstrap/065_granules_global_unique.ts index 31cd0af06591..a8ac33d9d255 100644 --- a/packages/db/src/migrations-bootstrap/065_granules_global_unique.ts +++ b/packages/db/src/migrations-bootstrap/065_granules_global_unique.ts @@ -1,9 +1,28 @@ import { Knex } from 'knex'; +import { getPartitionCount } from '../lib/migration'; + +const DEFAULT_PARTITION_COUNT = 2; export const up = async (knex: Knex): Promise => { - await knex.schema.createTable('granules_global_unique', (table) => { - table.text('granule_id').primary(); - }); + const PARTITION_COUNT: number = getPartitionCount( + 'GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT', DEFAULT_PARTITION_COUNT + ); + + await knex.raw(` + CREATE TABLE granules_global_unique ( + granule_id TEXT NOT NULL, + CONSTRAINT granules_global_unique_pkey PRIMARY KEY (granule_id) + ) PARTITION BY HASH (granule_id); + `); + + await Promise.all( + Array.from({ length: PARTITION_COUNT }).map((_, i) => + knex.raw(` + CREATE TABLE granules_global_unique_p${i} + PARTITION OF granules_global_unique + FOR VALUES WITH (MODULUS ${PARTITION_COUNT}, REMAINDER ${i}); + `)) + ); await knex.raw(` COMMENT ON TABLE granules_global_unique IS 'Global lookup table for granules uniqueness across partitions'; diff --git a/packages/db/src/migrations-bootstrap/075_files_global_unique.ts b/packages/db/src/migrations-bootstrap/075_files_global_unique.ts index 407f1a349033..edff8b141680 100644 --- a/packages/db/src/migrations-bootstrap/075_files_global_unique.ts +++ b/packages/db/src/migrations-bootstrap/075_files_global_unique.ts @@ -1,12 +1,29 @@ import { Knex } from 'knex'; +import { getPartitionCount } from '../lib/migration'; + +const DEFAULT_PARTITION_COUNT = 4; export const up = async (knex: Knex): Promise => { - await knex.schema.createTable('files_global_unique', (table) => { - table.text('bucket').notNullable(); - table.text('key').notNullable(); + const PARTITION_COUNT: number = getPartitionCount( + 'FILES_GLOBAL_UNIQUE_PARTITION_COUNT', DEFAULT_PARTITION_COUNT + ); + + await knex.raw(` + CREATE TABLE files_global_unique ( + bucket TEXT NOT NULL, + key TEXT NOT NULL, + CONSTRAINT files_global_unique_pkey PRIMARY KEY (bucket, key) + ) PARTITION BY HASH (bucket, key); + `); - table.primary(['bucket', 'key']); - }); + await Promise.all( + Array.from({ length: PARTITION_COUNT }).map((_, i) => + knex.raw(` + CREATE TABLE files_global_unique_p${i} + PARTITION OF files_global_unique + FOR VALUES WITH (MODULUS ${PARTITION_COUNT}, REMAINDER ${i}); + `)) + ); await knex.raw(` COMMENT ON TABLE files_global_unique IS 'Global lookup table for files uniqueness across partitions'; diff --git a/packages/db/src/migrations/20260625141202_partition_granules_global_unique.ts b/packages/db/src/migrations/20260625141202_partition_granules_global_unique.ts new file mode 100644 index 000000000000..ae07e4cd486b --- /dev/null +++ b/packages/db/src/migrations/20260625141202_partition_granules_global_unique.ts @@ -0,0 +1,79 @@ +import { Knex } from 'knex'; +import { getPartitionCount } from '../lib/migration'; + +const DEFAULT_PARTITION_COUNT = 2; + +export const up = async (knex: Knex): Promise => { + const oldTableName = 'granules_global_unique_old_non_partitioned'; + const oldPkeyName = 'granules_global_unique_pkey_old_non_partitioned'; + const MIGRATION_ROW_COUNT_THRESHOLD = 1000000; + + // check if the table is already partitioned + const partitionCheck = await knex.raw(` + SELECT 1 + FROM pg_class c + JOIN pg_partitioned_table p ON c.oid = p.partrelid + WHERE c.relname = 'granules_global_unique'; + `); + + if (partitionCheck.rows.length > 0) { + return; + } + + // check row count to decide if we migrate immediately and drop the old table + const countCheck = await knex.raw(` + SELECT reltuples::bigint AS estimated_count + FROM pg_class + WHERE relname = 'granules_global_unique'; + `); + + const estimatedRows = Number(countCheck.rows?.[0]?.estimated_count ?? 0); + const shouldMigrate = estimatedRows < MIGRATION_ROW_COUNT_THRESHOLD; + + await knex.raw(`ALTER TABLE granules_global_unique RENAME TO ${oldTableName};`); + await knex.raw(`ALTER TABLE ${oldTableName} RENAME CONSTRAINT granules_global_unique_pkey TO ${oldPkeyName};`); + + // create the new partitioned table + const PARTITION_COUNT: number = getPartitionCount( + 'GRANULES_GLOBAL_UNIQUE_PARTITION_COUNT', DEFAULT_PARTITION_COUNT + ); + + await knex.raw(` + CREATE TABLE granules_global_unique ( + granule_id TEXT NOT NULL, + CONSTRAINT granules_global_unique_pkey PRIMARY KEY (granule_id) + ) PARTITION BY HASH (granule_id); + `); + + await Promise.all( + Array.from({ length: PARTITION_COUNT }).map((_, i) => + knex.raw(` + CREATE TABLE granules_global_unique_p${i} + PARTITION OF granules_global_unique + FOR VALUES WITH (MODULUS ${PARTITION_COUNT}, REMAINDER ${i}); + `)) + ); + + await knex.raw(` + COMMENT ON TABLE granules_global_unique IS 'Global lookup table for granules uniqueness across partitions'; + COMMENT ON COLUMN granules_global_unique.granule_id IS 'Globally unique granule identifier'; + `); + + // perform migration and drop old table, or leave old table for manual migration + if (shouldMigrate) { + await knex.raw(` + INSERT INTO granules_global_unique (granule_id) + SELECT granule_id FROM ${oldTableName} + ON CONFLICT DO NOTHING; + `); + await knex.raw(`DROP TABLE ${oldTableName};`); + } else { + await knex.raw(` + COMMENT ON TABLE ${oldTableName} IS 'Backup of un-migrated unique granule identifier records'; + `); + } +}; + +export const down = async (knex: Knex): Promise => { + await knex.schema.dropTableIfExists('granules_global_unique'); +}; diff --git a/packages/db/src/migrations/20260625161818_partition_files_global_unique.ts b/packages/db/src/migrations/20260625161818_partition_files_global_unique.ts new file mode 100644 index 000000000000..ee3adc849729 --- /dev/null +++ b/packages/db/src/migrations/20260625161818_partition_files_global_unique.ts @@ -0,0 +1,81 @@ +import { Knex } from 'knex'; +import { getPartitionCount } from '../lib/migration'; + +const DEFAULT_PARTITION_COUNT = 4; + +export const up = async (knex: Knex): Promise => { + const oldTableName = 'files_global_unique_old_non_partitioned'; + const oldPkeyName = 'files_global_unique_pkey_old_non_partitioned'; + const MIGRATION_ROW_COUNT_THRESHOLD = 1000000; + + // check if the table is already partitioned + const partitionCheck = await knex.raw(` + SELECT 1 + FROM pg_class c + JOIN pg_partitioned_table p ON c.oid = p.partrelid + WHERE c.relname = 'files_global_unique'; + `); + + if (partitionCheck.rows.length > 0) { + return; + } + + // check row count to decide if we migrate immediately and drop the old table + const countCheck = await knex.raw(` + SELECT reltuples::bigint AS estimated_count + FROM pg_class + WHERE relname = 'files_global_unique'; + `); + + const estimatedRows = Number(countCheck.rows?.[0]?.estimated_count ?? 0); + const shouldMigrate = estimatedRows < MIGRATION_ROW_COUNT_THRESHOLD; + + await knex.raw(`ALTER TABLE files_global_unique RENAME TO ${oldTableName};`); + await knex.raw(`ALTER TABLE ${oldTableName} RENAME CONSTRAINT files_global_unique_pkey TO ${oldPkeyName};`); + + // Create the new partitioned table + const PARTITION_COUNT: number = getPartitionCount( + 'FILES_GLOBAL_UNIQUE_PARTITION_COUNT', DEFAULT_PARTITION_COUNT + ); + + await knex.raw(` + CREATE TABLE files_global_unique ( + bucket TEXT NOT NULL, + key TEXT NOT NULL, + CONSTRAINT files_global_unique_pkey PRIMARY KEY (bucket, key) + ) PARTITION BY HASH (bucket, key); + `); + + await Promise.all( + Array.from({ length: PARTITION_COUNT }).map((_, i) => + knex.raw(` + CREATE TABLE files_global_unique_p${i} + PARTITION OF files_global_unique + FOR VALUES WITH (MODULUS ${PARTITION_COUNT}, REMAINDER ${i}); + `)) + ); + + await knex.raw(` + COMMENT ON TABLE files_global_unique IS 'Global lookup table for files uniqueness across partitions'; + COMMENT ON COLUMN files_global_unique.bucket IS 'AWS S3 bucket'; + COMMENT ON COLUMN files_global_unique.key IS 'AWS S3 object key'; + `); + + // perform migration and drop old table, or leave old table for manual migration + if (shouldMigrate) { + await knex.raw(` + INSERT INTO files_global_unique (bucket, key) + SELECT bucket, key FROM ${oldTableName} + ON CONFLICT DO NOTHING; + `); + await knex.raw(`DROP TABLE ${oldTableName};`); + } else { + await knex.raw(` + COMMENT ON TABLE ${oldTableName} IS 'Backup of un-migrated unique file lookup records'; + `); + } +}; + +export const down = async (knex: Knex): Promise => { + await knex.schema.dropTableIfExists('files_global_unique'); +}; diff --git a/packages/db/src/migrations/20260625_migrate_and_verify_global_uniqueness.sql b/packages/db/src/migrations/20260625_migrate_and_verify_global_uniqueness.sql new file mode 100644 index 000000000000..6650a8613182 --- /dev/null +++ b/packages/db/src/migrations/20260625_migrate_and_verify_global_uniqueness.sql @@ -0,0 +1,135 @@ +/* +============================================================================ +SUMMARY: + Migrates records from old non-partitioned tables into new HASH-partitioned + uniqueness tables in batches of 500,000 rows with progress logging. + If backup tables do not exist, it audits row counts against core data + tables and throws an error on mismatch. + +REQUIREMENT: + Must run standalone. Do not execute inside an open transaction block. +============================================================================ +*/ + +DO $$ +DECLARE + v_old_granules_exists BOOLEAN; + v_old_files_exists BOOLEAN; + + v_cnt_granules BIGINT; + v_cnt_granules_unique BIGINT; + v_cnt_files BIGINT; + v_cnt_files_unique BIGINT; + v_total_to_migrate BIGINT; + + v_batch_size CONSTANT INT := 500000; + v_rows_moved INT; + v_offset INT; + v_current_migrated BIGINT; +BEGIN + --------------------------------------------------------------------------- + -- Granules Global Unique Processing + --------------------------------------------------------------------------- + SELECT EXISTS ( + SELECT FROM pg_tables + WHERE tablename = 'granules_global_unique_old_non_partitioned' + ) INTO v_old_granules_exists; + + IF NOT v_old_granules_exists THEN + -- Case A: Old backup table doesn't exist -> Compare table counts + SELECT COUNT(*) INTO v_cnt_granules_unique FROM granules_global_unique; + SELECT COUNT(*) INTO v_cnt_granules FROM granules; + + IF v_cnt_granules_unique <> v_cnt_granules THEN + RAISE EXCEPTION 'Granule unique counts mismatch! Partitioned unique table has % rows, but base granules table has % rows.', + v_cnt_granules_unique, v_cnt_granules; + ELSE + RAISE NOTICE 'Granules count matches (%). No synchronization needed.', v_cnt_granules; + END IF; + + ELSE + -- Case B: Old backup table exists -> Migrate from backup table using set-based chunks + SELECT COUNT(*) FROM granules_global_unique_old_non_partitioned INTO v_total_to_migrate; + RAISE NOTICE 'Backup table granules_global_unique_old_non_partitioned found. Total rows to migrate: %', v_total_to_migrate; + + v_offset := 0; + v_current_migrated := 0; + + LOOP + INSERT INTO granules_global_unique (granule_id) + SELECT granule_id + FROM granules_global_unique_old_non_partitioned + ORDER BY granule_id + LIMIT v_batch_size OFFSET v_offset + ON CONFLICT DO NOTHING; + + GET DIAGNOSTICS v_rows_moved = ROW_COUNT; + EXIT WHEN v_rows_moved = 0; + + v_offset := v_offset + v_batch_size; + v_current_migrated := v_current_migrated + v_rows_moved; + + RAISE NOTICE 'Granules Migration Progress: Migrated % / % rows (Offset: %)...', + v_current_migrated, v_total_to_migrate, v_offset; + + COMMIT; -- Flushes the batch and drops locks + END LOOP; + + EXECUTE 'DROP TABLE granules_global_unique_old_non_partitioned;'; + RAISE NOTICE 'Granules Migration Completed Successfully. Old table dropped. Total processed: % rows.', v_current_migrated; + END IF; + + --------------------------------------------------------------------------- + -- Files Global Unique Processing + --------------------------------------------------------------------------- + SELECT EXISTS ( + SELECT FROM pg_tables + WHERE tablename = 'files_global_unique_old_non_partitioned' + ) INTO v_old_files_exists; + + IF NOT v_old_files_exists THEN + -- Case A: Old backup table doesn't exist -> Compare table counts + SELECT COUNT(*) INTO v_cnt_files_unique FROM files_global_unique; + SELECT COUNT(*) INTO v_cnt_files FROM files; + + IF v_cnt_files_unique <> v_cnt_files THEN + RAISE EXCEPTION 'File unique counts mismatch! Partitioned unique table has % rows, but base files table has % rows.', + v_cnt_files_unique, v_cnt_files; + ELSE + RAISE NOTICE 'Files count matches (%). No synchronization needed.', v_cnt_files; + END IF; + + ELSE + -- Case B: Old backup table exists -> Migrate from backup table using set-based chunks + SELECT COUNT(*) FROM files_global_unique_old_non_partitioned INTO v_total_to_migrate; + RAISE NOTICE 'Backup table files_global_unique_old_non_partitioned found. Total rows to migrate: %', v_total_to_migrate; + + v_offset := 0; + v_current_migrated := 0; + + LOOP + INSERT INTO files_global_unique (bucket, key) + SELECT bucket, key + FROM files_global_unique_old_non_partitioned + ORDER BY bucket, key + LIMIT v_batch_size OFFSET v_offset + ON CONFLICT DO NOTHING; + + GET DIAGNOSTICS v_rows_moved = ROW_COUNT; + EXIT WHEN v_rows_moved = 0; + + v_offset := v_offset + v_batch_size; + v_current_migrated := v_current_migrated + v_rows_moved; + + RAISE NOTICE 'Files Migration Progress: Migrated % / % rows (Offset: %)...', + v_current_migrated, v_total_to_migrate, v_offset; + + COMMIT; -- Flushes the batch and drops locks + END LOOP; + + EXECUTE 'DROP TABLE files_global_unique_old_non_partitioned;'; + RAISE NOTICE 'Files Migration Completed Successfully. Old table dropped. Total processed: % rows.', v_current_migrated; + END IF; + + RAISE NOTICE 'Migration of Global Unique tables completed successfully.'; +END $$; diff --git a/tasks/add-unique-granuleID/.nycrc.json b/tasks/add-unique-granuleID/.nycrc.json index 0d6f3e99d490..fa5cd5fe11d7 100644 --- a/tasks/add-unique-granuleID/.nycrc.json +++ b/tasks/add-unique-granuleID/.nycrc.json @@ -4,8 +4,8 @@ "dist/src" ], "exclude-after-remap": false, - "statements": 93.0, - "functions": 50.0, - "branches": 83.0, - "lines": 92.85 + "statements": 92.0, + "functions": 47.0, + "branches": 97.0, + "lines": 92.0 } diff --git a/tasks/change-granule-collection-pg/.nycrc.json b/tasks/change-granule-collection-pg/.nycrc.json index be0c06e732e0..5ff0c04e5cc3 100644 --- a/tasks/change-granule-collection-pg/.nycrc.json +++ b/tasks/change-granule-collection-pg/.nycrc.json @@ -1,10 +1,7 @@ { "extends": "../../nyc.config.js", - "include": [ - "*.js" - ], - "statements": 92.0, - "functions": 92.0, - "branches": 78.0, - "lines": 91.0 + "statements": 83.0, + "functions": 85.0, + "branches": 74.0, + "lines": 82.0 } diff --git a/tasks/change-granule-collection-s3/.nycrc.json b/tasks/change-granule-collection-s3/.nycrc.json index 5e479b0b3698..62d681eb5512 100644 --- a/tasks/change-granule-collection-s3/.nycrc.json +++ b/tasks/change-granule-collection-s3/.nycrc.json @@ -1,7 +1,7 @@ { "extends": "../../nyc.config.js", - "statements": 88, - "functions": 87, - "branches": 75.0, - "lines": 90.0 + "statements": 91.0, + "functions": 97.0, + "branches": 79.0, + "lines": 91.0 } diff --git a/tf-modules/data-persistence/variables.tf b/tf-modules/data-persistence/variables.tf index 5b77000fea78..e0dcfb56dd92 100644 --- a/tf-modules/data-persistence/variables.tf +++ b/tf-modules/data-persistence/variables.tf @@ -67,15 +67,19 @@ variable "lambda_memory_sizes" { variable "db_partition_config" { type = object({ # By adding optional(type, default), Terraform handles the null fallback automatically - executions_total_years = optional(number, 2) - granules_count = optional(number, 512) - files_count = optional(number, 1024) + executions_total_years = optional(number, 2) + granules_count = optional(number, 64) + files_count = optional(number, 256) + granules_global_unique_count = optional(number, 16) + files_global_unique_count = optional(number, 64) }) description = < Date: Tue, 30 Jun 2026 11:58:51 -0400 Subject: [PATCH 02/10] Release 22.3.0 (#4524) * changelog and version bump * build docs * generate docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * doc updates * update docs for 4982 PR * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update schema --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jonathan Kovarik --- CHANGELOG.md | 5 +- .../db_schema/relationships.real.large.png | Bin 351431 -> 350747 bytes example/lambdas/asyncOperations/package.json | 2 +- .../ftpPopulateTestLambda/package.json | 14 +- example/lambdas/lzardsClientTest/package.json | 6 +- .../lambdas/python-processing/package.json | 2 +- .../lambdas/python-processing/pyproject.toml | 2 +- example/lambdas/python-processing/uv.lock | 2 +- .../python-reference-activity/package.json | 2 +- .../python-reference-activity/pyproject.toml | 2 +- .../lambdas/python-reference-activity/uv.lock | 2 +- .../python-reference-task/package.json | 2 +- .../python-reference-task/pyproject.toml | 2 +- example/lambdas/python-reference-task/uv.lock | 2 +- example/lambdas/s3AccessTest/package.json | 2 +- example/lambdas/snsS3Test/package.json | 2 +- example/lambdas/versionUpTest/package.json | 2 +- example/package.json | 52 +- example/scripts/generate_ingest/package.json | 6 +- example/scripts/lib/package.json | 2 +- lambdas/db-migration/package.json | 8 +- .../db-provision-user-database/package.json | 6 +- lambdas/dla-migration/package.json | 12 +- .../package.json | 14 +- lambdas/sqs-message-remover/package.json | 10 +- lerna.json | 2 +- packages/api-client/package.json | 8 +- packages/api/ecs/async-operation/package.json | 8 +- packages/api/package.json | 44 +- packages/async-operations/package.json | 16 +- packages/aws-client/package.json | 12 +- packages/checksum/package.json | 2 +- packages/cmr-client/package.json | 12 +- packages/cmrjs/package.json | 20 +- packages/collection-config-store/package.json | 8 +- packages/common/package.json | 8 +- packages/db/package.json | 14 +- packages/distribution-utils/package.json | 8 +- packages/errors/package.json | 2 +- packages/es-client/package.json | 14 +- packages/ingest/package.json | 24 +- packages/integration-tests/package.json | 22 +- packages/launchpad-auth/README.md | 2 +- packages/launchpad-auth/package.json | 6 +- packages/logger/package.json | 2 +- packages/lzards-api-client/package.json | 12 +- packages/message/package.json | 12 +- packages/oauth-client/package.json | 2 +- packages/object-store/package.json | 4 +- packages/pvl/package.json | 2 +- packages/s3-credentials-endpoint/package.json | 14 +- packages/schemas/package.json | 2 +- packages/sftp-client/package.json | 10 +- packages/tea-map-cache/package.json | 6 +- packages/test-data/package.json | 2 +- packages/tf-inventory/package.json | 6 +- packages/types/package.json | 2 +- scripts/generate_records/package.json | 14 +- scripts/unit-error-analysis/package.json | 4 +- tasks/add-missing-file-checksums/package.json | 8 +- tasks/add-unique-granuleID/package.json | 12 +- tasks/aws-api-proxy/package.json | 2 +- tasks/aws-api-proxy/pyproject.toml | 2 +- tasks/aws-api-proxy/uv.lock | 2 +- .../change-granule-collection-pg/package.json | 22 +- .../change-granule-collection-s3/package.json | 22 +- tasks/cnm-response/package.json | 4 +- tasks/cnm-response/pyproject.toml | 2 +- tasks/cnm-response/uv.lock | 2 +- tasks/cnm-to-cma/package.json | 4 +- tasks/cnm-to-cma/pyproject.toml | 2 +- tasks/cnm-to-cma/uv.lock | 2 +- tasks/discover-granules/package.json | 12 +- tasks/discover-pdrs/package.json | 10 +- tasks/files-to-granules/package.json | 10 +- tasks/get-cnm/package.json | 2 +- tasks/get-cnm/pyproject.toml | 2 +- tasks/get-cnm/uv.lock | 2 +- tasks/granule-invalidator/package.json | 2 +- tasks/granule-invalidator/pyproject.toml | 2 +- tasks/granule-invalidator/uv.lock | 2 +- tasks/hello-world/package.json | 6 +- tasks/hyrax-metadata-updates/package.json | 14 +- tasks/lzards-backup/package.json | 24 +- tasks/move-granules/package.json | 20 +- .../orca-copy-to-archive-adapter/package.json | 10 +- tasks/orca-recovery-adapter/package.json | 12 +- tasks/parse-pdr/package.json | 20 +- tasks/pdr-cleanup/package.json | 2 +- tasks/pdr-cleanup/pyproject.toml | 2 +- tasks/pdr-cleanup/uv.lock | 2 +- tasks/pdr-status-check/package.json | 8 +- tasks/post-to-cmr/package.json | 16 +- tasks/queue-granules/package.json | 12 +- tasks/queue-pdrs/package.json | 10 +- tasks/queue-workflow/package.json | 10 +- tasks/send-pan/package.json | 12 +- tasks/sf-sqs-report/package.json | 6 +- tasks/sync-granule/package.json | 22 +- tasks/test-processing/package.json | 6 +- .../package.json | 10 +- .../package.json | 14 +- tf-modules/ingest/package.json | 2 +- .../cumulus-test-cleanup/package.json | 2 +- tf-modules/s3-replicator/package.json | 6 +- .../versioned_docs/version-v22.3.0/README.md | 36 + .../version-v22.3.0/adding-a-task.md | 194 +++++ website/versioned_docs/version-v22.3.0/api.md | 7 + .../version-v22.3.0/architecture.md | 72 ++ .../assets/APIGateway-Delete-Stage.png | Bin 0 -> 85514 bytes ...Cross-account-log-delivery-and-metrics.png | Bin 0 -> 127228 bytes .../assets/CD_run_bulk_modal.png | Bin 0 -> 309909 bytes .../KinesisLambdaTriggerConfiguration.png | Bin 0 -> 57429 bytes .../assets/add_lifecycle_rule.png | Bin 0 -> 402500 bytes .../version-v22.3.0/assets/add_rule.png | Bin 0 -> 107133 bytes .../assets/aws_bucket_console_example.png | Bin 0 -> 377460 bytes .../assets/browse_processing_1.png | Bin 0 -> 159319 bytes .../assets/browse_processing_2.png | Bin 0 -> 174002 bytes .../assets/browse_processing_3.png | Bin 0 -> 126116 bytes .../assets/browse_processing_4.png | Bin 0 -> 30919 bytes .../assets/browse_processing_5.png | Bin 0 -> 9276 bytes .../assets/bulk-granules-modal.png | Bin 0 -> 189470 bytes .../assets/bulk-granules-query-1.png | Bin 0 -> 164200 bytes .../assets/bulk-granules-query-2.png | Bin 0 -> 176872 bytes .../assets/bulk-granules-submitted.png | Bin 0 -> 92110 bytes .../assets/cd_add_collection.png | Bin 0 -> 191308 bytes .../assets/cd_add_collection_filled.png | Bin 0 -> 381888 bytes .../assets/cd_add_collection_overview.png | Bin 0 -> 474495 bytes .../assets/cd_add_discover_rule_form.png | Bin 0 -> 120881 bytes .../assets/cd_add_provider_form.png | Bin 0 -> 154598 bytes .../version-v22.3.0/assets/cd_add_rule.png | Bin 0 -> 182137 bytes .../assets/cd_add_rule_filled.png | Bin 0 -> 261553 bytes .../assets/cd_add_rule_form_blank.png | Bin 0 -> 155825 bytes .../assets/cd_add_rule_overview.png | Bin 0 -> 238295 bytes .../assets/cd_add_s3_provider_form.png | Bin 0 -> 72549 bytes .../version-v22.3.0/assets/cd_bulk_delete.png | Bin 0 -> 383906 bytes .../version-v22.3.0/assets/cd_collection.png | Bin 0 -> 357243 bytes .../assets/cd_collections_page.png | Bin 0 -> 327048 bytes .../assets/cd_execute_publish.png | Bin 0 -> 189348 bytes .../assets/cd_execute_updateconstraints.png | Bin 0 -> 200950 bytes .../assets/cd_executions_page.png | Bin 0 -> 308738 bytes .../version-v22.3.0/assets/cd_granules.png | Bin 0 -> 390544 bytes .../assets/cd_granules_page.png | Bin 0 -> 311773 bytes .../assets/cd_operations_page.png | Bin 0 -> 398945 bytes .../assets/cd_provider_page.png | Bin 0 -> 277477 bytes .../assets/cd_reingest_bulk.png | Bin 0 -> 387476 bytes .../assets/cd_reingest_collection.png | Bin 0 -> 386575 bytes .../assets/cd_reingest_granule_modal.png | Bin 0 -> 656982 bytes .../assets/cd_reingest_modal_bulk.png | Bin 0 -> 749699 bytes .../version-v22.3.0/assets/cd_rules_page.png | Bin 0 -> 255040 bytes .../assets/cd_run_bulk_granules.png | Bin 0 -> 356670 bytes .../assets/cd_running_granules.png | Bin 0 -> 316004 bytes .../assets/cd_workflow_json.png | Bin 0 -> 308900 bytes .../assets/cd_workflow_page.png | Bin 0 -> 230805 bytes .../assets/cloudwatch-retention.png | Bin 0 -> 64163 bytes .../assets/cnm_create_kinesis_stream.jpg | Bin 0 -> 121633 bytes .../assets/cnm_create_kinesis_stream_V2.jpg | Bin 0 -> 506887 bytes .../assets/cnm_success_example.png | Bin 0 -> 256159 bytes .../assets/configure-release-branch-test.png | Bin 0 -> 73388 bytes .../assets/cumulus-arch-diagram-2023.png | Bin 0 -> 380360 bytes .../assets/cumulus-arch-diagram.png | Bin 0 -> 250734 bytes .../assets/cumulus-task-message-flow.png | Bin 0 -> 49586 bytes ...nfiguration_and_message_schema_diagram.png | Bin 0 -> 115465 bytes .../db_schema/relationships.real.large.png | Bin 0 -> 351431 bytes .../assets/gibs_ingest_granules_workflow.png | Bin 0 -> 49167 bytes .../assets/granule_not_found_report.png | Bin 0 -> 281380 bytes .../assets/granule_uniqification_updates.png | Bin 0 -> 159839 bytes .../assets/hello_world_workflow.png | Bin 0 -> 38176 bytes .../version-v22.3.0/assets/iceberg_arch.png | Bin 0 -> 78604 bytes .../assets/iceberg_bootstrap.png | Bin 0 -> 506691 bytes .../version-v22.3.0/assets/icon_note.svg | 1 + .../version-v22.3.0/assets/icon_warning.svg | 1 + .../version-v22.3.0/assets/ingest_diagram.png | Bin 0 -> 23218 bytes .../assets/ingest_diagram_gibs.png | Bin 0 -> 89687 bytes .../assets/interface_diagram.png | Bin 0 -> 19298 bytes .../version-v22.3.0/assets/interfaces.svg | 3 + .../assets/inventory_report.png | Bin 0 -> 251264 bytes .../assets/kibana-create-index-pattern-1.png | Bin 0 -> 203533 bytes .../assets/kibana-create-index-pattern-2.png | Bin 0 -> 190840 bytes .../assets/kibana-discover-page.png | Bin 0 -> 240650 bytes .../assets/kibana-discover-query.png | Bin 0 -> 292084 bytes .../assets/kibana-inspect-query.png | Bin 0 -> 413275 bytes .../assets/kibana-inspect-request.png | Bin 0 -> 446257 bytes .../assets/kinesis-workflow.png | Bin 0 -> 72954 bytes .../version-v22.3.0/assets/lifecycle_1.png | Bin 0 -> 113549 bytes .../version-v22.3.0/assets/lifecycle_2.png | Bin 0 -> 212174 bytes .../version-v22.3.0/assets/lifecycle_4.png | Bin 0 -> 160871 bytes .../version-v22.3.0/assets/lifecycle_5.png | Bin 0 -> 135382 bytes .../version-v22.3.0/assets/new_execution.png | Bin 0 -> 118070 bytes .../assets/pgadmin_create_server.png | Bin 0 -> 197661 bytes .../assets/pgadmin_query_tool.png | Bin 0 -> 359945 bytes .../assets/pgadmin_retrieve_btn.png | Bin 0 -> 7896 bytes .../assets/pgadmin_retrieve_values.png | Bin 0 -> 18254 bytes .../assets/pgadmin_server_connection.png | Bin 0 -> 332791 bytes .../assets/pgadmin_ssh_config.png | Bin 0 -> 21634 bytes .../version-v22.3.0/assets/queue-workflow.png | Bin 0 -> 126620 bytes .../assets/queued-execution-throttling.png | Bin 0 -> 64191 bytes .../assets/raw/interfaces.drawio | 1 + .../assets/rds_cluster_update.jpg | Bin 0 -> 272081 bytes .../assets/rec_reports_overview.png | Bin 0 -> 310851 bytes .../assets/rerun_execution.png | Bin 0 -> 345036 bytes .../assets/rolling-archive.png | Bin 0 -> 136079 bytes .../assets/schedule-workflows.png | Bin 0 -> 31839 bytes .../assets/secrets_manager_update.jpg | Bin 0 -> 110624 bytes ...sips-discover-and-queue-pdrs-execution.png | Bin 0 -> 44378 bytes .../assets/sips-ingest-granule.png | Bin 0 -> 219972 bytes .../version-v22.3.0/assets/sips-parse-pdr.png | Bin 0 -> 148195 bytes .../version-v22.3.0/assets/sips-provider.png | Bin 0 -> 17421 bytes .../assets/sqs_message_attribute.png | Bin 0 -> 43518 bytes .../assets/stepfunctions_graph.png | Bin 0 -> 255839 bytes .../version-v22.3.0/assets/workflow-fail.png | Bin 0 -> 38398 bytes .../assets/workflow_reporting_diagram.png | Bin 0 -> 34369 bytes .../configuration/cloudwatch-retention.md | 106 +++ .../collection-storage-best-practices.md | 184 +++++ .../configuration/data-management-types.md | 305 ++++++++ .../configuration/lifecycle-policies.md | 151 ++++ .../configuration/monitoring.md | 79 +++ .../configuration/server_access_logging.md | 39 + .../configuration/task-configuration.md | 93 +++ .../data-cookbooks/about-cookbooks.md | 27 + .../data-cookbooks/browse-generation.md | 600 ++++++++++++++++ .../data-cookbooks/choice-states.md | 58 ++ .../data-cookbooks/cnm-workflow.md | 640 +++++++++++++++++ .../data-cookbooks/error-handling.md | 268 +++++++ .../data-cookbooks/hello-world.md | 92 +++ .../data-cookbooks/ingest-notifications.md | 149 ++++ .../data-cookbooks/queue-post-to-cmr.md | 132 ++++ .../data-cookbooks/rolling-archive.md | 222 ++++++ .../run-tasks-in-lambda-or-docker.md | 159 +++++ .../data-cookbooks/sips-workflow.md | 151 ++++ .../throttling-queued-executions.md | 200 ++++++ .../data-cookbooks/tracking-files.md | 91 +++ .../version-v22.3.0/deployment/README.md | 671 ++++++++++++++++++ .../deployment/api_gateway_logging.md | 83 +++ .../deployment/apis-introduction.mdx | 23 + .../deployment/choosing_configuring_rds.md | 101 +++ .../version-v22.3.0/deployment/components.md | 77 ++ .../configure_cloudwatch_logs_delivery.md | 32 + .../deployment/create_bucket.md | 40 ++ .../deployment/cumulus-distribution.md | 243 +++++++ .../deployment/databases-introduction.mdx | 15 + .../version-v22.3.0/deployment/iceberg-api.md | 63 ++ .../postgres-database-deployment.md | 483 +++++++++++++ .../deployment/share-s3-access-logs.md | 49 ++ .../deployment/terraform-best-practices.md | 283 ++++++++ .../deployment/thin-egress-app.md | 70 ++ .../version-v22.3.0/deployment/upgrade.md | 90 +++ .../version-v22.3.0/development/forked-pr.md | 44 ++ .../development/integration-tests.md | 31 + .../development/pre-commit-setup.md | 97 +++ .../development/python-best-practices.md | 148 ++++ .../development/quality-and-coverage.md | 34 + .../version-v22.3.0/development/release.md | 444 ++++++++++++ .../development/terraform-best-practices.md | 9 + .../development/typescript-best-practices.md | 44 ++ .../version-v22.3.0/docs-how-to.md | 88 +++ .../external-contributions.md | 29 + .../versioned_docs/version-v22.3.0/faqs.md | 190 +++++ .../features/ancillary_metadata.md | 29 + .../features/backup_and_restore.md | 179 +++++ .../features/change_granule_collection.md | 111 +++ .../features/dead_letter_archive.md | 166 +++++ .../features/distribution-metrics.md | 19 + .../features/execution_payload_retention.md | 88 +++ .../features/granule-id-hashing-approach.md | 180 +++++ .../features/granule_uniquification.md | 284 ++++++++ .../version-v22.3.0/features/iceberg.md | 117 +++ .../features/lambda_dead_letter_queue.md | 41 ++ .../features/logging-esdis-metrics.md | 72 ++ .../features/record_archival.md | 121 ++++ .../features/record_write_options.md | 47 ++ .../features/replay-archived-sqs-messages.md | 27 + .../features/replay-kinesis-messages.md | 41 ++ .../version-v22.3.0/features/reports.md | 141 ++++ .../version-v22.3.0/getting-started.md | 116 +++ .../version-v22.3.0/glossary.md | 224 ++++++ .../integrator-guide/about-int-guide.md | 17 + .../integrator-guide/int-common-use-cases.md | 11 + .../workflow-add-new-lambda.md | 23 + .../workflow-ts-failed-step.md | 27 + .../version-v22.3.0/interfaces.md | 42 ++ .../operator-docs/about-operator-docs.md | 18 + .../operator-docs/bulk-operations.md | 90 +++ .../operator-docs/cmr-operations.md | 69 ++ .../operator-docs/create-rule-in-cumulus.md | 41 ++ .../operator-docs/discovery-filtering.md | 80 +++ .../operator-docs/granule-workflows.md | 71 ++ .../kinesis-stream-for-ingest.md | 33 + .../operator-docs/locating-access-logs.md | 9 + .../operator-docs/naming-executions.md | 98 +++ .../operator-docs/ops-common-use-cases.md | 11 + .../operator-docs/trigger-workflow.md | 98 +++ .../versioned_docs/version-v22.3.0/tasks.md | 286 ++++++++ .../versioned_docs/version-v22.3.0/team.md | 42 ++ .../version-v22.3.0/troubleshooting/README.md | 79 +++ .../troubleshooting/reindex-elasticsearch.md | 166 +++++ .../rerunning-workflow-executions.md | 18 + .../troubleshoot_database_migration.md | 36 + .../troubleshoot_deployment.md | 139 ++++ .../troubleshooting/troubleshoot_iceberg.md | 93 +++ .../upgrade-notes/archived_column_indexing.md | 94 +++ .../collection_cmr_provider_db_update.md | 88 +++ .../collection_metrics_provider_db_update.md | 91 +++ .../upgrade-notes/cumulus-distribution.md | 18 + ...ion-to-partitioned-global-unique-tables.md | 63 ++ .../upgrade-notes/migrate-tea-standalone.md | 182 +++++ .../rds-phase-3-data-migration-guidance.md | 87 +++ .../upgrade-notes/serverless-v2-upgrade.md | 27 + .../upgrade-notes/update-cma-2.0.2.md | 63 ++ ...te-cumulus_id-type-indexes-CUMULUS-3449.md | 251 +++++++ ...granules-to-include-producer_granule_id.md | 250 +++++++ .../update-table-indexes-CUMULUS-3792.md | 153 ++++ .../upgrade-execution-table-CUMULUS-3320.md | 283 ++++++++ .../upgrade-rds-cluster-tf-postgres-13.md | 43 ++ .../upgrade-rds-cluster-tf-postgres-17.md | 41 ++ .../upgrade-notes/upgrade-rds.md | 252 +++++++ .../upgrade-task-file-schemas.md | 203 ++++++ .../upgrade-notes/upgrade-terraform-1.12.md | 104 +++ .../upgrade_rds_phase_3_release.md | 156 ++++ .../upgrading-tf-version-0.13.6.md | 50 ++ .../upgrading-tf-version-1.5.3.md | 42 ++ .../workflow_tasks/discover_granules.md | 93 +++ .../workflow_tasks/files_to_granules.md | 48 ++ .../workflow_tasks/lzards_backup.md | 65 ++ .../workflow_tasks/move_granules.md | 60 ++ .../workflow_tasks/parse_pdr.md | 77 ++ .../workflow_tasks/queue_granules.md | 90 +++ .../version-v22.3.0/workflows/README.md | 184 +++++ .../workflows/cumulus-task-message-flow.md | 133 ++++ .../developing-a-cumulus-workflow.md | 60 ++ .../workflows/developing-workflow-tasks.md | 33 + .../version-v22.3.0/workflows/docker.md | 209 ++++++ .../version-v22.3.0/workflows/input_output.md | 565 +++++++++++++++ .../version-v22.3.0/workflows/lambda.md | 79 +++ .../workflows/message_granule_writes.md | 117 +++ .../version-v22.3.0/workflows/protocol.md | 16 + .../workflow-configuration-how-to.md | 298 ++++++++ .../workflows/workflow-triggers.md | 21 + .../version-v22.3.0-sidebars.json | 357 ++++++++++ website/versions.json | 1 + 340 files changed, 16623 insertions(+), 431 deletions(-) create mode 100644 website/versioned_docs/version-v22.3.0/README.md create mode 100644 website/versioned_docs/version-v22.3.0/adding-a-task.md create mode 100644 website/versioned_docs/version-v22.3.0/api.md create mode 100644 website/versioned_docs/version-v22.3.0/architecture.md create mode 100644 website/versioned_docs/version-v22.3.0/assets/APIGateway-Delete-Stage.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/AWS-Cross-account-log-delivery-and-metrics.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/CD_run_bulk_modal.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/KinesisLambdaTriggerConfiguration.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/add_lifecycle_rule.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/add_rule.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/aws_bucket_console_example.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/browse_processing_1.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/browse_processing_2.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/browse_processing_3.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/browse_processing_4.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/browse_processing_5.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/bulk-granules-modal.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/bulk-granules-query-1.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/bulk-granules-query-2.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/bulk-granules-submitted.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_collection.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_collection_filled.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_collection_overview.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_discover_rule_form.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_provider_form.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_rule.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_rule_filled.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_rule_form_blank.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_rule_overview.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_add_s3_provider_form.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_bulk_delete.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_collection.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_collections_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_execute_publish.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_execute_updateconstraints.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_executions_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_granules.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_granules_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_operations_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_provider_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_reingest_bulk.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_reingest_collection.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_reingest_granule_modal.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_reingest_modal_bulk.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_rules_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_run_bulk_granules.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_running_granules.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_workflow_json.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cd_workflow_page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cloudwatch-retention.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cnm_create_kinesis_stream.jpg create mode 100644 website/versioned_docs/version-v22.3.0/assets/cnm_create_kinesis_stream_V2.jpg create mode 100644 website/versioned_docs/version-v22.3.0/assets/cnm_success_example.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/configure-release-branch-test.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cumulus-arch-diagram-2023.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cumulus-arch-diagram.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cumulus-task-message-flow.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/cumulus_configuration_and_message_schema_diagram.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/db_schema/relationships.real.large.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/gibs_ingest_granules_workflow.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/granule_not_found_report.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/granule_uniqification_updates.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/hello_world_workflow.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/iceberg_arch.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/iceberg_bootstrap.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/icon_note.svg create mode 100644 website/versioned_docs/version-v22.3.0/assets/icon_warning.svg create mode 100644 website/versioned_docs/version-v22.3.0/assets/ingest_diagram.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/ingest_diagram_gibs.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/interface_diagram.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/interfaces.svg create mode 100644 website/versioned_docs/version-v22.3.0/assets/inventory_report.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-create-index-pattern-1.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-create-index-pattern-2.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-discover-page.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-discover-query.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-inspect-query.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kibana-inspect-request.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/kinesis-workflow.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/lifecycle_1.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/lifecycle_2.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/lifecycle_4.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/lifecycle_5.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/new_execution.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_create_server.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_query_tool.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_retrieve_btn.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_retrieve_values.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_server_connection.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/pgadmin_ssh_config.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/queue-workflow.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/queued-execution-throttling.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/raw/interfaces.drawio create mode 100644 website/versioned_docs/version-v22.3.0/assets/rds_cluster_update.jpg create mode 100644 website/versioned_docs/version-v22.3.0/assets/rec_reports_overview.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/rerun_execution.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/rolling-archive.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/schedule-workflows.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/secrets_manager_update.jpg create mode 100644 website/versioned_docs/version-v22.3.0/assets/sips-discover-and-queue-pdrs-execution.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/sips-ingest-granule.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/sips-parse-pdr.png create mode 100755 website/versioned_docs/version-v22.3.0/assets/sips-provider.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/sqs_message_attribute.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/stepfunctions_graph.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/workflow-fail.png create mode 100644 website/versioned_docs/version-v22.3.0/assets/workflow_reporting_diagram.png create mode 100644 website/versioned_docs/version-v22.3.0/configuration/cloudwatch-retention.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/collection-storage-best-practices.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/data-management-types.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/lifecycle-policies.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/monitoring.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/server_access_logging.md create mode 100644 website/versioned_docs/version-v22.3.0/configuration/task-configuration.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/about-cookbooks.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/browse-generation.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/choice-states.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/cnm-workflow.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/error-handling.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/hello-world.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/ingest-notifications.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/queue-post-to-cmr.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/rolling-archive.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/run-tasks-in-lambda-or-docker.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/sips-workflow.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/throttling-queued-executions.md create mode 100644 website/versioned_docs/version-v22.3.0/data-cookbooks/tracking-files.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/README.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/api_gateway_logging.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/apis-introduction.mdx create mode 100644 website/versioned_docs/version-v22.3.0/deployment/choosing_configuring_rds.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/components.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/configure_cloudwatch_logs_delivery.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/create_bucket.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/cumulus-distribution.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/databases-introduction.mdx create mode 100644 website/versioned_docs/version-v22.3.0/deployment/iceberg-api.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/postgres-database-deployment.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/share-s3-access-logs.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/terraform-best-practices.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/thin-egress-app.md create mode 100644 website/versioned_docs/version-v22.3.0/deployment/upgrade.md create mode 100644 website/versioned_docs/version-v22.3.0/development/forked-pr.md create mode 100644 website/versioned_docs/version-v22.3.0/development/integration-tests.md create mode 100644 website/versioned_docs/version-v22.3.0/development/pre-commit-setup.md create mode 100644 website/versioned_docs/version-v22.3.0/development/python-best-practices.md create mode 100644 website/versioned_docs/version-v22.3.0/development/quality-and-coverage.md create mode 100644 website/versioned_docs/version-v22.3.0/development/release.md create mode 100644 website/versioned_docs/version-v22.3.0/development/terraform-best-practices.md create mode 100644 website/versioned_docs/version-v22.3.0/development/typescript-best-practices.md create mode 100644 website/versioned_docs/version-v22.3.0/docs-how-to.md create mode 100644 website/versioned_docs/version-v22.3.0/external-contributions/external-contributions.md create mode 100644 website/versioned_docs/version-v22.3.0/faqs.md create mode 100644 website/versioned_docs/version-v22.3.0/features/ancillary_metadata.md create mode 100644 website/versioned_docs/version-v22.3.0/features/backup_and_restore.md create mode 100644 website/versioned_docs/version-v22.3.0/features/change_granule_collection.md create mode 100644 website/versioned_docs/version-v22.3.0/features/dead_letter_archive.md create mode 100644 website/versioned_docs/version-v22.3.0/features/distribution-metrics.md create mode 100644 website/versioned_docs/version-v22.3.0/features/execution_payload_retention.md create mode 100644 website/versioned_docs/version-v22.3.0/features/granule-id-hashing-approach.md create mode 100644 website/versioned_docs/version-v22.3.0/features/granule_uniquification.md create mode 100644 website/versioned_docs/version-v22.3.0/features/iceberg.md create mode 100644 website/versioned_docs/version-v22.3.0/features/lambda_dead_letter_queue.md create mode 100644 website/versioned_docs/version-v22.3.0/features/logging-esdis-metrics.md create mode 100644 website/versioned_docs/version-v22.3.0/features/record_archival.md create mode 100644 website/versioned_docs/version-v22.3.0/features/record_write_options.md create mode 100644 website/versioned_docs/version-v22.3.0/features/replay-archived-sqs-messages.md create mode 100644 website/versioned_docs/version-v22.3.0/features/replay-kinesis-messages.md create mode 100644 website/versioned_docs/version-v22.3.0/features/reports.md create mode 100644 website/versioned_docs/version-v22.3.0/getting-started.md create mode 100644 website/versioned_docs/version-v22.3.0/glossary.md create mode 100644 website/versioned_docs/version-v22.3.0/integrator-guide/about-int-guide.md create mode 100644 website/versioned_docs/version-v22.3.0/integrator-guide/int-common-use-cases.md create mode 100644 website/versioned_docs/version-v22.3.0/integrator-guide/workflow-add-new-lambda.md create mode 100644 website/versioned_docs/version-v22.3.0/integrator-guide/workflow-ts-failed-step.md create mode 100644 website/versioned_docs/version-v22.3.0/interfaces.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/about-operator-docs.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/bulk-operations.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/cmr-operations.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/create-rule-in-cumulus.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/discovery-filtering.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/granule-workflows.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/kinesis-stream-for-ingest.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/locating-access-logs.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/naming-executions.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/ops-common-use-cases.md create mode 100644 website/versioned_docs/version-v22.3.0/operator-docs/trigger-workflow.md create mode 100644 website/versioned_docs/version-v22.3.0/tasks.md create mode 100644 website/versioned_docs/version-v22.3.0/team.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/README.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/reindex-elasticsearch.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/rerunning-workflow-executions.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/troubleshoot_database_migration.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/troubleshoot_deployment.md create mode 100644 website/versioned_docs/version-v22.3.0/troubleshooting/troubleshoot_iceberg.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/archived_column_indexing.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/collection_cmr_provider_db_update.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/collection_metrics_provider_db_update.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/cumulus-distribution.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/data-migration-to-partitioned-global-unique-tables.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/migrate-tea-standalone.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/rds-phase-3-data-migration-guidance.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/serverless-v2-upgrade.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/update-cma-2.0.2.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/update-cumulus_id-type-indexes-CUMULUS-3449.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/update-granules-to-include-producer_granule_id.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/update-table-indexes-CUMULUS-3792.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-execution-table-CUMULUS-3320.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-rds-cluster-tf-postgres-13.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-rds-cluster-tf-postgres-17.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-rds.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-task-file-schemas.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade-terraform-1.12.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrade_rds_phase_3_release.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrading-tf-version-0.13.6.md create mode 100644 website/versioned_docs/version-v22.3.0/upgrade-notes/upgrading-tf-version-1.5.3.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/discover_granules.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/files_to_granules.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/lzards_backup.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/move_granules.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/parse_pdr.md create mode 100644 website/versioned_docs/version-v22.3.0/workflow_tasks/queue_granules.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/README.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/cumulus-task-message-flow.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/developing-a-cumulus-workflow.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/developing-workflow-tasks.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/docker.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/input_output.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/lambda.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/message_granule_writes.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/protocol.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/workflow-configuration-how-to.md create mode 100644 website/versioned_docs/version-v22.3.0/workflows/workflow-triggers.md create mode 100644 website/versioned_sidebars/version-v22.3.0-sidebars.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 97f40e14be80..b1c698f0f670 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [Unreleased] +## [v22.3.0] 2026-06-29 + #### Migration Notes - **CUMULUS-4982** @@ -9979,7 +9981,8 @@ Note: There was an issue publishing 1.12.0. Upgrade to 1.12.1. ## [v1.0.0] - 2018-02-23 -[Unreleased]: https://github.com/nasa/cumulus/compare/v22.2.5...HEAD +[Unreleased]: https://github.com/nasa/cumulus/compare/v22.3.0...HEAD +[v22.3.0]: https://github.com/nasa/cumulus/compare/v22.2.5...v22.3.0 [v22.2.5]: https://github.com/nasa/cumulus/compare/v22.2.4...v22.2.5 [v22.2.4]: https://github.com/nasa/cumulus/compare/v22.2.3...v22.2.4 [v22.2.3]: https://github.com/nasa/cumulus/compare/v22.2.2...v22.2.3 diff --git a/docs/assets/db_schema/relationships.real.large.png b/docs/assets/db_schema/relationships.real.large.png index 07ebc581c515713f49d429606ed55a72d2894d49..a4c77105ffb0a5b3ce8ac592480258504a55d6a5 100644 GIT binary patch delta 50800 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 `=TK&j0N`aw!b*DDX*{%SD!oR>%ZS-lVG z`$0gp9MjZKt$V6}kEtrviaW?@^ciJ-Vo6J*ejsUP(DkqG>8Xx}{2JDo7%-_r>UPqYjLwt=1qG{{TTxr)tmg{l=;M(H-Aw~ zn+Ff1wHr|JqW#jlPP~vimaL!K;|uoQZ;~c6Z_%=cdnWLTE9gTa5RB!=K;5|(=gV^v z`d=%DL6ZRz+ZW}aB>+V~UcmS3{rvu3TVEbYh}KOT^21tm3FuU3;{Jh)+BfMm{vXmE zcVxWg+*eM{*QdS&Gio=PE@G1gA}F^hd`NF<=QFAJ<=l4C4aDIWK+K&>7usG#R4Se{ zRQ{op@J+?L^+T@@Dn6Ta`-NU$;=k(ZGtgE3`maSc9D3HfneFBz94dgQOfp^&6UB%&Huz6iNq zcN|SH=xN@kedvIP<@MOqo~es6be$PLXY3bW?Rb}|MPZpA=<&TucojU6TP+M(^bL04 zHaeNe{gsm$9UJS~TdW9{Yk9sNVtj?WLEK)(feh!D(YGH+*Kee>o|czh<1?S3gQQT=O&xeIRjyoGnKT^xV%iRP8LqyvNaJ}r=gk=l2JS<=VKBV>X zJvKS>N8Ie^eq-|b&Jew}gUHVUC*M-2q%v4gPFf0$6vuIj>`}YauMdmm0cw5Yngvjw zn9Wu5<*Z_v26m^ekZa7D0h`D-M)IzaaL2QGXN zs){RKkDHcGKkVWhYuj)#vdJinukIt}gE4v^Qf~OX-Br?aa-ud;pA*@XzI2jSJgzvPr6+#n~s7Ry_43$USy5w z$V<5MUkf00Uc=b>KR@v)_l{5h0{tIpl-qAQnYX(ooVC#IN;-7D)*GPaWjhXkF9FkN zir`N7o@d`(dKwcO?{ae)ZAGK_%uO_xC146hG4b;ji}_TMD!LDX2X@+Bzkdiw-G6Iv z3y0;?7qI|YZ)XxrqzyR#eoJ{V=|fjEvhIdVoS8>C!4>hC{k44Xc+<4II-m$*nT!6k z1dHCr@=O|U$_JgCrtWwYH+!RP#q8x;B5 zn;hd9mY>9lG&k7<{UJCpqSAX|J#K-r9C$#Y9CwN|_6bOr^?c1(RGt-z@o60E;(Asxad^Kq?r|%6q@op35 z*7^n=W{bV@tt>h|egZ(ICABS*sG&Hf75V4-&wfZS_gtL)zjKD(XWb4p4dRCY)Yo4D4U}7U&0M_nutWYltV6NIXFE`VF$x zL}DqlwR+)Iee?BM6bc#JLGH?n@$@GCXw|$koUdSq{dK=TdbIFhu}h}A&^Gz=_`%}b zCmXRF5wNZmPl$FC?|;IcnfPO7Bf%`bb6EDFxIP$DT%Lc)?!f62{Q@KLGQ}+w+OK4x z=tUVxDJhQohQLv|?Zo{Vr$?FZ|JXVc8iZlr>6g~9uLG~9PP6R87?oPX{4SHso1nH+ z^1%H@PTseJE7w&=ci-(|O}TrULYLntIFtWvL0ImfeV*i8{zJdN-Clh*b9!03v3GOk-Ev zVVm`HI7K(XYtF4N$n$_dzA6PncSC%;p|8-L@$HjR@k~o?g4vStlOTj0p;Kl+To#A- zU`0tr8cl-`}xnQ}jUxzytPcC6fNj8IGZBuOil z-t&~TnS(BsCkg@XXlb0KO-&*I0Ik5{6$OLlf-=6P)Gvl~=-0b91n)vN?EQl#hqT42yA*FEv4AA{3suk!gT;^ zt~muv-GdFD!{6_C?+;G(5_@_#dC|XcxQFzh*wbSh+)tn~m+6%m0iEaGxM652@xL@$7)eH%0q@1Xn{o*ywS4KRceI z2{{Gi%5ut-qK4%e|NK0RyH>yZTmL0MWhTZCDbrUgxCjehFV-HCxc|qcGxA(MUy^b8 zV>a92{?9CL*S>(2W;LBU&-brL3g2AybKr({-j%i84Lg48zBp!;{6~{f6Gp}lcU<*< E0J}wUZ~y=R delta 51591 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 z%0DQKa~AHP$`%pqh(iicd!aZ9!@+Y{Yu{n?{1H;O079VG?6S;i-ohI@aWz1=0a+kf_&um(OSoOg zu8(E<2l|TtJn{StM#q4r8jO41}V%30Bc0h9N^T66W;t!V;7-g`Zz&fV@f(eQ}wALF)nU(ZN9^pSNM0O#OYa+YJ)32$8m!iy+e-Kfm~4YefoC zDugRtuvdn>pDye|`6Un&K?pbjUMOY;Kq(L?Z``}L>eZ`PH++=o-pf;a{}kKVa*u+) z?>r7_8Z_VH*4WrszZQo5kf(2w+XfCQH)3P2RX z!CKfvAgMd|?p=WXze`*Deq~Z@FgkKmd;0rKNL%v{pc3J ztLf|?f`@`{AYVZSO|AWdW1YGi(j^f5g{ZLx%4jo2#PaaUjYm(Oc!D&n-Lz?cmz(AS zysU(jN@BEZG-vbxTJgqE*uOV|gSjB4tQ8czg($$<9Xq(;83^p<;eCPh2Vn@{KJo3Z=p$#q z?g;KeO#-0S7_3 zWtTn5kfg1no(BXHKXsuSR8t>$TJqY)`VXvHRd0T#+kCU}J91>NA!Obr)WUAj3`tl>Jm@)Y9v%}-BS5%2_4L-^1v@H@^Lg+Iw4Fde_@3n7E8V^a5F|k1 zeL)0}LKhr>IjD~fn`YU`j8{P2@KKui`S&=W)j=5`>xEojGpKb#u#4MwNCx_nrX>}_ z1pD~5HJim@=|n+r=h1*C<{#co*OdCx8$v3@N~AC^w^3MlJv>aX`~_=e@>yw>uc!+e znEuHsC|HQTE{&`kZfQQkGk7dH#l;MmQ4$?JVPf(_yrLB@69?`At6x_T+BNeV!6nlA z%<)=7;>JSYOM@Gk`u)yUKnjv@Ac+u2L|F|DYltca{{R5d)d!?r;BT$;^PnEiYOQWu zap2WCU%qhRG6Wt9@@s*Xh@nH{BxM`;ZXTaRw5Bsf1(Y8mq=l-(+hb8P>F}G ztSj2!1)(xu_wZOUJrp*R1&t1F#p0z)^C3GPm)=DmQMa%V`>X8oB@NB$PipI_U(a5u zqLR&_Au8#6znqor!nb!jP_M2Fs01$Nc2(Br|HI{Kl5Fa?ldu+svNX~^9l~p4P)wio z+G;Mi&8t`dQ2HF!GJ?)IIPf5Pxmd1s7^MVEjW9;7cLvz26eCsouQUl*x&BuRmCs1t zErx5{DkioIGhHrUU9JM?t~kT7dpOC;+IoD(X2&XSZf`h8%@D8dU?2p&68FyZ2l%km z#%5&5BY~{`&+-1-;3D>kps(ZCToJwtRiv0{Q~YaL)VLv2XT$P%1fGYTOkp#nYQ6V9w}%c#}5 zmyWn5j`E%R_q7Fou+*+1Y8~RKq+1f<9R-|54rlDPDIk!s3Tk>DDbtvcL;iq_0zkP; z!h0+Mi%&t*rzdYgws^L!qrR+&)4OCeI}A#vc+ozIM%UHdt%t}A2i^ieBV|2)6Cst* zcKVT~Bd<3jkPeen*rqpe=L~=ovE_da0)EcfB{I&2zWcq6i!b8);$_Q}@X}S>fUbeT zJTPa35^s^M9=}OemJ5(72Ne-yS%m_Dq&B_PEFa49IfD-B!;EjJ%ALc$R7arc9Q zi2e|r;x{%b^|RyjI|rHJk&$(jsOW7xjb;EX0RwR9wJY4oe~?M=797kB4n>B c!k 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 ZIOOJ^=SD2MlOexuI&{>KxIvSa{U7EZP~iXo diff --git a/example/lambdas/asyncOperations/package.json b/example/lambdas/asyncOperations/package.json index 03edfb0ff4a8..173dd74e9d31 100644 --- a/example/lambdas/asyncOperations/package.json +++ b/example/lambdas/asyncOperations/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-async-operations", - "version": "22.2.5", + "version": "22.3.0", "description": "AsyncOperations Test Lambda", "main": "index.js", "private": true, diff --git a/example/lambdas/ftpPopulateTestLambda/package.json b/example/lambdas/ftpPopulateTestLambda/package.json index 4eeaa93ab7c0..344aa4a51ed5 100644 --- a/example/lambdas/ftpPopulateTestLambda/package.json +++ b/example/lambdas/ftpPopulateTestLambda/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ftp-populate-test-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "FTP Population Utility Lambda", "main": "index.js", "private": true, @@ -18,12 +18,12 @@ "access": "private" }, "dependencies": { - "@cumulus/api": "22.2.5", - "@cumulus/api-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/integration-tests": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/test-data": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/api-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/integration-tests": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/test-data": "22.3.0", "fs-extra": "^9.0.0", "jsftp": "https://github.com/jkovarik/jsftp.git#add_288", "lodash": "^4.18.1" diff --git a/example/lambdas/lzardsClientTest/package.json b/example/lambdas/lzardsClientTest/package.json index e544e326f82d..f107225bf771 100644 --- a/example/lambdas/lzardsClientTest/package.json +++ b/example/lambdas/lzardsClientTest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-lzards-api-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "LZARDS API Client Test Lambda", "private": true, "engines": { @@ -20,7 +20,7 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/logger": "22.2.5", - "@cumulus/lzards-api-client": "22.2.5" + "@cumulus/logger": "22.3.0", + "@cumulus/lzards-api-client": "22.3.0" } } diff --git a/example/lambdas/python-processing/package.json b/example/lambdas/python-processing/package.json index bfa347007ce8..2fcf905da0f3 100644 --- a/example/lambdas/python-processing/package.json +++ b/example/lambdas/python-processing/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/python-process-activity", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Python reference activity", "homepage": "https://github.com/nasa/cumulus/tree/master/example/lambdas/python-reference-activity", "repository": { diff --git a/example/lambdas/python-processing/pyproject.toml b/example/lambdas/python-processing/pyproject.toml index 794c43453751..4d4918620ac6 100644 --- a/example/lambdas/python-processing/pyproject.toml +++ b/example/lambdas/python-processing/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cumulus-python-processing" -version = "22.2.5" +version = "22.3.0" description = "Python reference activity that utilizes the Cumulus Process SDK." requires-python = "~=3.12.0" diff --git a/example/lambdas/python-processing/uv.lock b/example/lambdas/python-processing/uv.lock index 7d6a9e078af3..99b47f08ac7c 100644 --- a/example/lambdas/python-processing/uv.lock +++ b/example/lambdas/python-processing/uv.lock @@ -82,7 +82,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/0d/0f/6a8b3f739ab748b5b [[package]] name = "cumulus-python-processing" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "boto3" }, diff --git a/example/lambdas/python-reference-activity/package.json b/example/lambdas/python-reference-activity/package.json index 22b92d584f9c..1c999138a9e2 100644 --- a/example/lambdas/python-reference-activity/package.json +++ b/example/lambdas/python-reference-activity/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/python-reference-activity", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Python reference activity", "homepage": "https://github.com/nasa/cumulus/tree/master/example/lambdas/python-reference-activity", "repository": { diff --git a/example/lambdas/python-reference-activity/pyproject.toml b/example/lambdas/python-reference-activity/pyproject.toml index 15a8a23c66b0..f1e39cd1e7d0 100644 --- a/example/lambdas/python-reference-activity/pyproject.toml +++ b/example/lambdas/python-reference-activity/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cumulus-python-reference-activity" -version = "22.2.5" +version = "22.3.0" description = "Python reference activity" requires-python = "~=3.12.0" dependencies = [ diff --git a/example/lambdas/python-reference-activity/uv.lock b/example/lambdas/python-reference-activity/uv.lock index c5acaf95bc72..e5f598b605e8 100644 --- a/example/lambdas/python-reference-activity/uv.lock +++ b/example/lambdas/python-reference-activity/uv.lock @@ -82,7 +82,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/0d/0f/6a8b3f739ab748b5b [[package]] name = "cumulus-python-reference-activity" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "boto3" }, diff --git a/example/lambdas/python-reference-task/package.json b/example/lambdas/python-reference-task/package.json index aa0cf09666b5..8b9c437268c8 100644 --- a/example/lambdas/python-reference-task/package.json +++ b/example/lambdas/python-reference-task/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/python-reference-task", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Python reference task", "main": "index.js", "homepage": "https://github.com/nasa/cumulus/tree/master/example/lambdas/python-reference-task", diff --git a/example/lambdas/python-reference-task/pyproject.toml b/example/lambdas/python-reference-task/pyproject.toml index afb1f90aa3fa..77edf8d166a2 100644 --- a/example/lambdas/python-reference-task/pyproject.toml +++ b/example/lambdas/python-reference-task/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cumulus-python-reference-task" -version = "22.2.5" +version = "22.3.0" description = "Python reference task" requires-python = "~=3.12.0" dependencies = [ diff --git a/example/lambdas/python-reference-task/uv.lock b/example/lambdas/python-reference-task/uv.lock index af64c01359c2..423aa000b596 100644 --- a/example/lambdas/python-reference-task/uv.lock +++ b/example/lambdas/python-reference-task/uv.lock @@ -82,7 +82,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/0d/0f/6a8b3f739ab748b5b [[package]] name = "cumulus-python-reference-task" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "boto3" }, diff --git a/example/lambdas/s3AccessTest/package.json b/example/lambdas/s3AccessTest/package.json index 6bcd579c527c..69a41e19551e 100644 --- a/example/lambdas/s3AccessTest/package.json +++ b/example/lambdas/s3AccessTest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-s3-access", - "version": "22.2.5", + "version": "22.3.0", "description": "S3 Access Test Lambda", "main": "index.js", "private": true, diff --git a/example/lambdas/snsS3Test/package.json b/example/lambdas/snsS3Test/package.json index f9cace1359ec..ed0b5e787a7f 100644 --- a/example/lambdas/snsS3Test/package.json +++ b/example/lambdas/snsS3Test/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-sns-s3", - "version": "22.2.5", + "version": "22.3.0", "description": "SNS to S3 Test Lambda", "main": "index.js", "private": true, diff --git a/example/lambdas/versionUpTest/package.json b/example/lambdas/versionUpTest/package.json index 2b6782fc9a6e..a3f3e18de8e7 100644 --- a/example/lambdas/versionUpTest/package.json +++ b/example/lambdas/versionUpTest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-version-up", - "version": "22.2.5", + "version": "22.3.0", "description": "Version Up Test Lambda", "main": "index.js", "private": true, diff --git a/example/package.json b/example/package.json index 1370559aeae0..5a937f0e779c 100644 --- a/example/package.json +++ b/example/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cumulus-integration-tests", - "version": "22.2.5", + "version": "22.3.0", "description": "Cumulus Integration Test Deployment", "private": true, "main": "index.js", @@ -48,32 +48,32 @@ "@aws-sdk/client-lambda": "^3.993.0", "@aws-sdk/client-sns": "^3.993.0", "@aws-sdk/client-sts": "^3.993.0", - "@cumulus/api": "22.2.5", - "@cumulus/api-client": "22.2.5", - "@cumulus/async-operations": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/checksum": "22.2.5", - "@cumulus/cmr-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/discover-granules": "22.2.5", - "@cumulus/discover-pdrs": "22.2.5", - "@cumulus/files-to-granules": "22.2.5", - "@cumulus/hello-world": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/integration-tests": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/move-granules": "22.2.5", - "@cumulus/parse-pdr": "22.2.5", - "@cumulus/pdr-status-check": "22.2.5", - "@cumulus/post-to-cmr": "22.2.5", - "@cumulus/queue-granules": "22.2.5", - "@cumulus/queue-pdrs": "22.2.5", - "@cumulus/sf-sqs-report": "22.2.5", - "@cumulus/sync-granule": "22.2.5", - "@cumulus/test-processing": "22.2.5" + "@cumulus/api": "22.3.0", + "@cumulus/api-client": "22.3.0", + "@cumulus/async-operations": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/checksum": "22.3.0", + "@cumulus/cmr-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/discover-granules": "22.3.0", + "@cumulus/discover-pdrs": "22.3.0", + "@cumulus/files-to-granules": "22.3.0", + "@cumulus/hello-world": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/integration-tests": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/move-granules": "22.3.0", + "@cumulus/parse-pdr": "22.3.0", + "@cumulus/pdr-status-check": "22.3.0", + "@cumulus/post-to-cmr": "22.3.0", + "@cumulus/queue-granules": "22.3.0", + "@cumulus/queue-pdrs": "22.3.0", + "@cumulus/sf-sqs-report": "22.3.0", + "@cumulus/sync-granule": "22.3.0", + "@cumulus/test-processing": "22.3.0" }, "devDependencies": { - "@cumulus/test-data": "22.2.5" + "@cumulus/test-data": "22.3.0" } } diff --git a/example/scripts/generate_ingest/package.json b/example/scripts/generate_ingest/package.json index 826af3359e02..0bca4a4950c4 100644 --- a/example/scripts/generate_ingest/package.json +++ b/example/scripts/generate_ingest/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/generate_ingest", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Script to generate test data for scaled ingest", "keywords": [ "GIBS", @@ -22,8 +22,8 @@ "directory": "packages/types" }, "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5" + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0" }, "author": "Cumulus Authors", "license": "Apache-2.0" diff --git a/example/scripts/lib/package.json b/example/scripts/lib/package.json index 0374ade596fc..90e42400179f 100644 --- a/example/scripts/lib/package.json +++ b/example/scripts/lib/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/example-lib", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "example project libs", "homepage": "https://github.com/nasa/cumulus/tree/master/example/scripts/lib", "engines": { diff --git a/lambdas/db-migration/package.json b/lambdas/db-migration/package.json index 584aacf2d67a..a0d2e60b5d84 100644 --- a/lambdas/db-migration/package.json +++ b/lambdas/db-migration/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/db-migration-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "A Lambda function used for deploying DB migrations", "license": "Apache-2.0", "engines": { @@ -29,9 +29,9 @@ "timeout": "5m" }, "dependencies": { - "@cumulus/common": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/common": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/logger": "22.3.0", "knex": "2.4.1", "pg": "~8.13" } diff --git a/lambdas/db-provision-user-database/package.json b/lambdas/db-provision-user-database/package.json index dab2e76e0287..10e3e26d7590 100644 --- a/lambdas/db-provision-user-database/package.json +++ b/lambdas/db-provision-user-database/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/db-provision-user-database-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "A Lambda function used for provisioning user databases", "engines": { "node": ">=22.21.1" @@ -29,8 +29,8 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "^3.993.0", - "@cumulus/common": "22.2.5", - "@cumulus/db": "22.2.5", + "@cumulus/common": "22.3.0", + "@cumulus/db": "22.3.0", "knex": "2.4.1", "lodash": "^4.18.1", "pg": "~8.13" diff --git a/lambdas/dla-migration/package.json b/lambdas/dla-migration/package.json index e6c9f99c955e..9d8796394228 100644 --- a/lambdas/dla-migration/package.json +++ b/lambdas/dla-migration/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/dla-migration-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "A Lambda function used for DLA migrations", "license": "Apache-2.0", "engines": { @@ -23,11 +23,11 @@ "webpack": "../../node_modules/.bin/webpack" }, "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0", "lodash": "^4.18.1", "moment": "^2.30.1", "p-map": "^4.0.0" diff --git a/lambdas/migration-helper-async-operation/package.json b/lambdas/migration-helper-async-operation/package.json index c1b49115acf7..221440cf8712 100644 --- a/lambdas/migration-helper-async-operation/package.json +++ b/lambdas/migration-helper-async-operation/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/migration-helper-async-operation", - "version": "22.2.5", + "version": "22.3.0", "description": "Lambda function helps with various migrations", "author": "Cumulus Authors", "license": "Apache-2.0", @@ -30,12 +30,12 @@ "failFast": true }, "dependencies": { - "@cumulus/api": "22.2.5", - "@cumulus/async-operations": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/async-operations": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/types": "22.3.0", "lodash": "^4.18.1" } } diff --git a/lambdas/sqs-message-remover/package.json b/lambdas/sqs-message-remover/package.json index 5910da8aea91..4998f58d0b53 100644 --- a/lambdas/sqs-message-remover/package.json +++ b/lambdas/sqs-message-remover/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sqs-message-remover-lambda", - "version": "22.2.5", + "version": "22.3.0", "description": "Remove processed messages from SQS queues", "main": "src/index.js", "private": true, @@ -39,10 +39,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/logger": "22.3.0", "lodash": "^4.18.1" } } diff --git a/lerna.json b/lerna.json index b4d9d88f1365..b921f529c58e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "22.2.5" + "version": "22.3.0" } diff --git a/packages/api-client/package.json b/packages/api-client/package.json index e0c29b34059f..4d14a125d9c1 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/api-client", - "version": "22.2.5", + "version": "22.3.0", "description": "API client for working with the Cumulus archive API", "keywords": [ "GIBS", @@ -42,11 +42,11 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-lambda": "^3.993.0", - "@cumulus/aws-client": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/logger": "22.3.0", "p-retry": "^2.0.0" }, "devDependencies": { - "@cumulus/types": "22.2.5" + "@cumulus/types": "22.3.0" } } diff --git a/packages/api/ecs/async-operation/package.json b/packages/api/ecs/async-operation/package.json index dbbccefb5ba0..c146030172c2 100644 --- a/packages/api/ecs/async-operation/package.json +++ b/packages/api/ecs/async-operation/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ecs-async-operation", - "version": "22.2.5", + "version": "22.3.0", "description": "The docker image for running async operations", "keywords": [ "NASA", @@ -31,9 +31,9 @@ }, "dependencies": { "@aws-sdk/client-lambda": "^3.993.0", - "@cumulus/aws-client": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/logger": "22.3.0", "crypto-random-string": "^3.2.0", "got": "^11.8.5", "lodash": "^4.18.1", diff --git a/packages/api/package.json b/packages/api/package.json index efa9a0998f54..3cf61d3c7040 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/api", - "version": "22.2.5", + "version": "22.3.0", "description": "Lambda functions for handling all daac's API operations", "main": "index.js", "engines": { @@ -56,26 +56,26 @@ "@aws-sdk/client-sfn": "^3.993.0", "@aws-sdk/client-sns": "^3.993.0", "@aws-sdk/client-sqs": "^3.993.0", - "@cumulus/api-client": "22.2.5", - "@cumulus/async-operations": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmr-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/collection-config-store": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/es-client": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/oauth-client": "22.2.5", - "@cumulus/object-store": "22.2.5", - "@cumulus/pvl": "22.2.5", - "@cumulus/sftp-client": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/async-operations": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmr-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/collection-config-store": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/es-client": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/oauth-client": "22.3.0", + "@cumulus/object-store": "22.3.0", + "@cumulus/pvl": "22.3.0", + "@cumulus/sftp-client": "22.3.0", + "@cumulus/types": "22.3.0", "@hapi/boom": "^10.0.0", "aggregate-error": "^3.1.0", "ajv": "^8.18.0", @@ -121,7 +121,7 @@ "zod": "^3.20.2" }, "devDependencies": { - "@cumulus/test-data": "22.2.5", + "@cumulus/test-data": "22.3.0", "aws-sdk-client-mock": "^3.0.1", "proxyquire": "^2.1.3" } diff --git a/packages/async-operations/package.json b/packages/async-operations/package.json index 29233ecfd5fc..fbfd1c05e43a 100644 --- a/packages/async-operations/package.json +++ b/packages/async-operations/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/async-operations", - "version": "22.2.5", + "version": "22.3.0", "description": "Cumulus Core internal async operations module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -32,16 +32,16 @@ "dependencies": { "@aws-sdk/client-ecs": "^3.993.0", "@aws-sdk/client-lambda": "^3.993.0", - "@cumulus/aws-client": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/es-client": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/es-client": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/types": "22.3.0", "knex": "2.4.1", "uuid": "^11.1.1" }, "devDependencies": { - "@cumulus/common": "22.2.5" + "@cumulus/common": "22.3.0" } } diff --git a/packages/aws-client/package.json b/packages/aws-client/package.json index 83665feb6f59..ae0ddb27e3ce 100644 --- a/packages/aws-client/package.json +++ b/packages/aws-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/aws-client", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for working with AWS", "keywords": [ "GIBS", @@ -69,10 +69,10 @@ "@aws-sdk/s3-request-presigner": "^3.993.0", "@aws-sdk/signature-v4-crt": "^3.993.0", "@aws-sdk/types": "^3.609.0", - "@cumulus/checksum": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/checksum": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/types": "22.3.0", "lodash": "^4.18.1", "mem": "^8.0.2", "p-map": "^1.2.0", @@ -83,6 +83,6 @@ "uuid": "^11.1.1" }, "devDependencies": { - "@cumulus/test-data": "22.2.5" + "@cumulus/test-data": "22.3.0" } } diff --git a/packages/checksum/package.json b/packages/checksum/package.json index 209ef3d799ca..f0cd14828033 100644 --- a/packages/checksum/package.json +++ b/packages/checksum/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/checksum", - "version": "22.2.5", + "version": "22.3.0", "description": "Cumulus checksum utilities", "engines": { "node": ">=22.21.1" diff --git a/packages/cmr-client/package.json b/packages/cmr-client/package.json index b76fede518c6..22ea6a3593ca 100644 --- a/packages/cmr-client/package.json +++ b/packages/cmr-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cmr-client", - "version": "22.2.5", + "version": "22.3.0", "description": "A Node.js client to NASA's Common Metadata Repository (CMR) API.", "engines": { "node": ">=22.21.1" @@ -36,11 +36,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5", "jsonwebtoken": "^9.0.0", "lodash": "^4.18.1", diff --git a/packages/cmrjs/package.json b/packages/cmrjs/package.json index cc303c17a4a5..4a91f11aae6d 100644 --- a/packages/cmrjs/package.json +++ b/packages/cmrjs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cmrjs", - "version": "22.2.5", + "version": "22.3.0", "description": "A node SDK for CMR", "engines": { "node": ">=22.21.1" @@ -36,14 +36,14 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmr-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmr-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", "got": "^11.8.1", "js2xmlparser": "^5.0.0", "lodash": "^4.18.1", @@ -52,6 +52,6 @@ "xml2js": "0.5.0" }, "devDependencies": { - "@cumulus/types": "22.2.5" + "@cumulus/types": "22.3.0" } } diff --git a/packages/collection-config-store/package.json b/packages/collection-config-store/package.json index 7ae809d457a8..df843be67897 100644 --- a/packages/collection-config-store/package.json +++ b/packages/collection-config-store/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/collection-config-store", - "version": "22.2.5", + "version": "22.3.0", "description": "Utility for persisting collection configuration to S3 and retrieving it", "keywords": [ "CUMULUS", @@ -35,8 +35,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/message": "22.2.5" + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/message": "22.3.0" } } diff --git a/packages/common/package.json b/packages/common/package.json index 4b0161ef2cdf..f595fd7486b6 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/common", - "version": "22.2.5", + "version": "22.3.0", "description": "Common utilities used across tasks", "keywords": [ "GIBS", @@ -45,9 +45,9 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/signature-v4-crt": "^3.993.0", - "@cumulus/aws-client": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", "ajv": "^6.12.3", "follow-redirects": "^1.2.4", "fs-extra": "^5.0.0", diff --git a/packages/db/package.json b/packages/db/package.json index d53188083df0..e70d6d24ca7b 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/db", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for working with the Cumulus DB", "license": "Apache-2.0", "main": "./dist/index.js", @@ -47,12 +47,12 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "^3.993.0", - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0", "@duckdb/node-api": "^1.4.4-r.1", "crypto-random-string": "^3.2.0", "is-valid-hostname": "1.0.2", diff --git a/packages/distribution-utils/package.json b/packages/distribution-utils/package.json index b7ecbdb17fc7..82b99a57ddf9 100644 --- a/packages/distribution-utils/package.json +++ b/packages/distribution-utils/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/distribution-utils", - "version": "22.2.5", + "version": "22.3.0", "description": "Cumulus Distribution utilities", "keywords": [ "CUMULUS" @@ -35,9 +35,9 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", "url-join": "^1.1.0" }, "devDependencies": { diff --git a/packages/errors/package.json b/packages/errors/package.json index c04508ecb62b..0717adffe0f3 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/errors", - "version": "22.2.5", + "version": "22.3.0", "description": "Provides error classes for Cumulus", "keywords": [ "GIBS", diff --git a/packages/es-client/package.json b/packages/es-client/package.json index 5b8363d7f1be..76466bd32d49 100644 --- a/packages/es-client/package.json +++ b/packages/es-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/es-client", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for working with Elasticsearch", "keywords": [ "CUMULUS", @@ -34,10 +34,10 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-providers": "^3.993.0", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", "@elastic/elasticsearch": "^5.6.20", "aws4": "^1.12.0", "lodash": "^4.18.1", @@ -45,8 +45,8 @@ "p-limit": "^1.2.0" }, "devDependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/test-data": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/test-data": "22.3.0", "p-each-series": "^2.1.0" } } diff --git a/packages/ingest/package.json b/packages/ingest/package.json index 8fd485f0e746..3368b153329e 100644 --- a/packages/ingest/package.json +++ b/packages/ingest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ingest", - "version": "22.2.5", + "version": "22.3.0", "description": "Ingest utilities", "engines": { "node": ">=22.21.1" @@ -40,13 +40,13 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/sftp-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/sftp-client": "22.3.0", "cksum": "^1.3.0", "encodeurl": "^1.0.2", "fs-extra": "^5.0.0", @@ -60,9 +60,9 @@ "tough-cookie": "~4.0.0" }, "devDependencies": { - "@cumulus/checksum": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/test-data": "22.2.5", - "@cumulus/types": "22.2.5" + "@cumulus/checksum": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/test-data": "22.3.0", + "@cumulus/types": "22.3.0" } } diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 2cfa0698b73b..f933325698a8 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/integration-tests", - "version": "22.2.5", + "version": "22.3.0", "description": "Integration tests", "bin": { "cumulus-test": "./bin/cli.js" @@ -31,16 +31,16 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-lambda": "^3.993.0", - "@cumulus/api": "22.2.5", - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmr-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/oauth-client": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmr-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/oauth-client": "22.3.0", "base-64": "^0.1.0", "commander": "^2.15.0", "dotenv": "^8.2.0", diff --git a/packages/launchpad-auth/README.md b/packages/launchpad-auth/README.md index 84c83c98ad2c..8c1366116e90 100644 --- a/packages/launchpad-auth/README.md +++ b/packages/launchpad-auth/README.md @@ -61,7 +61,7 @@ newly made valid token. Validate a Launchpad token **Kind**: Exported function -**Returns**: The validate result object: +**Returns**: The validate result object with: status - 'success' or 'failed'; message - reason for failure; session_maxtimeout - number (seconds); diff --git a/packages/launchpad-auth/package.json b/packages/launchpad-auth/package.json index 75be374bdf6b..62df1d0edb66 100644 --- a/packages/launchpad-auth/package.json +++ b/packages/launchpad-auth/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/launchpad-auth", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for authentication with Launchpad", "keywords": [ "CUMULUS", @@ -40,8 +40,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5", "lodash": "^4.18.1", "p-retry": "^4.2.0", diff --git a/packages/logger/package.json b/packages/logger/package.json index 28fb7a5ffdbd..c15848ddb3e6 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/logger", - "version": "22.2.5", + "version": "22.3.0", "description": "A log library for use on Cumulus", "keywords": [ "GIBS", diff --git a/packages/lzards-api-client/package.json b/packages/lzards-api-client/package.json index d73c84298a2d..dc51bac10745 100644 --- a/packages/lzards-api-client/package.json +++ b/packages/lzards-api-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/lzards-api-client", - "version": "22.2.5", + "version": "22.3.0", "description": "A Node.js client to NASA's Level Zero and Repositories Data Store (LZARDS) API.", "engines": { "node": ">=22.21.1" @@ -35,11 +35,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5", "lodash": "^4.18.1" } diff --git a/packages/message/package.json b/packages/message/package.json index 91253526d2a4..663a18e929d2 100644 --- a/packages/message/package.json +++ b/packages/message/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/message", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for building and parsing Cumulus messages", "keywords": [ "GIBS", @@ -41,11 +41,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/types": "22.3.0", "jsonpath-plus": "^10.0.0", "lodash": "^4.18.1", "uuid": "^11.1.1" diff --git a/packages/oauth-client/package.json b/packages/oauth-client/package.json index 7ec477f4b073..7e55a181ee4a 100644 --- a/packages/oauth-client/package.json +++ b/packages/oauth-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/oauth-client", - "version": "22.2.5", + "version": "22.3.0", "description": "A generic auth client", "homepage": "https://github.com/nasa/cumulus/tree/master/packages/oauth-client#readme", "repository": { diff --git a/packages/object-store/package.json b/packages/object-store/package.json index 5527ae4b04c5..343353eb2b25 100644 --- a/packages/object-store/package.json +++ b/packages/object-store/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/object-store", - "version": "22.2.5", + "version": "22.3.0", "description": "Utilities for managing object stores", "keywords": [ "GIBS", @@ -42,6 +42,6 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5" + "@cumulus/aws-client": "22.3.0" } } diff --git a/packages/pvl/package.json b/packages/pvl/package.json index dbaf2cf671fe..bc60e80fe524 100644 --- a/packages/pvl/package.json +++ b/packages/pvl/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pvl", - "version": "22.2.5", + "version": "22.3.0", "description": "Parse and serialize Parameter Value Language, a data markup language used by NASA", "main": "index.js", "engine": { diff --git a/packages/s3-credentials-endpoint/package.json b/packages/s3-credentials-endpoint/package.json index dd8105570144..b2ce15786508 100644 --- a/packages/s3-credentials-endpoint/package.json +++ b/packages/s3-credentials-endpoint/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/s3-credentials-endpoint", - "version": "22.2.5", + "version": "22.3.0", "description": "An API Gateway Lambda to return AWS credentials for fetching objects from S3", "license": "Apache-2.0", "engines": { @@ -20,12 +20,12 @@ "failFast": true }, "dependencies": { - "@cumulus/api": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/oauth-client": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/oauth-client": "22.3.0", "aws-serverless-express": "^3.3.6", "body-parser": "^1.19.0", "cookie-parser": "^1.4.4", diff --git a/packages/schemas/package.json b/packages/schemas/package.json index f0ed442eb461..0771b435c705 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/schemas", - "version": "22.2.5", + "version": "22.3.0", "description": "Helpers for managing Cumulus task schemas", "homepage": "https://github.com/nasa/cumulus/tree/master/packages/schemas", "repository": { diff --git a/packages/sftp-client/package.json b/packages/sftp-client/package.json index fa5e823d4f55..ca33a488412f 100644 --- a/packages/sftp-client/package.json +++ b/packages/sftp-client/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sftp-client", - "version": "22.2.5", + "version": "22.3.0", "description": "A Promise-based SFTP client", "keywords": [ "GIBS", @@ -39,16 +39,16 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "lodash": "^4.18.1", "mime-types": "^2.1.27", "ssh2": "^1.16.0", "ssh2-sftp-client": "^11.0.0" }, "devDependencies": { - "@cumulus/checksum": "22.2.5", - "@cumulus/test-data": "22.2.5", + "@cumulus/checksum": "22.3.0", + "@cumulus/test-data": "22.3.0", "@types/ssh2-sftp-client": "^7.0.0" } } diff --git a/packages/tea-map-cache/package.json b/packages/tea-map-cache/package.json index 2f0d26c3161b..16e88e022804 100644 --- a/packages/tea-map-cache/package.json +++ b/packages/tea-map-cache/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/tea-map-cache", - "version": "22.2.5", + "version": "22.3.0", "description": "Tea Bucket Map Cache Writer", "main": "index.js", "engines": { @@ -30,8 +30,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5", "p-retry": "^4.2.0" }, diff --git a/packages/test-data/package.json b/packages/test-data/package.json index 0ebf72fc895a..f290d67a63cd 100644 --- a/packages/test-data/package.json +++ b/packages/test-data/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-data", - "version": "22.2.5", + "version": "22.3.0", "description": "Includes the test data for various packages", "keywords": [ "GIBS", diff --git a/packages/tf-inventory/package.json b/packages/tf-inventory/package.json index d7cd2ed90f56..76a58949e3a7 100644 --- a/packages/tf-inventory/package.json +++ b/packages/tf-inventory/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/tf-inventory", - "version": "22.2.5", + "version": "22.3.0", "description": "Package to help keep track of what resources are managed by Terraform in the AWS account", "main": "index.js", "engines": { @@ -32,11 +32,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "commander": "^4.1.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/common": "22.2.5" + "@cumulus/common": "22.3.0" } } diff --git a/packages/types/package.json b/packages/types/package.json index b3791757bf7c..6b0d5311cb9f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/types", - "version": "22.2.5", + "version": "22.3.0", "description": "TypeScript definitions for working with Cumulus data structures", "keywords": [ "GIBS", diff --git a/scripts/generate_records/package.json b/scripts/generate_records/package.json index 727c6fc1e30e..4ad942794bde 100644 --- a/scripts/generate_records/package.json +++ b/scripts/generate_records/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/generate_records", - "version": "22.2.5", + "version": "22.3.0", "author": "Cumulus Authors", "description": "compile errors", "license": "Apache-2.0", @@ -27,12 +27,12 @@ "timeout": "10m" }, "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/common": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/integration-tests": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/common": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/integration-tests": "22.3.0", + "@cumulus/logger": "22.3.0", "@types/minimist": "^1.2.5", "cli-progress": "^3.12.0", "crypto-js": "^4.2.0", diff --git a/scripts/unit-error-analysis/package.json b/scripts/unit-error-analysis/package.json index 16bd11b76a95..9d0db8922827 100644 --- a/scripts/unit-error-analysis/package.json +++ b/scripts/unit-error-analysis/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/unit-error-analysis", - "version": "22.2.5", + "version": "22.3.0", "author": "Cumulus Authors", "description": "compile errors", "license": "Apache-2.0", @@ -25,7 +25,7 @@ "tsc:listEmittedFiles": "../../node_modules/.bin/tsc --listEmittedFiles" }, "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@types/minimist": "^1.2.5", "minimist": "^1.2.8", "moment": "^2.30.1" diff --git a/tasks/add-missing-file-checksums/package.json b/tasks/add-missing-file-checksums/package.json index 04a7f9476b31..f66fd506f5de 100644 --- a/tasks/add-missing-file-checksums/package.json +++ b/tasks/add-missing-file-checksums/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/add-missing-file-checksums", - "version": "22.2.5", + "version": "22.3.0", "description": "Add checksums to files in S3 which don't have one", "author": "Cumulus Authors", "license": "Apache-2.0", @@ -45,12 +45,12 @@ "failFast": true }, "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0" }, "devDependencies": { - "@cumulus/schemas": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/schemas": "22.3.0", + "@cumulus/types": "22.3.0", "@types/aws-lambda": "^8.10.58" } } diff --git a/tasks/add-unique-granuleID/package.json b/tasks/add-unique-granuleID/package.json index 9197475a7936..d58df97b1ee6 100644 --- a/tasks/add-unique-granuleID/package.json +++ b/tasks/add-unique-granuleID/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/add-unique-granule-id", - "version": "22.2.5", + "version": "22.3.0", "description": "A Cumulus task to add a unique granule ID to a granule", "main": "dist/index.js", "private": true, @@ -40,11 +40,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/common": "22.2.5", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5" + "@cumulus/ingest": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0" } } diff --git a/tasks/aws-api-proxy/package.json b/tasks/aws-api-proxy/package.json index b38b2a3d3b62..4d42d1f13253 100644 --- a/tasks/aws-api-proxy/package.json +++ b/tasks/aws-api-proxy/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/aws-api-proxy-task", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "AWS API proxy task", "main": "index.js", "homepage": "https://github.com/nasa/cumulus/tree/master/tasks/aws-api-proxy", diff --git a/tasks/aws-api-proxy/pyproject.toml b/tasks/aws-api-proxy/pyproject.toml index c706d7184405..4f97f398d4d4 100644 --- a/tasks/aws-api-proxy/pyproject.toml +++ b/tasks/aws-api-proxy/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "aws-api-proxy" -version = "22.2.5" +version = "22.3.0" description = "Makes specified AWS API calls wrapped the Cumulus Message Adapter" readme = "README.md" requires-python = ">=3.12" diff --git a/tasks/aws-api-proxy/uv.lock b/tasks/aws-api-proxy/uv.lock index e1e3670ae2a8..3102a035972c 100644 --- a/tasks/aws-api-proxy/uv.lock +++ b/tasks/aws-api-proxy/uv.lock @@ -22,7 +22,7 @@ wheels = [ [[package]] name = "aws-api-proxy" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "cumulus-message-adapter" }, diff --git a/tasks/change-granule-collection-pg/package.json b/tasks/change-granule-collection-pg/package.json index 4b395be5ff00..d7ea16f6c826 100644 --- a/tasks/change-granule-collection-pg/package.json +++ b/tasks/change-granule-collection-pg/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/change-granule-collection-pg", - "version": "22.2.5", + "version": "22.3.0", "description": "Move granule files and postgres records to a new collection", "private": true, "main": "dist/index.js", @@ -41,19 +41,19 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5" + "@cumulus/errors": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0" }, "devDependencies": { - "@cumulus/api": "22.2.5", - "@cumulus/db": "22.2.5", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/es-client": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/db": "22.3.0", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/es-client": "22.3.0", "lodash": "^4.18.1" } } diff --git a/tasks/change-granule-collection-s3/package.json b/tasks/change-granule-collection-s3/package.json index 04e556643dab..d4516fbd835c 100644 --- a/tasks/change-granule-collection-s3/package.json +++ b/tasks/change-granule-collection-s3/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/change-granule-collection-s3", - "version": "22.2.5", + "version": "22.3.0", "description": "Move granule files and postgres records to a new collection", "private": true, "main": "dist/index.js", @@ -41,20 +41,20 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { "@aws-sdk/client-sns": "^3.993.0", - "@cumulus/api": "22.2.5" + "@cumulus/api": "22.3.0" } } diff --git a/tasks/cnm-response/package.json b/tasks/cnm-response/package.json index 9845949de9dd..2161ada52ece 100644 --- a/tasks/cnm-response/package.json +++ b/tasks/cnm-response/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cnm-response", - "version": "22.2.5", + "version": "22.3.0", "description": "CNM Response task", "main": "index.js", "directories": { @@ -27,6 +27,6 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/cnm-response/pyproject.toml b/tasks/cnm-response/pyproject.toml index ce23145624e3..ce44b0069a4d 100644 --- a/tasks/cnm-response/pyproject.toml +++ b/tasks/cnm-response/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cnm-response" -version = "22.2.5" +version = "22.3.0" description = "CNM Response task" requires-python = "~=3.12.0" dependencies = [ diff --git a/tasks/cnm-response/uv.lock b/tasks/cnm-response/uv.lock index 582e6691f562..e42fc016db22 100644 --- a/tasks/cnm-response/uv.lock +++ b/tasks/cnm-response/uv.lock @@ -98,7 +98,7 @@ wheels = [ [[package]] name = "cnm-response" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "boto3" }, diff --git a/tasks/cnm-to-cma/package.json b/tasks/cnm-to-cma/package.json index 973cd32424ec..6cc35c07263a 100644 --- a/tasks/cnm-to-cma/package.json +++ b/tasks/cnm-to-cma/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cnm-to-cma", - "version": "22.2.5", + "version": "22.3.0", "description": "CNM to CMA task", "main": "index.js", "directories": { @@ -27,6 +27,6 @@ "author": "Cumulus Author : Cumulus Coreification Team", "license": "Apache-2.0", "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/cnm-to-cma/pyproject.toml b/tasks/cnm-to-cma/pyproject.toml index ce48e3a20e7f..92ef5f6c43f0 100644 --- a/tasks/cnm-to-cma/pyproject.toml +++ b/tasks/cnm-to-cma/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cnm-to-cma" -version = "22.2.5" +version = "22.3.0" description = "Translate CNM message to CMA" authors = [ { name = "ESHINDavid Yen", email = "david.yen@jpl.nasa.gov" } diff --git a/tasks/cnm-to-cma/uv.lock b/tasks/cnm-to-cma/uv.lock index 188f569f2d03..a7b3a3892af5 100644 --- a/tasks/cnm-to-cma/uv.lock +++ b/tasks/cnm-to-cma/uv.lock @@ -107,7 +107,7 @@ wheels = [ [[package]] name = "cnm-to-cma" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "cumulus-message-adapter-python" }, diff --git a/tasks/discover-granules/package.json b/tasks/discover-granules/package.json index c9adadc14833..fdab50e373c3 100644 --- a/tasks/discover-granules/package.json +++ b/tasks/discover-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-granules", - "version": "22.2.5", + "version": "22.3.0", "description": "Discover Granules in FTP/HTTP/HTTPS/SFTP/S3 endpoints", "main": "index.js", "directories": { @@ -39,16 +39,16 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api-client": "22.2.5", + "@cumulus/api-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/ingest": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5", "lodash": "^4.18.1", "p-map": "^4.0.0" }, "devDependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5" + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0" } } diff --git a/tasks/discover-pdrs/package.json b/tasks/discover-pdrs/package.json index 7bf03b2e50cf..8ed820dbb75d 100644 --- a/tasks/discover-pdrs/package.json +++ b/tasks/discover-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/discover-pdrs", - "version": "22.2.5", + "version": "22.3.0", "description": "Discover PDRs in FTP and HTTP endpoints", "main": "index.js", "directories": { @@ -38,14 +38,14 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", + "@cumulus/ingest": "22.3.0", "lodash": "^4.18.1", "p-filter": "^2.1.0" }, "devDependencies": { - "@cumulus/common": "22.2.5", - "@cumulus/errors": "22.2.5" + "@cumulus/common": "22.3.0", + "@cumulus/errors": "22.3.0" } } diff --git a/tasks/files-to-granules/package.json b/tasks/files-to-granules/package.json index d01f95f25e10..a5dbad90bd82 100644 --- a/tasks/files-to-granules/package.json +++ b/tasks/files-to-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/files-to-granules", - "version": "22.2.5", + "version": "22.3.0", "description": "Converts array-of-files input into a granules object by extracting granuleId from filename", "main": "index.js", "directories": { @@ -36,13 +36,13 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", + "@cumulus/errors": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/common": "22.2.5", - "@cumulus/schemas": "22.2.5" + "@cumulus/common": "22.3.0", + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/get-cnm/package.json b/tasks/get-cnm/package.json index fe79651cc6cc..1d2642e25925 100644 --- a/tasks/get-cnm/package.json +++ b/tasks/get-cnm/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/get-cnm-task", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Get CNM task", "main": "index.js", "homepage": "https://github.com/nasa/cumulus/tree/master/tasks/get-cnm", diff --git a/tasks/get-cnm/pyproject.toml b/tasks/get-cnm/pyproject.toml index ed43b292bde9..16fa4d431edb 100644 --- a/tasks/get-cnm/pyproject.toml +++ b/tasks/get-cnm/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "get-cnm" -version = "22.2.5" +version = "22.3.0" description = "Retrieves the originating CNM message for a specified granule" readme = "README.md" requires-python = ">=3.12" diff --git a/tasks/get-cnm/uv.lock b/tasks/get-cnm/uv.lock index fa3ac14c3a63..eb326334ce33 100644 --- a/tasks/get-cnm/uv.lock +++ b/tasks/get-cnm/uv.lock @@ -351,7 +351,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/4a/92/8e97cc640181f72eb [[package]] name = "get-cnm" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "cumulus-api" }, diff --git a/tasks/granule-invalidator/package.json b/tasks/granule-invalidator/package.json index 5a7d215d8c27..214fc9a74388 100644 --- a/tasks/granule-invalidator/package.json +++ b/tasks/granule-invalidator/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/granule-invalidator-task", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "Granule invalidator task", "main": "index.js", "homepage": "https://github.com/nasa/cumulus/tree/master/tasks/granule-invalidator", diff --git a/tasks/granule-invalidator/pyproject.toml b/tasks/granule-invalidator/pyproject.toml index 1efc960eaf91..8503343ca4d4 100644 --- a/tasks/granule-invalidator/pyproject.toml +++ b/tasks/granule-invalidator/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "granule-invalidator" -version = "22.2.5" +version = "22.3.0" description = "Identifies granules that fulfill specific criteria" readme = "README.md" requires-python = ">=3.12" diff --git a/tasks/granule-invalidator/uv.lock b/tasks/granule-invalidator/uv.lock index bab95cea1435..96cbe117a452 100644 --- a/tasks/granule-invalidator/uv.lock +++ b/tasks/granule-invalidator/uv.lock @@ -351,7 +351,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/4a/92/8e97cc640181f72eb [[package]] name = "granule-invalidator" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "cumulus-api" }, diff --git a/tasks/hello-world/package.json b/tasks/hello-world/package.json index ba24f4554a83..c9a7d3258646 100644 --- a/tasks/hello-world/package.json +++ b/tasks/hello-world/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/hello-world", - "version": "22.2.5", + "version": "22.3.0", "description": "Example task", "main": "index.js", "directories": { @@ -36,8 +36,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0" } } diff --git a/tasks/hyrax-metadata-updates/package.json b/tasks/hyrax-metadata-updates/package.json index bf940cff46bb..4242e010aaf0 100644 --- a/tasks/hyrax-metadata-updates/package.json +++ b/tasks/hyrax-metadata-updates/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/hyrax-metadata-updates", - "version": "22.2.5", + "version": "22.3.0", "description": "Update granule metadata with hooks to OPeNDAP URL", "main": "index.js", "directories": { @@ -41,17 +41,17 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmr-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmr-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", + "@cumulus/errors": "22.3.0", "lodash": "^4.18.1", "xml2js": "0.6.2" }, "devDependencies": { - "@cumulus/schemas": "22.2.5", + "@cumulus/schemas": "22.3.0", "jsonwebtoken": "^9.0.0", "nock": "^12.0.1", "rewire": "^6.0.0" diff --git a/tasks/lzards-backup/package.json b/tasks/lzards-backup/package.json index 77ab0fc92592..bc08ea55fbed 100644 --- a/tasks/lzards-backup/package.json +++ b/tasks/lzards-backup/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/lzards-backup", - "version": "22.2.5", + "version": "22.3.0", "description": "Run LZARDS backup", "author": "Cumulus Authors", "license": "Apache-2.0", @@ -46,20 +46,20 @@ "failFast": true }, "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/db": "22.2.5", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/lzards-api-client": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/db": "22.3.0", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/lzards-api-client": "22.3.0", + "@cumulus/message": "22.3.0", "got": "^11.8.5" }, "devDependencies": { - "@cumulus/schemas": "22.2.5", - "@cumulus/types": "22.2.5" + "@cumulus/schemas": "22.3.0", + "@cumulus/types": "22.3.0" } } diff --git a/tasks/move-granules/package.json b/tasks/move-granules/package.json index d3d919eb5ecc..2355c6ad6487 100644 --- a/tasks/move-granules/package.json +++ b/tasks/move-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/move-granules", - "version": "22.2.5", + "version": "22.3.0", "description": "Move granule files from staging to final location", "main": "index.js", "directories": { @@ -41,18 +41,18 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/errors": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/errors": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/orca-copy-to-archive-adapter/package.json b/tasks/orca-copy-to-archive-adapter/package.json index 33def6d1fb35..1be090c4defd 100644 --- a/tasks/orca-copy-to-archive-adapter/package.json +++ b/tasks/orca-copy-to-archive-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/orca-copy-to-archive-adapter", - "version": "22.2.5", + "version": "22.3.0", "description": "Adapter to invoke orca copy-to-archive lambda", "main": "dist/index.js", "private": true, @@ -40,13 +40,13 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/logger": "22.2.5", + "@cumulus/logger": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/orca-recovery-adapter/package.json b/tasks/orca-recovery-adapter/package.json index 981b78d8d6eb..2b54303023c5 100644 --- a/tasks/orca-recovery-adapter/package.json +++ b/tasks/orca-recovery-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/orca-recovery-adapter", - "version": "22.2.5", + "version": "22.3.0", "description": "Adapter to invoke orca recovery workflow", "main": "dist/index.js", "private": true, @@ -40,14 +40,14 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/logger": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/logger": "22.3.0", + "@cumulus/message": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/parse-pdr/package.json b/tasks/parse-pdr/package.json index ce1d7e0c8eea..68107cf94d86 100644 --- a/tasks/parse-pdr/package.json +++ b/tasks/parse-pdr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/parse-pdr", - "version": "22.2.5", + "version": "22.3.0", "description": "Download and Parse a given PDR", "license": "Apache-2.0", "main": "index.js", @@ -34,18 +34,18 @@ "failFast": true }, "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/collection-config-store": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/collection-config-store": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/logger": "22.2.5", - "@cumulus/pvl": "22.2.5", + "@cumulus/errors": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/logger": "22.3.0", + "@cumulus/pvl": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/test-data": "22.2.5" + "@cumulus/test-data": "22.3.0" } } diff --git a/tasks/pdr-cleanup/package.json b/tasks/pdr-cleanup/package.json index deefed33c5f3..e47a25cf99bd 100644 --- a/tasks/pdr-cleanup/package.json +++ b/tasks/pdr-cleanup/package.json @@ -1,7 +1,7 @@ { "name": "@cumulus/pdr-cleanup", "private": true, - "version": "22.2.5", + "version": "22.3.0", "description": "This task is for cleaning up PDRs after a successful ingest", "homepage": "https://github.com/nasa/cumulus/tree/master/tasks/pdr-cleanup", "repository": { diff --git a/tasks/pdr-cleanup/pyproject.toml b/tasks/pdr-cleanup/pyproject.toml index e08275eadfb1..3898af435389 100644 --- a/tasks/pdr-cleanup/pyproject.toml +++ b/tasks/pdr-cleanup/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pdr-cleanup" -version = "22.2.5" +version = "22.3.0" description = "This task is for cleaning up PDRs after a successful ingest" readme = "README.md" requires-python = ">=3.12.0" diff --git a/tasks/pdr-cleanup/uv.lock b/tasks/pdr-cleanup/uv.lock index 02da3e979da0..333f9e49ea26 100644 --- a/tasks/pdr-cleanup/uv.lock +++ b/tasks/pdr-cleanup/uv.lock @@ -242,7 +242,7 @@ wheels = [ [[package]] name = "pdr-cleanup" -version = "22.2.5" +version = "22.3.0" source = { virtual = "." } dependencies = [ { name = "boto3" }, diff --git a/tasks/pdr-status-check/package.json b/tasks/pdr-status-check/package.json index cf231506da8a..fc8417c7ab95 100644 --- a/tasks/pdr-status-check/package.json +++ b/tasks/pdr-status-check/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/pdr-status-check", - "version": "22.2.5", + "version": "22.3.0", "description": "Checks execution status of granules in a PDR", "main": "index.js", "directories": { @@ -35,9 +35,9 @@ "failFast": true }, "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5" + "@cumulus/errors": "22.3.0" } } diff --git a/tasks/post-to-cmr/package.json b/tasks/post-to-cmr/package.json index c06d8c747e41..3ae3a62e9172 100644 --- a/tasks/post-to-cmr/package.json +++ b/tasks/post-to-cmr/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/post-to-cmr", - "version": "22.2.5", + "version": "22.3.0", "description": "Post a given granule to CMR", "main": "index.js", "directories": { @@ -36,17 +36,17 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", - "@cumulus/launchpad-auth": "22.2.5", + "@cumulus/errors": "22.3.0", + "@cumulus/launchpad-auth": "22.3.0", "lodash": "^4.18.1", "p-map": "^4.0.0" }, "devDependencies": { - "@cumulus/cmr-client": "22.2.5", - "@cumulus/schemas": "22.2.5" + "@cumulus/cmr-client": "22.3.0", + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/queue-granules/package.json b/tasks/queue-granules/package.json index c1dd123be9d9..fa1e2357bee9 100644 --- a/tasks/queue-granules/package.json +++ b/tasks/queue-granules/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-granules", - "version": "22.2.5", + "version": "22.3.0", "description": "Add discovered granules to the queue", "main": "dist/src/index.js", "directories": { @@ -46,12 +46,12 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api-client": "22.2.5", - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api-client": "22.3.0", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", "lodash": "^4.18.1", "p-map": "^4.0.0" } diff --git a/tasks/queue-pdrs/package.json b/tasks/queue-pdrs/package.json index 8e84735efce7..9cf6b9936a3c 100644 --- a/tasks/queue-pdrs/package.json +++ b/tasks/queue-pdrs/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-pdrs", - "version": "22.2.5", + "version": "22.3.0", "description": "Add discovered PDRs to a queue", "main": "index.js", "directories": { @@ -35,11 +35,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", "lodash": "^4.18.1" } } diff --git a/tasks/queue-workflow/package.json b/tasks/queue-workflow/package.json index d20285011ae8..414267dd68bc 100644 --- a/tasks/queue-workflow/package.json +++ b/tasks/queue-workflow/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/queue-workflow", - "version": "22.2.5", + "version": "22.3.0", "description": "Add workflow to the queue", "main": "index.js", "directories": { @@ -35,11 +35,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", "lodash": "^4.18.1" } } diff --git a/tasks/send-pan/package.json b/tasks/send-pan/package.json index 27942de26adb..9765741d0472 100644 --- a/tasks/send-pan/package.json +++ b/tasks/send-pan/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/send-pan", - "version": "22.2.5", + "version": "22.3.0", "description": "Sends a PAN response after parsing a PDR.", "main": "dist/index.js", "private": true, @@ -40,15 +40,15 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/api": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/api": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/ingest": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/ingest": "22.3.0", + "@cumulus/logger": "22.3.0", "got": "^11.8.5" }, "devDependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "url-join": "^4.0.0" } } diff --git a/tasks/sf-sqs-report/package.json b/tasks/sf-sqs-report/package.json index 476bac471a8c..2c9f4ff9c150 100644 --- a/tasks/sf-sqs-report/package.json +++ b/tasks/sf-sqs-report/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sf-sqs-report", - "version": "22.2.5", + "version": "22.3.0", "description": "Sends an incoming Cumulus message to SQS", "main": "index.js", "directories": { @@ -36,11 +36,11 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/common": "22.2.5" + "@cumulus/common": "22.3.0" } } diff --git a/tasks/sync-granule/package.json b/tasks/sync-granule/package.json index 472229be3484..f0357472bdc2 100644 --- a/tasks/sync-granule/package.json +++ b/tasks/sync-granule/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/sync-granule", - "version": "22.2.5", + "version": "22.3.0", "description": "Download a given granule", "main": "index.js", "directories": { @@ -40,21 +40,21 @@ "failFast": true }, "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/collection-config-store": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/collection-config-store": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/errors": "22.2.5", - "@cumulus/ingest": "22.2.5", - "@cumulus/message": "22.2.5", - "@cumulus/types": "22.2.5", + "@cumulus/errors": "22.3.0", + "@cumulus/ingest": "22.3.0", + "@cumulus/message": "22.3.0", + "@cumulus/types": "22.3.0", "lodash": "^4.18.1", "p-map": "^2.1.0", "uuid": "^11.1.1" }, "devDependencies": { - "@cumulus/schemas": "22.2.5", - "@cumulus/sftp-client": "22.2.5", - "@cumulus/test-data": "22.2.5" + "@cumulus/schemas": "22.3.0", + "@cumulus/sftp-client": "22.3.0", + "@cumulus/test-data": "22.3.0" } } diff --git a/tasks/test-processing/package.json b/tasks/test-processing/package.json index 1935b176c151..e278cc147e0b 100644 --- a/tasks/test-processing/package.json +++ b/tasks/test-processing/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/test-processing", - "version": "22.2.5", + "version": "22.3.0", "description": "Fake processing task used for integration tests", "main": "index.js", "homepage": "https://github.com/nasa/cumulus/tree/master/tasks/test-processing", @@ -24,8 +24,8 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", + "@cumulus/aws-client": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/integration-tests": "22.2.5" + "@cumulus/integration-tests": "22.3.0" } } diff --git a/tasks/update-cmr-access-constraints/package.json b/tasks/update-cmr-access-constraints/package.json index 9954410e3362..36173a269d5e 100644 --- a/tasks/update-cmr-access-constraints/package.json +++ b/tasks/update-cmr-access-constraints/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/update-cmr-access-constraints", - "version": "22.2.5", + "version": "22.3.0", "description": "Updates CMR metadata to set access constraints", "author": "Cumulus Authors", "license": "Apache-2.0", @@ -37,13 +37,13 @@ "failFast": true }, "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/common": "22.2.5", - "@cumulus/schemas": "22.2.5" + "@cumulus/common": "22.3.0", + "@cumulus/schemas": "22.3.0" } } diff --git a/tasks/update-granules-cmr-metadata-file-links/package.json b/tasks/update-granules-cmr-metadata-file-links/package.json index f95cb4287f10..4c92fcf05727 100644 --- a/tasks/update-granules-cmr-metadata-file-links/package.json +++ b/tasks/update-granules-cmr-metadata-file-links/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/update-granules-cmr-metadata-file-links", - "version": "22.2.5", + "version": "22.3.0", "description": "Update CMR metadata files with correct online access urls and etags and transfer etag info to granules' CMR files", "main": "index.js", "directories": { @@ -40,15 +40,15 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5", - "@cumulus/cmrjs": "22.2.5", - "@cumulus/common": "22.2.5", + "@cumulus/aws-client": "22.3.0", + "@cumulus/cmrjs": "22.3.0", + "@cumulus/common": "22.3.0", "@cumulus/cumulus-message-adapter-js": "2.4.0", - "@cumulus/distribution-utils": "22.2.5", - "@cumulus/logger": "22.2.5", + "@cumulus/distribution-utils": "22.3.0", + "@cumulus/logger": "22.3.0", "lodash": "^4.18.1" }, "devDependencies": { - "@cumulus/schemas": "22.2.5" + "@cumulus/schemas": "22.3.0" } } diff --git a/tf-modules/ingest/package.json b/tf-modules/ingest/package.json index 6270e44b4684..5943dcb4bd31 100644 --- a/tf-modules/ingest/package.json +++ b/tf-modules/ingest/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/ingest-module", - "version": "22.2.5", + "version": "22.3.0", "description": "Terraform module for data ingest related functionality", "engines": { "node": ">=22.21.1" diff --git a/tf-modules/internal/cumulus-test-cleanup/package.json b/tf-modules/internal/cumulus-test-cleanup/package.json index c178affac8c6..20df48192f0b 100644 --- a/tf-modules/internal/cumulus-test-cleanup/package.json +++ b/tf-modules/internal/cumulus-test-cleanup/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/cumulus-test-cleanup", - "version": "22.2.5", + "version": "22.3.0", "description": "Nightly cron job for cleaning up integration test artifacts", "main": "index.js", "engines": { diff --git a/tf-modules/s3-replicator/package.json b/tf-modules/s3-replicator/package.json index ec770b064edd..ea2cff1a1583 100644 --- a/tf-modules/s3-replicator/package.json +++ b/tf-modules/s3-replicator/package.json @@ -1,6 +1,6 @@ { "name": "@cumulus/s3-replicator", - "version": "22.2.5", + "version": "22.3.0", "description": "Replicate S3 Events to alternate bucket. Solves same-region replication.", "engines": { "node": ">=22.21.1" @@ -25,10 +25,10 @@ "author": "Cumulus Authors", "license": "Apache-2.0", "dependencies": { - "@cumulus/aws-client": "22.2.5" + "@cumulus/aws-client": "22.3.0" }, "devDependencies": { - "@cumulus/common": "22.2.5" + "@cumulus/common": "22.3.0" }, "private": true } diff --git a/website/versioned_docs/version-v22.3.0/README.md b/website/versioned_docs/version-v22.3.0/README.md new file mode 100644 index 000000000000..e5dab16cdae4 --- /dev/null +++ b/website/versioned_docs/version-v22.3.0/README.md @@ -0,0 +1,36 @@ +--- +id: cumulus-docs-readme +slug: / +title: Introduction +hide_title: false +--- + +This Cumulus project seeks to address the existing need for a “native” cloud-based data ingest, archive, distribution, and management system that can be used for all future Earth Observing System Data and Information System (EOSDIS) data streams via the development and implementation of Cumulus. The term “native” implies that the system will leverage all components of a cloud infrastructure provided by the vendor for efficiency (in terms of both processing time and cost). Additionally, Cumulus will operate on future data streams involving satellite missions, aircraft missions, and field campaigns. + +This documentation includes both guidelines, examples, and source code docs. It is accessible at . + +--- + +## Navigating the Cumulus Docs + +### Get To Know Cumulus + +* Getting Started - [here](getting-started.md) - If you are new to Cumulus we suggest that you begin with this section to help you understand and work in the environment. +* General Cumulus Documentation - [here](README.md) <- you're here + +### Cumulus Reference Docs + +* Cumulus API Documentation - [here](https://nasa.github.io/cumulus-api) +* Cumulus Developer Documentation - [here](https://github.com/nasa/cumulus) - READMEs throughout the main repository. +* Data Cookbooks - [here](data-cookbooks/about-cookbooks.md) + +### Auxiliary Guides + +* Integrator Guide - [here](integrator-guide/about-int-guide.md) +* Operator Docs - [here](operator-docs/about-operator-docs.md) + +--- + +## Contributing + +Please refer to: for information. We thank you in advance. diff --git a/website/versioned_docs/version-v22.3.0/adding-a-task.md b/website/versioned_docs/version-v22.3.0/adding-a-task.md new file mode 100644 index 000000000000..18c2ca2fbd30 --- /dev/null +++ b/website/versioned_docs/version-v22.3.0/adding-a-task.md @@ -0,0 +1,194 @@ +--- +id: adding-a-task +title: Contributing a Task +hide_title: false +--- + +We're tracking reusable Cumulus tasks [in this list](tasks.md) and, if you've got one you'd like to share with others, read on to learn how. + +## The tasks.md file is generated in the build process + +The tasks list in docs/tasks.md is generated from the list of task package names from the tasks folder. + +:::caution + +Do not edit the docs/tasks.md file directly. + +::: + +## Software Best Practices and Expectations + +The repository uses lerna to manage the repository. Please reference the [Quality and Coverage documentation](development/quality-and-coverage.md) and the [Python Best Practices](development/python-best-practices.md) or [TypeScript Best Practices](development/typescript-best-practices.md) documentation for expectations and tooling for the specific language. + +## Example Templates and Task Messaging + +Example templates have been created for both [Python](https://github.com/nasa/cumulus/tree/master/example/lambdas/python-reference-task) and [Typescript](https://github.com/nasa/cumulus/tree/master/tasks/add-missing-file-checksums) tasks for developers that exhibit the best practices and expectations for creating a Cumulus task. Tasks should conform to the Cumulus Message Adapter Schema for inter task messaging. This is the accepted input and output scheme. + +## Task Layout and Standards + +### Creating a task + +To create a task, start by making a directory under the tasks directory. The new task directory name should be a descriptive name of the task. The name should be in lower case with `-` used in place of spaces. Copy the contents of the task language example to the new task directory. + +The new task directory should look something like the following. Note that the files may differ slightly depending on the language. + +```text +. +├── bin +│ └── package.sh +├── Dockerfile +├── package.json +├── pyproject.toml* +├── README.md +├── schemas +│ ├── config.json +│ ├── input.json +│ └── output.json +├── src +│ ├── main.py* +│ └── python_refrence_task* +│ ├── __init__.py* +│ ├── schema.py* +│ └── task.py* +├── deploy +│ ├── main.tf +│ ├── output.tf +│ └── variables.tf +├── tests +│ ├── integration_tests +│ └── unit_tests +│ ├── __init__.py* +│ ├── python_reference_task* +│ │ ├── __init__.py* +│ │ └── test_task.py* +│ └── test_main.py* +├── tsconfig.json* +└── webpack.config.js* +``` + +:::note + +Those files and directories with a trailing `*` are language specific files and directories and may not be present depending on the language and example template related to the task. + +::: + +### Explanation of directories + +The task layout should include the following directories. + +#### `src` directory + +The `src` directory should contain the code for your task. + +#### `tests` directory + +The `tests` directory should contain all unit tests and if possible, all integraton tests. + +#### `deploy` directory + +The `deploy` directory should contain the terraform code for deploying the task. + +#### `schemas` directory + +The `schemas` directory contains JSON schemas for the input, output , and configuration the task. These files can be generated documentation or JSON schema documentation used for interface validation. + +#### `bin` directory + +The `bin` directory contains various scripts specific to this task, often written in bash, to help build, test, and deploy the task. + +### Explanation of files + +The task should contain the following files. + +#### `README.md` file + +The `README.md` file should provide sufficient documentation about the task. The template for the task README.md file can be found below. Those strings surrounded by `<>` are indicators where a developer should replace the information with that specific to the task. + +````md +# @cumulus/ + + + +## Usage + +This lambda takes the following input and config objects, derived from workflow configuration using the [Cumulus Message Adapter](https://github.com/nasa/cumulus-message-adapter/blob/master/CONTRACT.md) to drive configuration from the full cumulus message. The output from the task follows the Cumulus Message Adapter contract and provides the information detailed below. + +### Configuration + + + +### Input + + + +### Output + + + +### Example workflow configuration and use + + + +## Architecture + + + +```mermaid +architecture-beta + group trigger(cloud) [Starting Task] + group task(cloud)[Task] + + service db(database)[Database] in task + service ps3(disk)[Provider S3 Storage] in task + service as3(disk)[Archive S3 Storage] in task + service lambda(server)[Lambda Task] in task + + service tlambda(server) [Lambda Task] in trigger + + tlambda{group}:B --> T:lambda{group} + + lambda:R --> L:db + lambda:L --> R:ps3 + lambda:B --> T:as3 +``` + +### Internal Dependencies + + + +### External Dependencies + + + +## Development and Deployment + + + +## Contributing + +To make a contribution, please [see our Cumulus contributing guidelines](https://github.com/nasa/cumulus/blob/master/CONTRIBUTING.md) and our documentation on [adding a task](https://nasa.github.io/cumulus/docs/adding-a-task) + +## About Cumulus + +Cumulus is a cloud-based data ingest, archive, distribution and management prototype for NASA's future Earth science data streams. + +[Cumulus Documentation](https://nasa.github.io/cumulus) +```` + +#### `package.json` file + +The `package.json` file contains information on the task including executable commands for scripts to perform quality checking, building, and deploying of tasks. + +:::note + +In Python tasks, the `package.json` file is generated from the `pyproject.toml` file using a script. This file is used throughout the repository to perform repo wide CI/CD builds, deploys, and testing. + +::: + +## Quality Testing, Building, and Deploying + +All tasks should have worthwhile unit tests that accurately represent the input/output data that is expected from the task. Tasks should have a minimum of 80% coverage for unit tests. In addition to unit tests, integration tests should also be created and automated. Generally, integration tests should be done using the proper generic workflow patterns the task is expected to be a part of that covers known use cases. Additional Enterprise level testing verification and validation will be done in coordination with the Enterprise Test and Quality team in a production like setting and with production like data to validate performance and regression tests for any potential production issues. + +The task should build using one of two methods. For tasks that will be packaged for AWS lambdas, a zip file should be created for deployment. All other tasks should be built using an OCI compliant image. Examples of both build types are available in the language specific example. + +Deploying a task should be self contained as a terraform module. The task should be able to be deployed either as itself and as part of the larger software deployment. diff --git a/website/versioned_docs/version-v22.3.0/api.md b/website/versioned_docs/version-v22.3.0/api.md new file mode 100644 index 000000000000..7706b2a62083 --- /dev/null +++ b/website/versioned_docs/version-v22.3.0/api.md @@ -0,0 +1,7 @@ +--- +id: api +title: Cumulus API +hide_title: false +--- + +Read the Cumulus API documentation at [https://nasa.github.io/cumulus-api](https://nasa.github.io/cumulus-api) diff --git a/website/versioned_docs/version-v22.3.0/architecture.md b/website/versioned_docs/version-v22.3.0/architecture.md new file mode 100644 index 000000000000..a1ab0b944ad5 --- /dev/null +++ b/website/versioned_docs/version-v22.3.0/architecture.md @@ -0,0 +1,72 @@ +--- +id: architecture +title: Architecture +hide_title: false +--- + +## Architecture + +Below, find a diagram with the components that comprise an instance of Cumulus. + +![Architecture diagram of a Cumulus deployment](assets/cumulus-arch-diagram-2023.png) + +This diagram details all of the major architectural components of a Cumulus deployment. + +While the diagram can feel complex, it can easily be digested in several major components: + +### Data Distribution + +End Users can access data via Cumulus's `distribution` submodule, which includes ASF's [thin egress application](https://github.com/asfadmin/thin-egress-app), this provides authenticated data egress, temporary S3 links and other statistics features. + +#### Data search + +End user exposure of Cumulus's holdings is expected to be provided by an external service. + +For NASA use, this is assumed to be [CMR]() in this diagram. + +### Data ingest + +#### Workflows + +The core of the ingest and processing capabilities in Cumulus is built into the deployed AWS [Step Function](https://aws.amazon.com/step-functions/) workflows. Cumulus rules trigger workflows via either Cloud Watch rules, Kinesis streams, SNS topic, or SQS queue. The workflows then run with a configured [Cumulus message](./workflows/cumulus-task-message-flow), utilizing built-in processes to report status of granules, PDRs, executions, etc to the [Data Persistence](#data-persistence) components. + +Workflows can optionally report granule metadata to [CMR](), and workflow steps can report metrics information to a shared SNS topic, which could be subscribed to for near real time granule, execution, and PDR status. This could be used for metrics reporting using an external ELK stack, for example. + +#### Data persistence + +Cumulus entity state data is stored in a [PostgreSQL](https://www.postgresql.org/) compatible database, and is exported to an Elasticsearch instance for non-authoritative querying/state data for the API and other applications that require more complex queries. + +#### Data discovery + +Discovering data for ingest is handled via workflow step components using Cumulus `provider` and `collection` configurations and various triggers. Data can be ingested from AWS S3, FTP, HTTPS and more. + +#### Database + +Cumulus utilizes a user-provided PostgreSQL database backend. For improved API search query efficiency Cumulus provides data replication to an Elasticsearch instance. + +##### PostgreSQL Database Schema Diagram + +![ERD of the Cumulus Database](assets/db_schema/relationships.real.large.png) + +### Maintenance + +System maintenance personnel have access to manage ingest and various portions of Cumulus via an [AWS API gateway](), as well as the operator [dashboard](https://github.com/nasa/cumulus-dashboard). + +## Deployment Structure + +Cumulus is deployed via [Terraform](https://www.terraform.io/) and is organized internally into two separate top-level modules, as well as several external modules. + +### Cumulus + +The [Cumulus module](https://github.com/nasa/cumulus/tree/master/tf-modules/cumulus), which contains multiple internal submodules, deploys all of the Cumulus components that are not part of the `Data Persistence` portion of this diagram. + +### Data persistence + +The [data persistence](https://github.com/nasa/cumulus/tree/master/tf-modules/data-persistence) module provides the `Data Persistence` portion of the diagram. + +### Other modules + +Other modules are provided as artifacts on the [release](https://github.com/nasa/cumulus/releases) page for use in users configuring their own deployment and contain extracted subcomponents of the [cumulus](#cumulus) module. For more on these components see the [components documentation](deployment/components). + +For more on the specific structure, examples of use and how to deploy and more, please see the [deployment](deployment) docs as well as the [cumulus-template-deploy](https://github.com/nasa/cumulus-template-deploy) repo +. diff --git a/website/versioned_docs/version-v22.3.0/assets/APIGateway-Delete-Stage.png b/website/versioned_docs/version-v22.3.0/assets/APIGateway-Delete-Stage.png new file mode 100644 index 0000000000000000000000000000000000000000..311f49694c7f7570f52b04638ecb69f3246185c0 GIT binary patch literal 85514 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