rosotacom-dev 2.5.dev24__tar.gz → 2.5.dev26__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/CONCURRENCY.md +20 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/PKG-INFO +10 -1
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/README.md +9 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/cli.py +73 -8
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/PKG-INFO +10 -1
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/scm_version.json +2 -2
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_cli.py +59 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_concurrency.py +128 -2
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.devcontainer/devcontainer.json.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.devcontainer/re_generate_devcontainer_json.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/CODEOWNERS +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/documentation-audit.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/implementation-cleanup.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/quality-workflow.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/redesign.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/release-process.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/repository-diagnosis.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/test-ci-audit.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/work-item.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/dependabot.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/benchmark-calibrate.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/benchmark-gate.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/dev-release.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/image-scan.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/nightly-e2e.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/pr-lightweight.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/pr-merge-gate.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/release.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.pre-commit-config.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/AGENTS.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/CONTRIBUTING.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/DEVELOPMENT_PRINCIPLES.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/MANIFEST.in +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/budgets.jsonl +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/README.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/capacity-size-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-gop-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-nominal-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-cyclone.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-fastdds.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-zenoh.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/codecov.yml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/deployment-configuration.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/benchmark-ab.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/benchmark-bag-as-load.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/ci.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/ffmpeg-keyframes.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/README.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/cyclone-spdp-discovery-bursts.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/delay-alone-no-loss.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/head-of-line-irregularity.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/jitter-loss-bandwidth-latency.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/lighter-message-loss.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/zero-loss-boundaries-18kb-20hz.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/forensics-report.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/geo-link-map.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/github-repository-settings.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/link-trace.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/owner-runbook.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/performance-bands.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/playbooks/README.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/quality-model.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release-notes/TEMPLATE.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.1.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.2.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.3.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release-notes/v2.4.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/release.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0001-expectation-driven-test-suite.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0002-expectation-concepts.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0003-metric-backbone.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0004-network-profiles.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0005-benchmark-genres-and-ci.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0006-dynamic-qos.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/0007-regression-gate.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/rfcs/README.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/testing.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/work-items.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/install.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/justfile +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/media/control_center.png +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/media/echo_test.png +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/media/forensics-report-example.png +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/media/host.png +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/media/vehicle.png +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/pyproject.toml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/requirements.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/run_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/session-configuration.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/__init__.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/__main__.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/anonymize.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/benched_set.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/benchmark.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/deployment.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/forensics.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/geomap.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/image_cache.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/plots.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/py.typed +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/benched-set.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/.gitignore +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/README.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/__init__.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/bags/8_drop_reference/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/deployment.example.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/profiles.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/rosotacom.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scenarios/2_native_chatter/scenario-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_a.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/1_heartbeat/run_machine_b.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_a/wait_for_echo_topic.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/2_native_chatter/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/3_comp_occ_grid/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/foxglove.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/costmap_1second_0.mcap +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/costmap_1second/metadata.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/4_comp_occ_grid_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/5_sized_payload/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_a/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external.ros2docker.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/external_session.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_communication.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/scripts/6_sized_payload_zen/machine_b/run_external.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/10_restamp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/11_trickle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/12_content_integrity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/13_link_latency/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/14_remote_assist_anonymized/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/15_remote_assist_anonymized_costmap/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/16_remote_assist_anonymized_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/17_synthetic_camera_quality/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/1_heartbeat/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/1_heartbeat_status/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/2_native_chatter/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/3_comp_occ_grid/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/4_comp_occ_grid_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/5_sized_payload/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/6_sized_payload_zen/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/7_latched_static/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/8_drop/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/9_throttle/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_1_capacity/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_2_load_sweep/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_3_ramp/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_4_recovery/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/examples/sessions/bench_1_5_camera/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ros2docker.json.example +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/.vscode/c_cpp_properties.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/.vscode/settings.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_easy_mode.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_initial_peer_list.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v2.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v3.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v4.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/archive/fastdds_v5.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/create_zenoh_json5.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/cyclonedds_minimal.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/cyclonedds_tuned.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/fastdds_unicast.xml.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/get_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/utils.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ota_configs/zenoh.json5.template +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/.gitkeep +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/COLCON_IGNORE +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/package.xml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/hz_monitor.cpp +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_compressor.cpp +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_cpp/src/universal_decompressor.cpp +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/CMakeLists.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/CompressedData.msg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/EchoHeartbeat.msg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/OtaStamped.msg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/msg/SizedPayload.msg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_msgs/package.xml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/LICENSE.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/__init__.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/base_bridge_relay.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_in.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/bridge_out.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/heartbeat_echo.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/hz_monitor.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_bandwidth_reducer.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/image_pixel_capper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/lanelet_saver.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/latch_relay.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/costmap_remapper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/marker_remapper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/speed_test.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/tf_remapper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/traffic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/legacy/wifi_network_analysis_1.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/link_trace.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/local_global_frame_bridge.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/localization_map_split_reduce_saver.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/msg_transform.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pair_management.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/pub_sub_pair.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/qos.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_in.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/relay_out.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/restamp.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/sized_publisher.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/stage_latency_core.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/status_overview_core.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/tf_map_to_cart_saver.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_monitor.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/topic_resolution.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/trickle.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_compressor.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_decompressor.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_unwrapper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/com_py/universal_ota_wrapper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/package.xml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/resource/com_py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/setup.cfg +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/setup.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_copyright.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_flake8.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/ros2src/com_py/test/test_pep257.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/base/session_plugin_base.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/network/up_connectivity.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/content/network/wifi_network_analysis_2.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/anonymize_bag.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/catmux_log_setup.sh +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/create_session_yaml.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/generate_session_files.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/run_session.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/run_session_in_external_terminal.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/resources/ws/session/creation/strip_ansi.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/status_eval.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/transit.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom/video_quality.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/SOURCES.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/dependency_links.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/entry_points.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/requires.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/scm_file_list.json +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/src/rosotacom_dev.egg-info/top_level.txt +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/stop_session_in_container.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/terminology.md +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_benched_set_registry.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_findings.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_markdown_links.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_ota_source_bundle.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_package_metadata.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_packaged_resources.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_profile_covers_generated_commands.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_pytest_policy.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_readme_examples.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_security_maintenance_config.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_session_configuration_doc.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/contract/test_workflow_contracts.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/conftest.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_anonymize_e2e.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_ab.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_capacity.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_benchmark_replay.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_parallel_smoke.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_smoke.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_timeline_stepping.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/e2e/test_video_quality_e2e.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/generate_rmw_matrix.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-local_zenoh-ros2dds-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_cyclone-ota-tuned/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_fastdds/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/sessions/rmw_matrix/1_heartbeat_zen-endpoints/session-definition.yaml +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_anonymize.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_bag_ground_truth.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_benched_set.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_benchmark_delta.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_bundle_check.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_cli_benchmark.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_deployment.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_ffmpeg_packet.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_forensics.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_geomap.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_image_cache.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_link_bytes.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_link_trace.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_network_profiles.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_network_shaper.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_ota_xml.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_plots.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_stage_latency.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_status_eval.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_status_overview.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_stream_stats.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_trace_profiles.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_transit.py +0 -0
- {rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/tests/unit/test_video_quality.py +0 -0
|
@@ -39,6 +39,26 @@ commands *discover* the matching containers from Docker instead of recomputing
|
|
|
39
39
|
fixed names — they clean up every instance for the requested identity/target,
|
|
40
40
|
including leftovers from crashed runs.
|
|
41
41
|
|
|
42
|
+
## Opting out: fixed, human-readable names
|
|
43
|
+
|
|
44
|
+
A project whose machines are read by people rather than by CI — a demo or
|
|
45
|
+
operations project — can set `com_container_prefix` in its `rosotacom.yaml`:
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
com_container_prefix: remote-assist
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Session communication containers are then named
|
|
52
|
+
`<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`): stable
|
|
53
|
+
across runs and legible in `docker ps`, at the price of parallelism — a second
|
|
54
|
+
start of the same session on the same host is a name conflict. That conflict is
|
|
55
|
+
detected in the same preflight as everything else: `--force` (the session
|
|
56
|
+
default) replaces the running container, `--no-force` aborts with its name.
|
|
57
|
+
Conflict discovery matches **both** naming schemes, so a leftover
|
|
58
|
+
instance-scoped container is still found and replaced after a project switches
|
|
59
|
+
modes. Test and CI projects should leave the key unset and keep the
|
|
60
|
+
collision-free instance-scoped names.
|
|
61
|
+
|
|
42
62
|
## How conflicts are detected (fail-safe preflight)
|
|
43
63
|
|
|
44
64
|
Each start command checks Docker before it allocates anything, and aborts with
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rosotacom-dev
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.dev26
|
|
4
4
|
Summary: Host CLI for ROS OTA communication sessions.
|
|
5
5
|
Author: develNor
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -227,6 +227,15 @@ scripts/
|
|
|
227
227
|
project-local directories first and shared/example directories later when one
|
|
228
228
|
project should discover both.
|
|
229
229
|
|
|
230
|
+
`com_container_prefix` (optional) trades concurrency for readability: when set,
|
|
231
|
+
session communication containers get the stable name
|
|
232
|
+
`<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
|
|
233
|
+
the default workspace- and instance-scoped unique name. Set it in projects whose
|
|
234
|
+
machines are read by people (`docker ps` during a demo, next to colleagues'
|
|
235
|
+
containers); leave it unset in test/CI projects, where concurrent instances must
|
|
236
|
+
never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
|
|
237
|
+
conflict semantics.
|
|
238
|
+
|
|
230
239
|
### Locating packaged resources
|
|
231
240
|
|
|
232
241
|
rosotacom is installed in an isolated environment (pipx, or a project venv), so
|
|
@@ -182,6 +182,15 @@ scripts/
|
|
|
182
182
|
project-local directories first and shared/example directories later when one
|
|
183
183
|
project should discover both.
|
|
184
184
|
|
|
185
|
+
`com_container_prefix` (optional) trades concurrency for readability: when set,
|
|
186
|
+
session communication containers get the stable name
|
|
187
|
+
`<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
|
|
188
|
+
the default workspace- and instance-scoped unique name. Set it in projects whose
|
|
189
|
+
machines are read by people (`docker ps` during a demo, next to colleagues'
|
|
190
|
+
containers); leave it unset in test/CI projects, where concurrent instances must
|
|
191
|
+
never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
|
|
192
|
+
conflict semantics.
|
|
193
|
+
|
|
185
194
|
### Locating packaged resources
|
|
186
195
|
|
|
187
196
|
rosotacom is installed in an isolated environment (pipx, or a project venv), so
|
|
@@ -181,6 +181,7 @@ class RuntimeConfig:
|
|
|
181
181
|
scenario_configs_dir: tuple[Path, ...] = ()
|
|
182
182
|
profiles_file: Path | None = None
|
|
183
183
|
benchmarks_dir: Path | None = None
|
|
184
|
+
com_container_prefix: str | None = None
|
|
184
185
|
|
|
185
186
|
|
|
186
187
|
@dataclass(frozen=True)
|
|
@@ -485,6 +486,22 @@ def _resolve_project_config_source(args: argparse.Namespace) -> tuple[str | None
|
|
|
485
486
|
return None, None
|
|
486
487
|
|
|
487
488
|
|
|
489
|
+
_DOCKER_NAME_RE = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_.-]*$")
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def _validated_com_container_prefix(raw: Any) -> str | None:
|
|
493
|
+
if raw is None:
|
|
494
|
+
return None
|
|
495
|
+
value = str(raw).strip()
|
|
496
|
+
if not value:
|
|
497
|
+
return None
|
|
498
|
+
if not _DOCKER_NAME_RE.match(value):
|
|
499
|
+
raise RuntimeError(
|
|
500
|
+
f"com_container_prefix must be a valid docker name ([a-zA-Z0-9][a-zA-Z0-9_.-]*), got: {raw!r}"
|
|
501
|
+
)
|
|
502
|
+
return value
|
|
503
|
+
|
|
504
|
+
|
|
488
505
|
def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfig:
|
|
489
506
|
args = args or argparse.Namespace()
|
|
490
507
|
rosotacom_config_raw, project_source = _resolve_project_config_source(args)
|
|
@@ -499,6 +516,7 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
|
|
|
499
516
|
"deployment",
|
|
500
517
|
"profiles",
|
|
501
518
|
"benchmarks_dir",
|
|
519
|
+
"com_container_prefix",
|
|
502
520
|
}
|
|
503
521
|
unknown_project_keys = sorted(set(cfg) - allowed_project_keys)
|
|
504
522
|
if unknown_project_keys:
|
|
@@ -543,6 +561,10 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
|
|
|
543
561
|
os.environ.get("ROSOTACOM_BENCHMARKS_DIR"),
|
|
544
562
|
cfg.get("benchmarks_dir"),
|
|
545
563
|
)
|
|
564
|
+
com_container_prefix_raw = _first_value(
|
|
565
|
+
os.environ.get("ROSOTACOM_COM_CONTAINER_PREFIX"),
|
|
566
|
+
cfg.get("com_container_prefix"),
|
|
567
|
+
)
|
|
546
568
|
|
|
547
569
|
ros2docker_config = _resolve_path(ros2docker_config_raw, config_base, must_exist=True)
|
|
548
570
|
if ros2docker_config is None:
|
|
@@ -575,6 +597,7 @@ def _load_runtime_config(args: argparse.Namespace | None = None) -> RuntimeConfi
|
|
|
575
597
|
),
|
|
576
598
|
profiles_file=_resolve_path(profiles_raw, config_base, must_exist=True),
|
|
577
599
|
benchmarks_dir=_resolve_path(benchmarks_dir_raw, config_base, must_exist=False),
|
|
600
|
+
com_container_prefix=_validated_com_container_prefix(com_container_prefix_raw),
|
|
578
601
|
)
|
|
579
602
|
|
|
580
603
|
|
|
@@ -663,7 +686,23 @@ def _workspace_container_prefix(runtime: RuntimeConfig) -> str:
|
|
|
663
686
|
return f"rosotacom_{runtime.install_id}_"
|
|
664
687
|
|
|
665
688
|
|
|
689
|
+
def _fixed_com_container_name(runtime: RuntimeConfig, remote_peer_name: str) -> str | None:
|
|
690
|
+
"""The stable, human-readable com container name, when the project opts in.
|
|
691
|
+
|
|
692
|
+
A project sets ``com_container_prefix`` when people read ``docker ps`` on its
|
|
693
|
+
machines (demos, operations). The price is concurrency: two instances of the
|
|
694
|
+
same session cannot run side by side on one host, which is why test/CI
|
|
695
|
+
projects leave the key unset and keep the instance-scoped names.
|
|
696
|
+
"""
|
|
697
|
+
if not runtime.com_container_prefix:
|
|
698
|
+
return None
|
|
699
|
+
return _sanitize_docker_name(f"{runtime.com_container_prefix}_com-to-{remote_peer_name}")
|
|
700
|
+
|
|
701
|
+
|
|
666
702
|
def _container_name(remote_peer_name: str, runtime: RuntimeConfig, instance_id: str) -> str:
|
|
703
|
+
fixed = _fixed_com_container_name(runtime, remote_peer_name)
|
|
704
|
+
if fixed is not None:
|
|
705
|
+
return fixed
|
|
667
706
|
return _sanitize_docker_name(
|
|
668
707
|
f"rosotacom_{runtime.install_id}_{_instance_name_token(instance_id)}_com_to_{remote_peer_name}"
|
|
669
708
|
)
|
|
@@ -697,10 +736,19 @@ def _list_docker_containers(*, all_states: bool = False) -> list[tuple[str, list
|
|
|
697
736
|
|
|
698
737
|
|
|
699
738
|
def _matching_com_containers(runtime: RuntimeConfig, remote_peer_name: str, *, all_states: bool = False) -> list[str]:
|
|
700
|
-
"""Workspace communication containers for `remote_peer_name`, any instance.
|
|
739
|
+
"""Workspace communication containers for `remote_peer_name`, any instance.
|
|
740
|
+
|
|
741
|
+
Matches both naming schemes — the instance-scoped default and the fixed
|
|
742
|
+
``com_container_prefix`` name — so a leftover container from the other mode
|
|
743
|
+
is still found after a project toggles the key.
|
|
744
|
+
"""
|
|
701
745
|
suffix = _sanitize_docker_name(f"com_to_{remote_peer_name}")
|
|
746
|
+
fixed = _fixed_com_container_name(runtime, remote_peer_name)
|
|
702
747
|
names = []
|
|
703
748
|
for name, _networks in _list_docker_containers(all_states=all_states):
|
|
749
|
+
if fixed is not None and name == fixed:
|
|
750
|
+
names.append(name)
|
|
751
|
+
continue
|
|
704
752
|
parts = _split_workspace_container(name, runtime)
|
|
705
753
|
if parts is not None and parts[1] == suffix:
|
|
706
754
|
names.append(name)
|
|
@@ -4350,7 +4398,13 @@ def _load_scenario_definition(resolved: ResolvedScenario) -> ScenarioDefinition:
|
|
|
4350
4398
|
assert config_path is not None
|
|
4351
4399
|
if not config_path.is_file():
|
|
4352
4400
|
raise RuntimeError(f"{context}.ros2docker_config must resolve to a file: {config_path}")
|
|
4353
|
-
|
|
4401
|
+
# Structural validation only. A definition names applications for
|
|
4402
|
+
# every peer, and a `-v` host path (a staged replay bag, a local
|
|
4403
|
+
# workspace) is only required to exist on the machine that starts
|
|
4404
|
+
# that application — which validates it in `_run-application`.
|
|
4405
|
+
# Resolving run args here would make every peer demand every other
|
|
4406
|
+
# peer's machine-local artifacts (#249).
|
|
4407
|
+
load_config(config_path, resolve_run_args=False)
|
|
4354
4408
|
seen_names.add(name)
|
|
4355
4409
|
parsed_entries.append(ScenarioApplication(name=name, ros2docker_config=config_path))
|
|
4356
4410
|
applications[identity] = tuple(parsed_entries)
|
|
@@ -4900,7 +4954,13 @@ def start_session(args: argparse.Namespace) -> str:
|
|
|
4900
4954
|
container_name = _container_name(remote_name, runtime, instance.instance_id)
|
|
4901
4955
|
network_isolated = bool(getattr(args, "network_name", None))
|
|
4902
4956
|
if not network_isolated and not getattr(args, "skip_conflict_check", False):
|
|
4903
|
-
|
|
4957
|
+
matching = _matching_com_containers(runtime, remote_name)
|
|
4958
|
+
if _fixed_com_container_name(runtime, remote_name) is not None:
|
|
4959
|
+
# A fixed name cannot coexist with itself: a running container with
|
|
4960
|
+
# this exact name is a conflict too, not a rejoinable instance.
|
|
4961
|
+
conflicts = matching
|
|
4962
|
+
else:
|
|
4963
|
+
conflicts = [name for name in matching if name != container_name]
|
|
4904
4964
|
if conflicts and args.force:
|
|
4905
4965
|
for conflict in conflicts:
|
|
4906
4966
|
_stop_container_name(conflict, runtime, quiet_missing=True)
|
|
@@ -5616,15 +5676,20 @@ def ps_command(args: argparse.Namespace) -> int:
|
|
|
5616
5676
|
"""Answer "can I start something?" by classifying active rosotacom containers."""
|
|
5617
5677
|
runtime = _load_runtime_config(args)
|
|
5618
5678
|
prefix = _workspace_container_prefix(runtime)
|
|
5679
|
+
fixed_com_prefix = (
|
|
5680
|
+
f"{_sanitize_docker_name(runtime.com_container_prefix)}_com-to-" if runtime.com_container_prefix else None
|
|
5681
|
+
)
|
|
5619
5682
|
smoke_isolated: list[tuple[str, str]] = []
|
|
5620
5683
|
host_shared: list[str] = []
|
|
5621
5684
|
other_workspaces: list[str] = []
|
|
5622
5685
|
for name, networks in _list_docker_containers():
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5686
|
+
fixed_named = fixed_com_prefix is not None and name.startswith(fixed_com_prefix)
|
|
5687
|
+
if not fixed_named:
|
|
5688
|
+
if not name.startswith("rosotacom_"):
|
|
5689
|
+
continue
|
|
5690
|
+
if not name.startswith(prefix):
|
|
5691
|
+
other_workspaces.append(name)
|
|
5692
|
+
continue
|
|
5628
5693
|
smoke_nets = [net for net in networks if net.startswith("rosotacom_smoke_") or net == SMOKE_NETWORK_NAME]
|
|
5629
5694
|
if smoke_nets:
|
|
5630
5695
|
smoke_isolated.append((name, smoke_nets[0]))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rosotacom-dev
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.dev26
|
|
4
4
|
Summary: Host CLI for ROS OTA communication sessions.
|
|
5
5
|
Author: develNor
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -227,6 +227,15 @@ scripts/
|
|
|
227
227
|
project-local directories first and shared/example directories later when one
|
|
228
228
|
project should discover both.
|
|
229
229
|
|
|
230
|
+
`com_container_prefix` (optional) trades concurrency for readability: when set,
|
|
231
|
+
session communication containers get the stable name
|
|
232
|
+
`<prefix>_com-to-<remote-peer>` (e.g. `remote-assist_com-to-center`) instead of
|
|
233
|
+
the default workspace- and instance-scoped unique name. Set it in projects whose
|
|
234
|
+
machines are read by people (`docker ps` during a demo, next to colleagues'
|
|
235
|
+
containers); leave it unset in test/CI projects, where concurrent instances must
|
|
236
|
+
never collide on a name. [CONCURRENCY.md](CONCURRENCY.md) has the exact
|
|
237
|
+
conflict semantics.
|
|
238
|
+
|
|
230
239
|
### Locating packaged resources
|
|
231
240
|
|
|
232
241
|
rosotacom is installed in an isolated environment (pipx, or a project venv), so
|
|
@@ -158,6 +158,31 @@ def test_rosotacom_yaml_rejects_removed_data_dict_key(tmp_path: Path) -> None:
|
|
|
158
158
|
rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
|
|
159
159
|
|
|
160
160
|
|
|
161
|
+
def test_rosotacom_yaml_accepts_com_container_prefix(tmp_path: Path) -> None:
|
|
162
|
+
(tmp_path / "ros2docker.json").write_text('{"image_name": "test"}\n', encoding="utf-8")
|
|
163
|
+
config = tmp_path / "rosotacom.yaml"
|
|
164
|
+
config.write_text(
|
|
165
|
+
"ros2docker_config: ros2docker.json\ncom_container_prefix: remote-assist\n",
|
|
166
|
+
encoding="utf-8",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
runtime = rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
|
|
170
|
+
|
|
171
|
+
assert runtime.com_container_prefix == "remote-assist"
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def test_rosotacom_yaml_rejects_invalid_com_container_prefix(tmp_path: Path) -> None:
|
|
175
|
+
(tmp_path / "ros2docker.json").write_text('{"image_name": "test"}\n', encoding="utf-8")
|
|
176
|
+
config = tmp_path / "rosotacom.yaml"
|
|
177
|
+
config.write_text(
|
|
178
|
+
"ros2docker_config: ros2docker.json\ncom_container_prefix: 'has space'\n",
|
|
179
|
+
encoding="utf-8",
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
with pytest.raises(RuntimeError, match="com_container_prefix must be a valid docker name"):
|
|
183
|
+
rosotacom._load_runtime_config(argparse.Namespace(rosotacom_config=str(config)))
|
|
184
|
+
|
|
185
|
+
|
|
161
186
|
def test_session_definition_rejects_physical_address_field() -> None:
|
|
162
187
|
with pytest.raises(RuntimeError, match="Unsupported keys in peers.a.*address"):
|
|
163
188
|
rosotacom.session_gen._validate_session_template_cfg({"peers": {"a": {"address": "10.0.0.1"}, "b": {}}})
|
|
@@ -411,6 +436,40 @@ def test_scenario_definition_resolves_and_validates_strictly(tmp_path: Path) ->
|
|
|
411
436
|
rosotacom._load_scenario_definition(resolved)
|
|
412
437
|
|
|
413
438
|
|
|
439
|
+
def test_scenario_definition_ignores_foreign_peers_host_paths(tmp_path: Path) -> None:
|
|
440
|
+
"""Loading a definition must not require other peers' machine-local mounts.
|
|
441
|
+
|
|
442
|
+
Application b mounts a host path that exists only on b's machine (a staged
|
|
443
|
+
replay bag). Peer a still has to be able to parse the definition and start
|
|
444
|
+
its own applications; the mount is validated where b actually starts
|
|
445
|
+
(#249).
|
|
446
|
+
"""
|
|
447
|
+
runtime, resolved = _write_test_scenario_project(tmp_path)
|
|
448
|
+
foreign_config = tmp_path / "apps" / "b.json"
|
|
449
|
+
foreign_config.write_text(
|
|
450
|
+
"\n".join(
|
|
451
|
+
[
|
|
452
|
+
"{",
|
|
453
|
+
' "container_name": "b_app",',
|
|
454
|
+
' "run_type": "command",',
|
|
455
|
+
' "command": ["true"],',
|
|
456
|
+
' "run_args": ["-v", "./only-on-machine-b:/bag:ro"]',
|
|
457
|
+
"}",
|
|
458
|
+
"",
|
|
459
|
+
]
|
|
460
|
+
),
|
|
461
|
+
encoding="utf-8",
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
definition = rosotacom._load_scenario_definition(resolved)
|
|
465
|
+
assert definition.applications["b"][0].name == "local_app"
|
|
466
|
+
|
|
467
|
+
# The start path still refuses the missing mount on the machine that runs
|
|
468
|
+
# the application: full resolution stays where it is meaningful.
|
|
469
|
+
with pytest.raises(FileNotFoundError, match="Host path does not exist"):
|
|
470
|
+
rosotacom.load_config(foreign_config)
|
|
471
|
+
|
|
472
|
+
|
|
414
473
|
def test_scenario_name_completion_uses_active_project(
|
|
415
474
|
tmp_path: Path,
|
|
416
475
|
monkeypatch: pytest.MonkeyPatch,
|
|
@@ -17,8 +17,20 @@ import rosotacom.cli as rosotacom
|
|
|
17
17
|
from rosotacom import cli_benchmark
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def _runtime(
|
|
21
|
-
|
|
20
|
+
def _runtime(
|
|
21
|
+
tmp_path: Path,
|
|
22
|
+
install_id: str = "abc",
|
|
23
|
+
com_container_prefix: str | None = None,
|
|
24
|
+
) -> rosotacom.RuntimeConfig:
|
|
25
|
+
return rosotacom.RuntimeConfig(
|
|
26
|
+
None,
|
|
27
|
+
tmp_path / "ros2docker.json",
|
|
28
|
+
(),
|
|
29
|
+
None,
|
|
30
|
+
install_id,
|
|
31
|
+
tmp_path / "instances",
|
|
32
|
+
com_container_prefix=com_container_prefix,
|
|
33
|
+
)
|
|
22
34
|
|
|
23
35
|
|
|
24
36
|
def test_container_name_is_instance_scoped(tmp_path: Path) -> None:
|
|
@@ -34,6 +46,42 @@ def test_container_name_is_instance_scoped(tmp_path: Path) -> None:
|
|
|
34
46
|
assert rosotacom._container_name("remote", runtime, "my_run") == "rosotacom_abc_my-run_com_to_remote"
|
|
35
47
|
|
|
36
48
|
|
|
49
|
+
def test_container_name_is_fixed_with_com_container_prefix(tmp_path: Path) -> None:
|
|
50
|
+
runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
|
|
51
|
+
first = rosotacom._container_name("center", runtime, "run1")
|
|
52
|
+
second = rosotacom._container_name("center", runtime, "run2")
|
|
53
|
+
|
|
54
|
+
# No install id, no instance token: the name is stable across runs and
|
|
55
|
+
# readable next to colleagues' containers in `docker ps`.
|
|
56
|
+
assert first == "remote-assist_com-to-center"
|
|
57
|
+
assert second == first
|
|
58
|
+
assert rosotacom._container_name("ella", runtime, "run1") == "remote-assist_com-to-ella"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_matching_com_containers_includes_fixed_names(
|
|
62
|
+
tmp_path: Path,
|
|
63
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
64
|
+
) -> None:
|
|
65
|
+
runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
|
|
66
|
+
monkeypatch.setattr(
|
|
67
|
+
rosotacom,
|
|
68
|
+
"_list_docker_containers",
|
|
69
|
+
lambda all_states=False: [
|
|
70
|
+
("remote-assist_com-to-remote", ["bridge"]),
|
|
71
|
+
("remote-assist_com-to-other", ["bridge"]),
|
|
72
|
+
("rosotacom_abc_run1_com_to_remote", ["bridge"]),
|
|
73
|
+
("unrelated", ["bridge"]),
|
|
74
|
+
],
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Both schemes match, so a leftover instance-scoped container is still
|
|
78
|
+
# found after the project switched to fixed names (and vice versa).
|
|
79
|
+
assert rosotacom._matching_com_containers(runtime, "remote") == [
|
|
80
|
+
"remote-assist_com-to-remote",
|
|
81
|
+
"rosotacom_abc_run1_com_to_remote",
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
|
|
37
85
|
def test_scenario_container_name_is_instance_scoped(tmp_path: Path) -> None:
|
|
38
86
|
runtime = _runtime(tmp_path)
|
|
39
87
|
first = rosotacom._scenario_container_name(runtime, "demo", "a", "app", "run1")
|
|
@@ -209,6 +257,58 @@ def test_start_session_force_replaces_conflicting_identity_container(
|
|
|
209
257
|
assert [name for name, _ in calls] == ["build", "run", "exec"]
|
|
210
258
|
|
|
211
259
|
|
|
260
|
+
def test_start_session_fixed_name_conflicts_with_itself_without_force(
|
|
261
|
+
tmp_path: Path,
|
|
262
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
263
|
+
) -> None:
|
|
264
|
+
runtime = _runtime(tmp_path, install_id="id", com_container_prefix="remote-assist")
|
|
265
|
+
session = rosotacom.ResolvedSession(tmp_path, "/session/current", "absolute")
|
|
266
|
+
cfg = {"peers": {"a": {}, "b": {"com-name": "remote"}}}
|
|
267
|
+
calls: list[tuple[str, dict[str, object]]] = []
|
|
268
|
+
_patch_start_session_collaborators(monkeypatch, runtime, session, cfg, calls)
|
|
269
|
+
monkeypatch.setattr(
|
|
270
|
+
rosotacom,
|
|
271
|
+
"_list_docker_containers",
|
|
272
|
+
lambda all_states=False: [("remote-assist_com-to-remote", ["bridge"])],
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
with pytest.raises(RuntimeError) as excinfo:
|
|
276
|
+
rosotacom.start_session(_start_session_args())
|
|
277
|
+
|
|
278
|
+
# A fixed name cannot coexist with itself, so the running container is a
|
|
279
|
+
# conflict rather than a rejoinable instance.
|
|
280
|
+
assert "remote-assist_com-to-remote" in str(excinfo.value)
|
|
281
|
+
assert calls == []
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def test_start_session_fixed_name_force_replaces_running_container(
|
|
285
|
+
tmp_path: Path,
|
|
286
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
287
|
+
) -> None:
|
|
288
|
+
runtime = _runtime(tmp_path, install_id="id", com_container_prefix="remote-assist")
|
|
289
|
+
session = rosotacom.ResolvedSession(tmp_path, "/session/current", "absolute")
|
|
290
|
+
cfg = {"peers": {"a": {}, "b": {"com-name": "remote"}}}
|
|
291
|
+
calls: list[tuple[str, dict[str, object]]] = []
|
|
292
|
+
stopped: list[str] = []
|
|
293
|
+
_patch_start_session_collaborators(monkeypatch, runtime, session, cfg, calls)
|
|
294
|
+
monkeypatch.setattr(
|
|
295
|
+
rosotacom,
|
|
296
|
+
"_list_docker_containers",
|
|
297
|
+
lambda all_states=False: [("remote-assist_com-to-remote", ["bridge"])],
|
|
298
|
+
)
|
|
299
|
+
monkeypatch.setattr(
|
|
300
|
+
rosotacom,
|
|
301
|
+
"_stop_container_name",
|
|
302
|
+
lambda name, runtime, **kwargs: stopped.append(name) or True,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
container = rosotacom.start_session(_start_session_args(force=True))
|
|
306
|
+
|
|
307
|
+
assert container == "remote-assist_com-to-remote"
|
|
308
|
+
assert stopped[0] == "remote-assist_com-to-remote"
|
|
309
|
+
assert [name for name, _ in calls] == ["build", "run", "exec"]
|
|
310
|
+
|
|
311
|
+
|
|
212
312
|
def test_start_session_skips_identity_conflicts_on_isolated_networks(
|
|
213
313
|
tmp_path: Path,
|
|
214
314
|
monkeypatch: pytest.MonkeyPatch,
|
|
@@ -318,6 +418,32 @@ def test_ps_command_classifies_active_containers(
|
|
|
318
418
|
assert "onedrive" not in output
|
|
319
419
|
|
|
320
420
|
|
|
421
|
+
def test_ps_command_lists_fixed_named_com_containers(
|
|
422
|
+
tmp_path: Path,
|
|
423
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
424
|
+
capsys: pytest.CaptureFixture[str],
|
|
425
|
+
) -> None:
|
|
426
|
+
runtime = _runtime(tmp_path, com_container_prefix="remote-assist")
|
|
427
|
+
monkeypatch.setattr(rosotacom, "_load_runtime_config", lambda args: runtime)
|
|
428
|
+
monkeypatch.setattr(
|
|
429
|
+
rosotacom,
|
|
430
|
+
"_list_docker_containers",
|
|
431
|
+
lambda all_states=False: [
|
|
432
|
+
("remote-assist_com-to-center", ["bridge"]),
|
|
433
|
+
("rosotacom_abc_run2_com_to_b", ["bridge"]),
|
|
434
|
+
("onedrive", ["bridge"]),
|
|
435
|
+
],
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
assert rosotacom.ps_command(argparse.Namespace()) == 0
|
|
439
|
+
output = capsys.readouterr().out
|
|
440
|
+
|
|
441
|
+
assert "Host-shared" in output
|
|
442
|
+
assert "remote-assist_com-to-center" in output
|
|
443
|
+
assert "rosotacom_abc_run2_com_to_b" in output
|
|
444
|
+
assert "onedrive" not in output
|
|
445
|
+
|
|
446
|
+
|
|
321
447
|
def test_ps_command_reports_empty_workspace(
|
|
322
448
|
tmp_path: Path,
|
|
323
449
|
monkeypatch: pytest.MonkeyPatch,
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.devcontainer/devcontainer.json.template
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.devcontainer/re_generate_devcontainer_json.py
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/documentation-audit.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/implementation-cleanup.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/quality-workflow.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/release-process.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/ISSUE_TEMPLATE/repository-diagnosis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/.github/workflows/benchmark-calibrate.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/capacity-size-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-gop-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-nominal-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-cyclone.json
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/calibration/probe-loss-tight-fastdds.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/cyclone-spdp-discovery-bursts.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/head-of-line-irregularity.md
RENAMED
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/jitter-loss-bandwidth-latency.md
RENAMED
|
File without changes
|
|
File without changes
|
{rosotacom_dev-2.5.dev24 → rosotacom_dev-2.5.dev26}/docs/findings/zero-loss-boundaries-18kb-20hz.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|