Merged
Conversation
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
There was a problem hiding this comment.
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.
demos/moveit_pick_place/container_scripts/moveit-planning/planning-benchmark/script.bash
Outdated
Show resolved
Hide resolved
demos/moveit_pick_place/container_scripts/moveit-planning/arm-self-test/script.bash
Outdated
Show resolved
Hide resolved
demos/turtlebot3_integration/container_scripts/nav2-stack/reset-navigation/script.bash
Show resolved
Hide resolved
.../turtlebot3_integration/container_scripts/nav2-stack/inject-localization-failure/script.bash
Show resolved
Hide resolved
demos/sensor_diagnostics/container_scripts/compute-unit/run-diagnostics/script.bash
Outdated
Show resolved
Hide resolved
- 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
mfaferek93
reviewed
Mar 22, 2026
demos/sensor_diagnostics/container_scripts/compute-unit/inject-nan/script.bash
Show resolved
Hide resolved
demos/sensor_diagnostics/container_scripts/compute-unit/inject-fault-scenario/script.bash
Outdated
Show resolved
Hide resolved
demos/turtlebot3_integration/container_scripts/nav2-stack/restore-normal/script.bash
Show resolved
Hide resolved
- 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
approved these changes
Mar 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
/var/lib/ros2_medkit/scripts/{entity_id}/{script_id}/)POST /scripts/{id}/executionsvia sharedlib/scripts-api.shPer demo:
Key changes:
docker execin any host-side scriptGET /components/{id}/scriptslib/scripts-api.shwith polling, timeout, progress feedback, stdout displayjqadded to turtlebot3 and moveit Dockerfilesmedkit_params.yamlFollow-up: TODO(#49) markers for migration to manifest-defined scripts once ros2_medkit#303 lands (managed=true semantics).
Related Issue
closes #42
Checklist