Skip to content

Commit b8421e5

Browse files
committed
Merge remote-tracking branch 'origin/main' into feature/CCM-13116-Letter-Queue-Operations
2 parents b642dac + 3820d92 commit b8421e5

43 files changed

Lines changed: 11890 additions & 16166 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: E2E tests
2+
description: "Run end-to-end tests for this repo"
3+
4+
runs:
5+
using: "composite"
6+
7+
steps:
8+
- name: Install poetry and e2e test dependencies
9+
shell: bash
10+
run: |
11+
pipx install poetry
12+
cd tests/e2e-tests && poetry install
13+
14+
- name: Run e2e tests
15+
shell: bash
16+
run: |
17+
echo "$INTERNAL_DEV_TEST_PEM" > "${GITHUB_WORKSPACE}/internal-dev-test-1.pem"
18+
chmod 600 "${GITHUB_WORKSPACE}/internal-dev-test-1.pem"
19+
export PROXY_NAME=nhs-notify-supplier--internal-dev--nhs-notify-supplier
20+
export API_ENVIRONMENT=internal-dev
21+
export NON_PROD_PRIVATE_KEY="${GITHUB_WORKSPACE}/internal-dev-test-1.pem"
22+
make .internal-dev-test

.github/actions/test-types.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[
2-
"component"
2+
"component",
3+
"sandbox"
34
]

.github/workflows/cicd-1-pull-request.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ jobs:
2929
does_pull_request_exist: ${{ steps.pr_exists.outputs.does_pull_request_exist }}
3030
pr_number: ${{ steps.pr_exists.outputs.pr_number }}
3131
skip_trivy_package: ${{ steps.skip_trivy.outputs.skip_trivy_package }}
32+
deploy_proxy: ${{ steps.deploy_proxy.outputs.deploy_proxy }}
3233
steps:
3334
- name: "Checkout code"
3435
uses: actions/checkout@v5
@@ -87,6 +88,26 @@ jobs:
8788
else
8889
echo "skip_trivy_package=false" >> $GITHUB_OUTPUT
8990
fi
91+
- name: "Determine if proxy should be deployed"
92+
id: deploy_proxy
93+
env:
94+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
95+
PR_NUMBER: ${{ steps.pr_exists.outputs.pr_number }}
96+
run: |
97+
if [[ -z "$PR_NUMBER" ]]; then
98+
echo "No pull request detected; proxy deployment will run."
99+
echo "deploy_proxy=true" >> $GITHUB_OUTPUT
100+
exit 0
101+
fi
102+
103+
labels=$(gh pr view "$PR_NUMBER" --json labels --jq '.labels[].name')
104+
echo "Labels on PR #$PR_NUMBER: $labels"
105+
106+
if echo "$labels" | grep -Fxq 'deploy-proxy'; then
107+
echo "deploy_proxy=true" >> $GITHUB_OUTPUT
108+
else
109+
echo "deploy_proxy=false" >> $GITHUB_OUTPUT
110+
fi
90111
- name: "List variables"
91112
run: |
92113
export BUILD_DATETIME_LONDON="${{ steps.variables.outputs.build_datetime_london }}"
@@ -141,6 +162,7 @@ jobs:
141162
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
142163
version: "${{ needs.metadata.outputs.version }}"
143164
pr_number: "${{ needs.metadata.outputs.pr_number }}"
165+
deploy_proxy: "${{ needs.metadata.outputs.deploy_proxy }}"
144166
secrets: inherit
145167
acceptance-stage: # Recommended maximum execution time is 10 minutes
146168
name: "Acceptance stage"
@@ -156,6 +178,7 @@ jobs:
156178
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
157179
version: "${{ needs.metadata.outputs.version }}"
158180
pr_number: ${{ needs.metadata.outputs.pr_number }}
181+
proxy_deployed: "${{ needs.metadata.outputs.deploy_proxy }}"
159182
secrets: inherit
160183
publish-stage: # Recommended maximum execution time is 10 minutes
161184
name: "Publish stage"

.github/workflows/release_created.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ jobs:
4141
--targetComponent "api" \
4242
--terraformAction "apply"
4343
deploy-proxy:
44+
needs: deploy-main #wait for backend deploy to complete
4445
name: "Deploy proxy"
4546
runs-on: ubuntu-latest
4647
timeout-minutes: 10

.github/workflows/stage-3-build.yaml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ on:
3535
description: "PR Number if it exists"
3636
required: false
3737
type: string
38+
deploy_proxy:
39+
description: "True if the APIM proxy should be deployed"
40+
required: true
41+
type: string
3842

3943
permissions:
4044
id-token: write # This is required for requesting the JWT
@@ -133,9 +137,13 @@ jobs:
133137
pr-create-dynamic-environment:
134138
name: Create Dynamic Environment
135139
runs-on: ubuntu-latest
136-
if: inputs.pr_number != ''
140+
outputs:
141+
environment_name: ${{ steps.set-environment.outputs.environment_name }}
137142
steps:
138143
- uses: actions/checkout@v5
144+
- name: Set environment name
145+
id: set-environment
146+
run: echo "environment_name=${{ inputs.pr_number != '' && format('pr{0}', inputs.pr_number) || 'main' }}" >> $GITHUB_OUTPUT
139147
- name: Trigger dynamic environment creation
140148
env:
141149
APP_CLIENT_ID: ${{ secrets.APP_CLIENT_ID }}
@@ -148,7 +156,7 @@ jobs:
148156
--infraRepoName "$(echo ${{ github.repository }} | cut -d'/' -f2)" \
149157
--releaseVersion ${{ github.head_ref || github.ref_name }} \
150158
--targetWorkflow "dispatch-deploy-dynamic-env.yaml" \
151-
--targetEnvironment "pr${PR_NUMBER}" \
159+
--targetEnvironment "${{ steps.set-environment.outputs.environment_name }}" \
152160
--targetComponent "api" \
153161
--targetAccountGroup "nhs-notify-supplier-api-dev" \
154162
--terraformAction "apply" \
@@ -157,12 +165,11 @@ jobs:
157165
artefact-proxies:
158166
name: "Build proxies"
159167
runs-on: ubuntu-latest
160-
if: inputs.pr_number != ''
168+
if: inputs.deploy_proxy == 'true'
161169
needs: [artefact-oas-spec-sandbox, pr-create-dynamic-environment]
162170
timeout-minutes: 10
163171
env:
164172
PROXYGEN_API_NAME: nhs-notify-supplier
165-
PR_NUMBER: ${{ inputs.pr_number }}
166173
APP_CLIENT_ID: ${{ secrets.APP_CLIENT_ID }}
167174
APP_PEM_FILE: ${{ secrets.APP_PEM_FILE }}
168175
steps:
@@ -172,7 +179,7 @@ jobs:
172179
uses: ./.github/actions/build-proxies
173180
with:
174181
version: "${{ inputs.version }}"
175-
environment: ${{ inputs.pr_number != '' && format('pr{0}', inputs.pr_number) || 'main' }}
182+
environment: ${{ needs.pr-create-dynamic-environment.outputs.environment_name }}
176183
apimEnv: "internal-dev-sandbox"
177184
runId: "${{ github.run_id }}"
178185
buildSandbox: true

.github/workflows/stage-4-acceptance.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ on:
3434
pr_number:
3535
required: true
3636
type: string
37+
proxy_deployed:
38+
description: "True if the APIM proxy was deployed"
39+
required: true
40+
type: string
3741

3842
permissions:
3943
id-token: write
@@ -77,3 +81,20 @@ jobs:
7781
--targetEnvironment "$ENVIRONMENT" \
7882
--targetAccountGroup "nhs-notify-supplier-api-dev" \
7983
--targetComponent "api"
84+
85+
run-e2e-tests:
86+
name: Run End-to-End Tests
87+
runs-on: ubuntu-latest
88+
if: inputs.proxy_deployed == 'true'
89+
steps:
90+
- uses: actions/checkout@v5.0.0
91+
92+
- name: "Run e2e tests"
93+
#uses: ./.github/actions/e2e-tests
94+
env:
95+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
96+
NON_PROD_API_KEY: ${{ secrets.NON_PROD_API_KEY }}
97+
INTERNAL_DEV_TEST_PEM: ${{ secrets.INTERNAL_DEV_TEST_PEM }}
98+
shell: bash
99+
run: |
100+
echo "E2E tests are currently disabled. See CCM-14778"

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ config:: _install-dependencies version # Configure development environment (main
104104
test-component:
105105
(cd tests && npm install && npm run test:component)
106106

107+
test-sandbox:
108+
(cd tests && npm install && npm run test:sandbox)
109+
107110
test-performance:
108111
(cd tests && npm install && npm run test:performance)
109112

infrastructure/terraform/components/api/README.md

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,20 @@ No requirements.
2020
| <a name="input_enable_alarms"></a> [enable\_alarms](#input\_enable\_alarms) | Enable CloudWatch alarms for this deployed environment | `bool` | `true` | no |
2121
| <a name="input_enable_api_data_trace"></a> [enable\_api\_data\_trace](#input\_enable\_api\_data\_trace) | Enable API Gateway data trace logging | `bool` | `false` | no |
2222
| <a name="input_enable_backups"></a> [enable\_backups](#input\_enable\_backups) | Enable backups | `bool` | `false` | no |
23+
| <a name="input_enable_event_anomaly_detection"></a> [enable\_event\_anomaly\_detection](#input\_enable\_event\_anomaly\_detection) | Enable CloudWatch anomaly detection alarm for SNS message Detects abnormal drops or spikes in event publishing volume. | `bool` | `true` | no |
2324
| <a name="input_enable_event_cache"></a> [enable\_event\_cache](#input\_enable\_event\_cache) | Enable caching of events to an S3 bucket | `bool` | `true` | no |
2425
| <a name="input_enable_sns_delivery_logging"></a> [enable\_sns\_delivery\_logging](#input\_enable\_sns\_delivery\_logging) | Enable SNS Delivery Failure Notifications | `bool` | `true` | no |
2526
| <a name="input_environment"></a> [environment](#input\_environment) | The name of the tfscaffold environment | `string` | n/a | yes |
27+
| <a name="input_event_anomaly_band_width"></a> [event\_anomaly\_band\_width](#input\_event\_anomaly\_band\_width) | The width of the anomaly detection band. Higher values (e.g. 4-6) reduce sensitivity and noise, lower values (e.g. 2-3) increase sensitivity. Recommended: 2-4. | `number` | `4` | no |
28+
| <a name="input_event_anomaly_evaluation_periods"></a> [event\_anomaly\_evaluation\_periods](#input\_event\_anomaly\_evaluation\_periods) | Number of evaluation periods for the anomaly alarm. Each period is defined by event\_anomaly\_period. | `number` | `3` | no |
29+
| <a name="input_event_anomaly_period"></a> [event\_anomaly\_period](#input\_event\_anomaly\_period) | The period in seconds over which the specified statistic is applied for anomaly detection. Minimum 300 seconds (5 minutes). Recommended: 300-600. | `number` | `300` | no |
2630
| <a name="input_eventpub_control_plane_bus_arn"></a> [eventpub\_control\_plane\_bus\_arn](#input\_eventpub\_control\_plane\_bus\_arn) | ARN of the EventBridge control plane bus for eventpub | `string` | `""` | no |
2731
| <a name="input_eventpub_data_plane_bus_arn"></a> [eventpub\_data\_plane\_bus\_arn](#input\_eventpub\_data\_plane\_bus\_arn) | ARN of the EventBridge data plane bus for eventpub | `string` | `""` | no |
2832
| <a name="input_force_destroy"></a> [force\_destroy](#input\_force\_destroy) | Flag to force deletion of S3 buckets | `bool` | `false` | no |
2933
| <a name="input_force_lambda_code_deploy"></a> [force\_lambda\_code\_deploy](#input\_force\_lambda\_code\_deploy) | If the lambda package in s3 has the same commit id tag as the terraform build branch, the lambda will not update automatically. Set to True if making changes to Lambda code from on the same commit for example during development | `bool` | `false` | no |
3034
| <a name="input_group"></a> [group](#input\_group) | The group variables are being inherited from (often synonmous with account short-name) | `string` | n/a | yes |
3135
| <a name="input_kms_deletion_window"></a> [kms\_deletion\_window](#input\_kms\_deletion\_window) | When a kms key is deleted, how long should it wait in the pending deletion state? | `string` | `"30"` | no |
36+
| <a name="input_letter_event_source"></a> [letter\_event\_source](#input\_letter\_event\_source) | Source value to use for the letter status event updates | `string` | `"/data-plane/supplier-api/nhs-supplier-api-prod/main/update-status"` | no |
3237
| <a name="input_letter_table_ttl_hours"></a> [letter\_table\_ttl\_hours](#input\_letter\_table\_ttl\_hours) | Number of hours to set as TTL on letters table | `number` | `24` | no |
3338
| <a name="input_letter_variant_map"></a> [letter\_variant\_map](#input\_letter\_variant\_map) | n/a | `map(object({ supplierId = string, specId = string }))` | <pre>{<br/> "lv1": {<br/> "specId": "spec1",<br/> "supplierId": "supplier1"<br/> },<br/> "lv2": {<br/> "specId": "spec2",<br/> "supplierId": "supplier1"<br/> },<br/> "lv3": {<br/> "specId": "spec3",<br/> "supplierId": "supplier2"<br/> }<br/>}</pre> | no |
3439
| <a name="input_log_level"></a> [log\_level](#input\_log\_level) | The log level to be used in lambda functions within the component. Any log with a lower severity than the configured value will not be logged: https://docs.python.org/3/library/logging.html#levels | `string` | `"INFO"` | no |
@@ -45,31 +50,31 @@ No requirements.
4550
| Name | Source | Version |
4651
|------|--------|---------|
4752
| <a name="module_amendment_event_transformer"></a> [amendment\_event\_transformer](#module\_amendment\_event\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
48-
| <a name="module_amendments_queue"></a> [amendments\_queue](#module\_amendments\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.5/terraform-sqs.zip | n/a |
53+
| <a name="module_amendments_queue"></a> [amendments\_queue](#module\_amendments\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-sqs.zip | n/a |
4954
| <a name="module_authorizer_lambda"></a> [authorizer\_lambda](#module\_authorizer\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
5055
| <a name="module_ddb_alarms_letter_queue"></a> [ddb\_alarms\_letter\_queue](#module\_ddb\_alarms\_letter\_queue) | ../../modules/alarms-ddb | n/a |
5156
| <a name="module_ddb_alarms_letters"></a> [ddb\_alarms\_letters](#module\_ddb\_alarms\_letters) | ../../modules/alarms-ddb | n/a |
5257
| <a name="module_ddb_alarms_mi"></a> [ddb\_alarms\_mi](#module\_ddb\_alarms\_mi) | ../../modules/alarms-ddb | n/a |
5358
| <a name="module_ddb_alarms_suppliers"></a> [ddb\_alarms\_suppliers](#module\_ddb\_alarms\_suppliers) | ../../modules/alarms-ddb | n/a |
54-
| <a name="module_domain_truststore"></a> [domain\_truststore](#module\_domain\_truststore) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.4/terraform-s3bucket.zip | n/a |
55-
| <a name="module_eventpub"></a> [eventpub](#module\_eventpub) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.4/terraform-eventpub.zip | n/a |
59+
| <a name="module_domain_truststore"></a> [domain\_truststore](#module\_domain\_truststore) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip | n/a |
60+
| <a name="module_eventpub"></a> [eventpub](#module\_eventpub) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-eventpub.zip | n/a |
5661
| <a name="module_eventsub"></a> [eventsub](#module\_eventsub) | ../../modules/eventsub | n/a |
5762
| <a name="module_get_letter"></a> [get\_letter](#module\_get\_letter) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
5863
| <a name="module_get_letter_data"></a> [get\_letter\_data](#module\_get\_letter\_data) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
5964
| <a name="module_get_letters"></a> [get\_letters](#module\_get\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6065
| <a name="module_get_status"></a> [get\_status](#module\_get\_status) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6166
| <a name="module_kms"></a> [kms](#module\_kms) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-kms.zip | n/a |
6267
| <a name="module_lambda_alarms"></a> [lambda\_alarms](#module\_lambda\_alarms) | ../../modules/alarms-lambda | n/a |
63-
| <a name="module_letter_status_updates_queue"></a> [letter\_status\_updates\_queue](#module\_letter\_status\_updates\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.5/terraform-sqs.zip | n/a |
68+
| <a name="module_letter_status_updates_queue"></a> [letter\_status\_updates\_queue](#module\_letter\_status\_updates\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-sqs.zip | n/a |
6469
| <a name="module_letter_updates_transformer"></a> [letter\_updates\_transformer](#module\_letter\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6570
| <a name="module_mi_updates_transformer"></a> [mi\_updates\_transformer](#module\_mi\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
6671
| <a name="module_patch_letter"></a> [patch\_letter](#module\_patch\_letter) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6772
| <a name="module_post_letters"></a> [post\_letters](#module\_post\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6873
| <a name="module_post_mi"></a> [post\_mi](#module\_post\_mi) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
6974
| <a name="module_s3bucket_test_letters"></a> [s3bucket\_test\_letters](#module\_s3bucket\_test\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-s3bucket.zip | n/a |
7075
| <a name="module_sqs_alarms"></a> [sqs\_alarms](#module\_sqs\_alarms) | ../../modules/alarms-sqs | n/a |
71-
| <a name="module_sqs_letter_updates"></a> [sqs\_letter\_updates](#module\_sqs\_letter\_updates) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.5/terraform-sqs.zip | n/a |
72-
| <a name="module_sqs_supplier_allocator"></a> [sqs\_supplier\_allocator](#module\_sqs\_supplier\_allocator) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.5/terraform-sqs.zip | n/a |
76+
| <a name="module_sqs_letter_updates"></a> [sqs\_letter\_updates](#module\_sqs\_letter\_updates) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-sqs.zip | n/a |
77+
| <a name="module_sqs_supplier_allocator"></a> [sqs\_supplier\_allocator](#module\_sqs\_supplier\_allocator) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-sqs.zip | n/a |
7378
| <a name="module_supplier_allocator"></a> [supplier\_allocator](#module\_supplier\_allocator) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
7479
| <a name="module_supplier_ssl"></a> [supplier\_ssl](#module\_supplier\_ssl) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-ssl.zip | n/a |
7580
| <a name="module_update_letter_queue"></a> [update\_letter\_queue](#module\_update\_letter\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |

infrastructure/terraform/components/api/module_domain_truststore.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module "domain_truststore" {
2-
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.4/terraform-s3bucket.zip"
2+
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-s3bucket.zip"
33

44
name = "truststore"
55
aws_account_id = var.aws_account_id

infrastructure/terraform/components/api/module_lambda_letter_updates_transformer.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module "letter_updates_transformer" {
3636

3737
lambda_env_vars = merge(local.common_lambda_env_vars, {
3838
EVENTPUB_SNS_TOPIC_ARN = "${module.eventpub.sns_topic.arn}",
39-
EVENT_SOURCE = "/data-plane/supplier-api/${var.group}/${var.environment}/letters"
39+
EVENT_SOURCE = var.letter_event_source
4040
})
4141
}
4242

0 commit comments

Comments
 (0)