Skip to content

feat(hole-punch): add py-libp2p v0.5#813

Open
parth-soni07 wants to merge 2 commits intolibp2p:masterfrom
parth-soni07:test-plans-pylibp2p
Open

feat(hole-punch): add py-libp2p v0.5#813
parth-soni07 wants to merge 2 commits intolibp2p:masterfrom
parth-soni07:test-plans-pylibp2p

Conversation

@parth-soni07
Copy link

py-libp2p Hole-Punch Interop Testing

Overview

Added py-libp2p v0.5 implementation for DCUtR (Direct Connection Upgrade through Relay) hole-punch interoperability testing.

Changes

1. New Files (images/python/v0.5/)

File Purpose
peer.py Dialer/Listener implementation using DCUtR protocol
relay.py Circuit relay v2 server
Dockerfile.peer Docker image for peer
Dockerfile.relay Docker image for relay
run-peer.sh / run-relay.sh Entry scripts
requirements.txt Python dependencies

Key implementation details:

A. Dialer: circuit-dial + DCUtR initiation

py-libp2p’s default swarm dial path doesn’t reliably handle /p2p-circuit addresses, so the dialer uses CircuitV2Transport.dial() directly, then triggers DCUtR:

# Create circuit address to listener through relay
circuit_addr = multiaddr.Multiaddr(
    f"{relay_addr}/p2p-circuit/p2p/{listener_peer_id_str}"
)

# Use CircuitV2Transport.dial() directly for circuit addresses
conn = await transport.dial(circuit_addr)

# Initiate hole punch
result = await dcutr_protocol.initiate_hole_punch(listener_peer_id)

B. Test coordination via Redis

The containers coordinate using two Redis keys derived from TEST_KEY:

# listener publishes its peer id
redis_key = f"{self.test_key}_listener_peer_id"
self.redis_client.set(redis_key, peer_id)

# relay publishes its multiaddr
redis_key = f"{self.test_key}_relay_multiaddr"
self.redis_client.set(redis_key, relay_multiaddr)

2. Configuration (images.yaml)

Added py-v0.5 under both relays and implementations:

relays:
  - id: py-v0.5
    source:
      type: local
      path: images/python/v0.5
      dockerfile: Dockerfile.relay
    transports: [tcp]
    secureChannels: [noise]
    muxers: [yamux]

implementations:
  - id: py-v0.5
    source:
      type: local
      path: images/python/v0.5
      dockerfile: Dockerfile.peer
    transports: [tcp]
    secureChannels: [noise]
    muxers: [yamux]

3. Bug Fixes (lib/generate-tests.sh)

Fixed two issues in test matrix generation:

A. Null string handling - yq returns literal "null" for missing values:

# Before
if [ -n "${dialer_commit}" ]; then

# After
if [ -n "${dialer_commit}" ] && [ "${dialer_commit}" != "null" ]; then

B. Wrong output file - Snapshots were written to worker_selected instead of worker_ignored in the ignored tests section:

# Before (incorrect)
echo "      snapshot: snapshots/${relay_commit}.zip" >> "${worker_selected}"

# After (correct)
echo "      snapshot: snapshots/${relay_commit}.zip" >> "${worker_ignored}"

Approach

  1. Peer implementation: Bring up a libp2p host with the selected transport/security/muxer, then connect to the relay and dial the listener via a /p2p-circuit address using CircuitV2Transport.dial(). Once the relay connection is established, initiate DCUtR to upgrade to a direct connection.

  2. Test coordination: Use Redis as the rendezvous plane:

    • Relay publishes {TEST_KEY}_relay_multiaddr
    • Listener publishes {TEST_KEY}_listener_peer_id
    • Dialer waits on both, then proceeds.
  3. Async runtime: Implemented with Trio (py-libp2p runtime), using background_trio_service(...) for long-running protocol services.

Test Command

./run-tests.sh --impl-select py-v0.5 --relay-select py-v0.5

Conventions

These changes follow the same patterns as the Performance Tests README:

  • images.yaml: Same structure — id, source (type, path, dockerfile), transports, secureChannels, muxers. Hole-punch adds relays and routers; py-v0.5 uses local source (no source.commit).
  • Filtering: Two-stage SELECT/IGNORE (--impl-select, --impl-ignore, --relay-select, etc.) with the same semantics.
  • Redis coordination: Per-test 8-character hash key (TEST_KEY from compute_test_key) for namespace isolation; relay/listener publish, dialer waits (same publish/wait pattern as perf’s listener/dialer).
  • Test matrix: generate-tests.sh emits snapshot refs only when commit is present and not the literal "null" (local images), and writes ignored-test blocks (including snapshot lines) to worker_ignored — consistent with cached matrix and snapshot behaviour described in perf.

@parth-soni07
Copy link
Author

@seetadev
Copy link
Collaborator

seetadev commented Feb 7, 2026

Thanks a lot for this comprehensive contribution, @parth-soni07 — this is a neat start 👏

The py-libp2p v0.5 DCUtR / hole-punch interop coverage is thoughtfully designed. The direct use of CircuitV2Transport.dial() for /p2p-circuit addresses is a pragmatic and well-justified choice given the current swarm dial behavior, and the Redis-based coordination pattern is clean, deterministic, and consistent with the existing perf test conventions.

The fixes in generate-tests.sh are also much appreciated — especially the handling of literal "null" values from yq and correcting the snapshot output target. These are subtle issues that can easily lead to confusing test matrices, so great catch.

Inviting @acul71 , @sumanjeet0012, @lla-dane and @Winter-Soren to review this PR, particularly around:

  • DCUtR initiation flow and circuit dialing logic

  • Test matrix generation and snapshot handling

  • Alignment with existing hole-punch and performance test patterns

Overall, this significantly strengthens our hole-punch interop testing for py-libp2p and brings v0.5 into much better parity with the rest of the ecosystem. Looking forward to the reviews.

@acul71
Copy link
Contributor

acul71 commented Feb 8, 2026

Hey @parth-soni07 thanks for this PR.

In my linux box py - py - py works!
PS: why there is only tcp, noice, yamux and not the others transports, security, muxer combinations ?

[2026-02-08 03:35:49] INFO: Running: py-v0.5 x py-v0.5 (tcp, noise, yamux) [dr - linux, rly - py-v0.5, lr - linux]
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-dialer Creating
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-dialer Created
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-listener Creating
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-listener Created
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__wan Creating
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__wan Created
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Creating
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Created
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Creating
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Creating
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Created
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Creating
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Created
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Creating
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Created
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Created
Attaching to py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer, py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router, py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener, py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router, py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Starting
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Started
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Starting
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Starting
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Starting RELAY server...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  |   TRANSPORT: tcp
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  |   SECURE_CHANNEL: noise
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  |   MUXER: yamux
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  |   RELAY_IP: 10.125.47.68
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Connecting to Redis at 172.18.0.2:6379...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Connected to Redis on attempt 1
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Relay peer ID: 12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Relay addresses: ['/ip4/10.125.47.68/tcp/4001/p2p/12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA']
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Relay multiaddr: /ip4/10.125.47.68/tcp/4001/p2p/12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Published relay multiaddr to Redis key: 5d0f9bcb_relay_multiaddr
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay  | Relay server ready, accepting connections...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Linux NAT Router Configuration
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Linux NAT Router Configuration
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Configuration:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   WAN Interface: wan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   WAN IP:        10.125.47.66
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   WAN Subnet:    10.125.47.64/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   LAN Interface: lan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   LAN IP:        10.125.47.98
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |   LAN Subnet:    10.125.47.96/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Configuring iptables NAT rules...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Configuration:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   WAN Interface: wan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   WAN IP:        10.125.47.67
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   WAN Subnet:    10.125.47.64/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   LAN Interface: lan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   LAN IP:        10.125.47.130
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |   LAN Subnet:    10.125.47.128/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Configuring iptables NAT rules...
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Started
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Starting
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Started
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Starting
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |NAT rules configured
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | NAT Router Ready
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Routing: 10.125.47.96/27 (lan0) ↔ NAT10.125.47.64/27 (wan0)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | iptables NAT rules:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |NAT rules configured
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | NAT Router Ready
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | ========================================
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Routing: 10.125.47.128/27 (lan0) ↔ NAT10.125.47.64/27 (wan0)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | iptables NAT rules:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |     0     0 MASQUERADE  0    --  *      wan0    10.125.47.128/27     0.0.0.0/0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | iptables FORWARD rules:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |     0     0 MASQUERADE  0    --  *      wan0    10.125.47.96/27      0.0.0.0/0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | iptables FORWARD rules:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Chain FORWARD (policy DROP 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Chain FORWARD (policy DROP 0 packets, 0 bytes)
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |     0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |     0     0 ACCEPT     0    --  lan0   wan0    10.125.47.96/27      0.0.0.0/0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |     0     0 ACCEPT     0    --  wan0   lan0    0.0.0.0/0            10.125.47.96/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | Routing table:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |  pkts bytes target     prot opt in     out     source               destination
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |     0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |     0     0 ACCEPT     0    --  lan0   wan0    10.125.47.128/27     0.0.0.0/0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |     0     0 ACCEPT     0    --  wan0   lan0    0.0.0.0/0            10.125.47.128/27
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | Routing table:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | default via 10.125.47.65 dev wan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | 10.125.47.64/27 dev wan0 proto kernel scope link src 10.125.47.66
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | default via 10.125.47.65 dev wan0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | 10.125.47.96/27 dev lan0 proto kernel scope link src 10.125.47.98
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | 10.125.47.64/27 dev wan0 proto kernel scope link src 10.125.47.67
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | 10.125.47.128/27 dev lan0 proto kernel scope link src 10.125.47.130
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router  | NAT router is running. Press Ctrl+C to stop.
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    |
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router    | NAT router is running. Press Ctrl+C to stop.
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Setting route to WAN subnet 10.125.47.64/27 via 10.125.47.130
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Started
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Connecting to Redis at 172.18.0.2:6379...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Connected to Redis on attempt 1
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Starting as LISTENER...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         |   TRANSPORT: tcp
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         |   SECURE_CHANNEL: noise
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         |   MUXER: yamux
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         |   PEER_IP: 0.0.0.0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Listener peer ID: 12D3KooWQCRunQEHQw52tERk1gNamkpFGuqwggoQHRJhLaYHPLfV
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Published peer ID to Redis key: 5d0f9bcb_listener_peer_id
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Waiting for relay multiaddr at key: 5d0f9bcb_relay_multiaddr
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Got relay multiaddr: /ip4/10.125.47.68/tcp/4001/p2p/12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Connected to relay: 12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener         | Listener ready, waiting for hole punch...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Setting route to WAN subnet 10.125.47.64/27 via 10.125.47.98
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Started
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Connecting to Redis at 172.18.0.2:6379...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Connected to Redis on attempt 1
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Starting as DIALER...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           |   TRANSPORT: tcp
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           |   SECURE_CHANNEL: noise
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           |   MUXER: yamux
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           |   PEER_IP: 0.0.0.0
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Dialer peer ID: 12D3KooWN8ZhuWKBYj2EAaiuY2qxAfpYLCpTeHP5YPEUV35V7x4W
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Waiting for relay multiaddr at key: 5d0f9bcb_relay_multiaddr
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Got relay multiaddr: /ip4/10.125.47.68/tcp/4001/p2p/12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Connected to relay: 12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Waiting for listener peer ID at key: 5d0f9bcb_listener_peer_id
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Got listener peer ID: 12D3KooWQCRunQEHQw52tERk1gNamkpFGuqwggoQHRJhLaYHPLfV
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Circuit address: /ip4/10.125.47.68/tcp/4001/p2p/12D3KooWA9heyEu35fww9FM5K22SiHh8yWabWjhkjb768QED2SHA/p2p-circuit/p2p/12D3KooWQCRunQEHQw52tERk1gNamkpFGuqwggoQHRJhLaYHPLfV
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Connecting to listener through relay...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error handling hop stream from 12D3KooWN8ZhuWKBYj2EAaiuY2qxAfpYLCpTeHP5YPEUV35V7x4W: Cannot write to stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Error sending status message: Cannot write to stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Connected to listener through relay
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Initiating hole punch...
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Hole punch result: True
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Has direct connection: True
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Hole punch SUCCESS! Direct connection established.
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Handshake time: 120.70ms
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | Stream handlers registered successfully
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer           | handshakeTime: 120.70
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream: Cannot read from stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream: Cannot read from stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Error relaying data: Cannot read from stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer exited with code 0
 Compose Stopping Aborting on container exit...
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Stopping
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream:
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream: Cannot read from stream; stream is reset
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Stopping
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener exited with code 143
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Stopped
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router exited with code 143
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error reading from stream: Cannot read from stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Error relaying data: Cannot read from stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Unexpected error handling hop stream from 12D3KooWN8ZhuWKBYj2EAaiuY2qxAfpYLCpTeHP5YPEUV35V7x4W: Cannot write to stream; stream is reset
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay            | Error sending status message: Cannot write to stream; stream is reset
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Stopping
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router exited with code 143
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Stopped
py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay exited with code 143
[2026-02-08 03:36:15] INFO:   ✓ Test complete
[2026-02-08 03:36:16] DEBUG:   Cleaning up containers...
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Removing
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Removing
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener Removed
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Removing
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer Removed
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Removing
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__listener_router Removed
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__dialer_router Removed
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Stopping
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Stopped
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Removing
 Container py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__relay Removed
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-dialer Removing
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__wan Removing
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-listener Removing
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-dialer Removed
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__lan-listener Removed
 Network py-v0_5_x_py-v0_5__tcp__noise__yamux___dr_-_linux__rly_-_py-v0_5__lr_-_linux__wan Removed
luca@r17:~/PNL_Launchpad_Curriculum/Libp2p/test-plans-fork/hole-punch$

@acul71
Copy link
Contributor

acul71 commented Feb 8, 2026

@seetadev @dhuseby
I've seen the in my linux box all rust tests are failing
There is also a bug in test matrix generation (test duplicated, fixed)

luca@r17:~/PNL_Launchpad_Curriculum/Libp2p/test-plans-fork/hole-punch$ git diff lib/generate-tests.sh
diff --git a/hole-punch/lib/generate-tests.sh b/hole-punch/lib/generate-tests.sh
index 29fe433..7c64055 100755
--- a/hole-punch/lib/generate-tests.sh
+++ b/hole-punch/lib/generate-tests.sh
@@ -546,8 +546,8 @@ generate_tests_worker() {

         print_debug "selecting listener router: ${listener_router_id}"

-        # Iterate through all dialers
-        for dialer_id in "${all_image_ids[@]}"; do
+        # Iterate through this worker's chunk of dialers
+        for dialer_id in "${dialer_chunk[@]}"; do
           dialer_transports="${image_transports[$dialer_id]}"
           dialer_secure="${image_secure[$dialer_id]}"
           dialer_muxers="${image_muxers[$dialer_id]}"

Investigating.....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants