Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
9c36c50
Add itslive STAC search module
jhkennedy Mar 4, 2026
ba8af0d
Add de-duplication of ITS_LIVE STAC and
jhkennedy Mar 4, 2026
04d9a4f
refactor tests and add stubs for missing tests
jhkennedy Mar 4, 2026
7f0e996
ruff and mypy
jhkennedy Mar 4, 2026
3b9fbce
Add changelog
jhkennedy Mar 4, 2026
59e5c25
Merge pull request #338 from ASFHyP3/stac-deduplication
jhkennedy Mar 4, 2026
6dd94d4
Don't login to ECR if dependabot PR
jhkennedy Mar 4, 2026
eacd53b
Merge pull request #339 from ASFHyP3/jhkennedy-patch-1
jhkennedy Mar 4, 2026
7427c98
Bump the pip-deps group across 1 directory with 11 updates
dependabot[bot] Mar 4, 2026
277dfe1
Merge pull request #335 from ASFHyP3/dependabot/pip/pip-deps-3508f9b6fd
jhkennedy Mar 4, 2026
78594e1
Bump aws-actions/configure-aws-credentials
dependabot[bot] Feb 9, 2026
6c80e2b
Merge pull request #334 from ASFHyP3/dependabot/github_actions/github…
jhkennedy Mar 4, 2026
9ce0b21
TODO for different length burst sets
jhkennedy Mar 6, 2026
a0e211a
add pyarrow and ipython to local requirements for convenience
jhkennedy Mar 6, 2026
23953ee
Add support for processing NISAR scenes
jhkennedy Mar 6, 2026
eb1212e
Add nisar tiles to process
jhkennedy Mar 6, 2026
fcd6edf
Changelog and typo
jhkennedy Mar 6, 2026
5c6c287
static fixes
jhkennedy Mar 6, 2026
4e0f7ba
fix missing req.; get acq. dates from nisar scenes
jhkennedy Mar 6, 2026
e21058f
fix typo
jhkennedy Mar 6, 2026
7cc0022
Setup SNS subscriptions and integration testing
jhkennedy Mar 6, 2026
ab6fe55
Add test stubs for NISAR
jhkennedy Mar 6, 2026
5382962
pipe NISAR topic arn into CI/CD
jhkennedy Mar 6, 2026
bf059b8
Merge pull request #341 from ASFHyP3/add-nisar
jhkennedy Mar 6, 2026
1af7dcf
Add access_urls to integration test messages
jhkennedy Mar 6, 2026
1a38730
ref sec need to be tuples
jhkennedy Mar 6, 2026
1222b01
add casts to make mypy happy :vomiting_face:
jhkennedy Mar 6, 2026
c673c1b
Merge pull request #342 from ASFHyP3/add-nisar
jhkennedy Mar 6, 2026
eef16df
allow skipping of hyp3 or stac deduplication; centralize config into …
jhkennedy Mar 8, 2026
a222419
fix errant tuple
jhkennedy Mar 8, 2026
cf87f44
Merge pull request #343 from ASFHyP3/disable-dedup
jhkennedy Mar 8, 2026
a0cafc1
grrr errant tuples
jhkennedy Mar 8, 2026
b934597
remove unecessary casts
jhkennedy Mar 8, 2026
4f0d0f8
switch to always using filter for its-live stac queries
jhkennedy Mar 12, 2026
4163c22
reserve concurrency for monitoring lambda so as to not overwhelm STAC…
jhkennedy Mar 12, 2026
84254aa
add timeouts to STAC search
jhkennedy Mar 12, 2026
edd0af6
fix stac search
jhkennedy Mar 12, 2026
9c2b4b8
Merge pull request #346 from ASFHyP3/prod-tweaks
jhkennedy Mar 12, 2026
1a58fbc
select only scenes with co-pol data in frequency A
jhkennedy Mar 14, 2026
d09588a
fix typing
jhkennedy Mar 14, 2026
a793aa1
Merge pull request #347 from ASFHyP3/nisar-pols
jhkennedy Mar 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/actions/deploy/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ inputs:
required: true
LANDSAT_TOPIC_ARN:
required: true
NISAR_TOPIC_ARN:
required: true
SENTINEL1_TOPIC_ARN:
required: true
SENTINEL2_TOPIC_ARN:
Expand Down Expand Up @@ -48,6 +50,7 @@ runs:
--capabilities CAPABILITY_IAM \
--parameter-overrides \
LandsatTopicArn=${{ inputs.LANDSAT_TOPIC_ARN }} \
NisarTopicArn=${{ inputs.NISAR_TOPIC_ARN }} \
Sentinel1TopicArn=${{ inputs.SENTINEL1_TOPIC_ARN }} \
Sentinel2TopicArn=${{ inputs.SENTINEL2_TOPIC_ARN }} \
Hyp3Api=${{ inputs.HYP3_API }} \
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@ jobs:
with:
platforms: ${{ env.PLATFORMS }}

- uses: aws-actions/configure-aws-credentials@v5
- uses: aws-actions/configure-aws-credentials@v6
if: ${{ github.actor != 'dependabot[bot]' }}
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}

- name: Login to Amazon ECR
if: ${{ github.actor != 'dependabot[bot]' }}
uses: aws-actions/amazon-ecr-login@v2

- name: Build, tag, and push image to Amazon ECR
Expand Down Expand Up @@ -104,7 +105,7 @@ jobs:
steps:
- uses: actions/checkout@v6

- uses: aws-actions/configure-aws-credentials@v5
- uses: aws-actions/configure-aws-credentials@v6
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Expand All @@ -117,6 +118,7 @@ jobs:
EARTHDATA_PASSWORD: ${{ secrets.EARTHDATA_PASSWORD }}
CF_TEMPLATE_BUCKET: cf-templates-3o5lnspmwmzg-us-west-2
LANDSAT_TOPIC_ARN: ${{ vars.LANDSAT_TOPIC_ARN }}
NISAR_TOPIC_ARN: ${{ vars.NISAR_TOPIC_ARN }}
SENTINEL1_TOPIC_ARN: ${{ vars.SENTINEL1_TOPIC_ARN }}
SENTINEL2_TOPIC_ARN: ${{ vars.SENTINEL2_TOPIC_ARN }}
HYP3_API: ${{ vars.HYP3_API }}
Expand Down
24 changes: 22 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,33 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.8.0]
### Added
- Support for processing NISAR SNS messages and submitting jobs to hyp3-its-live has been added.
- NISAR specific functions have been added to a new `nisar` module.
- An `itslive` module with functions to deduplicate already published pairs based on the STAC catalog.

### Changed
- All environment variable configuration is now centralized in a new `config` module.
- HyP3 deduplication of pairs will be skipped if the `JOBS_TABLE_NAME` environment variable is not provided.
- ITS_LIVE STAC deduplication of pairs will be skipped if the `STAC_ITEMS_ENDPOINT` environment variable is not provided
- `deduplicate_hyp3_pairs`, `submit_pairs_for_processing`, and other HyP3 specific functionality has been moved to the `hyp3` module from `main`.

### Fixed
- Monitoring lambda function now uses reserved concurrency to set a maximum number of concurrent executions so it doesn't overwhelm the STAC catalog instance.
- pystac-client is now configured with connection and read timeouts when searching the ITS_LIVE catalog so it does not hang indefinitely waiting for a response.
- Sentinel-1 burst or SLC image pairs are now deduplicated against already published ITS_LIVE pairs in the STAC catalog.See [#331](https://github.com/ASFHyP3/its-live-monitoring/issues/331) for more info.

### Removed
- `deduplicate_s3_pairs` and supporting functions in favor of `itslive.deduplicate_published_pairs`.

## [0.7.0]
## Added
### Added
- `StacItemsEndpoint` and `StacExistsOk` cloudformation parameters to allow publishing STAC items directly to a STAC catalog. Accordingly:
- `STAC_ITEMS_ENDPOINT` and `STAC_EXISTS_OK` environment variables are set for the monitoring lambda.
- The cloud formation parameters are set in the build and deploy GitHub Actions workflow by the `STAC_ITEMS_ENDPOINT` and `STAC_EXISTS_OK` deploy environment variables.

## Changed
### Changed
- Updated the `AUTORIFT_JOB_TEMPLATE` for [HyP3 v10.13.0+](https://github.com/ASFHyP3/hyp3/pull/3003) to allow posting/putting STAC items in the catalog instead of writing them to an alternate ingest location.

### Removed
Expand Down
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ IMAGE_TAG = $(subst +,_,$(SDIST_VERSION))
endif

LANDSAT_TOPIC_ARN ?= arn:aws:sns:us-west-2:986442313181:its-live-notify-landsat-test
NISAR_TOPIC_ARN ?= arn:aws:sns:us-west-2:986442313181:its-live-notify-nisar-test
SENTINEL1_TOPIC_ARN ?= arn:aws:sns:us-west-2:986442313181:its-live-notify-sentinel1-test
SENTINEL2_TOPIC_ARN ?= arn:aws:sns:eu-west-1:986442313181:its-live-notify-sentinel2-test

Expand All @@ -32,6 +33,10 @@ landsat-integration:
export AWS_PAGER='' && \
$(foreach file, $(wildcard tests/integration/landsat*.json), aws sns publish --profile saml-pub --topic-arn ${LANDSAT_TOPIC_ARN} --message file://${file} --output json;)

nisar-integration:
export AWS_PAGER='' && \
$(foreach file, $(wildcard tests/integration/nisar*.json), aws sns publish --profile saml-pub --topic-arn ${NISAR_TOPIC_ARN} --message file://${file} --output json;)

sentinel1-integration:
export AWS_PAGER='' && \
$(foreach file, $(wildcard tests/integration/sentinel1*.json), aws sns publish --profile saml-pub --topic-arn ${SENTINEL1_TOPIC_ARN} --message file://${file} --output json;)
Expand All @@ -40,7 +45,7 @@ sentinel2-integration:
export AWS_PAGER='' && \
$(foreach file, $(wildcard tests/integration/sentinel2*.json), aws sns publish --region eu-west-1 --profile saml-pub --topic-arn ${SENTINEL2_TOPIC_ARN} --message file://${file} --output json;)

integration: landsat-integration sentinel1-integration sentinel2-integration
integration: landsat-integration nisar-integration sentinel1-integration sentinel2-integration

static: mypy ruff cfn-lint

Expand Down
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# ITS_LIVE Monitoring

The ITS_LIVE monitoring stack provides the AWS architecture to support low-latency production of netCDF glacier velocity products produced from Optical (Landsat 8/9, Sentinel-2) and SAR (Sentinel-1) image pairs.
The ITS_LIVE monitoring stack provides the AWS architecture to support low-latency production of netCDF glacier velocity products produced from Optical (Landsat 8/9, Sentinel-2) and SAR (Sentinel-1, NISAR) image pairs.

## Architecture overview

ITS_LIVE Monitoring uses a pub-sub model all missions. Data providers publish new scene messages to SNS Topics for each new scene added to the dataset. The SNS Topics for each mission data are described on these pages:
* Landsat: <https://registry.opendata.aws/usgs-landsat/>
* NISAR: <https://github.com/ASFHyP3/CMR-notifier>
* Sentinel-2: <https://registry.opendata.aws/sentinel-2/>
* Sentinel-1: <https://github.com/ASFHyP3/CMR-notifier>

Expand Down Expand Up @@ -95,6 +96,10 @@ To submit _just_ the Landsat integration test payloads to the default Landsat te
```shell
make landsat-integration
```
To submit _just_ the NISAR integration test payloads to the default NISAR test SNS topic, run:
```shell
make nisar-integration
```
To submit _just_ the Sentinel-1 integration test payloads to the default Sentinel-1 test SNS topic, run:
```shell
make Sentinel1-integration
Expand All @@ -107,6 +112,7 @@ make Sentinel2-integration
or, you can submit to an alternative SNS topic like:
```shell
LANDSAT_TOPIC_ARN=foobar make landsat-integration
NISAR_TOPIC_ARN=foobar make nisar-integration
SENTINEL1_TOPIC_ARN=foobar make sentinel1-integration
SENTINEL2_TOPIC_ARN=foobar make sentinel2-integration
```
18 changes: 17 additions & 1 deletion cloudformation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ Parameters:
LandsatTopicArn:
Type: String

NisarTopicArn:
Type: String

Sentinel1TopicArn:
Type: String

Expand Down Expand Up @@ -78,7 +81,7 @@ Resources:
Resource: !GetAtt Queue.Arn
Condition:
ArnEquals:
aws:SourceArn: [!Ref LandsatTopicArn, !Ref Sentinel1TopicArn, !Ref Sentinel2TopicArn]
aws:SourceArn: [!Ref LandsatTopicArn, !Ref NisarTopicArn, !Ref Sentinel1TopicArn, !Ref Sentinel2TopicArn]
Queues:
- !Ref Queue

Expand All @@ -96,6 +99,18 @@ Resources:
s3_location:
- prefix: 's3://usgs-landsat/collection02/level-1/standard/oli-tirs/'

NisarSubscription:
Type: AWS::SNS::Subscription
Properties:
TopicArn: !Ref NisarTopicArn
Protocol: sqs
Endpoint: !GetAtt Queue.Arn
FilterPolicyScope: MessageBody
FilterPolicy:
granule_ur:
- prefix: 'NISAR_L'


Sentinel1Subscription:
Type: AWS::SNS::Subscription
Properties:
Expand All @@ -119,6 +134,7 @@ Resources:
Role: !GetAtt LambdaRole.Arn
MemorySize: 256
Timeout: 900
ReservedConcurrentExecutions: 10
Environment:
Variables:
HYP3_API: !Ref Hyp3Api
Expand Down
28 changes: 28 additions & 0 deletions its_live_monitoring/src/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""ITS_LIVE monitoring environment variable configuration."""

import os


def _nullable_str(s: str) -> str | None:
s = s.replace('None', '').strip()
return s if s else None


def _string_is_true(s: str) -> bool:
return s.lower() == 'true'


LOGGING_LEVEL = os.environ.get('LOGGING_LEVEL', 'INFO')

# needed to deduplicate via HyP3
HYP3_JOBS_TABLE_NAME = os.environ.get('JOBS_TABLE_NAME', '')
EARTHDATA_USERNAME = os.environ.get('EARTHDATA_USERNAME')

# needed to deduplicate via STAC
STAC_ITEMS_ENDPOINT = _nullable_str(os.environ.get('STAC_ITEMS_ENDPOINT', 'None'))

# needed to submit HyP3 jobs
HYP3_API = os.environ.get('HYP3_API', '')
EARTHDATA_PASSWORD = os.environ.get('EARTHDATA_PASSWORD')
STAC_EXISTS_OK = _string_is_true(os.environ.get('STAC_EXISTS_OK', 'False'))
PUBLISH_BUCKET = _nullable_str(os.environ.get('PUBLISH_BUCKET', 'None'))
Loading
Loading