iperf3-lib 0.4.1__tar.gz → 0.4.2__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.
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/ci.yml +41 -14
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/docs.yml +1 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/python-preview.yml +6 -6
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/release.yml +16 -16
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Dockerfile.preview +1 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Makefile +3 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/PKG-INFO +3 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/README.md +2 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/contributing.md +26 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/advanced-execution.md +4 -5
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/releasing.md +3 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/roadmap.md +16 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docker-entrypoint.sh +4 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/changelog.md +36 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/getting-started.md +8 -7
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/choosing-an-integration.md +2 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/configuration-intent.md +4 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/migration-0.3.md +3 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/native-controls.md +1 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/running-tests.md +3 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/index.md +9 -9
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/api.md +7 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/compatibility.md +87 -8
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/security.md +2 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/overrides/main.html +1 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/pyproject.toml +3 -3
- iperf3_lib-0.4.2/scripts/ci_scope.py +200 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/docker_validate.py +2 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/python_preview.py +4 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/smoke_release.py +9 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_cancellation.py +3 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_capture.py +15 -9
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_execution.py +1 -3
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_live_event_types.py +10 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive.py +47 -15
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_execution.py +5 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_reports.py +12 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/analysis.py +30 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/artifacts.py +60 -12
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/assessments.py +12 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/async_trials.py +5 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_execution.py +12 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_reports.py +18 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_trials.py +5 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/config.py +15 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/events.py +20 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/exceptions.py +8 -0
- iperf3_lib-0.4.2/src/iperf3_lib/exporters/__init__.py +8 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/exporters/prometheus.py +17 -8
- iperf3_lib-0.4.2/src/iperf3_lib/ffi/__init__.py +11 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/api.py +13 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/symbols.py +5 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/intent.py +13 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_client.py +72 -8
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_server.py +7 -4
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/native_options.py +10 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_execution.py +10 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_reports.py +12 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/reports.py +19 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/result.py +55 -6
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/server_config.py +5 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/sweep_reports.py +11 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/sweeps.py +22 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/trials.py +14 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/sweep_helpers.py +29 -3
- iperf3_lib-0.4.2/tests/test_ci_scope.py +294 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_reports.py +3 -1
- iperf3_lib-0.4.2/tests/test_correctness_and_typing.py +529 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_execution_worker.py +2 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_lifecycle_qualification.py +24 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_python_preview.py +5 -2
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_python_preview_policy.py +13 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_additional.py +12 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_transport_evidence.py +64 -6
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/uv.lock +59 -59
- iperf3_lib-0.4.1/src/iperf3_lib/exporters/__init__.py +0 -1
- iperf3_lib-0.4.1/src/iperf3_lib/ffi/__init__.py +0 -1
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.dockerignore +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.gitattributes +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/task.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/dependabot.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.gitignore +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/change-policy.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/checks/repository.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/mode-policy.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/path-policy.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/size-policy.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/tree-policy.toml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/AGENTS.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/CONTRIBUTING.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Dockerfile +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/LICENSE +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/SECURITY.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/isolated-execution-qualification.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/live-event-qualification.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/native-event-observations.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/native-events-2026-09-26.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/documentation.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/contributing.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/design/advanced-execution.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/design/native-event-observations.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/documentation.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/adaptive-udp.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/analysis.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/artifacts.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/concurrent-plans.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/grafana.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/live-events.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/migration-0.4.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/prometheus.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/results.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/sweeps.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/trials.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/configuration.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/native-options.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/releasing.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/roadmap.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/stylesheets/extra.css +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/native_controls.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/Dockerfile +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/benchmark.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/dashboard.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/dashboards.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/datasources.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/kustomization.yaml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/namespace.yaml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/prometheus.yml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/stack.yaml +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/verify.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/overrides/404.html +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/check_docs.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/qualify_lifecycle.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/release_artifacts.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/validate_release.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/verify_release_qualification.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/__init__.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_stream.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_evidence.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_ipc.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker_lifetime.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/capabilities.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/py.typed +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/_native_resource_inventory.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/conftest.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/v1-synthetic.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/development-v1-original-hashes.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/legacy-end-only.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-failed.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-incomplete.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-evidence-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-partial-zero-extensions.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/concurrent-plan-v3.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-server.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/capture.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/v2-cancelled-synthetic.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/baseline-pass.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/partial-failure.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/README.md +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/v1-synthetic.json +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_execution.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_reports.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_advanced_client_results.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_analysis.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_artifacts.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_assessments.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_async_trials.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_async_trials_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_cancellation_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_cancellation_ownership.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_capabilities.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_async_and_result.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_branches.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_integration_configs.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_mocked.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_more.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_trials.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_trials_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_config.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_config_native_controls.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_docker_validate.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_docs.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_event_capture.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_event_stream.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_extended_compatibility.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_extended_configuration_contracts.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ffi_dlopen.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ffi_load.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_installed_smoke.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_intent.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_intent_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ipc.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_event_evidence.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_event_types.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_events_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_controls_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_options.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_resource_inventory.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_observability_example.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_plan_reports.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_prometheus_exporter.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_public_api.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_release_policy.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_release_qualification.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_reports.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_resource_stress_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_result_native_fixtures.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_result_normalization.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_config.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_iteration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_serve_once.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweep_reports.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweeps.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweeps_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_trials.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_trials_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_ipc_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_lifetime.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_lifetime_integration.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_protocol.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/trial_helpers.py +0 -0
- {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/zensical.toml +0 -0
|
@@ -20,6 +20,30 @@ concurrency:
|
|
|
20
20
|
cancel-in-progress: true
|
|
21
21
|
|
|
22
22
|
jobs:
|
|
23
|
+
scope:
|
|
24
|
+
name: CI scope
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
timeout-minutes: 5
|
|
27
|
+
outputs:
|
|
28
|
+
native-required: ${{ steps.scope.outputs.native-required }}
|
|
29
|
+
steps:
|
|
30
|
+
- name: Check out exact event revision and comparison history
|
|
31
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
32
|
+
with:
|
|
33
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
34
|
+
fetch-depth: 0
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
- name: Select required CI coverage
|
|
37
|
+
id: scope
|
|
38
|
+
env:
|
|
39
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
40
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
|
|
41
|
+
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
42
|
+
run: >-
|
|
43
|
+
python scripts/ci_scope.py detect
|
|
44
|
+
--event "$EVENT_NAME" --base "$BASE_SHA" --head "$HEAD_SHA"
|
|
45
|
+
--github-output "$GITHUB_OUTPUT" --summary "$GITHUB_STEP_SUMMARY"
|
|
46
|
+
|
|
23
47
|
lint-and-types:
|
|
24
48
|
name: lint-and-types
|
|
25
49
|
runs-on: ubuntu-latest
|
|
@@ -36,7 +60,7 @@ jobs:
|
|
|
36
60
|
|
|
37
61
|
- name: Install uv and Python
|
|
38
62
|
id: setup-uv
|
|
39
|
-
uses: astral-sh/setup-uv@
|
|
63
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
40
64
|
with:
|
|
41
65
|
python-version: "3.12"
|
|
42
66
|
enable-cache: true
|
|
@@ -73,7 +97,7 @@ jobs:
|
|
|
73
97
|
--github-output "$GITHUB_OUTPUT"
|
|
74
98
|
|
|
75
99
|
- name: Retain the exact lifecycle qualification distributions
|
|
76
|
-
uses: actions/upload-artifact@
|
|
100
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
77
101
|
with:
|
|
78
102
|
name: lifecycle-distributions
|
|
79
103
|
path: lifecycle-dist/*
|
|
@@ -93,12 +117,13 @@ jobs:
|
|
|
93
117
|
fetch-depth: 0
|
|
94
118
|
persist-credentials: false
|
|
95
119
|
- name: Check pull request title and commits
|
|
96
|
-
uses: dariuszpanas/yaga/actions/commit-check@
|
|
120
|
+
uses: dariuszpanas/yaga/actions/commit-check@fe0a4b219002c7f49eee055f1fd7ef9c8ccd526f # v0.3.0
|
|
97
121
|
|
|
98
122
|
docker-matrix-tests:
|
|
99
123
|
name: docker (${{ matrix.python }}, iperf ${{ matrix.iperf }})
|
|
100
124
|
runs-on: ubuntu-latest
|
|
101
|
-
needs: lint-and-types
|
|
125
|
+
needs: [scope, lint-and-types]
|
|
126
|
+
if: needs.scope.outputs.native-required == 'true'
|
|
102
127
|
timeout-minutes: 45
|
|
103
128
|
strategy:
|
|
104
129
|
fail-fast: false
|
|
@@ -119,7 +144,7 @@ jobs:
|
|
|
119
144
|
persist-credentials: false
|
|
120
145
|
|
|
121
146
|
- name: Download the retained wheel, sdist and source manifest
|
|
122
|
-
uses: actions/download-artifact@
|
|
147
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
123
148
|
with:
|
|
124
149
|
name: lifecycle-distributions
|
|
125
150
|
path: lifecycle-dist
|
|
@@ -175,7 +200,7 @@ jobs:
|
|
|
175
200
|
|
|
176
201
|
- name: Retain installed lifecycle receipts and test logs
|
|
177
202
|
if: always()
|
|
178
|
-
uses: actions/upload-artifact@
|
|
203
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
179
204
|
with:
|
|
180
205
|
name: lifecycle-py${{ matrix.python }}-iperf${{ matrix.iperf }}
|
|
181
206
|
path: lifecycle-evidence/*
|
|
@@ -185,19 +210,21 @@ jobs:
|
|
|
185
210
|
ci:
|
|
186
211
|
name: ci
|
|
187
212
|
runs-on: ubuntu-latest
|
|
188
|
-
needs: [lint-and-types, commit-policy, docker-matrix-tests]
|
|
213
|
+
needs: [scope, lint-and-types, commit-policy, docker-matrix-tests]
|
|
189
214
|
if: ${{ always() }}
|
|
190
215
|
timeout-minutes: 5
|
|
191
216
|
steps:
|
|
217
|
+
- name: Check out exact event revision
|
|
218
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
219
|
+
with:
|
|
220
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
221
|
+
persist-credentials: false
|
|
192
222
|
- name: Verify required jobs
|
|
193
223
|
env:
|
|
224
|
+
SCOPE_RESULT: ${{ needs.scope.result }}
|
|
225
|
+
NATIVE_REQUIRED: ${{ needs.scope.outputs.native-required }}
|
|
194
226
|
LINT_RESULT: ${{ needs.lint-and-types.result }}
|
|
195
|
-
|
|
227
|
+
NATIVE_RESULT: ${{ needs.docker-matrix-tests.result }}
|
|
196
228
|
COMMIT_RESULT: ${{ needs.commit-policy.result }}
|
|
197
229
|
EVENT_NAME: ${{ github.event_name }}
|
|
198
|
-
run:
|
|
199
|
-
test "$LINT_RESULT" = "success"
|
|
200
|
-
test "$TEST_RESULT" = "success"
|
|
201
|
-
if [ "$EVENT_NAME" = "pull_request" ]; then
|
|
202
|
-
test "$COMMIT_RESULT" = "success"
|
|
203
|
-
fi
|
|
230
|
+
run: python scripts/ci_scope.py gate
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
with:
|
|
25
25
|
persist-credentials: false
|
|
26
26
|
- name: Install uv and Python
|
|
27
|
-
uses: astral-sh/setup-uv@
|
|
27
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
28
28
|
with:
|
|
29
29
|
python-version: "3.12"
|
|
30
30
|
enable-cache: true
|
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
fetch-depth: 0
|
|
30
30
|
persist-credentials: false
|
|
31
31
|
- name: Install stable build tools
|
|
32
|
-
uses: astral-sh/setup-uv@
|
|
32
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
33
33
|
with:
|
|
34
34
|
python-version: "3.12"
|
|
35
35
|
- name: Qualify source before native execution
|
|
@@ -54,7 +54,7 @@ jobs:
|
|
|
54
54
|
--distributions preview-dist --revision "$SOURCE_REVISION" \
|
|
55
55
|
--github-output "$GITHUB_OUTPUT"
|
|
56
56
|
- name: Retain preview distributions and manifest
|
|
57
|
-
uses: actions/upload-artifact@
|
|
57
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
58
58
|
with:
|
|
59
59
|
name: python-preview-distributions
|
|
60
60
|
path: preview-dist/*
|
|
@@ -77,7 +77,7 @@ jobs:
|
|
|
77
77
|
ref: ${{ needs.build.outputs.revision }}
|
|
78
78
|
persist-credentials: false
|
|
79
79
|
- name: Download the same preview distributions
|
|
80
|
-
uses: actions/download-artifact@
|
|
80
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
81
81
|
with:
|
|
82
82
|
name: python-preview-distributions
|
|
83
83
|
path: preview-dist
|
|
@@ -96,7 +96,7 @@ jobs:
|
|
|
96
96
|
cache-to: type=gha,mode=max,scope=preview-base-iperf${{ matrix.iperf }}
|
|
97
97
|
- name: Install the exact candidate interpreter in a separate environment
|
|
98
98
|
run: |
|
|
99
|
-
docker pull ghcr.io/astral-sh/uv:0.
|
|
99
|
+
docker pull ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff
|
|
100
100
|
docker build --builder default --load -f Dockerfile.preview \
|
|
101
101
|
--build-arg NATIVE_IMAGE=iperf3-lib-preview-base:local \
|
|
102
102
|
-t iperf3-lib-preview:local .
|
|
@@ -107,7 +107,7 @@ jobs:
|
|
|
107
107
|
run: |
|
|
108
108
|
mkdir -p preview-evidence
|
|
109
109
|
docker image inspect iperf3-lib-preview:local > preview-evidence/image.json
|
|
110
|
-
docker image inspect ghcr.io/astral-sh/uv:0.
|
|
110
|
+
docker image inspect ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff > preview-evidence/uv-image.json
|
|
111
111
|
docker run --rm -v "${{ github.workspace }}/preview-evidence:/evidence" \
|
|
112
112
|
iperf3-lib-preview:local \
|
|
113
113
|
/opt/preview-venv/bin/python -I /app/scripts/python_preview.py \
|
|
@@ -170,7 +170,7 @@ jobs:
|
|
|
170
170
|
'
|
|
171
171
|
- name: Retain preview runtime, installed receipts and logs
|
|
172
172
|
if: always()
|
|
173
|
-
uses: actions/upload-artifact@
|
|
173
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
174
174
|
with:
|
|
175
175
|
name: python-preview-rc3-iperf${{ matrix.iperf }}
|
|
176
176
|
path: preview-evidence/**
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
fetch-depth: 0
|
|
45
45
|
persist-credentials: false
|
|
46
46
|
- name: Install uv and Python
|
|
47
|
-
uses: astral-sh/setup-uv@
|
|
47
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
48
48
|
with:
|
|
49
49
|
python-version: "3.12"
|
|
50
50
|
enable-cache: true
|
|
@@ -90,7 +90,7 @@ jobs:
|
|
|
90
90
|
--distributions dist --manifest release-evidence/lifecycle-manifest.json \
|
|
91
91
|
--revision "$EXPECTED_REVISION" --github-output "$GITHUB_OUTPUT"
|
|
92
92
|
- name: Upload retained distributions and identity manifest
|
|
93
|
-
uses: actions/upload-artifact@
|
|
93
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
94
94
|
with:
|
|
95
95
|
name: release-bundle
|
|
96
96
|
path: |
|
|
@@ -123,7 +123,7 @@ jobs:
|
|
|
123
123
|
ref: ${{ needs.build.outputs.revision }}
|
|
124
124
|
persist-credentials: false
|
|
125
125
|
- name: Download retained release bundle
|
|
126
|
-
uses: actions/download-artifact@
|
|
126
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
127
127
|
with:
|
|
128
128
|
name: release-bundle
|
|
129
129
|
- name: Verify retained distribution hashes
|
|
@@ -212,7 +212,7 @@ jobs:
|
|
|
212
212
|
'
|
|
213
213
|
- name: Retain installed-native evidence
|
|
214
214
|
if: always()
|
|
215
|
-
uses: actions/upload-artifact@
|
|
215
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
216
216
|
with:
|
|
217
217
|
name: native-evidence-py${{ matrix.python }}-iperf${{ matrix.iperf }}
|
|
218
218
|
path: native-evidence/*.json
|
|
@@ -239,7 +239,7 @@ jobs:
|
|
|
239
239
|
--python "$PYTHON_VERSION" --native "$IPERF3_VERSION" --output /evidence
|
|
240
240
|
- name: Retain installed lifecycle receipts and logs
|
|
241
241
|
if: always()
|
|
242
|
-
uses: actions/upload-artifact@
|
|
242
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
243
243
|
with:
|
|
244
244
|
name: lifecycle-evidence-py${{ matrix.python }}-iperf${{ matrix.iperf }}
|
|
245
245
|
path: lifecycle-evidence/*
|
|
@@ -266,20 +266,20 @@ jobs:
|
|
|
266
266
|
ref: ${{ needs.build.outputs.revision }}
|
|
267
267
|
persist-credentials: false
|
|
268
268
|
- name: Install qualification verifier dependencies
|
|
269
|
-
uses: astral-sh/setup-uv@
|
|
269
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
270
270
|
with:
|
|
271
271
|
python-version: "3.12"
|
|
272
272
|
- name: Download retained release bundle
|
|
273
|
-
uses: actions/download-artifact@
|
|
273
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
274
274
|
with:
|
|
275
275
|
name: release-bundle
|
|
276
276
|
- name: Download all installed smoke receipts
|
|
277
|
-
uses: actions/download-artifact@
|
|
277
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
278
278
|
with:
|
|
279
279
|
pattern: native-evidence-py*
|
|
280
280
|
path: retained/smoke
|
|
281
281
|
- name: Download all installed lifecycle receipts and logs
|
|
282
|
-
uses: actions/download-artifact@
|
|
282
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
283
283
|
with:
|
|
284
284
|
pattern: lifecycle-evidence-py*
|
|
285
285
|
path: retained/lifecycle
|
|
@@ -302,7 +302,7 @@ jobs:
|
|
|
302
302
|
--output release-evidence/qualification.json
|
|
303
303
|
echo "Qualified revision: $EXPECTED_REVISION" >> "$GITHUB_STEP_SUMMARY"
|
|
304
304
|
- name: Retain the verified release qualification index
|
|
305
|
-
uses: actions/upload-artifact@
|
|
305
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
306
306
|
with:
|
|
307
307
|
name: release-qualification
|
|
308
308
|
path: release-evidence/qualification.json
|
|
@@ -322,7 +322,7 @@ jobs:
|
|
|
322
322
|
id-token: write
|
|
323
323
|
steps:
|
|
324
324
|
- name: Download retained release bundle
|
|
325
|
-
uses: actions/download-artifact@
|
|
325
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
326
326
|
with:
|
|
327
327
|
name: release-bundle
|
|
328
328
|
- name: Verify retained distribution hashes
|
|
@@ -356,7 +356,7 @@ jobs:
|
|
|
356
356
|
raise SystemExit(f"Release artifact changed: {name}")
|
|
357
357
|
PY
|
|
358
358
|
- name: Publish to TestPyPI
|
|
359
|
-
uses: pypa/gh-action-pypi-publish@
|
|
359
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
|
|
360
360
|
with:
|
|
361
361
|
repository-url: https://test.pypi.org/legacy/
|
|
362
362
|
|
|
@@ -373,7 +373,7 @@ jobs:
|
|
|
373
373
|
id-token: write
|
|
374
374
|
steps:
|
|
375
375
|
- name: Download retained release bundle
|
|
376
|
-
uses: actions/download-artifact@
|
|
376
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
377
377
|
with:
|
|
378
378
|
name: release-bundle
|
|
379
379
|
- name: Verify retained distribution hashes
|
|
@@ -407,7 +407,7 @@ jobs:
|
|
|
407
407
|
raise SystemExit(f"Release artifact changed: {name}")
|
|
408
408
|
PY
|
|
409
409
|
- name: Publish to PyPI
|
|
410
|
-
uses: pypa/gh-action-pypi-publish@
|
|
410
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
|
|
411
411
|
|
|
412
412
|
github-release:
|
|
413
413
|
name: Create GitHub release from retained artifacts
|
|
@@ -419,7 +419,7 @@ jobs:
|
|
|
419
419
|
contents: write
|
|
420
420
|
steps:
|
|
421
421
|
- name: Download retained release bundle
|
|
422
|
-
uses: actions/download-artifact@
|
|
422
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
423
423
|
with:
|
|
424
424
|
name: release-bundle
|
|
425
425
|
- name: Verify retained distribution hashes
|
|
@@ -453,7 +453,7 @@ jobs:
|
|
|
453
453
|
raise SystemExit(f"Release artifact changed: {name}")
|
|
454
454
|
PY
|
|
455
455
|
- name: Download verified qualification index
|
|
456
|
-
uses: actions/download-artifact@
|
|
456
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
457
457
|
with:
|
|
458
458
|
name: release-qualification
|
|
459
459
|
path: release-evidence
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# The native image is built from the unchanged Dockerfile for each libiperf endpoint.
|
|
2
2
|
ARG NATIVE_IMAGE
|
|
3
3
|
|
|
4
|
-
FROM ghcr.io/astral-sh/uv:0.13.
|
|
4
|
+
FROM ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff AS preview-uv
|
|
5
5
|
FROM ${NATIVE_IMAGE}
|
|
6
6
|
|
|
7
7
|
COPY --from=preview-uv /uv /uvx /usr/local/bin/
|
|
@@ -83,9 +83,9 @@ docs-serve:
|
|
|
83
83
|
$(UV) run --frozen zensical serve
|
|
84
84
|
|
|
85
85
|
build:
|
|
86
|
-
$(UV) build --no-sources
|
|
87
|
-
$(UV) run --frozen --no-dev --group release twine check dist/*
|
|
88
|
-
$(UV) run --frozen --no-dev --group release check-wheel-contents dist/*.whl
|
|
86
|
+
$(UV) build --no-sources --clear
|
|
87
|
+
$(UV) run --frozen --isolated --no-dev --group release twine check dist/*
|
|
88
|
+
$(UV) run --frozen --isolated --no-dev --group release check-wheel-contents dist/*.whl
|
|
89
89
|
|
|
90
90
|
docker-build:
|
|
91
91
|
$(UV) run --frozen python scripts/docker_validate.py build \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: iperf3-lib
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: Programmable network benchmarking and analysis powered by libiperf.
|
|
5
5
|
Project-URL: Homepage, https://github.com/dariuszpanas/iperf3-lib
|
|
6
6
|
Project-URL: Documentation, https://dariuszpanas.github.io/iperf3-lib/
|
|
@@ -95,11 +95,11 @@ and execution limits.
|
|
|
95
95
|
|
|
96
96
|
| Topic | Guides and references |
|
|
97
97
|
| --- | --- |
|
|
98
|
-
| Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
|
|
98
|
+
| Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Live events](https://dariuszpanas.github.io/iperf3-lib/guides/live-events.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
|
|
99
99
|
| Bind interfaces and tune traffic | [Native-control recipes](https://dariuszpanas.github.io/iperf3-lib/guides/native-controls.html) · [Configuration](https://dariuszpanas.github.io/iperf3-lib/reference/configuration.html) · [Complete native-option inventory](https://dariuszpanas.github.io/iperf3-lib/reference/native-options.html) |
|
|
100
100
|
| Check support and execution limits | [Compatibility and native setup](https://dariuszpanas.github.io/iperf3-lib/reference/compatibility.html) · [Rate intent and capabilities](https://dariuszpanas.github.io/iperf3-lib/guides/configuration-intent.html) |
|
|
101
101
|
| Interpret and save measurements | [Results](https://dariuszpanas.github.io/iperf3-lib/guides/results.html) · [Portable artifacts](https://dariuszpanas.github.io/iperf3-lib/guides/artifacts.html) |
|
|
102
|
-
| Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) |
|
|
102
|
+
| Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Concurrent plans](https://dariuszpanas.github.io/iperf3-lib/guides/concurrent-plans.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) · [Adaptive UDP](https://dariuszpanas.github.io/iperf3-lib/guides/adaptive-udp.html) |
|
|
103
103
|
| Integrate monitoring | [Prometheus](https://dariuszpanas.github.io/iperf3-lib/guides/prometheus.html) · [Grafana](https://dariuszpanas.github.io/iperf3-lib/guides/grafana.html) |
|
|
104
104
|
|
|
105
105
|
## Contributing
|
|
@@ -62,11 +62,11 @@ and execution limits.
|
|
|
62
62
|
|
|
63
63
|
| Topic | Guides and references |
|
|
64
64
|
| --- | --- |
|
|
65
|
-
| Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
|
|
65
|
+
| Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Live events](https://dariuszpanas.github.io/iperf3-lib/guides/live-events.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
|
|
66
66
|
| Bind interfaces and tune traffic | [Native-control recipes](https://dariuszpanas.github.io/iperf3-lib/guides/native-controls.html) · [Configuration](https://dariuszpanas.github.io/iperf3-lib/reference/configuration.html) · [Complete native-option inventory](https://dariuszpanas.github.io/iperf3-lib/reference/native-options.html) |
|
|
67
67
|
| Check support and execution limits | [Compatibility and native setup](https://dariuszpanas.github.io/iperf3-lib/reference/compatibility.html) · [Rate intent and capabilities](https://dariuszpanas.github.io/iperf3-lib/guides/configuration-intent.html) |
|
|
68
68
|
| Interpret and save measurements | [Results](https://dariuszpanas.github.io/iperf3-lib/guides/results.html) · [Portable artifacts](https://dariuszpanas.github.io/iperf3-lib/guides/artifacts.html) |
|
|
69
|
-
| Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) |
|
|
69
|
+
| Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Concurrent plans](https://dariuszpanas.github.io/iperf3-lib/guides/concurrent-plans.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) · [Adaptive UDP](https://dariuszpanas.github.io/iperf3-lib/guides/adaptive-udp.html) |
|
|
70
70
|
| Integrate monitoring | [Prometheus](https://dariuszpanas.github.io/iperf3-lib/guides/prometheus.html) · [Grafana](https://dariuszpanas.github.io/iperf3-lib/guides/grafana.html) |
|
|
71
71
|
|
|
72
72
|
## Contributing
|
|
@@ -19,6 +19,32 @@ repository policies. `make test` runs non-native tests. Docker is required for
|
|
|
19
19
|
workflow lint and the full native suite; see [compatibility](../docs/reference/compatibility.md)
|
|
20
20
|
for supported versions. Run non-native gates before native tests.
|
|
21
21
|
|
|
22
|
+
## CI coverage for documentation changes
|
|
23
|
+
|
|
24
|
+
Pull requests and main pushes that change only the following documentation
|
|
25
|
+
files skip the eight native Docker jobs:
|
|
26
|
+
|
|
27
|
+
| Location | Allowed files |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| Repository root | `README.md`, `CONTRIBUTING.md`, `SECURITY.md` |
|
|
30
|
+
| Anywhere under `docs/` or `development/` | `.md`, `.css` and image files |
|
|
31
|
+
| Anywhere under `overrides/` | `.html`, `.css` and image files |
|
|
32
|
+
|
|
33
|
+
Allowed image suffixes are `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg` and
|
|
34
|
+
`.ico`. These paths and suffixes are case-sensitive. Changes must use ordinary
|
|
35
|
+
non-executable files. Changes to any other path, executable or nonregular file
|
|
36
|
+
modes, mixed changes, an empty diff or an uncertain comparison require the full
|
|
37
|
+
native matrix. Renames retain both old and new paths for this decision.
|
|
38
|
+
|
|
39
|
+
Quality checks, non-native unit tests, YAGA policies, the strict documentation
|
|
40
|
+
build, README rendering and local-link checks, and the package build still run.
|
|
41
|
+
The short workflow lint check also remains Docker-backed.
|
|
42
|
+
|
|
43
|
+
The required `ci` result always runs and accepts a skipped native matrix only
|
|
44
|
+
after an explicit documentation-only decision and successful remaining checks.
|
|
45
|
+
Manual and scheduled CI runs still use the full matrix. Release qualification
|
|
46
|
+
and publication always retain their complete native gates.
|
|
47
|
+
|
|
22
48
|
## Stable local Docker validation
|
|
23
49
|
|
|
24
50
|
`make docker-build` and `make docker-test` copy the selected checkout into one
|
|
@@ -19,7 +19,7 @@ criteria have evidence; implementation and collected tests alone are insufficien
|
|
|
19
19
|
| Proposal | Decision | Evidence needed for complete qualification |
|
|
20
20
|
| --- | --- | --- |
|
|
21
21
|
| [Adaptive UDP #34](https://github.com/dariuszpanas/iperf3-lib/issues/34) | Qualified and merged through PR69; see the [0.4.0 guide](../../docs/guides/adaptive-udp.md). | The issue retains exact-source synthetic, minimum/latest native, isolated impairment, and installed wheel/sdist evidence. |
|
|
22
|
-
| [Live events #35](https://github.com/dariuszpanas/iperf3-lib/issues/35) |
|
|
22
|
+
| [Live events #35](https://github.com/dariuszpanas/iperf3-lib/issues/35) | Qualified and merged through PR70; see the [0.4.0 live-event guide](../../docs/guides/live-events.md). | The [live-event qualification map](live-event-qualification.md) and issue retain minimum/latest event assembly, bounded delivery, failure/overflow/abandonment, and installed lifecycle evidence. |
|
|
23
23
|
| [Process isolation #36](https://github.com/dariuszpanas/iperf3-lib/issues/36) | Qualified and merged through PR68. | The [acceptance map](isolated-execution-qualification.md) and issue retain the exact-source installed matrix, bounded transport, partial evidence and resource cleanup qualification. |
|
|
24
24
|
|
|
25
25
|
Native event shapes have been observed in a small loopback experiment. The
|
|
@@ -186,7 +186,7 @@ and discards future nonterminal payloads; the owner must still drain/clean up
|
|
|
186
186
|
the direct run or await an isolated worker's terminal state. Queue bounds do
|
|
187
187
|
not cancel a native call.
|
|
188
188
|
|
|
189
|
-
### Qualification
|
|
189
|
+
### Qualification contract
|
|
190
190
|
|
|
191
191
|
The 22 exploratory probes establish small event-shape observations only.
|
|
192
192
|
The [live-event qualification map](live-event-qualification.md) connects these
|
|
@@ -306,7 +306,7 @@ Truncated or malformed frames invalidate only that worker's channel. Cap
|
|
|
306
306
|
pending output, drain while waiting, and reject replayed/wrong-request terminal
|
|
307
307
|
frames. Waiting for exit while a worker blocks sending its result can deadlock.
|
|
308
308
|
|
|
309
|
-
###
|
|
309
|
+
### Isolated worker qualification contract
|
|
310
310
|
|
|
311
311
|
Test startup/import/native-load failure, malformed/oversized frames, crashes
|
|
312
312
|
before and after allocation, stalled connection/run, user cancellation,
|
|
@@ -327,8 +327,7 @@ design do not establish its cancellation, stress or orphan-cleanup qualification
|
|
|
327
327
|
|
|
328
328
|
Close each issue only when its implementation and qualification criteria are
|
|
329
329
|
met, with acceptance checkboxes and retained exact-source evidence reconciled.
|
|
330
|
-
Issues #34 and #36 record their completed qualification. The
|
|
331
|
-
tracks the remaining candidate evidence separately. The native-controls implementation must preserve complete results and
|
|
330
|
+
Issues #34, #35, and #36 record their completed qualification and shipped in 0.4.0. The native-controls implementation must preserve complete results and
|
|
332
331
|
explicit lifecycle/concurrency limits while its combined source is qualified.
|
|
333
332
|
Revisit each broader proposal with its own acceptance evidence and release
|
|
334
333
|
decision; adaptive UDP selection remains separate from explicit sweeps.
|
|
@@ -211,8 +211,8 @@ aggregate workflow result together before publication.
|
|
|
211
211
|
will remain true after publication; rendering and matching hashes alone do
|
|
212
212
|
not check this. PyPI retains the first uploaded description and cannot apply
|
|
213
213
|
a later repository edit to that release. Then run the Docker/native matrix,
|
|
214
|
-
merge through the normal required checks, and run a
|
|
215
|
-
|
|
214
|
+
merge through the normal required checks, and run a nonpublishing hosted
|
|
215
|
+
qualification for the resulting exact commit. Inspect the retained distributions,
|
|
216
216
|
hashes, and every installed-native receipt.
|
|
217
217
|
4. Inspect the retained artifacts' rendered README and deployed documentation
|
|
218
218
|
anonymously. Confirm
|
|
@@ -239,7 +239,7 @@ and post releases are not part of this publication policy.
|
|
|
239
239
|
Validate a planned tag against the current metadata:
|
|
240
240
|
|
|
241
241
|
```bash
|
|
242
|
-
uv run --no-project python scripts/validate_release.py --tag v0.4.
|
|
242
|
+
uv run --no-project python scripts/validate_release.py --tag v0.4.2
|
|
243
243
|
```
|
|
244
244
|
|
|
245
245
|
That local metadata check alone does not qualify the candidate. The workflow
|
|
@@ -5,8 +5,19 @@ This is retained planning background from the 0.3.0 development cycle.
|
|
|
5
5
|
for current scope and completion status; the tables below preserve the planning
|
|
6
6
|
context rather than certify the current release candidate.
|
|
7
7
|
|
|
8
|
-
##
|
|
9
|
-
|
|
8
|
+
## 0.4.2 candidate and released 0.4.1 / 0.4.0
|
|
9
|
+
|
|
10
|
+
The 0.4.2 candidate ([issue #106](https://github.com/dariuszpanas/iperf3-lib/issues/106))
|
|
11
|
+
consolidates post-0.4.1 maintenance refinements: `address_family` verification
|
|
12
|
+
from connected socket endpoints, strict report and artifact validation
|
|
13
|
+
symmetry, consumer static-typing ergonomics and submodule `__all__` contracts
|
|
14
|
+
([#102](https://github.com/dariuszpanas/iperf3-lib/issues/102)), adaptive UDP
|
|
15
|
+
and worker/live-event runtime optimizations
|
|
16
|
+
([#103](https://github.com/dariuszpanas/iperf3-lib/issues/103)), and the
|
|
17
|
+
published API/schema stability policy and tagged documentation snapshots
|
|
18
|
+
([#101](https://github.com/dariuszpanas/iperf3-lib/issues/101)).
|
|
19
|
+
Version 0.4.1 refines CI scope detection for documentation-only changes while
|
|
20
|
+
preserving the full native and installed-package qualification gates.
|
|
10
21
|
Version 0.4.0 adds owned async and bounded concurrent plans,
|
|
11
22
|
adaptive UDP experiments, and typed live-event consumption. Issues
|
|
12
23
|
[#36](https://github.com/dariuszpanas/iperf3-lib/issues/36),
|
|
@@ -28,8 +39,9 @@ The 0.4.0 release completes this scope with the task-submission correction in
|
|
|
28
39
|
recommendation. No additional feature cycle is required for this Beta release.
|
|
29
40
|
Stable API/deprecation guarantees, immutable versioned documentation, broader
|
|
30
41
|
platform coverage, longer mixed-workload qualification, and consumer feedback
|
|
31
|
-
remain
|
|
32
|
-
[#
|
|
42
|
+
remain post-0.4.0 stability work, tracked in
|
|
43
|
+
[#83](https://github.com/dariuszpanas/iperf3-lib/issues/83) (following the
|
|
44
|
+
completed 0.4.0 readiness checklist in [#78](https://github.com/dariuszpanas/iperf3-lib/issues/78)).
|
|
33
45
|
|
|
34
46
|
## Historical 0.3.0 planning
|
|
35
47
|
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
4
|
# Keep the image's development environment aligned with its baked-in lockfile.
|
|
5
|
-
if [[ -f /app/pyproject.toml
|
|
6
|
-
uv sync --frozen --dev
|
|
7
|
-
else
|
|
5
|
+
if [[ ! -f /app/pyproject.toml || ! -f /app/uv.lock ]]; then
|
|
8
6
|
echo "error: /app must contain pyproject.toml and uv.lock" >&2
|
|
9
7
|
exit 2
|
|
10
8
|
fi
|
|
9
|
+
if [[ "${IPERF3_FORCE_UV_SYNC:-0}" == "1" || ! -f /opt/venv/pyvenv.cfg ]]; then
|
|
10
|
+
uv sync --frozen --dev
|
|
11
|
+
fi
|
|
11
12
|
|
|
12
13
|
exec "$@"
|
|
@@ -4,7 +4,42 @@ These pages describe `main`. Released versions remain available through
|
|
|
4
4
|
[GitHub releases](https://github.com/dariuszpanas/iperf3-lib/releases) and
|
|
5
5
|
[PyPI](https://pypi.org/project/iperf3-lib/).
|
|
6
6
|
|
|
7
|
-
## 0.4.
|
|
7
|
+
## 0.4.2
|
|
8
|
+
|
|
9
|
+
- Verify `address_family` from observed socket endpoint literals in
|
|
10
|
+
`raw["start"]["connected"]`, populating `effective["address_family"]` as
|
|
11
|
+
`"ipv4"` or `"ipv6"` and treating `requested["address_family"] == "auto"` as
|
|
12
|
+
compatible with verified IPv4/IPv6 connections across client results,
|
|
13
|
+
artifacts, sweeps, and adaptive UDP experiments.
|
|
14
|
+
- Accept `ipaddress.IPv4Address | ipaddress.IPv6Address` for
|
|
15
|
+
`ClientConfig.server` and `Literal["tcp", "udp", "sctp"]` strings for
|
|
16
|
+
`ClientConfig.protocol` in static type checking while normalizing to
|
|
17
|
+
`Protocol`. Declare explicit `__all__` exports across all public submodules.
|
|
18
|
+
- Validate `TestResult` in-memory invariants (`version`, `protocol`,
|
|
19
|
+
`direction`, `reporting_role`) before artifact serialization, enforce
|
|
20
|
+
control-character and RFC 6901 JSON Pointer checks across artifact,
|
|
21
|
+
assessment, sweep, and concurrent report deserializers, preserve
|
|
22
|
+
`bytes_per_second` in `TrialAssessmentReport` text summaries, and include
|
|
23
|
+
`start_time_unix` in Prometheus exporter completeness checks.
|
|
24
|
+
- Reuse first-pass observation dictionaries in adaptive UDP summaries, skip
|
|
25
|
+
unconditional `ctypes.util.find_library` subprocess probes when `IPERF3_LIB`
|
|
26
|
+
or standard Linux loader names succeed, switch worker parent-child pipes to
|
|
27
|
+
binary I/O with direct UTF-8 `bytes` JSON parsing, validate live-event
|
|
28
|
+
payloads in a single pass, and add a `/proc` fallback for `WaitPID` in
|
|
29
|
+
`docker-entrypoint.sh`.
|
|
30
|
+
- Publish the [API and schema stability policy](reference/compatibility.md#compatibility-deprecation-and-archive-policy),
|
|
31
|
+
add tagged release documentation snapshot links (`v0.2.0`–`v0.4.1`), and
|
|
32
|
+
align architecture, design, and contributor documentation with the `0.4.x`
|
|
33
|
+
codebase.
|
|
34
|
+
- Route documentation-only pull requests and pushes away from the native Docker
|
|
35
|
+
matrix while preserving the required `ci` check, static/unit gates, and full
|
|
36
|
+
native coverage for code, workflow, and release paths. Align preview `uv`
|
|
37
|
+
provenance checks and stricter `ty` keyword-argument typing.
|
|
38
|
+
|
|
39
|
+
## 0.4.1 — 2026-10-12
|
|
40
|
+
|
|
41
|
+
Published on [PyPI](https://pypi.org/project/iperf3-lib/0.4.1/) and as
|
|
42
|
+
[GitHub release v0.4.1](https://github.com/dariuszpanas/iperf3-lib/releases/tag/v0.4.1).
|
|
8
43
|
|
|
9
44
|
- Make the packaged README independent of publication timing. The immutable
|
|
10
45
|
0.4.0 description incorrectly calls 0.4.0 unreleased; a repository-only edit
|
|
@@ -9,12 +9,13 @@ configuration, result, experiment, and reporting features, or keep your runner
|
|
|
9
9
|
and import its completed JSON.
|
|
10
10
|
|
|
11
11
|
!!! note "Match the documentation to your version"
|
|
12
|
-
This site follows `main`; the latest published version is **0.4.
|
|
12
|
+
This site follows `main`; the latest published version is **0.4.1**.
|
|
13
13
|
The project retains Beta maturity. Dataclasses, portable artifacts, analysis,
|
|
14
14
|
trial plans, sweeps, and Prometheus output first shipped in 0.3.0; 0.4.0 adds
|
|
15
15
|
owned async execution, concurrent plans, adaptive UDP and typed live events.
|
|
16
|
-
Use documentation matching your installed version
|
|
17
|
-
|
|
16
|
+
Use documentation matching your installed version: see the
|
|
17
|
+
[tagged release documentation snapshots](reference/compatibility.md#release-documentation-snapshots),
|
|
18
|
+
[changelog](changelog.md), and
|
|
18
19
|
[published releases](https://github.com/dariuszpanas/iperf3-lib/releases)
|
|
19
20
|
for publication status.
|
|
20
21
|
|
|
@@ -28,7 +29,7 @@ changes, customizations, optional new APIs, and report readers.
|
|
|
28
29
|
|
|
29
30
|
## Install the Python package
|
|
30
31
|
|
|
31
|
-
For the published 0.4.
|
|
32
|
+
For the published 0.4.1 package, choose the installer used by your application:
|
|
32
33
|
|
|
33
34
|
```bash
|
|
34
35
|
uv add iperf3-lib
|
|
@@ -121,14 +122,14 @@ unavailable. For directional analysis or missing-data decisions, use
|
|
|
121
122
|
|
|
122
123
|
## Next steps
|
|
123
124
|
|
|
124
|
-
- [Migrate a 0.2.0 application to dataclasses](guides/migration-0.3.md).
|
|
125
|
-
- [Run TCP, UDP, reverse, or bidirectional tests](guides/running-tests.md).
|
|
125
|
+
- [Migrate a 0.2.0 application to dataclasses](guides/migration-0.3.md) or [upgrade from 0.3.0 to 0.4.0](guides/migration-0.4.md).
|
|
126
|
+
- [Run TCP, UDP, reverse, or bidirectional tests](guides/running-tests.md) and [consume typed live events](guides/live-events.md).
|
|
126
127
|
- [Choose configuration values and understand validation](reference/configuration.md).
|
|
127
128
|
- [Find a native CLI option's Python equivalent](reference/native-options.md)
|
|
128
129
|
and [use binding, transport, timeout and event controls](guides/native-controls.md).
|
|
129
130
|
- [Declare aggregate rate intent and inspect capabilities](guides/configuration-intent.md).
|
|
130
131
|
- [Read flows, observations, intervals, and native JSON](guides/results.md).
|
|
131
132
|
- [Save portable artifacts](guides/artifacts.md) and [analyze measurements](guides/analysis.md).
|
|
132
|
-
- [Repeat and assess trials](guides/trials.md)
|
|
133
|
+
- [Repeat and assess trials](guides/trials.md), [run bounded concurrent plans](guides/concurrent-plans.md), [run finite parameter sweeps](guides/sweeps.md), or [explore adaptive UDP rates](guides/adaptive-udp.md).
|
|
133
134
|
- [Explore Prometheus snapshots and textfile output](guides/prometheus.md).
|
|
134
135
|
|
|
@@ -37,14 +37,14 @@ launch the `iperf3` executable or parse its human-readable terminal output.
|
|
|
37
37
|
Expanded controls use libiperf's public argument parser inside an isolated
|
|
38
38
|
Python/CFFI worker, so that path also works without the CLI executable.
|
|
39
39
|
|
|
40
|
-
Process isolation remains part of the implementation.
|
|
40
|
+
Process isolation remains part of the implementation. Basic
|
|
41
41
|
synchronous native calls run in the caller and must be serialized because
|
|
42
42
|
libiperf has process-global state. Async operations, expanded controls, event delivery, and explicit execution
|
|
43
43
|
timeouts use Python worker processes. The library manages their protocol,
|
|
44
44
|
results, and cleanup; native traffic generation still happens in libiperf.
|
|
45
45
|
|
|
46
46
|
!!! note "Additional ownership APIs in 0.4.0"
|
|
47
|
-
|
|
47
|
+
Starting in 0.4.0, async cancellation awaits worker cleanup and any
|
|
48
48
|
active callback, reporting unconfirmed cleanup as `IperfCleanupError`.
|
|
49
49
|
[Owned live-event streams](live-events.md), [bounded concurrent plans](concurrent-plans.md),
|
|
50
50
|
and [adaptive UDP experiments](adaptive-udp.md) are also available in 0.4.0.
|
|
@@ -156,10 +156,10 @@ flags still collapse lookup/load failures to false; use the report when those
|
|
|
156
156
|
distinctions matter. Parser-backed worker controls are distinct from dedicated
|
|
157
157
|
setter probes. SCTP and MPTCP still depend on the native build and kernel. Basic
|
|
158
158
|
direct calls remain non-reentrant. Async methods always select the isolated
|
|
159
|
-
worker
|
|
160
|
-
|
|
161
|
-
callback, and unconfirmed cleanup raises `IperfCleanupError
|
|
162
|
-
|
|
159
|
+
worker; an explicit execution timeout also selects it for a synchronous client.
|
|
160
|
+
Starting in 0.4.0, async cancellation waits for worker cleanup and any active
|
|
161
|
+
callback, and unconfirmed cleanup raises `IperfCleanupError`; see
|
|
162
|
+
[async cancellation](running-tests.md#integrate-with-asyncio).
|
|
163
163
|
|
|
164
164
|
## Profiles and native option decisions
|
|
165
165
|
|