Skip to content

Add Scripts API support to all demos#50

Merged
bburda merged 11 commits intomainfrom
feat/42-scripts-api-demo
Mar 22, 2026
Merged

Add Scripts API support to all demos#50
bburda merged 11 commits intomainfrom
feat/42-scripts-api-demo

Conversation

@bburda
Copy link
Contributor

@bburda bburda commented Mar 22, 2026

Description

Migrate all demo inject/restore scripts to the gateway's Scripts API and add new diagnostic scripts. Scripts now run inside Docker containers and are callable via REST API, visible in the web UI.

Two-layer architecture:

  • Container-side scripts in gateway's filesystem auto-discovery layout (/var/lib/ros2_medkit/scripts/{entity_id}/{script_id}/)
  • Host-side thin wrappers calling POST /scripts/{id}/executions via shared lib/scripts-api.sh

Per demo:

Demo Container scripts New scripts
sensor_diagnostics 7 run-diagnostics, inject-fault-scenario
turtlebot3 5 nav-health-check, reset-navigation
moveit 5 arm-self-test, planning-benchmark

Key changes:

  • No more docker exec in any host-side script
  • All scripts discoverable via GET /components/{id}/scripts
  • Shared lib/scripts-api.sh with polling, timeout, progress feedback, stdout display
  • jq added to turtlebot3 and moveit Dockerfiles
  • Scripts section enabled in all 3 medkit_params.yaml
  • READMEs updated with Scripts API docs, examples, env var overrides

Follow-up: TODO(#49) markers for migration to manifest-defined scripts once ros2_medkit#303 lands (managed=true semantics).

Related Issue

closes #42

Checklist

  • Tested locally (Docker build + E2E: scripts discovered, executed, stdout captured)
  • README updated (all 3 demos)

bburda added 8 commits March 22, 2026 15:50
Introduces lib/scripts-api.sh, a sourced bash library that centralises
the poll-and-wait logic for calling the gateway Scripts API. All
host-side wrapper scripts across the sensor_diagnostics, turtlebot3,
and moveit demos will source this file rather than duplicating the
implementation.

Provides: execute_script(), list_scripts(), check_gateway(), and
dependency checks for curl and jq at source time. Configurable via
GATEWAY_URL, POLL_INTERVAL, and MAX_WAIT environment variables.
- 7 container-side scripts in auto-discovery layout (compute-unit entity)
- Enable scripts section in medkit_params.yaml
- COPY container_scripts in Dockerfile
- Rewrite host-side scripts as Scripts API wrappers
- New scripts: run-diagnostics, inject-fault-scenario
Document the Scripts API endpoint for calling inject/restore scripts
via REST, add host prerequisites note for curl/jq, and extend the
Scripts table with run-diagnostics.sh and inject-fault-scenario.sh.
- 5 container-side scripts in auto-discovery layout (nav2-stack entity)
- Enable scripts section in medkit_params.yaml
- Add jq to Dockerfile, COPY container_scripts
- Rewrite host-side scripts as Scripts API wrappers
- New scripts: nav-health-check, reset-navigation
- Update README with Scripts API documentation
- 5 container-side scripts in auto-discovery layout (moveit-planning entity)
- Enable scripts section in medkit_params.yaml
- Add jq to Dockerfile, COPY container_scripts, remove old symlinks
- Rewrite host-side scripts as Scripts API wrappers (no more docker exec)
- New scripts: arm-self-test, planning-benchmark
- Remove migrated .sh from scripts/, update CMakeLists.txt
- Update README with Scripts API documentation
Reference follow-up issue #49 in all 3 demo configs.
Once ros2_medkit#303 lands, scripts should move from filesystem
auto-discovery to manifest-defined entries (managed=true).
Critical fixes:
- Fix set -e + $? dead code pattern (use 'if !' instead)
- Add executable permission to 4 new host-side scripts
- Add -f flag to curl PUT calls in inject scripts

Important fixes:
- scripts-api.sh: fix 2>&1 -> 2>/dev/null, resilient polling,
  print script stdout on completion, progress dots, recovery hint,
  use $SECONDS for accurate timeout tracking
- Add || true to restore scripts for best-effort error tolerance
- Add EXEC_ID format validation in turtlebot3 container scripts
- Upgrade set -e to set -eu in all container scripts

TODO markers:
- Add TODO(#49) to Dockerfiles for manifest migration
- Standardize exec_id placeholder to <exec_id> across all demos
- Add GATEWAY_URL override example to each Scripts API section
- Add curl/jq to turtlebot3 Prerequisites
- Update sensor_diagnostics scripts table note to list all scripts
- Add container_scripts/ to turtlebot3 File Structure section
- Fix moveit stale {"data":{"value":...}} -> {"value":...} format
Copilot AI review requested due to automatic review settings March 22, 2026 16:04
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR migrates all demo fault injection/restore workflows to the ros2_medkit gateway Scripts API, moving executable logic into container-discovered scripts and leaving host-side scripts as thin REST wrappers. It also adds new diagnostic/maintenance scripts per demo and updates demo configuration/docs to expose scripts in the gateway/UI.

Changes:

  • Added a shared host-side helper (lib/scripts-api.sh) to start script executions and poll for completion/output.
  • Added container-side script bundles (metadata + bash) for each demo under /var/lib/ros2_medkit/scripts/<entity>/<script>/.
  • Enabled gateway scripts configuration in demo medkit_params.yaml, updated READMEs, and adjusted Dockerfiles to include required deps/copies.

Reviewed changes

Copilot reviewed 62 out of 62 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
lib/scripts-api.sh Shared host helper to execute/poll Scripts API executions
demos/turtlebot3_integration/restore-normal.sh Wrapper calling restore-normal via Scripts API
demos/turtlebot3_integration/reset-navigation.sh New wrapper calling reset-navigation via Scripts API
demos/turtlebot3_integration/nav-health-check.sh New wrapper calling nav-health-check via Scripts API
demos/turtlebot3_integration/inject-nav-failure.sh Wrapper calling inject-nav-failure via Scripts API
demos/turtlebot3_integration/inject-localization-failure.sh Wrapper calling inject-localization-failure via Scripts API
demos/turtlebot3_integration/container_scripts/nav2-stack/restore-normal/script.bash In-container restore script (cancel goals, reset params, clear faults)
demos/turtlebot3_integration/container_scripts/nav2-stack/restore-normal/metadata.json Scripts API metadata for restore-normal
demos/turtlebot3_integration/container_scripts/nav2-stack/reset-navigation/script.bash In-container reset script (cancel goals + AMCL reset)
demos/turtlebot3_integration/container_scripts/nav2-stack/reset-navigation/metadata.json Scripts API metadata for reset-navigation
demos/turtlebot3_integration/container_scripts/nav2-stack/nav-health-check/script.bash In-container health check for key nav2 apps + fault count
demos/turtlebot3_integration/container_scripts/nav2-stack/nav-health-check/metadata.json Scripts API metadata for nav-health-check
demos/turtlebot3_integration/container_scripts/nav2-stack/inject-nav-failure/script.bash In-container injection: send unreachable nav goal
demos/turtlebot3_integration/container_scripts/nav2-stack/inject-nav-failure/metadata.json Scripts API metadata for inject-nav-failure
demos/turtlebot3_integration/container_scripts/nav2-stack/inject-localization-failure/script.bash In-container injection: AMCL reinit + nav goal
demos/turtlebot3_integration/container_scripts/nav2-stack/inject-localization-failure/metadata.json Scripts API metadata for inject-localization-failure
demos/turtlebot3_integration/config/medkit_params.yaml Enables scripts auto-discovery/config in gateway params
demos/turtlebot3_integration/README.md Documents Scripts API usage + lists available scripts
demos/turtlebot3_integration/Dockerfile Installs jq + copies container scripts into scripts_dir
demos/sensor_diagnostics/run-diagnostics.sh New wrapper calling run-diagnostics via Scripts API
demos/sensor_diagnostics/restore-normal.sh Wrapper calling restore-normal via Scripts API
demos/sensor_diagnostics/inject-noise.sh Wrapper calling inject-noise via Scripts API
demos/sensor_diagnostics/inject-nan.sh Wrapper calling inject-nan via Scripts API
demos/sensor_diagnostics/inject-fault-scenario.sh New wrapper calling composite scenario via Scripts API
demos/sensor_diagnostics/inject-failure.sh Wrapper calling inject-failure via Scripts API
demos/sensor_diagnostics/inject-drift.sh Wrapper calling inject-drift via Scripts API
demos/sensor_diagnostics/container_scripts/compute-unit/run-diagnostics/script.bash In-container diagnostics: hit sensor data endpoints + fault count
demos/sensor_diagnostics/container_scripts/compute-unit/run-diagnostics/metadata.json Scripts API metadata for run-diagnostics
demos/sensor_diagnostics/container_scripts/compute-unit/restore-normal/script.bash In-container restore: reset sensor params + clear faults
demos/sensor_diagnostics/container_scripts/compute-unit/restore-normal/metadata.json Scripts API metadata for restore-normal
demos/sensor_diagnostics/container_scripts/compute-unit/inject-noise/script.bash In-container injection: set lidar/camera noise
demos/sensor_diagnostics/container_scripts/compute-unit/inject-noise/metadata.json Scripts API metadata for inject-noise
demos/sensor_diagnostics/container_scripts/compute-unit/inject-nan/script.bash In-container injection: enable NaN on lidar/imu/gps
demos/sensor_diagnostics/container_scripts/compute-unit/inject-nan/metadata.json Scripts API metadata for inject-nan
demos/sensor_diagnostics/container_scripts/compute-unit/inject-fault-scenario/script.bash In-container composite injection across all sensors
demos/sensor_diagnostics/container_scripts/compute-unit/inject-fault-scenario/metadata.json Scripts API metadata for inject-fault-scenario
demos/sensor_diagnostics/container_scripts/compute-unit/inject-failure/script.bash In-container injection: IMU failure_probability=1.0
demos/sensor_diagnostics/container_scripts/compute-unit/inject-failure/metadata.json Scripts API metadata for inject-failure
demos/sensor_diagnostics/container_scripts/compute-unit/inject-drift/script.bash In-container injection: lidar drift_rate=0.1
demos/sensor_diagnostics/container_scripts/compute-unit/inject-drift/metadata.json Scripts API metadata for inject-drift
demos/sensor_diagnostics/config/medkit_params.yaml Enables scripts auto-discovery/config in gateway params
demos/sensor_diagnostics/README.md Documents Scripts API usage + new diagnostic scripts
demos/sensor_diagnostics/Dockerfile Copies container scripts into scripts_dir
demos/moveit_pick_place/restore-normal.sh Wrapper calling restore-normal via Scripts API
demos/moveit_pick_place/planning-benchmark.sh New wrapper calling planning-benchmark via Scripts API
demos/moveit_pick_place/inject-planning-failure.sh Wrapper calling inject-planning-failure via Scripts API
demos/moveit_pick_place/inject-collision.sh Wrapper calling inject-collision via Scripts API
demos/moveit_pick_place/arm-self-test.sh New wrapper calling arm-self-test via Scripts API
demos/moveit_pick_place/container_scripts/moveit-planning/restore-normal/script.bash Updates in-container restore script for scripts execution
demos/moveit_pick_place/container_scripts/moveit-planning/restore-normal/metadata.json Scripts API metadata for restore-normal
demos/moveit_pick_place/container_scripts/moveit-planning/planning-benchmark/script.bash New in-container benchmark (checks key apps/ops)
demos/moveit_pick_place/container_scripts/moveit-planning/planning-benchmark/metadata.json Scripts API metadata for planning-benchmark
demos/moveit_pick_place/container_scripts/moveit-planning/inject-planning-failure/script.bash Updates in-container wall injection script for Scripts API
demos/moveit_pick_place/container_scripts/moveit-planning/inject-planning-failure/metadata.json Scripts API metadata for inject-planning-failure
demos/moveit_pick_place/container_scripts/moveit-planning/inject-collision/script.bash Updates in-container collision injection script for Scripts API
demos/moveit_pick_place/container_scripts/moveit-planning/inject-collision/metadata.json Scripts API metadata for inject-collision
demos/moveit_pick_place/container_scripts/moveit-planning/arm-self-test/script.bash New in-container self-test (checks key apps + fault count)
demos/moveit_pick_place/container_scripts/moveit-planning/arm-self-test/metadata.json Scripts API metadata for arm-self-test
demos/moveit_pick_place/config/medkit_params.yaml Enables scripts auto-discovery/config in gateway params
demos/moveit_pick_place/README.md Documents Scripts API usage and new script set
demos/moveit_pick_place/Dockerfile Installs jq + copies container scripts into scripts_dir; removes old PATH symlink setup
demos/moveit_pick_place/CMakeLists.txt Stops installing old inject/restore scripts as ROS runtime programs

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bburda bburda self-assigned this Mar 22, 2026
@bburda bburda requested a review from mfaferek93 March 22, 2026 16:45
- Replace unused RESPONSE variable captures with direct curl > /dev/null
  (arm-self-test, planning-benchmark, run-diagnostics)
- Add shellcheck source directive to all host-side wrappers
bburda added 2 commits March 22, 2026 18:04
- Inject scripts: handle partial failures with per-call error tracking
  instead of aborting on first failure (inject-nan, inject-noise,
  inject-fault-scenario)
- Add -sf flag to turtlebot3 POST calls (inject-localization-failure,
  reset-navigation) so HTTP errors are caught
- Add exec_id format validation to lib/scripts-api.sh
- Use proper if/else instead of && || to satisfy shellcheck SC2015
@mfaferek93 mfaferek93 self-requested a review March 22, 2026 18:01
@bburda bburda merged commit 12cc3e5 into main Mar 22, 2026
4 checks passed
@bburda bburda deleted the feat/42-scripts-api-demo branch March 22, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add diagnostic scripts showcasing Scripts API

3 participants