All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added
processing_times
field to the Job schema in the API in order to support jobs with multiple processing steps.
- Removed
processing_time_in_seconds
field from the Job schema.
- New
RIVER_WIDTH
job type.
- Job specifications can now specify multiple tasks.
WATER_MAP
andWATER_MAP_10M
now can run up to 10 hours before timing out.
WATER_MAP
andWATER_MAP_10M
now can run up to 19800s before timing out.
scale-cluster
now temporarily disables the Batch Compute Environment to allow maxvCpus to be reduced in cases when the current desired vCpus exceeds the new target value.
scale-cluster
now adjusts the compute environment size based on total month-to-date spending, rather than only EC2 spending.
- Granted additional IAM permissions required by AWS Step Functions to manage AWS Batch jobs.
- Changed the Swagger UI page header and title to reflect the particular HyP3 deployment.
- The
next
URL in paginatedGET /jobs
responses will now reflect the correct API hostname and path in load balanced environments. Fixes #1071.
- Added support for updating subscription
start
andintersectsWith
fields.
- Increased
MemorySize
forprocess-new-granules
function to improve performance when evaluating subscriptions.
BannedCidrBlocks
stack parameter to specify CIDR ranges that will receive HTTP 403 Forbidden responses from the API
- Granules for jobs are now validated against the updated 2021 release of Copernicus GLO-30 Public DEM coverage.
- GitHub action to scan Python dependencies and rendered CloudFormation templates for known security vulnerabilities using Snyk.
- AUTORIFT jobs can now be submitted for Sentinel-2 scenes with 25-character Earth Search names. Fixes #1022.
GET /jobs
requests now acceptname
parameters up to 100 characters. Fixes #1019.
- Fix how we fetch jobs that are waiting for step function execution, so that we actually start up to 400 executions at a time.
- Added default values for
logs
andexpiration_time
, which should prevent failed jobs from remaining inRUNNING
.
- Monthly job quota checks can now be suppressed for individual users by setting
max_jobs_per_month
tonull
in the users table. - A user can now be given a fixed Batch job priority for all jobs that they submit by setting the
priority
field in the users table.
- Handle missing log stream when uploading logs, which should prevent jobs from remaining in
RUNNING
status after failure. - Don't write error messages to
processing_time_in_seconds
field.
- Added
execution_started
field to job schema to indicate whether a step function execution has been started for the job.
- Job status code doesn't switch from
PENDING
toRUNNING
until the Batch job starts running.
- Added flood depth options to water map job (currently limited to
hyp3-test
).
- Increased job name length limit to 100 characters.
- Compute processing time when one or more Batch attempts is missing a
StartedAt
time.
- Convert floats to decimals when adding a subscription.
- Process new granules for
WATER_MAP
subscriptions.
- Step function now retries the CHECK_PROCESSING_TIME task when errors are encountered.
- Step function now retries transient
Batch.AWSBatchException
errors when submitting jobs to AWS Batch. Fixes #911.
- Expose CloudFront product download URLs for Earthdata Cloud environments via the HyP3 API.
OriginAccessIdentityId
stack parameter supporting content distribution via CloudFront.
- Upgraded AWS Lambda functions and Github Actions to Python 3.9
- Require HttpTokens to be consistent with EC2 instance metadata configured with Instance Metadata Service Version 2 (IMDSv2).
- Cloudformation stack parameters that are specific to Earthdata Cloud environments are now managed via Jinja templates, rather than CloudFormation conditions.
- A
JPL-public
security environment when rendering CloudFormation templates which will deploy a public bucket policy. To use this environment, the AWS S3 account level Block All Public Access setting must have been turned off by the JPL Cloud team.
- The
JPL
security environment, when rendering CloudFormation templates, will no longer deploy a public bucket policy as this is disallowed by default for JPL commercial cloud accounts.
- New
InstanceTypes
parameter to the cloudformation template to specify which EC2 Instance Types are available to the Compute Environment - Added
r5dn.xlarge
as an eligible instance type in most HyP3 deployments
- The
job_spec_files
positional argument torender_cf.py
has been switched to a required--job-spec-files
optional argument to support multiple open-ended arguments. - Set S3 Object Ownership to
Bucket owner enforced
for all buckets so that access via ACLs is no longer supported.
- The HyP3 API is now implemented as an API Gateway REST API, supporting private API deployments.
- AutoRIFT jobs now allow submission with Landsat 9 Collection 2 granules
- Add
processing_time_in_seconds
to thejob
API schema to allow plugin developers to check processing time.
- Encrypt Earthdata username and password using AWS Secrets Manager.
- Documentation about deploying to a JPL-managed commercial AWS account has been added to
docs/deployments
.
- Increase monthly job quota per user from 250 to 1,000.
- Limited the number of jobs a subscription can send at a time to avoid timing out. Fixes #794.
- Confirm there are no unprocessed granules before disabling subscriptions past their expiration date.
- Jobs are now assigned a
priority
attribute when submitted.priority
is calculated based on jobs already submitted month-to-date by the same user. Jobs with a higherpriority
value will run before jobs with a lower value. Batch.ServerException
errors encountered by the Step Function are now retried, to address intermittent errors when the Step Functions service calls the Batch SubmitJob API.
- HyP3 can now be deployed into a JPL managed commercial AWS account
- Selectable security environment when rendering CloudFormation templates, which will modify resources/configurations for:
ASF
(default) -- AWS accounts managed by the Alaska Satellite FacilityEDC
-- AWS accounts managed by the NASA Earthdata CLoudJPL
-- AWS accounts managed by the NASA Jet Propulsion Laboratory
- A
security_environment
Make variable used by therender
target (and any target that depends onrender
). Use likemake security_environment=ASF build
- All CloudFormation templates (
*-cf.yml
) are now rendered from jinja2 templates (*-cf.yml.j2
)
- The
EarthdataCloud
CloudFormation template parameter toapps/main-cf.yml
- Use Managed Policies for IAM permissions in support of future deployments using custom CloudFormation IAM resources
- Added build target to Makefile.
- Disabled default encryption for the monitoring SNS topic. Fixes #762.
- Enabled default encryption for the monitoring SNS topic
- Block Public Access settings for the S3 content bucket are now configured based on the EarthdataCloud stack parameter.
- s3 access log bucket is now encrypted using AWS S3 Bucket Keys
- The
scale-cluster
lambda now reducesdesiredVpucs
to matchmaxVcpus
when necessary to allow the compute environment to scale down immediately.
- The
DomainName
andCertificateArn
stack parameters are now optional, allowing HyP3 to be deployed without a custom domain name for the API.
- Support for automatic toggling between two
maxvCpus
values for the Batch compute environment, based on monthly budget vs month-to-date spending
- Api 400 responses now use a consistent JSON schema for the response body. Fixes #625
- Default autoRIFT parameter file was updated to point at the new
its-live-data
AWS S3 bucket instead ofits-live-data.jpl.nasa.gov
, except for the customautorift-eu
deployment which uses a copy ineu-central-1
. - Job specification YAMLs can now specify a container
image_tag
, which will override the deployment default image tag - Provided example granule pairs for INSAR_GAMMA and AUTORIFT jobs in the OpenApi schema
POST /jobs
no longer allows users to submit a job of onejob_type
with the parameters of anotherPOST /subscriptions
no longer allows user to submit a subscriptions of onejob_type
with the parameters of anotherProcessNewGranules
now convertsdecimal.Decimal
objects tofloat
orint
before passing toasf_search.search
- fixed typo in
search_parameteters['FlightDirection']
DECENDING -> DESCENDING
- New
AmiId
stack parameter to specify a specific AMI for the AWS Batch compute environment
job_spec/*.yml
files are now explicitly selected allowing per-deployment job customization
AutoriftImage
,AutoriftNamingScheme
, andAutoriftParameterFile
CloudFormation stack parameters have been removed and are instead captured in customjob_spec/*.yml
files.
- Optional
DeployLambdasInVpc
stack parameter to deploy all lambda functions into the givenVpcId
andSubnetIds
- Job types now are defined each in their own file under the
job_spec
directory - Api job parameters are now defined in the
job_spec
folder for the given job type
- Optional
PermissionsBoundaryPolicyArn
stack parameter to apply to all created IAM roles
- Resolved an issue where API requests would return HTTP 500 due to space-padded sourceIp value, e.g. ' 123.123.123.50'
BannedCidrBlocks
stack parameter to specify CIDR ranges that will receive HTTP 403 Forbidden responses from the API
- All job parameters of type
list
now are converted to space delimited strings prior to invoking job definitions in Batch.
- Exposed new
include_displacement_maps
API parameter for INSAR_GAMMA jobs, which will cause both a line-of-sight displacement and a vertical displacement GEOTIFF to be included in the product.
- Reduced default job quota to 250 jobs per user per month
- The
include_los_displacement
API parameter for INSAR_GAMMA jobs has been deprecated in favor of theinclude_displacement_maps
parameter, and will be removed in the future.
- The
logs
attribute inGET /jobs
responses is now only populated for FAILED jobs, and will be an empty list for SUCCEEDED jobs
POST /subscriptions
requests may now include avalidate_only
key which when set totrue
will not add the subscription to the database but still validate it.- in
POST /subscriptions
requests,search_parameters
andjob_specification
are now included undersubscription
GET /subscriptions
requests now include query parametersname
gets only subscriptions with the given namejob_type
gets only subscriptions with the given job typeenabled
gets only subscriptions whereenabled
matches
- subscriptions now include
creation_date
which indicates date and time of subscription creation, responses fromGET /subscriptions
are sorted bycreation_date
decending
PATCH /subscriptions
requests may now update a subscription'senabled
attribute in addition toend_date
GET /jobs
responses now include asubscription_id
field for jobs created by subscriptionsGET /jobs
requests now may include asubscription_id
query parameter to limit jobs based on subscription_id- Subscriptions are now evaluated every 16 minutes, instead of every hour
/subscriptions
endpoint which allows a user to define a subscription with search and processing criteriaPOST /subscriptions
to create a subscriptionGET /subscriptions
to list all subscriptions for the userPATCH /subscriptions/<subscription_id>
to update the end date of a subscriptionGET /subscriptions/<subscription_id>
to list the information for a specific subscription
process_new_granules
app which searches for unprocessed granules related to subscriptions and automatically starts jobs for them as they become available.
- HyP3 content bucket now allows Cross Origin Resource Headers
- Exposed new
apply_water_mask
API parameter for INSAR_GAMMA jobs, which sets pixels over coastal and large inland waterbodies as invalid for phase unwrapping.
- Modified retry strategies for Batch jobs and UploadLog lambda to address scaling errors
lib/dynamo
library to allow sharing common code among different apps.
POST /jobs
responses no longer include thejob_id
,request_time
,status_code
, oruser_id
fields whenvalidate_only=true
- moved dynamodb functionality from
hyp3_api/dynamo
tolib/dynamo
- moved job creation buisness logic from
hyp3_api/handlers
tolib/dynamo
AutoriftNamingScheme
CloudFormation parameter to set the naming scheme for autoRIFT products
- Sentinel-2 autoRIFT jobs now reserve 3/4 less memory, allowing more jobs to be run in parallel
- Increased default job quota to 1,000 jobs per user per month
- Allow the UI to be accessed from
/ui/
as well as/ui
- POST
/jobs
now generates an error for Sentinel-1 granules with partial-dual polarizations, fixes #376
- Removed
connexion
library due to inactivity, replaced withopen-api-core
- Error messages from invalid input according to the
api-spec
are different
- POST
/jobs
no longer throws 500 fordecimal.Inexact
errors, fixes #444 start_exectuion.py
will now submit at most 400 step function executions per run. Resolves an issue where no executions would be started when many PENDING jobs were available for submission.
- Landsat and Sentinel-2 autoRIFT jobs will utilize 1/3 less memory
- Exposed new
include_wrapped_phase
API parameter for INSAR_GAMMA jobs
- Exposed new
include_dem
API parameter for INSAR_GAMMA jobs
- RTC_GAMMA jobs now use the Copernicus DEM by default
- AUTORIFT jobs now accept Landsat 8 scenes with a sensor mode of ORI-only (
LO08
)
- INSAR_GAMMA jobs now expose
include_inc_map
parameter that allows users to include an incidence angle map.
- Updated API GATEWAY payload format to version 2.0 to support later versions of serverless wsgi
- Granules for INSAR_GAMMA jobs are now validated against Copernicus GLO-30 Public DEM coverage
- resolved
handlers.get_names_for_user
error whendynamo.query_jobs
requires paging. - Resolved HTTP 500 error when quota check requires paging.
- Exposed new
dem_name
api parameter for RTC_GAMMA jobsdem_name="copernicus"
will use the Copernicus GLO-30 Public DEMdem_name="legacy"
will use the DEM with the best coverage from ASF's legacy SRTM/NED data sets
util.get_job_count_for_month
now usesSelect='COUNT'
for better performance querying DynamoDB
- Granules for RTC_GAMMA jobs are now validated against the appropriate DEM coverage map based on the value of the
dem_name
job parameter
GET /jobs
now pages results. Large queries (that require paging) will contain anext
key in the root level of the json response with a URL to fetch subsequent pagesGET /jobs
now accepts ajob_type
query parameterGET /jobs
now provides jobs sorted byrequest_time
in descending order
- Exposed new
include_rgb
api parameter for RTC_GAMMA jobs
get_files.py
now only includes product files ending in.zip
or.nc
in thefiles
list returned inGET /jobs
API responses
- S3 content bucket now allows public
s3:ListBucket
ands3:GetObjectTagging
- Jobs now include a
logs
key containing a list of log file download urls
- Increased max capacity for compute environment to 1600 vCPUs
- Improved response latency when submitting new jobs via
POST /jobs
GET /jobs
responses now includes3.bucket
ands3.key
entries for each file to facilitate interacting with products using s3-aware tools.
- AUTORIFT jobs now correctly accept Sentinel-2 granules using Earth Search IDs of 23 characters.
- AutoRIFT jobs now allow submission with Landsat 8 Collection 2 granules
- AutoRIFT jobs now only accept Sentinel-2 L1C granules, rather than any Sentinel-2 granules
- API responses are no longer validated against the OpenAPI schema.
GET /jobs
requests for jobs with legacy parameter values (e.g. S2 L2A granules) will no longer return HTTP 500 errors.
- INSAR_GAMMA jobs now use the hyp3-gamma plugin to do processing
- RTC_GAMMA jobs now use the hyp3-gamma plugin to do processing
- Autorift jobs now allow submission with Sentinel 2 granules
- A new
include_scattering_area
paramter has been added forRTC_GAMMA
jobs, which includes a GeoTIFF of scattering area in the product package. This supports creation of composites of RTC images using Local Resolution Weighting per Small (2012) https://doi.org/10.1109/IGARSS.2012.6350465. - Cloudwatch request metrics are now enabled for the S3 content bucket
- Api Gateway access logs are now in JSON format for easier parsing by Cloudwatch Insights
- Api Gateway access logs now include
responseLatency
anduserAgent
fields. Unusedcaller
anduserId
fields are no longer included.
/
now redirects to/ui
- Increased compute to allow 200 concurrent instances.
- Refactored dynamodb interactions
dynamo.py
in the api code now manages all dynamodb interactions for the api- added tests for new dynamo module
- added paging for dynamodb query calls
- Added Code of Conduct and Contributing Guidelines
MonthlyJobQuotaPerUser
stack parameter no longer has a default, and the value can now be set to zero.- Value is now set to
200
for ASF deployments. - Value is now set to
0
for the autoRIFT deployment.
- Value is now set to
POST /jobs
requests now allow up to 200 jobs per request, up from 25
- User table which can be used to add custom quotas for users, users not in the table will still have the default.
- GET /jobs/{job_id} API endpoint to search for a job by its job_id
- Api and processing errors will now post to a SNS topic
- Parameters for
INSAR_GAMMA
jobs have been updated to reflect hyp3-insar-gamma v2.2.0.
- API behavior for different job types is now defined exclusively in
job_types.yml
. Available parameter types must still be defined inapps/api/src/hyp3_api/api-sec/job_parameters.yml.j2
, and available validation rules must still be defined inapps/api/src/hyp3_api/validation.py
.
- Added
AmazonS3ReadOnlyAccess
permission to batch task role to support container jobs fetching input data from S3.
- RTC_GAMMA jobs now use the user-provided value for the speckle filter parameter. Previously, the user-provided value was ignored and all jobs processed using the default value (false).
- Hyp3 now uses jinja templates in defining CloudFormation templates and the StepFunction definition, rendered at buildtime.
- Job types are now defined only in the API spec and the
job_types.yml
file, no job specific information needs to be added to AWS resource definitions. - Static Analysis now requires rendering before run.
- Added a new
AUTORIFT
job type for processing a pair of Sentinel-1 SLC IW scenes using autoRIFT. For details, refer to the hyp3-autorift plugin repository.
- Updated readme deployment instructions.
- Clarified job parameter descriptions in OpenAPI specification.
- Moved step function definition into it's own file and added static analysis on step funciton definition.
- Split OpenAPI spec into multiple files using File References to resolve, static analysis change from openapi-spec-validator to prance.
GET /user
response now includes ajob_names
list including all distinct job names previously submitted for the current user
- API is now deployed using Api Gateway V2 resources, resulting in lower response latency.
- Added a new
INSAR_GAMMA
job type for producing an interferogram from a pair of Sentinel-1 SLC IW scenes using GAMMA. For details, refer to the hyp3-insar-gamma plugin repository.
-
All job types requiring one or more granules now expose a single
granules
job parameter, formatted as a list of granule names:"granules": ["myGranule"]
forRTC_GAMMA
jobs"granules": ["granule1", "granule2"]
forINSAR_GAMMA
jobs
Note this is a breaking change for
RTC_GAMMA
jobs. -
Browse and thumbnail URLs for
RTC_GAMMA
jobs will now be sorted with the amplitude image first, followed by the rgb image, inGET /jobs
responses.
- Resolved HTTP 500 error when submitting jobs with a resolution with decimal precision (e.g.
30.0
)
- The
dem_matching
,speckle_filter
,include_dem
, andinclude_inc_map
api parameters are now booleans instead of strings. - The
resolution
api parameter is now a number instead of a string, and the10.0
option has been removed.
- Implemented 0.15° buffer and 20% threshold in DEM coverage checks when submitting new jobs. As a result slightly more granules will be rejected as having insufficient coverage.
- Removed optional
description
field for jobs
- Unit tests for
get-files
lambda function
- Resolved HTTP 500 errors for
POST /jobs
requests when the optionalvalidate_only
parameter was not provided - Jobs encountering unexpected errors in the
get-files
step will now correctly transition to aFAILED
status
POST /jobs
now accepts avalidate_only
key at root level, set to true to skip submitting jobs but run api validation.
get-files
get expiration only from product
get-files
step functions AMI roles for tags
POST /jobs
now accepts custom job parameters when submitting jobsGET /jobs
now shows parameters job was run with
get_files.py
now uses tags to identify file_type instead of path
- Name field to job parameter, set in the same way as description but with max length of 20
- Administrators can now shut down Hyp3-api by setting SystemAvailable flag to false in CloudFormation Template and deploying
- Retry policies to improve reliability
- POST /jobs now accepts GRDH Files in the IW beam mode.
- Removed scaling rules and moved to MANAGED compute environment to run jobs
- POST /jobs now checks granule intersects DEM Coverage map to provide faster feedback on common error cases
- Resolved bug not finding granules when submitting 10 unique granules in a RTC_GAMMA job
- README.md with instructions for deploying, testing, and running the application
- Descriptions for all parameters in the top level cloudformation template
- Descriptions for all schema objects in the OpenAPI specification
- Reduced monthly job quota per user from 100 to 25
- Reduced maximum number of jobs allowed in a single POST /jobs request from 100 to 25
- Removed user authorization requirement for submitting jobs
- Removed is_authorized field from GET /user response
- New GET /user API endpoint to query job quota and jobs remaining
- browse image key for each job containing a list of urls for browse images
- browse images expire at the same time as products
- thumbnail image key for each job containing a list of urls for thumbnail images
- thubnail images expire at the same time as products
- API checks granule exists in CMR and rejects jobs with granules that are not found