Skip to content

Commit 320475b

Browse files
NRL-1666 allow table name to be configured and fix NHS number generation
1 parent 84f22a4 commit 320475b

File tree

4 files changed

+63
-37
lines changed

4 files changed

+63
-37
lines changed

Makefile

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ACCOUNT ?= dev
1515
APP_ALIAS ?= default
1616
HOST ?= $(TF_WORKSPACE_NAME).api.record-locator.$(ENV).national.nhs.uk
1717
ENV_TYPE ?= $(ENV)
18+
PERFTEST_TABLE_NAME ?= nhsd-nrlf--xaxel-deleteme-pointers-table
1819

1920
export PATH := $(PATH):$(PWD)/.venv/bin
2021
export USE_SHARED_RESOURCES := $(shell poetry run python scripts/are_resources_shared_for_stack.py $(TF_WORKSPACE_NAME))
@@ -253,8 +254,17 @@ generate-perftest-permissions: ## Generate perftest permissions and add to nrlf_
253254
# Run producer performance tests with configurable HOST and ENV_TYPE
254255
perftest-producer:
255256
@echo "Running producer performance tests with HOST=$(HOST) and ENV_TYPE=$(ENV_TYPE)"
256-
k6 run tests/performance/producer/perftest.js -e HOST=$(HOST) -e ENV_TYPE=$(ENV_TYPE)
257+
k6 run tests/performance/producer/perftest.js -e HOST=$(HOST) -e ENV_TYPE=$(ENV_TYPE) -e PERFTEST_TABLE_NAME=$(PERFTEST_TABLE_NAME)
257258

258259
perftest-consumer:
259260
@echo "Running consumer performance tests with HOST=$(HOST) and ENV_TYPE=$(ENV_TYPE)"
260261
k6 run tests/performance/consumer/perftest.js -e HOST=$(HOST) -e ENV_TYPE=$(ENV_TYPE)
262+
263+
# Generates input csv for a given table
264+
perftest-prepare:
265+
mkdir -p $(DIST_PATH)
266+
PYTHONPATH=. poetry run python tests/performance/perftest_environment.py generate_pointer_table_extract $(PERFTEST_TABLE_NAME)
267+
268+
perftest-seed-data: perftest-prepare
269+
@echo "Seeding dynamo with data for performance tests with HOST=$(HOST) and ENV_TYPE=$(ENV_TYPE)"
270+
poetry run python tests/performance/consumer/perftest.js --table_name="" --px_with_pointers="" --pointers_per_px="" --type_dists="" --custodian_dists=""

tests/performance/README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Performance Testing
2+
3+
some high level context short
4+
5+
## Run perf tests
6+
7+
### Prepare
8+
9+
```sh
10+
assume dev
11+
make perftest-prepare PERFTEST_TABLE_NAME=<POINTER_TABLE_NAME>
12+
```
13+
14+
choose existing table name/create table with this script > `PERFTEST_TABLE_NAME` env var
15+
makes these files
16+
17+
### Run
18+
19+
these/find profiles available
20+
21+
### Outputs
22+
23+
handy bits

tests/performance/perftest_environment.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
import csv
22
import json
3+
import os
34
import pathlib
5+
import re
46

57
import boto3
68

79
# from nhs_number import generate
810

9-
# from scripts.are_resources_shared_for_stack import uses_shared_resources
1011

1112
DYNAMODB = boto3.resource("dynamodb", region_name="eu-west-2")
1213

14+
default_table_name = "default-table-name"
15+
# default_table_name = "nhsd-nrlf--xaxel-deleteme-pointers-table"
1316

14-
def get_pointers_table_name(stack_name):
15-
# if uses_shared_resources(stack_name):
16-
# env = stack_name.split("-")[0]
17-
# return f"nhsd-nrlf--{env}-pointers-table"
18-
# else:
19-
# return f"nhsd-nrlf--{stack_name}-pointers-table"
20-
# return f"nhsd-nrlf--perftest-pointers-table"
21-
return f"nhsd-nrlf--xaxel-deleteme-pointers-table"
2217

18+
def _get_pointers_table_name():
19+
perftest_table_name = os.environ.get("PERFTEST_TABLE_NAME", default_table_name)
2320

24-
def extract_consumer_data(stack_name, out="consumer_reference_data.json"):
25-
table_name = get_pointers_table_name(stack_name)
21+
if re.search("^nhsd-nrlf--.+-pointers-table$", perftest_table_name):
22+
return perftest_table_name
23+
24+
return f"nhsd-nrlf--{perftest_table_name}-pointers-table"
25+
26+
27+
def extract_consumer_data(out="consumer_reference_data.json"):
28+
table_name = _get_pointers_table_name()
2629
table = DYNAMODB.Table(table_name)
2730
scan_kwargs = {}
2831
done = False
@@ -84,7 +87,6 @@ def __next__(self):
8487

8588

8689
def generate_producer_data(
87-
stack_name,
8890
proportion_existing=0.8, # Proportion of output that should be existing NHS numbers
8991
total_count=1000, # Total number of NHS numbers to output
9092
out="producer_reference_data.json",
@@ -96,7 +98,7 @@ def generate_producer_data(
9698
- total_count: total number of NHS numbers in output
9799
NHS numbers are generated in a semi-deterministic way, similar to the NFT seeding script.
98100
"""
99-
table_name = get_pointers_table_name(stack_name)
101+
table_name = _get_pointers_table_name()
100102
table = DYNAMODB.Table(table_name)
101103
scan_kwargs = {}
102104
done = False
@@ -176,13 +178,12 @@ def __next__(self):
176178

177179

178180
def generate_pointer_table_extract(
179-
stack_name,
180181
out="producer_reference_data.csv",
181182
):
182183
"""
183184
Generate a CSV file containing all pointer IDs, pointer type, custodian, and nhs_number (patient).
184185
"""
185-
table_name = get_pointers_table_name(stack_name)
186+
table_name = _get_pointers_table_name()
186187
table = DYNAMODB.Table(table_name)
187188
scan_kwargs = {}
188189
done = False
@@ -197,6 +198,7 @@ def generate_pointer_table_extract(
197198
["count", "pointer_id", "pointer_type", "custodian", "nhs_number"]
198199
)
199200
while not done:
201+
200202
if start_key:
201203
scan_kwargs["ExclusiveStartKey"] = start_key
202204
response = table.scan(**scan_kwargs)

tests/performance/producer/client_perftest.js

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,18 @@ function randomNHSNumberInRange(start, end) {
5252
}
5353

5454
function generateValidNHSNumber(first9) {
55-
// NHS number with checksum logic
56-
// const CHECKSUM_WEIGHTS = [10, 9, 8, 7, 6, 5, 4, 3, 2];
57-
// while (true) {
58-
// const first9Str = String(first9).padStart(9, "0");
59-
// const digits = first9Str.split("").map(Number);
60-
// if (digits.some(isNaN)) {
61-
// throw new Error("Invalid digit in NHS number generation");
62-
// }
63-
// let sum = digits.reduce((acc, digit, idx) => acc + digit * CHECKSUM_WEIGHTS[idx], 0);
64-
// // Python: checksum = (sum * -1) % 11
65-
// let checksum = (sum * -1) % 11;
66-
// if (checksum === 10) {
67-
// first9++;
68-
// if (first9 > 999999999) {
69-
// throw new Error("No valid NHS number found in range.");
70-
// }
71-
// continue;
72-
// }
73-
// return first9Str + String(checksum);
74-
// }
75-
return "3226053469";
55+
const first9Str = String(first9).padStart(9, "0");
56+
57+
if (first9Str.match(/^\d{9}$/)) {
58+
throw new Error(
59+
"bad NHS number generated - expected 9 digits",
60+
first9Str,
61+
first9
62+
);
63+
}
64+
65+
// NHS numbers not validated, checksum doesn't need to be legit
66+
return `${first9Str}${"1"}`;
7667
}
7768

7869
function pickNHSNumber() {

0 commit comments

Comments
 (0)