mq-bridge-py-basic 0.3.1__tar.gz → 0.3.3__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.
- mq_bridge_py_basic-0.3.3/.github/workflows/benchmark.yml +254 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/ci.yml +88 -39
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/ibm-mq.yml +16 -5
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/node.yml +23 -1
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-node.yml +18 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/publish-python.yml +60 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/CONFIGURATION.md +21 -3
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/Cargo.lock +84 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/Cargo.toml +33 -5
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/PKG-INFO +93 -6
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/README.md +5 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/benches/performance_bench.rs +80 -32
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/bindings-common/Cargo.toml +2 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/bindings-common/src/lib.rs +2 -0
- mq_bridge_py_basic-0.3.3/bindings-common/src/logging.rs +234 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq-bridge.schema.json +183 -12
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.py +2 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/__init__.pyi +40 -1
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.py +4 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/config.pyi +31 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/pyproject.toml +1 -1
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/Cargo.toml +20 -6
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/README.md +91 -4
- mq_bridge_py_basic-0.3.3/python/mq-bridge-py/examples/dlt_source.py +112 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/pyproject-basic.toml +1 -1
- mq_bridge_py_basic-0.3.3/python/mq-bridge-py/pyproject-reduced.toml +65 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/src/lib.rs +266 -47
- mq_bridge_py_basic-0.3.3/python/mq-bridge-py/tests/test_logging.py +113 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_public_api.py +2 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_routes.py +86 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/debug_ibm_mq_tls.rs +6 -5
- mq_bridge_py_basic-0.3.3/scripts/ci/format_bench_output.sh +11 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/canonical_message.rs +105 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/amqp.rs +28 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/aws.rs +3 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/file.rs +6 -1
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.rs +5 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/http.rs +4 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/ibm_mq.rs +213 -29
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/kafka.rs +29 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mod.rs +90 -5
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mongodb.rs +25 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/mqtt.rs +332 -20
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/nats.rs +83 -1
- mq_bridge_py_basic-0.3.3/src/endpoints/redis_streams.rs +644 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/sled.rs +6 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/zeromq.rs +73 -11
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/models.rs +195 -7
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/test_utils.rs +205 -15
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/armature_integration.rs +39 -33
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka.yml +1 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init.mqsc +4 -0
- mq_bridge_py_basic-0.3.3/tests/integration/docker-compose/redis.yml +11 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc.rs +4 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/http.rs +2 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq.rs +38 -7
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ibm_mq_tls.rs +9 -1
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka.rs +96 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mariadb.rs +10 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mod.rs +4 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb.rs +2 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mysql.rs +5 -4
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/nats.rs +2 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/postgres.rs +10 -4
- mq_bridge_py_basic-0.3.3/tests/integration/redis_streams.rs +147 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/sqlite.rs +2 -2
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/tls_helpers.rs +3 -3
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration_test.rs +46 -10
- mq_bridge_py_basic-0.3.1/.github/workflows/benchmark.yml +0 -106
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/python.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/release.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.github/workflows/test-matrix.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/.gitignore +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/ARCHITECTURE.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/CONTRIBUTING.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/LICENSE +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/benches/router_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/build.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/claude.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/examples/ipc_worker_queue.yaml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/mq_bridge/py.typed +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/package-lock.json +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/LICENSE.python +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/analysis/bench_http_native.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/example.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/bench_memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/consume_pull.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/json_route.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/memory.yaml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/examples/raw_route.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/scripts/gen_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_config_types.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_packaging.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/tests/test_performance_smoke.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/python/mq-bridge-py/uv.lock +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/HTTP_STREAM_ENDPOINT_PLAN.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/benches/metadata_bench.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/analyze_xctrace_time_profile.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/http_flamegraph.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/mq_bridge_http_profile.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/analysis/http/run_http_ladder.sh +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/README.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/Dockerfile +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/meta.json +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/httparena/frameworks/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/README.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/benchmark_config.json +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/mq-bridge-py.dockerfile +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/Python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/README.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/seed.sql +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/techempower/verify.sh +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/README.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/config.yaml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/pyproject.toml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/scripts/the-benchmarker/python/mq-bridge-py/server.py +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/command_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/connection_registry.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/fanout.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/grpc.proto +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/http_stream.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_unix.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/ipc_windows.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/memory_transport.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/memory/transport.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/null.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/reader.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/response.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/sqlx.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/static_endpoint.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/stream_buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/switch.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/endpoints/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/errors.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/event_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/event_store.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/extensions.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/lib.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/buffer.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/cookie_jar.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/deduplication.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/delay.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/dlq.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/limiter.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/metrics.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/mod.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/random_panic.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/retry.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/middleware/weak_join.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/outcomes.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/publisher.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/response.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/route.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/traits.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/src/type_handler.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/README.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/amqp.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/aws.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/config.toml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/amqp.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/aws.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.crl +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.kdb +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.p12 +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.rdb +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm-mq-certs/client.sth +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/ibm_mq_tls.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/kafka-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mariadb.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-replica.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb-tls.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mongodb.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto.conf +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_performance.conf +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mosquitto_persistence.conf +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mq_init_tls.mqsc +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mqtt_performance.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/mysql.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/nats.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/docker-compose/postgres.yml +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/file.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/grpc_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/http_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/ipc.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/kafka_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/logic_test.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/memory.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_raw.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mongodb_tls.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/mqtt.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/performance_static.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/route.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/scripts/gen_certs.sh +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/websocket.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/integration/zeromq.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/memory_leak_test.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/ref_test.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/sqlite_test.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/tls_example.rs +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/unit_tests.md +0 -0
- {mq_bridge_py_basic-0.3.1 → mq_bridge_py_basic-0.3.3}/tests/websocket_test.rs +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
name: Benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
schedule:
|
|
7
|
+
# Nightly full benchmark run (04:00 UTC)
|
|
8
|
+
- cron: '0 4 * * *'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
env:
|
|
12
|
+
CARGO_TERM_COLOR: always
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
# Compile the bench binary once (release, --features full) and hand the
|
|
16
|
+
# executable to the shard jobs below so none of them need to recompile.
|
|
17
|
+
benchmark-build:
|
|
18
|
+
name: Build Benchmark Binary
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
|
|
27
|
+
- name: Install Rust toolchain
|
|
28
|
+
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
|
|
29
|
+
|
|
30
|
+
- name: Cache cargo build
|
|
31
|
+
uses: Swatinem/rust-cache@v2
|
|
32
|
+
with:
|
|
33
|
+
shared-key: release-full
|
|
34
|
+
|
|
35
|
+
- name: Build bench binary
|
|
36
|
+
run: |
|
|
37
|
+
set -o pipefail
|
|
38
|
+
cargo bench --bench performance_bench --features full --no-run --message-format=json | tee build-output.json
|
|
39
|
+
BIN_PATH=$(jq -r 'select(.reason == "compiler-artifact" and (.target.kind // [] | index("bench")) and .executable != null) | .executable' build-output.json | tail -n1)
|
|
40
|
+
if [ -z "$BIN_PATH" ]; then
|
|
41
|
+
echo "Could not locate performance_bench executable in cargo build output" >&2
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
cp "$BIN_PATH" ./performance_bench_bin
|
|
45
|
+
|
|
46
|
+
- name: Upload bench binary
|
|
47
|
+
uses: actions/upload-artifact@v4
|
|
48
|
+
with:
|
|
49
|
+
name: performance-bench-bin
|
|
50
|
+
path: performance_bench_bin
|
|
51
|
+
retention-days: 1
|
|
52
|
+
|
|
53
|
+
# Three independent shards of the same binary, filtered via the
|
|
54
|
+
# MQB_TEST_BACKEND env var that test_utils::should_run_benchmark() already
|
|
55
|
+
# supports. Each only pre-pulls the Docker images it actually needs.
|
|
56
|
+
benchmark-streams:
|
|
57
|
+
name: Benchmark (streams)
|
|
58
|
+
needs: benchmark-build
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
permissions:
|
|
61
|
+
contents: read
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
with:
|
|
65
|
+
persist-credentials: false
|
|
66
|
+
|
|
67
|
+
- name: Download bench binary
|
|
68
|
+
uses: actions/download-artifact@v4
|
|
69
|
+
with:
|
|
70
|
+
name: performance-bench-bin
|
|
71
|
+
|
|
72
|
+
- name: Pre-pull docker images
|
|
73
|
+
run: |
|
|
74
|
+
for f in aws kafka amqp nats mqtt_performance; do
|
|
75
|
+
docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
|
|
76
|
+
done
|
|
77
|
+
|
|
78
|
+
- name: Run benchmarks
|
|
79
|
+
shell: bash
|
|
80
|
+
env:
|
|
81
|
+
MQB_TEST_BACKEND: "aws,kafka,amqp,nats,mqtt,ibm-mq"
|
|
82
|
+
run: |
|
|
83
|
+
set -o pipefail
|
|
84
|
+
chmod +x ./performance_bench_bin
|
|
85
|
+
export CARGO_TERM_COLOR=never
|
|
86
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_streams.txt
|
|
87
|
+
./scripts/ci/format_bench_output.sh raw_output_streams.txt output_streams.txt
|
|
88
|
+
|
|
89
|
+
- name: Upload shard output
|
|
90
|
+
uses: actions/upload-artifact@v4
|
|
91
|
+
with:
|
|
92
|
+
name: bench-output-streams
|
|
93
|
+
path: |
|
|
94
|
+
raw_output_streams.txt
|
|
95
|
+
output_streams.txt
|
|
96
|
+
retention-days: 1
|
|
97
|
+
|
|
98
|
+
benchmark-database:
|
|
99
|
+
name: Benchmark (database)
|
|
100
|
+
needs: benchmark-build
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
permissions:
|
|
103
|
+
contents: read
|
|
104
|
+
steps:
|
|
105
|
+
- uses: actions/checkout@v4
|
|
106
|
+
with:
|
|
107
|
+
persist-credentials: false
|
|
108
|
+
|
|
109
|
+
- name: Download bench binary
|
|
110
|
+
uses: actions/download-artifact@v4
|
|
111
|
+
with:
|
|
112
|
+
name: performance-bench-bin
|
|
113
|
+
|
|
114
|
+
- name: Pre-pull docker images
|
|
115
|
+
run: |
|
|
116
|
+
for f in mongodb postgres; do
|
|
117
|
+
docker compose -f "tests/integration/docker-compose/${f}.yml" pull -q
|
|
118
|
+
done
|
|
119
|
+
|
|
120
|
+
- name: Run benchmarks
|
|
121
|
+
shell: bash
|
|
122
|
+
env:
|
|
123
|
+
MQB_TEST_BACKEND: "mongodb,postgres"
|
|
124
|
+
run: |
|
|
125
|
+
set -o pipefail
|
|
126
|
+
chmod +x ./performance_bench_bin
|
|
127
|
+
export CARGO_TERM_COLOR=never
|
|
128
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_database.txt
|
|
129
|
+
./scripts/ci/format_bench_output.sh raw_output_database.txt output_database.txt
|
|
130
|
+
|
|
131
|
+
- name: Upload shard output
|
|
132
|
+
uses: actions/upload-artifact@v4
|
|
133
|
+
with:
|
|
134
|
+
name: bench-output-database
|
|
135
|
+
path: |
|
|
136
|
+
raw_output_database.txt
|
|
137
|
+
output_database.txt
|
|
138
|
+
retention-days: 1
|
|
139
|
+
|
|
140
|
+
benchmark-dockerless:
|
|
141
|
+
name: Benchmark (dockerless)
|
|
142
|
+
needs: benchmark-build
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
permissions:
|
|
145
|
+
contents: read
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@v4
|
|
148
|
+
with:
|
|
149
|
+
persist-credentials: false
|
|
150
|
+
|
|
151
|
+
- name: Download bench binary
|
|
152
|
+
uses: actions/download-artifact@v4
|
|
153
|
+
with:
|
|
154
|
+
name: performance-bench-bin
|
|
155
|
+
|
|
156
|
+
- name: Run benchmarks
|
|
157
|
+
shell: bash
|
|
158
|
+
env:
|
|
159
|
+
MQB_TEST_BACKEND: "zeromq,memory,file,http,websocket,grpc"
|
|
160
|
+
run: |
|
|
161
|
+
set -o pipefail
|
|
162
|
+
chmod +x ./performance_bench_bin
|
|
163
|
+
export CARGO_TERM_COLOR=never
|
|
164
|
+
./performance_bench_bin --bench --output-format bencher | tee raw_output_dockerless.txt
|
|
165
|
+
./scripts/ci/format_bench_output.sh raw_output_dockerless.txt output_dockerless.txt
|
|
166
|
+
|
|
167
|
+
- name: Upload shard output
|
|
168
|
+
uses: actions/upload-artifact@v4
|
|
169
|
+
with:
|
|
170
|
+
name: bench-output-dockerless
|
|
171
|
+
path: |
|
|
172
|
+
raw_output_dockerless.txt
|
|
173
|
+
output_dockerless.txt
|
|
174
|
+
retention-days: 1
|
|
175
|
+
|
|
176
|
+
# Merge the three shard outputs back into the single combined report the
|
|
177
|
+
# gh-pages benchmark history / dashboard has always tracked.
|
|
178
|
+
benchmark-collect:
|
|
179
|
+
name: Collect Benchmark Results
|
|
180
|
+
needs: [benchmark-streams, benchmark-database, benchmark-dockerless]
|
|
181
|
+
runs-on: ubuntu-latest
|
|
182
|
+
permissions:
|
|
183
|
+
contents: write
|
|
184
|
+
deployments: write
|
|
185
|
+
steps:
|
|
186
|
+
- uses: actions/checkout@v4
|
|
187
|
+
|
|
188
|
+
- name: Download shard outputs
|
|
189
|
+
uses: actions/download-artifact@v4
|
|
190
|
+
with:
|
|
191
|
+
pattern: bench-output-*
|
|
192
|
+
merge-multiple: true
|
|
193
|
+
path: bench-outputs
|
|
194
|
+
|
|
195
|
+
- name: Merge shard outputs
|
|
196
|
+
run: |
|
|
197
|
+
cat bench-outputs/raw_output_*.txt > raw_output.txt
|
|
198
|
+
cat bench-outputs/output_*.txt > output.txt
|
|
199
|
+
|
|
200
|
+
- name: Generate Throughput Summary
|
|
201
|
+
run: |
|
|
202
|
+
python3 -c '
|
|
203
|
+
import re
|
|
204
|
+
import os
|
|
205
|
+
|
|
206
|
+
data = {}
|
|
207
|
+
try:
|
|
208
|
+
with open("raw_output.txt", "r") as f:
|
|
209
|
+
for line in f:
|
|
210
|
+
# Match lines like: "aws single_write: 1 iters, total time 1.48s, 673.75 msgs/sec"
|
|
211
|
+
m = re.search(r"^\s*(.*): .* ([\d\.]+) msgs/sec", line)
|
|
212
|
+
if m:
|
|
213
|
+
name = m.group(1).strip()
|
|
214
|
+
rate = float(m.group(2))
|
|
215
|
+
if name not in data:
|
|
216
|
+
data[name] = []
|
|
217
|
+
data[name].append(rate)
|
|
218
|
+
|
|
219
|
+
if data:
|
|
220
|
+
with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as f:
|
|
221
|
+
f.write("### Benchmark Throughput Results\n")
|
|
222
|
+
f.write("| Test Case | Average msgs/sec | Samples |\n")
|
|
223
|
+
f.write("|-----------|------------------|---------|\n")
|
|
224
|
+
for name in sorted(data.keys()):
|
|
225
|
+
rates = data[name]
|
|
226
|
+
avg = sum(rates) / len(rates)
|
|
227
|
+
f.write(f"| {name} | {avg:,.2f} | {len(rates)} |\n")
|
|
228
|
+
except Exception as e:
|
|
229
|
+
print(f"Error generating summary: {e}")
|
|
230
|
+
'
|
|
231
|
+
|
|
232
|
+
- name: Create gh-pages branch if missing
|
|
233
|
+
run: |
|
|
234
|
+
git fetch origin gh-pages || {
|
|
235
|
+
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
236
|
+
git config --global user.name "github-actions[bot]"
|
|
237
|
+
git checkout --orphan gh-pages
|
|
238
|
+
git rm -rf .
|
|
239
|
+
git commit --allow-empty -m "Initialize gh-pages branch"
|
|
240
|
+
git push origin gh-pages
|
|
241
|
+
git checkout ${{ github.sha }}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
- name: Store benchmark result
|
|
245
|
+
uses: benchmark-action/github-action-benchmark@v1
|
|
246
|
+
with:
|
|
247
|
+
name: Rust Benchmark
|
|
248
|
+
tool: 'cargo'
|
|
249
|
+
output-file-path: output.txt
|
|
250
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
251
|
+
auto-push: true
|
|
252
|
+
alert-threshold: '40000%'
|
|
253
|
+
comment-on-alert: true
|
|
254
|
+
fail-on-alert: false
|
|
@@ -107,35 +107,74 @@ jobs:
|
|
|
107
107
|
- name: Memory leak soak (route commit-task JoinSet)
|
|
108
108
|
run: cargo test --test memory_leak_test --features=full -- --ignored --nocapture
|
|
109
109
|
|
|
110
|
-
#
|
|
110
|
+
# Compile the integration test binaries ONCE (release, full,test-utils) and
|
|
111
|
+
# publish them as a nextest archive. The three run jobs below download this
|
|
112
|
+
# archive instead of each recompiling the same binaries.
|
|
113
|
+
integration-build:
|
|
114
|
+
name: Integration — Build
|
|
115
|
+
runs-on: ubuntu-latest
|
|
116
|
+
steps:
|
|
117
|
+
- uses: actions/checkout@v4
|
|
118
|
+
|
|
119
|
+
- name: Install Rust toolchain
|
|
120
|
+
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
|
|
121
|
+
|
|
122
|
+
- name: Install cargo-nextest
|
|
123
|
+
uses: taiki-e/install-action@v2
|
|
124
|
+
with:
|
|
125
|
+
tool: nextest
|
|
126
|
+
|
|
127
|
+
- name: Cache cargo build
|
|
128
|
+
uses: Swatinem/rust-cache@v2
|
|
129
|
+
with:
|
|
130
|
+
# Shared with the benchmark job so the full-feature dependency compile
|
|
131
|
+
# is reused across jobs/runs.
|
|
132
|
+
shared-key: release-full
|
|
133
|
+
|
|
134
|
+
- name: Build nextest archive
|
|
135
|
+
run: |
|
|
136
|
+
cargo nextest archive \
|
|
137
|
+
--release --features full,test-utils \
|
|
138
|
+
--test integration_test --test armature_integration \
|
|
139
|
+
--archive-file nextest-archive.tar.zst
|
|
140
|
+
|
|
141
|
+
- name: Upload nextest archive
|
|
142
|
+
uses: actions/upload-artifact@v4
|
|
143
|
+
with:
|
|
144
|
+
name: integration-nextest-archive
|
|
145
|
+
path: nextest-archive.tar.zst
|
|
146
|
+
retention-days: 1
|
|
147
|
+
|
|
148
|
+
# Integration tests (requires Docker) split into parallel jobs. Each runs the
|
|
149
|
+
# prebuilt nextest archive from integration-build — no recompilation.
|
|
111
150
|
integration-others:
|
|
112
151
|
name: Integration — Others
|
|
113
152
|
runs-on: ubuntu-latest
|
|
153
|
+
needs: integration-build
|
|
114
154
|
services:
|
|
115
155
|
docker:
|
|
116
156
|
image: docker:dind
|
|
117
157
|
options: --privileged
|
|
118
158
|
steps:
|
|
119
159
|
- uses: actions/checkout@v4
|
|
120
|
-
|
|
121
|
-
- name: Install
|
|
122
|
-
uses:
|
|
123
|
-
|
|
124
|
-
- name: Cache cargo build
|
|
125
|
-
uses: Swatinem/rust-cache@v2
|
|
160
|
+
|
|
161
|
+
- name: Install cargo-nextest
|
|
162
|
+
uses: taiki-e/install-action@v2
|
|
126
163
|
with:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
164
|
+
tool: nextest
|
|
165
|
+
|
|
166
|
+
- name: Download nextest archive
|
|
167
|
+
uses: actions/download-artifact@v4
|
|
168
|
+
with:
|
|
169
|
+
name: integration-nextest-archive
|
|
170
|
+
|
|
132
171
|
- name: Pre-pull docker images
|
|
133
172
|
run: |
|
|
134
173
|
find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
|
|
135
|
-
- name: Install
|
|
174
|
+
- name: Install JRE (for keytool)
|
|
136
175
|
run: |
|
|
137
176
|
sudo apt-get update
|
|
138
|
-
sudo apt-get install -y default-
|
|
177
|
+
sudo apt-get install -y default-jre-headless
|
|
139
178
|
|
|
140
179
|
- name: Generate TLS certs for integration services
|
|
141
180
|
run: |
|
|
@@ -146,15 +185,20 @@ jobs:
|
|
|
146
185
|
|
|
147
186
|
- name: Run chaos/stability tests
|
|
148
187
|
run: |
|
|
149
|
-
cargo
|
|
188
|
+
cargo nextest run --archive-file nextest-archive.tar.zst \
|
|
189
|
+
--run-ignored all --no-capture \
|
|
190
|
+
-E 'binary(integration_test) & test(=test_all_chaos)'
|
|
150
191
|
|
|
151
192
|
- name: Run remaining integration tests (excluding chaos & performance)
|
|
152
193
|
run: |
|
|
153
|
-
cargo
|
|
194
|
+
cargo nextest run --archive-file nextest-archive.tar.zst \
|
|
195
|
+
--run-ignored all --no-capture \
|
|
196
|
+
-E 'binary(integration_test) & not test(=test_all_chaos) & not test(=test_all_performance_pipeline) & not test(=test_all_performance_direct)'
|
|
154
197
|
|
|
155
198
|
integration-performance:
|
|
156
199
|
name: Integration — Performance
|
|
157
200
|
runs-on: ubuntu-latest
|
|
201
|
+
needs: integration-build
|
|
158
202
|
services:
|
|
159
203
|
docker:
|
|
160
204
|
image: docker:dind
|
|
@@ -162,24 +206,23 @@ jobs:
|
|
|
162
206
|
steps:
|
|
163
207
|
- uses: actions/checkout@v4
|
|
164
208
|
|
|
165
|
-
- name: Install
|
|
166
|
-
uses:
|
|
209
|
+
- name: Install cargo-nextest
|
|
210
|
+
uses: taiki-e/install-action@v2
|
|
211
|
+
with:
|
|
212
|
+
tool: nextest
|
|
167
213
|
|
|
168
|
-
- name:
|
|
169
|
-
uses:
|
|
214
|
+
- name: Download nextest archive
|
|
215
|
+
uses: actions/download-artifact@v4
|
|
170
216
|
with:
|
|
171
|
-
|
|
172
|
-
# empty string (no-op) in non-matrix jobs. rust-cache already keys on the
|
|
173
|
-
# job id, OS, rustc version, and lockfiles automatically.
|
|
174
|
-
key: ${{ matrix.features }}
|
|
217
|
+
name: integration-nextest-archive
|
|
175
218
|
|
|
176
219
|
- name: Pre-pull docker images
|
|
177
220
|
run: |
|
|
178
221
|
find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
|
|
179
|
-
- name: Install
|
|
222
|
+
- name: Install JRE (for keytool)
|
|
180
223
|
run: |
|
|
181
224
|
sudo apt-get update
|
|
182
|
-
sudo apt-get install -y default-
|
|
225
|
+
sudo apt-get install -y default-jre-headless
|
|
183
226
|
|
|
184
227
|
- name: Generate TLS certs for integration services
|
|
185
228
|
run: |
|
|
@@ -190,15 +233,20 @@ jobs:
|
|
|
190
233
|
|
|
191
234
|
- name: Run pipeline performance tests
|
|
192
235
|
run: |
|
|
193
|
-
cargo
|
|
236
|
+
cargo nextest run --archive-file nextest-archive.tar.zst \
|
|
237
|
+
--run-ignored all --no-capture \
|
|
238
|
+
-E 'binary(integration_test) & test(=test_all_performance_pipeline)'
|
|
194
239
|
|
|
195
240
|
- name: Run other performance tests
|
|
196
241
|
run: |
|
|
197
|
-
cargo
|
|
242
|
+
cargo nextest run --archive-file nextest-archive.tar.zst \
|
|
243
|
+
--run-ignored all --no-capture \
|
|
244
|
+
-E 'binary(integration_test) & test(=test_all_performance_direct)'
|
|
198
245
|
|
|
199
246
|
integration-armature:
|
|
200
247
|
name: Integration — Armature
|
|
201
248
|
runs-on: ubuntu-latest
|
|
249
|
+
needs: integration-build
|
|
202
250
|
services:
|
|
203
251
|
docker:
|
|
204
252
|
image: docker:dind
|
|
@@ -206,24 +254,23 @@ jobs:
|
|
|
206
254
|
steps:
|
|
207
255
|
- uses: actions/checkout@v4
|
|
208
256
|
|
|
209
|
-
- name: Install
|
|
210
|
-
uses:
|
|
257
|
+
- name: Install cargo-nextest
|
|
258
|
+
uses: taiki-e/install-action@v2
|
|
259
|
+
with:
|
|
260
|
+
tool: nextest
|
|
211
261
|
|
|
212
|
-
- name:
|
|
213
|
-
uses:
|
|
262
|
+
- name: Download nextest archive
|
|
263
|
+
uses: actions/download-artifact@v4
|
|
214
264
|
with:
|
|
215
|
-
|
|
216
|
-
# empty string (no-op) in non-matrix jobs. rust-cache already keys on the
|
|
217
|
-
# job id, OS, rustc version, and lockfiles automatically.
|
|
218
|
-
key: ${{ matrix.features }}
|
|
265
|
+
name: integration-nextest-archive
|
|
219
266
|
|
|
220
267
|
- name: Pre-pull docker images
|
|
221
268
|
run: |
|
|
222
269
|
find tests/integration/docker-compose -name "*.yml" | xargs -P 5 -I {} docker compose -f {} pull -q
|
|
223
|
-
- name: Install
|
|
270
|
+
- name: Install JRE (for keytool)
|
|
224
271
|
run: |
|
|
225
272
|
sudo apt-get update
|
|
226
|
-
sudo apt-get install -y default-
|
|
273
|
+
sudo apt-get install -y default-jre-headless
|
|
227
274
|
|
|
228
275
|
- name: Generate TLS certs for integration services
|
|
229
276
|
run: |
|
|
@@ -234,7 +281,9 @@ jobs:
|
|
|
234
281
|
|
|
235
282
|
- name: Run armature integration tests
|
|
236
283
|
run: |
|
|
237
|
-
cargo
|
|
284
|
+
cargo nextest run --archive-file nextest-archive.tar.zst \
|
|
285
|
+
--run-ignored all --no-capture \
|
|
286
|
+
-E 'binary(armature_integration)'
|
|
238
287
|
|
|
239
288
|
# Documentation
|
|
240
289
|
docs:
|
|
@@ -82,10 +82,16 @@ jobs:
|
|
|
82
82
|
ls -la /opt/mqm/lib64/ || echo "MQ lib64 directory not found"
|
|
83
83
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
|
|
84
84
|
|
|
85
|
-
-
|
|
85
|
+
# `ibm-mq` (dlopen) is the shipping path and needs no SDK at build; the
|
|
86
|
+
# redist install above only provides headers for the static compile-check.
|
|
87
|
+
- name: Build with IBM MQ feature (dlopen)
|
|
86
88
|
if: steps.mqclient.outputs.available == 'true'
|
|
87
89
|
run: cargo build --features ibm-mq
|
|
88
90
|
|
|
91
|
+
- name: Build with IBM MQ feature (static link)
|
|
92
|
+
if: steps.mqclient.outputs.available == 'true'
|
|
93
|
+
run: cargo build --features ibm-mq-static
|
|
94
|
+
|
|
89
95
|
- name: Run clippy on IBM MQ code
|
|
90
96
|
if: steps.mqclient.outputs.available == 'true'
|
|
91
97
|
run: cargo clippy --features ibm-mq -- -D warnings
|
|
@@ -156,13 +162,18 @@ jobs:
|
|
|
156
162
|
|
|
157
163
|
- name: Run IBM MQ integration tests
|
|
158
164
|
if: steps.mqclient.outputs.available == 'true'
|
|
165
|
+
env:
|
|
166
|
+
MQB_TEST_BACKEND: ibm-mq
|
|
159
167
|
run: |
|
|
168
|
+
# The test fns are named test_all_* (filtered to ibm-mq via
|
|
169
|
+
# MQB_TEST_BACKEND). The previous test_ibm_mq_* filters matched no
|
|
170
|
+
# test, so this job silently ran zero tests.
|
|
160
171
|
cargo test --test integration_test --features ibm-mq,test-utils,rustls-ring -- \
|
|
161
172
|
--ignored --nocapture --test-threads=1 \
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
173
|
+
test_all_subscriber_logic \
|
|
174
|
+
test_all_performance_pipeline \
|
|
175
|
+
test_all_chaos \
|
|
176
|
+
test_all_status
|
|
166
177
|
|
|
167
178
|
- name: Run IBM MQ TLS tests
|
|
168
179
|
if: steps.mqclient.outputs.available == 'true'
|
|
@@ -2,7 +2,7 @@ name: Node
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
branches: [main]
|
|
5
|
+
branches: [main, dev]
|
|
6
6
|
paths:
|
|
7
7
|
- ".github/workflows/node.yml"
|
|
8
8
|
- "node/mq-bridge-node/**"
|
|
@@ -23,6 +23,28 @@ env:
|
|
|
23
23
|
CARGO_TERM_COLOR: always
|
|
24
24
|
|
|
25
25
|
jobs:
|
|
26
|
+
# Fast guard: catches package.json/package-lock.json drift (e.g. a version
|
|
27
|
+
# bump that only half-updates the lock) before it reaches the publish flow,
|
|
28
|
+
# where `npm ci` fails after all the native builds have already run.
|
|
29
|
+
lock-sync:
|
|
30
|
+
name: package-lock in sync
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
34
|
+
with:
|
|
35
|
+
persist-credentials: false
|
|
36
|
+
|
|
37
|
+
- name: Set up Node
|
|
38
|
+
uses: actions/setup-node@v4
|
|
39
|
+
with:
|
|
40
|
+
node-version: "20"
|
|
41
|
+
cache: npm
|
|
42
|
+
cache-dependency-path: node/mq-bridge-node/package-lock.json
|
|
43
|
+
|
|
44
|
+
- name: Verify lock is in sync
|
|
45
|
+
working-directory: node/mq-bridge-node
|
|
46
|
+
run: npm ci --ignore-scripts
|
|
47
|
+
|
|
26
48
|
test:
|
|
27
49
|
name: Node binding smoke test
|
|
28
50
|
runs-on: ubuntu-latest
|
|
@@ -59,6 +59,12 @@ jobs:
|
|
|
59
59
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
|
|
60
60
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
61
61
|
|
|
62
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
63
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
|
|
64
|
+
- name: Sync version from Cargo workspace
|
|
65
|
+
working-directory: node/mq-bridge-node
|
|
66
|
+
run: npm run sync-version
|
|
67
|
+
|
|
62
68
|
- name: Install Node dependencies
|
|
63
69
|
working-directory: node/mq-bridge-node
|
|
64
70
|
run: npm ci
|
|
@@ -124,6 +130,12 @@ jobs:
|
|
|
124
130
|
with:
|
|
125
131
|
targets: ${{ matrix.target }}
|
|
126
132
|
|
|
133
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
134
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the build.
|
|
135
|
+
- name: Sync version from Cargo workspace
|
|
136
|
+
working-directory: node/mq-bridge-node
|
|
137
|
+
run: npm run sync-version
|
|
138
|
+
|
|
127
139
|
- name: Install Node dependencies
|
|
128
140
|
working-directory: node/mq-bridge-node
|
|
129
141
|
run: npm ci
|
|
@@ -170,14 +182,16 @@ jobs:
|
|
|
170
182
|
- name: Update npm
|
|
171
183
|
run: npm install -g npm@11.5.1
|
|
172
184
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
run: npm ci
|
|
176
|
-
|
|
185
|
+
# Regenerate package.json/lock from the Cargo workspace version (source of
|
|
186
|
+
# truth) BEFORE npm ci, so a drifted committed lock can't fail the publish.
|
|
177
187
|
- name: Sync version from Cargo workspace
|
|
178
188
|
working-directory: node/mq-bridge-node
|
|
179
189
|
run: npm run sync-version
|
|
180
190
|
|
|
191
|
+
- name: Install Node dependencies
|
|
192
|
+
working-directory: node/mq-bridge-node
|
|
193
|
+
run: npm ci
|
|
194
|
+
|
|
181
195
|
- name: Download loader into package root
|
|
182
196
|
uses: actions/download-artifact@v4
|
|
183
197
|
with:
|
|
@@ -39,6 +39,25 @@ jobs:
|
|
|
39
39
|
os: linux
|
|
40
40
|
target: aarch64
|
|
41
41
|
args: --release --out dist --find-interpreter --no-default-features
|
|
42
|
+
# musl/Alpine wheels for the basic package. basic uses the aws-lc-sys
|
|
43
|
+
# crypto provider (amqp + aws pull it in, same as full); aws-lc-sys
|
|
44
|
+
# compiles its C natively under musl given cmake + gcc, which
|
|
45
|
+
# before-script-linux installs in the musllinux container. The full
|
|
46
|
+
# wheel has no musl build (rdkafka makes it a separate effort).
|
|
47
|
+
- package: mq-bridge-py-basic
|
|
48
|
+
pyproject: pyproject-basic.toml
|
|
49
|
+
runner: ubuntu-latest
|
|
50
|
+
os: linux
|
|
51
|
+
target: x86_64
|
|
52
|
+
manylinux: musllinux_1_2
|
|
53
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
54
|
+
- package: mq-bridge-py-basic
|
|
55
|
+
pyproject: pyproject-basic.toml
|
|
56
|
+
runner: ubuntu-24.04-arm
|
|
57
|
+
os: linux
|
|
58
|
+
target: aarch64
|
|
59
|
+
manylinux: musllinux_1_2
|
|
60
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
42
61
|
- package: mq-bridge-py-basic
|
|
43
62
|
pyproject: pyproject-basic.toml
|
|
44
63
|
runner: macos-15-intel
|
|
@@ -75,6 +94,39 @@ jobs:
|
|
|
75
94
|
os: linux
|
|
76
95
|
target: aarch64
|
|
77
96
|
args: --release --out dist --find-interpreter
|
|
97
|
+
# Reduced-feature wheels published UNDER THE `mq-bridge-py` NAME so that
|
|
98
|
+
# a single `pip install mq-bridge-py` resolves to the `full` wheel on
|
|
99
|
+
# glibc-Linux/macOS/Windows-x64 and to this `basic`-featured wheel on
|
|
100
|
+
# targets where the full C toolchain doesn't build (musl/Alpine,
|
|
101
|
+
# Windows arm64), picked automatically by platform tag.
|
|
102
|
+
# pyproject-reduced.toml keeps the `mq-bridge-py` project name but
|
|
103
|
+
# compiles the `basic` feature set (no Kafka/sqlx/grpc/IBM-MQ-static).
|
|
104
|
+
# Same aws-lc-sys-native setup as the mq-bridge-py-basic rows.
|
|
105
|
+
- package: mq-bridge-py
|
|
106
|
+
pyproject: pyproject-reduced.toml
|
|
107
|
+
runner: ubuntu-latest
|
|
108
|
+
os: linux
|
|
109
|
+
target: x86_64
|
|
110
|
+
manylinux: musllinux_1_2
|
|
111
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
112
|
+
- package: mq-bridge-py
|
|
113
|
+
pyproject: pyproject-reduced.toml
|
|
114
|
+
runner: ubuntu-24.04-arm
|
|
115
|
+
os: linux
|
|
116
|
+
target: aarch64
|
|
117
|
+
manylinux: musllinux_1_2
|
|
118
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
119
|
+
# Windows arm64 gets the reduced set too: `basic` still pulls aws-lc-sys
|
|
120
|
+
# (via amqp+aws), which compiles natively under MSVC on the native
|
|
121
|
+
# windows-11-arm runner. If aws-lc-sys ever fails to build here, drop
|
|
122
|
+
# amqp+aws from a Windows-arm-only feature set rather than reintroducing
|
|
123
|
+
# a cross-compile.
|
|
124
|
+
- package: mq-bridge-py
|
|
125
|
+
pyproject: pyproject-reduced.toml
|
|
126
|
+
runner: windows-11-arm
|
|
127
|
+
os: windows
|
|
128
|
+
target: aarch64
|
|
129
|
+
args: --release --out dist --find-interpreter --no-default-features
|
|
78
130
|
- package: mq-bridge-py
|
|
79
131
|
pyproject: pyproject.toml
|
|
80
132
|
runner: macos-15-intel
|
|
@@ -126,12 +178,18 @@ jobs:
|
|
|
126
178
|
target: ${{ matrix.target }}
|
|
127
179
|
args: ${{ matrix.args }}
|
|
128
180
|
sccache: "true"
|
|
129
|
-
manylinux: auto
|
|
181
|
+
manylinux: ${{ matrix.manylinux || 'auto' }}
|
|
182
|
+
# amqp/aws (and full's kafka) pull aws-lc-sys, which compiles its C with
|
|
183
|
+
# cmake. manylinux containers already ship it; the musllinux (Alpine)
|
|
184
|
+
# container does not, so install it there. Guarded so it's a no-op
|
|
185
|
+
# wherever cmake is already present. Only runs for linux builds.
|
|
186
|
+
before-script-linux: |
|
|
187
|
+
command -v cmake >/dev/null 2>&1 || apk add --no-cache cmake gcc g++ make musl-dev perl
|
|
130
188
|
|
|
131
189
|
- name: Upload wheels
|
|
132
190
|
uses: actions/upload-artifact@v4
|
|
133
191
|
with:
|
|
134
|
-
name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}
|
|
192
|
+
name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}-${{ matrix.manylinux || 'auto' }}
|
|
135
193
|
path: python/mq-bridge-py/dist
|
|
136
194
|
|
|
137
195
|
build-sdists:
|