#!/usr/bin/env bash # Seeds the acceptance stand with datasets for the load test (Приложение 3, # п. 3.3), so the read endpoints work on a realistic catalogue. # # test/acceptance/seed.sh create (idempotent) category "acc-load": # SEED_VECTOR (25) vector GeoJSON, # SEED_KATO (25) vector_with_kato GeoJSON with # KATO mapping (14 districts x 3 years each), # SEED_RASTER (50) GeoTIFF rasters; the # vector_with_kato datasets form the group # "acc-load-population" # test/acceptance/seed.sh clean delete everything seed.sh created # # Writes the ids load.sh needs to test/acceptance/results/seed.env. # WRITES to the stand: never point it at production. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" BASE_URL="${BASE_URL:-http://localhost:18080}" BASE_URL="${BASE_URL%/}" PYTHON="${PYTHON:-python3}" SEED_VECTOR="${SEED_VECTOR:-25}" SEED_KATO="${SEED_KATO:-25}" SEED_RASTER="${SEED_RASTER:-50}" CAT_CODE=acc-load GRP_CODE=acc-load-population ENV_OUT="$HERE/results/seed.env" mkdir -p "$HERE/results" case "$BASE_URL" in *dssgis.dwh.kz*) echo "refusing to write to $BASE_URL (production)" >&2; exit 2;; esac J=(-H 'Content-Type: application/json') cat_id() { curl -fsS "$BASE_URL/categories" | jq -r --arg c "$CAT_CODE" '.[]|select(.code==$c)|.id' | head -n1; } grp_id() { curl -fsS "$BASE_URL/dataset-groups?code=$GRP_CODE" | jq -r '.data[0].id // empty'; } ids_in_category() { # all dataset ids of a category (paginated) local cat="$1" page=1 out while :; do out="$(curl -fsS "$BASE_URL/datasets?category_id=$cat&page_size=100&page=$page")" jq -r '.data[].id' <<< "$out" [ "$page" -lt "$(jq -r .total_pages <<< "$out")" ] || break page=$((page + 1)) done } if [ "${1:-}" = clean ]; then CAT="$(cat_id || true)"; GRP="$(grp_id || true)" if [ -n "$CAT" ]; then n=0; for id in $(ids_in_category "$CAT"); do curl -sS -o /dev/null -X DELETE "$BASE_URL/datasets/$id"; n=$((n + 1)); done echo "deleted $n datasets" fi [ -n "$GRP" ] && curl -sS -o /dev/null -w "group delete %{http_code}\n" -X DELETE "$BASE_URL/dataset-groups/$GRP" [ -n "$CAT" ] && curl -sS -o /dev/null -w "category delete %{http_code}\n" -X DELETE "$BASE_URL/categories/$CAT" rm -f "$ENV_OUT" exit 0 fi CAT="$(cat_id || true)" if [ -z "$CAT" ]; then CAT="$(curl -fsS -X POST "$BASE_URL/categories" "${J[@]}" -d "{\"code\":\"$CAT_CODE\",\"name\":\"Нагрузочное тестирование\",\"description\":\"Данные для test/acceptance/load.sh\"}" | jq -r .id)" fi GRP="$(grp_id || true)" if [ -z "$GRP" ]; then GRP="$(curl -fsS -X POST "$BASE_URL/dataset-groups" "${J[@]}" -d "{\"code\":\"$GRP_CODE\",\"name\":\"Население СКО (нагрузочный тест)\"}" | jq -r .id)" fi want=$((SEED_VECTOR + SEED_KATO + SEED_RASTER)) have="$(curl -fsS "$BASE_URL/datasets?category_id=$CAT&status=ready&page_size=1" | jq -r .total)" if [ "$have" -lt "$want" ]; then echo "seeding $BASE_URL: $SEED_VECTOR vector, $SEED_KATO vector_with_kato, $SEED_RASTER raster (category $CAT_CODE)" TMP="$(mktemp -d "${TMPDIR:-/tmp}/gis-seed.XXXXXX")"; trap 'rm -rf "$TMP"' EXIT "$PYTHON" "$HERE/lib/helpers.py" ndvi "$TMP/ndvi_seed.tif" upload() { curl -fsS -X POST "$BASE_URL/datasets" "$@" | jq -r .id; } for i in $(seq 1 "$SEED_VECTOR"); do upload -F "file=@$HERE/data/plots_nko.geojson" -F file_type=vector -F "category_id=$CAT" -F "name=Участки $i" >/dev/null done kato_ids="" for i in $(seq 1 "$SEED_KATO"); do y=$((2000 + i)) kato_ids="$kato_ids $(upload -F "file=@$HERE/data/population_kato.geojson" -F file_type=vector_with_kato -F "category_id=$CAT" \ -F "name=Население $i" -F "dg_id=$GRP" -F "start_date=$y-01-01" -F "end_date=$y-12-31")" done for i in $(seq 1 "$SEED_RASTER"); do upload -F "file=@$TMP/ndvi_seed.tif" -F file_type=raster -F "category_id=$CAT" -F "name=NDVI $i" >/dev/null done MAP='{"kato_column":"kato","year_columns":[{"column":"Y2022","start_date":"2022-01-01","end_date":"2022-12-31"},{"column":"Y2023","start_date":"2023-01-01","end_date":"2023-12-31"},{"column":"Y2024","start_date":"2024-01-01","end_date":"2024-12-31"}]}' for id in $kato_ids; do for _ in $(seq 1 120); do [ "$(curl -fsS "$BASE_URL/datasets/$id" | jq -r .status)" = awaiting_mapping ] && break; sleep 1 done curl -fsS -o /dev/null -X POST "$BASE_URL/datasets/$id/mapping" "${J[@]}" -d "$MAP" done for _ in $(seq 1 300); do have="$(curl -fsS "$BASE_URL/datasets?category_id=$CAT&status=ready&page_size=1" | jq -r .total)" [ "$have" -ge "$want" ] && break; sleep 1 done fi VWK="$(curl -fsS "$BASE_URL/datasets?category_id=$CAT&file_type=vector_with_kato&status=ready&page_size=1" | jq -r '.data[0].id')" printf 'CAT_ID=%s\nGROUP_ID=%s\nVWK_ID=%s\n' "$CAT" "$GRP" "$VWK" > "$ENV_OUT" echo "seed: category $CAT_CODE has $have ready datasets (wanted $want); ids in $ENV_OUT" cat "$ENV_OUT"