feat(ET-001): implement barrier blocking and footway exclusion in OSRM profile
All checks were successful
CI / lint (push) Successful in 7s
CI / test (push) Successful in 6s
CI / build (push) Successful in 2s

- enduro.lua: блокировка нод barrier=gate|bollard|lift_gate|chain|cycle_barrier|
  motorcycle_barrier|border_control|block через mode.inaccessible (ADR-001).
  cattle_grid и ford остаются проезжими.
- enduro.lua: highway=footway|pedestrian|steps|corridor полностью исключены
  из графа (early return в process_way). Эти типы удалены из highway_rate
  и highway_speeds, чтобы профиль был самодостаточным.
- scripts/rebuild-osrm.sh: пересборка графа (extract → partition → customize)
  и рестарт контейнера osrm-routed.
- tests/integration/test_routing_barriers.py: 7 тестов (TC-001..TC-005 +
  статический анализ blocked_barriers/excluded_highways). Интеграционные тесты
  скипаются если OSRM не доступен.

Refs: ET-001
This commit is contained in:
2026-05-15 22:11:32 +03:00
parent c44dc5ceff
commit e263f8425c
4 changed files with 440 additions and 16 deletions

72
scripts/rebuild-osrm.sh Executable file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# rebuild-osrm.sh — пересборка OSRM-графа эндуро-профиля.
#
# Запускает полный цикл extract → partition → customize и рестартит роутер.
# Требует docker, osrm-backend образ и pbf-файл в каталоге OSRM_DIR.
#
# Использование:
# ./scripts/rebuild-osrm.sh
# OSRM_DIR=/path/to/osrm OSRM_PBF=area.osm.pbf ./scripts/rebuild-osrm.sh
#
# Переменные окружения (со значениями по умолчанию):
# OSRM_DIR — каталог с enduro.lua и .osm.pbf (default: /home/slin/enduro-trails/osrm)
# OSRM_PBF — имя pbf-файла (default: enduro.osm.pbf)
# OSRM_PROFILE — имя lua-профиля (default: enduro.lua)
# OSRM_IMAGE — docker-образ osrm-backend (default: ghcr.io/project-osrm/osrm-backend:latest)
# OSRM_CONTAINER — имя контейнера для рестарта (default: osrm-osrm-routed-1)
set -euo pipefail
OSRM_DIR="${OSRM_DIR:-/home/slin/enduro-trails/osrm}"
OSRM_PBF="${OSRM_PBF:-enduro.osm.pbf}"
OSRM_PROFILE="${OSRM_PROFILE:-enduro.lua}"
OSRM_IMAGE="${OSRM_IMAGE:-ghcr.io/project-osrm/osrm-backend:latest}"
OSRM_CONTAINER="${OSRM_CONTAINER:-osrm-osrm-routed-1}"
if [[ ! -d "$OSRM_DIR" ]]; then
echo "ERROR: каталог $OSRM_DIR не существует" >&2
exit 1
fi
if [[ ! -f "$OSRM_DIR/$OSRM_PBF" ]]; then
echo "ERROR: pbf-файл $OSRM_DIR/$OSRM_PBF не найден" >&2
exit 1
fi
if [[ ! -f "$OSRM_DIR/$OSRM_PROFILE" ]]; then
echo "ERROR: lua-профиль $OSRM_DIR/$OSRM_PROFILE не найден" >&2
exit 1
fi
OSRM_BASE="${OSRM_PBF%.osm.pbf}"
OSRM_FILE="$OSRM_BASE.osrm"
echo "==> Пересборка OSRM-графа"
echo " каталог: $OSRM_DIR"
echo " pbf: $OSRM_PBF"
echo " профиль: $OSRM_PROFILE"
echo " образ: $OSRM_IMAGE"
echo " контейнер: $OSRM_CONTAINER"
run_osrm() {
docker run --rm -v "$OSRM_DIR:/data" "$OSRM_IMAGE" "$@"
}
echo "==> [1/4] osrm-extract (это ~40 минут)"
run_osrm osrm-extract -p "/data/$OSRM_PROFILE" "/data/$OSRM_PBF"
echo "==> [2/4] osrm-partition"
run_osrm osrm-partition "/data/$OSRM_FILE"
echo "==> [3/4] osrm-customize"
run_osrm osrm-customize "/data/$OSRM_FILE"
echo "==> [4/4] Рестарт контейнера $OSRM_CONTAINER"
if docker ps -a --format '{{.Names}}' | grep -qx "$OSRM_CONTAINER"; then
docker restart "$OSRM_CONTAINER"
echo " контейнер перезапущен"
else
echo " WARNING: контейнер $OSRM_CONTAINER не найден — рестарт пропущен" >&2
fi
echo "==> Готово"