iperf3-lib 0.4.0__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.0 → iperf3_lib-0.4.2}/.github/workflows/ci.yml +41 -14
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/docs.yml +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/python-preview.yml +6 -6
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/release.yml +16 -16
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Dockerfile.preview +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Makefile +3 -3
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/PKG-INFO +6 -6
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/README.md +5 -5
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/contributing.md +26 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/advanced-execution.md +8 -9
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/isolated-execution-qualification.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/releasing.md +36 -17
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/roadmap.md +28 -14
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docker-entrypoint.sh +4 -3
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/changelog.md +51 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/getting-started.md +13 -11
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/adaptive-udp.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/choosing-an-integration.md +5 -5
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/concurrent-plans.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/configuration-intent.md +4 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/live-events.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/migration-0.3.md +3 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/migration-0.4.md +7 -7
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/native-controls.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/running-tests.md +4 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/sweeps.md +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/trials.md +3 -3
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/index.md +9 -9
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/api.md +16 -7
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/compatibility.md +87 -8
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/security.md +2 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/overrides/main.html +1 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/pyproject.toml +3 -3
- iperf3_lib-0.4.2/scripts/ci_scope.py +200 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/docker_validate.py +2 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/python_preview.py +4 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/release_artifacts.py +19 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/smoke_release.py +9 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_cancellation.py +3 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_capture.py +15 -9
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_execution.py +1 -3
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_live_event_types.py +10 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive.py +47 -15
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_execution.py +5 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_reports.py +12 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/analysis.py +30 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/artifacts.py +60 -12
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/assessments.py +12 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/async_trials.py +5 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_execution.py +12 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_reports.py +18 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_trials.py +5 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/config.py +15 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/events.py +20 -0
- {iperf3_lib-0.4.0 → 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.0 → 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.0 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/api.py +13 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/symbols.py +5 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/intent.py +13 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_client.py +72 -8
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_server.py +7 -4
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/native_options.py +10 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_execution.py +10 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_reports.py +12 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/reports.py +19 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/result.py +55 -6
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/server_config.py +5 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/sweep_reports.py +11 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/sweeps.py +22 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/trials.py +14 -0
- {iperf3_lib-0.4.0 → 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.0 → 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.0 → iperf3_lib-0.4.2}/tests/test_execution_worker.py +2 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_lifecycle_qualification.py +24 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_python_preview.py +5 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_python_preview_policy.py +13 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_release_policy.py +103 -2
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_additional.py +12 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_transport_evidence.py +64 -6
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/uv.lock +59 -59
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/zensical.toml +1 -1
- iperf3_lib-0.4.0/src/iperf3_lib/exporters/__init__.py +0 -1
- iperf3_lib-0.4.0/src/iperf3_lib/ffi/__init__.py +0 -1
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.dockerignore +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.gitattributes +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/task.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/dependabot.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.gitignore +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/change-policy.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/checks/repository.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/mode-policy.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/path-policy.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/size-policy.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/tree-policy.toml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/AGENTS.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/CONTRIBUTING.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Dockerfile +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/LICENSE +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/SECURITY.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/live-event-qualification.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/native-event-observations.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/native-events-2026-09-26.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/documentation.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/contributing.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/design/advanced-execution.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/design/native-event-observations.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/documentation.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/analysis.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/artifacts.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/grafana.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/prometheus.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/results.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/configuration.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/native-options.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/releasing.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/roadmap.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/stylesheets/extra.css +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/native_controls.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/Dockerfile +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/benchmark.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/dashboard.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/dashboards.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/datasources.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/kustomization.yaml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/namespace.yaml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/prometheus.yml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/stack.yaml +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/verify.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/overrides/404.html +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/check_docs.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/qualify_lifecycle.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/validate_release.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/verify_release_qualification.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/__init__.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_stream.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_evidence.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_ipc.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker_lifetime.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/capabilities.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/py.typed +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/_native_resource_inventory.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/conftest.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/v1-synthetic.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/development-v1-original-hashes.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/legacy-end-only.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-failed.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-incomplete.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-evidence-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-partial-zero-extensions.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/concurrent-plan-v3.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-client.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-server.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/capture.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/v2-cancelled-synthetic.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/baseline-pass.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/partial-failure.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/README.md +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/v1-synthetic.json +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_execution.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_reports.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_advanced_client_results.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_analysis.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_artifacts.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_assessments.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_async_trials.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_async_trials_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_cancellation_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_cancellation_ownership.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_capabilities.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_async_and_result.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_branches.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_integration_configs.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_mocked.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_more.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_concurrent_trials.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_concurrent_trials_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_config.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_config_native_controls.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_docker_validate.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_docs.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_event_capture.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_event_stream.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_extended_compatibility.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_extended_configuration_contracts.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ffi_dlopen.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ffi_load.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_installed_smoke.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_intent.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_intent_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ipc.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_event_evidence.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_event_types.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_events_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_controls_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_options.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_resource_inventory.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_observability_example.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_plan_reports.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_prometheus_exporter.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_public_api.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_release_qualification.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_reports.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_resource_stress_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_result_native_fixtures.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_result_normalization.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_config.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_iteration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_serve_once.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweep_reports.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweeps.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweeps_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_trials.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_trials_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_ipc_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_lifetime.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_lifetime_integration.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_protocol.py +0 -0
- {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/trial_helpers.py +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/
|
|
@@ -80,13 +80,13 @@ Python **3.12–3.15** with the standard GIL is supported. Stable CI and release
|
|
|
80
80
|
qualification cover all four Python versions against both native endpoints,
|
|
81
81
|
including installed wheel and sdist checks.
|
|
82
82
|
|
|
83
|
-
The
|
|
84
|
-
|
|
83
|
+
The project has **Beta** maturity. Documentation follows `main`.
|
|
84
|
+
The installation guide explains how to choose
|
|
85
85
|
between a published package and a source revision; consult the
|
|
86
86
|
[changelog](https://dariuszpanas.github.io/iperf3-lib/changelog.html) for release
|
|
87
87
|
status. Upgrade guidance covers
|
|
88
88
|
[0.2.0 to 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.3.html)
|
|
89
|
-
and [
|
|
89
|
+
and [0.3.0 to 0.4.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
|
|
90
90
|
|
|
91
91
|
## Documentation
|
|
92
92
|
|
|
@@ -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
|
|
@@ -47,13 +47,13 @@ Python **3.12–3.15** with the standard GIL is supported. Stable CI and release
|
|
|
47
47
|
qualification cover all four Python versions against both native endpoints,
|
|
48
48
|
including installed wheel and sdist checks.
|
|
49
49
|
|
|
50
|
-
The
|
|
51
|
-
|
|
50
|
+
The project has **Beta** maturity. Documentation follows `main`.
|
|
51
|
+
The installation guide explains how to choose
|
|
52
52
|
between a published package and a source revision; consult the
|
|
53
53
|
[changelog](https://dariuszpanas.github.io/iperf3-lib/changelog.html) for release
|
|
54
54
|
status. Upgrade guidance covers
|
|
55
55
|
[0.2.0 to 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.3.html)
|
|
56
|
-
and [
|
|
56
|
+
and [0.3.0 to 0.4.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
|
|
57
57
|
|
|
58
58
|
## Documentation
|
|
59
59
|
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Advanced execution: design and release disposition
|
|
2
2
|
|
|
3
|
-
Status: **implementation contracts
|
|
3
|
+
Status: **implementation contracts shipped in 0.4.0**. The original
|
|
4
4
|
design review and native-event exploration were recorded on 2026-09-26.
|
|
5
5
|
The [native-control guide](../../docs/guides/native-controls.md) and
|
|
6
6
|
[live-event guide](../../docs/guides/live-events.md) document the public interfaces.
|
|
@@ -18,8 +18,8 @@ criteria have evidence; implementation and collected tests alone are insufficien
|
|
|
18
18
|
|
|
19
19
|
| Proposal | Decision | Evidence needed for complete qualification |
|
|
20
20
|
| --- | --- | --- |
|
|
21
|
-
| [Adaptive UDP #34](https://github.com/dariuszpanas/iperf3-lib/issues/34) | Qualified and merged through PR69; see the [
|
|
22
|
-
| [Live events #35](https://github.com/dariuszpanas/iperf3-lib/issues/35) |
|
|
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) | 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
|
|
@@ -52,7 +52,7 @@ defines the current platform and native-version coverage.
|
|
|
52
52
|
|
|
53
53
|
### Admission and evidence
|
|
54
54
|
|
|
55
|
-
The
|
|
55
|
+
The 0.4.0 implementation is split between `adaptive.py` (pure decisions),
|
|
56
56
|
`adaptive_execution.py` (sequential batches) and `adaptive_reports.py` (standalone
|
|
57
57
|
schema-1 archives). The [user guide](../../docs/guides/adaptive-udp.md) states its
|
|
58
58
|
explicit limitations and public API. The following criteria remain the
|
|
@@ -126,7 +126,7 @@ and all admission limits with controlled observations. Then qualify bounded
|
|
|
126
126
|
native mechanics on libiperf 3.19.1 and 3.22 and a controlled impaired link
|
|
127
127
|
with recorded rate/loss settings. Clean loopback alone cannot validate the
|
|
128
128
|
loss-threshold algorithm. Explicit finite sweeps remain the published 0.3.0
|
|
129
|
-
mechanism; adaptive UDP
|
|
129
|
+
mechanism; adaptive UDP shipped in 0.4.0 with its separate qualification.
|
|
130
130
|
|
|
131
131
|
## Typed live events
|
|
132
132
|
|
|
@@ -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.
|
{iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/isolated-execution-qualification.md
RENAMED
|
@@ -8,7 +8,7 @@ Use the exact candidate commit, retained distributions and current Actions resul
|
|
|
8
8
|
| --- | --- | --- |
|
|
9
9
|
| Concurrent admission and contention | Invocation-local worker and aggregate target-rate caps, endpoint/user-resource exclusion and per-cell dependencies. Targets include streams, directions and warm-ups; wire traffic is measured separately. | Admission/race tests plus positive native traffic from overlapping workers, actual exclusions/rate-cap backfill and schema-v3 reservation histories. |
|
|
10
10
|
| Comparison methodology | Descriptive analysis by default; comparisons require a declared matched cohort/contention method. Native-setting compatibility alone is insufficient. | The [comparison method](../../docs/guides/concurrent-plans.md#compare-experiments-with-a-declared-contention-policy), complete histories and strict v1/v2 type boundaries. Unknown contention remains inconclusive; no automatic concurrent performance assessment is claimed. |
|
|
11
|
-
| Plan and consumer ownership | Cancellation owns every admitted child through cleanup. Callback failure suppresses delivery and propagates after shutdown. The
|
|
11
|
+
| Plan and consumer ownership | Cancellation owns every admitted child through cleanup. Callback failure suppresses delivery and propagates after shutdown. The typed iterator added in 0.4.0 provides an owned context; see its [qualification map](live-event-qualification.md). | Queued/startup/completion races, repeated cancellation, multi-worker cleanup failure retaining original owners, and callback failure after positive native traffic. |
|
|
12
12
|
| Shutdown and grace | Admission-only stops let peers finish; an optional overall deadline bounds that drain. Hard stops have zero natural-completion grace, then TERM/KILL cleanup with retained ownership on failure. | Deadline-after-admission-stop and first-cause tests; actual reaping/closed pipes. Cleanup-attempt budgets do not bound blocked callbacks or Python return time. |
|
|
13
13
|
| Partial outcomes | Completed results remain artifacts. Interrupted and exceptional trials retain bounded diagnostic events, with unstarted trials explicit. No native summary or C finalizer is invented after a kill. | Existing v1/v2 fixtures, strict v2/v3 reports and saved native report/hash round-trips with positive partial intervals. Sequential SIGKILL and real output-pipe interruption after positive traffic must retain the completed prefix, failed active trial and unstarted suffix over TCP and UDP. |
|
|
14
14
|
| IPC bounds | Versioned frames, identities/order, bounded queues/control capacity and terminal/EOF/exit validation. Native capture is outside wire/queue bounds. | Malformed, oversized, replayed/truncated and saturated channel tests, including interruption during incomplete output. |
|
|
@@ -6,7 +6,7 @@ decision.
|
|
|
6
6
|
|
|
7
7
|
The published 0.3.0 scope included finite sequential trials, explicit sweeps,
|
|
8
8
|
expanded native controls, callback events and isolated Python/CFFI workers.
|
|
9
|
-
The
|
|
9
|
+
The published 0.4.0 scope adds owned async and bounded concurrent plans, adaptive
|
|
10
10
|
UDP experiments, and typed live-event consumption. Their current qualification
|
|
11
11
|
maps are linked from the [advanced execution design](design/advanced-execution.md).
|
|
12
12
|
Historical release receipts do not qualify these additions. Release notes and
|
|
@@ -24,9 +24,9 @@ GIL configuration. The release verifier rejects prerelease versions.
|
|
|
24
24
|
The eight-cell release gate requires **16 smoke and 16 lifecycle receipts,
|
|
25
25
|
784 selected cases and 2352 passed phases**.
|
|
26
26
|
|
|
27
|
-
Issue [#63](https://github.com/dariuszpanas/iperf3-lib/issues/63)
|
|
28
|
-
and qualification evidence.
|
|
29
|
-
on
|
|
27
|
+
Issue [#63](https://github.com/dariuszpanas/iperf3-lib/issues/63) retains support
|
|
28
|
+
and qualification evidence. Run the complete non-publishing release rehearsal
|
|
29
|
+
on each final release candidate. Historical RC3 results or an earlier successful
|
|
30
30
|
candidate cannot replace evidence for that exact source and its retained
|
|
31
31
|
wheel/sdist pair. Python `>=3.12`, the shared wheel format and the two native
|
|
32
32
|
endpoints remain unchanged. Free-threaded builds are outside this matrix.
|
|
@@ -81,7 +81,9 @@ A successful rehearsal contains:
|
|
|
81
81
|
and unit gates, YAGA policy checks, and Docker-backed workflow lint.
|
|
82
82
|
- One wheel/sdist pair checked with Twine and wheel-content validation.
|
|
83
83
|
Both embedded descriptions must match the candidate README and render with
|
|
84
|
-
valid documentation links.
|
|
84
|
+
valid documentation links. The descriptions must be suitable for publication:
|
|
85
|
+
temporary claims such as "unreleased" or "latest published version" are
|
|
86
|
+
rejected. Every absolute documentation URL in the README,
|
|
85
87
|
including its deployed HTML fragments, is checked alongside the public
|
|
86
88
|
landing and changelog pages.
|
|
87
89
|
- A `release-bundle` artifact with those distributions and
|
|
@@ -194,16 +196,26 @@ aggregate workflow result together before publication.
|
|
|
194
196
|
deferred to a later version.
|
|
195
197
|
2. Update `project.version` in `pyproject.toml` and the local project identity
|
|
196
198
|
in `uv.lock`. Keep historical artifact producer identities unchanged. Record
|
|
197
|
-
selected changes under a
|
|
198
|
-
[changelog](../docs/changelog.md)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
and
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
199
|
+
selected changes under a version heading in the
|
|
200
|
+
[changelog](../docs/changelog.md), without a publication date until upload
|
|
201
|
+
succeeds; a metadata version does not establish publication. Track candidate
|
|
202
|
+
status in the release issue. Prepare installation examples and migration
|
|
203
|
+
instructions together, and update the site's latest-release banner after
|
|
204
|
+
publication. Keep the packaged README release-neutral: no "unreleased",
|
|
205
|
+
"not yet published" or "latest published version" claims. Factual feature
|
|
206
|
+
availability, compatibility, Beta maturity and migration links are appropriate.
|
|
207
|
+
Release status and dates belong in the linked changelog and release pages.
|
|
208
|
+
3. Run local quality/unit gates and build preview wheel/sdist archives. Inspect
|
|
209
|
+
their embedded, rendered README as the eventual PyPI description before
|
|
210
|
+
accepting the candidate for native qualification. Confirm that its wording
|
|
211
|
+
will remain true after publication; rendering and matching hashes alone do
|
|
212
|
+
not check this. PyPI retains the first uploaded description and cannot apply
|
|
213
|
+
a later repository edit to that release. Then run the Docker/native matrix,
|
|
214
|
+
merge through the normal required checks, and run a nonpublishing hosted
|
|
215
|
+
qualification for the resulting exact commit. Inspect the retained distributions,
|
|
205
216
|
hashes, and every installed-native receipt.
|
|
206
|
-
4. Inspect the rendered README and deployed documentation
|
|
217
|
+
4. Inspect the retained artifacts' rendered README and deployed documentation
|
|
218
|
+
anonymously. Confirm
|
|
207
219
|
the Pages revision, actual page content, and public links. The automated
|
|
208
220
|
HTTP checks alone do not establish that the intended revision is displayed.
|
|
209
221
|
5. For measurement/exporter changes, also require the real
|
|
@@ -211,8 +223,11 @@ aggregate workflow result together before publication.
|
|
|
211
223
|
or a string comparison of metrics is insufficient.
|
|
212
224
|
6. After qualification, obtain the explicit publication decision. Only an
|
|
213
225
|
actual publication establishes a release date and permits changing the
|
|
214
|
-
changelog's
|
|
215
|
-
|
|
226
|
+
changelog's publication date. If any packaged content, including its README,
|
|
227
|
+
needs correction after qualification, prepare a new candidate and repeat
|
|
228
|
+
exact-source qualification before publishing. Never publish a known stale
|
|
229
|
+
description to preserve an earlier qualification. Once published, retain the
|
|
230
|
+
immutable distribution bytes; a description correction needs a new release.
|
|
216
231
|
7. Verify the registry's trusted-publisher configuration and intended publishing
|
|
217
232
|
environment restrictions before selecting a publication target. The workflow
|
|
218
233
|
does not create or administratively configure those settings for a rehearsal.
|
|
@@ -224,7 +239,7 @@ and post releases are not part of this publication policy.
|
|
|
224
239
|
Validate a planned tag against the current metadata:
|
|
225
240
|
|
|
226
241
|
```bash
|
|
227
|
-
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
|
|
228
243
|
```
|
|
229
244
|
|
|
230
245
|
That local metadata check alone does not qualify the candidate. The workflow
|
|
@@ -258,6 +273,10 @@ assets and their hashes against the retained manifest. Install the published
|
|
|
258
273
|
package in a clean environment, check version and lazy import, and run a
|
|
259
274
|
native smoke with a supported library. Inspect the public PyPI description
|
|
260
275
|
and its documentation links without maintainer authentication.
|
|
276
|
+
Check that the description's wording is correct for the published release;
|
|
277
|
+
matching the qualified source does not establish semantic correctness. Keep the
|
|
278
|
+
release checklist open if this fails. A newer release can correct the default
|
|
279
|
+
project page, but the old version's description remains immutable.
|
|
261
280
|
|
|
262
281
|
If publication is interrupted, inspect which files reached the registry
|
|
263
282
|
before retrying. Published files cannot be overwritten. If only GitHub Release
|