feat(hole-punch): add py-libp2p v0.5#813
Conversation
|
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:
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. |
|
Hey @parth-soni07 thanks for this PR. In my linux box py - py - py works! [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) ↔ NAT ↔ 10.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) ↔ NAT ↔ 10.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$ |
|
@seetadev @dhuseby 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..... |
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/)peer.pyrelay.pyDockerfile.peerDockerfile.relayrun-peer.sh/run-relay.shrequirements.txtKey implementation details:
A. Dialer: circuit-dial + DCUtR initiation
py-libp2p’s default swarm dial path doesn’t reliably handle
/p2p-circuitaddresses, so the dialer usesCircuitV2Transport.dial()directly, then triggers DCUtR:B. Test coordination via Redis
The containers coordinate using two Redis keys derived from
TEST_KEY:2. Configuration (
images.yaml)Added py-v0.5 under both
relaysandimplementations:3. Bug Fixes (
lib/generate-tests.sh)Fixed two issues in test matrix generation:
A. Null string handling -
yqreturns literal"null"for missing values:B. Wrong output file - Snapshots were written to
worker_selectedinstead ofworker_ignoredin the ignored tests section:Approach
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-circuitaddress usingCircuitV2Transport.dial(). Once the relay connection is established, initiate DCUtR to upgrade to a direct connection.Test coordination: Use Redis as the rendezvous plane:
{TEST_KEY}_relay_multiaddr{TEST_KEY}_listener_peer_idAsync runtime: Implemented with Trio (py-libp2p runtime), using
background_trio_service(...)for long-running protocol services.Test Command
Conventions
These changes follow the same patterns as the Performance Tests README:
id,source(type,path,dockerfile),transports,secureChannels,muxers. Hole-punch addsrelaysandrouters; py-v0.5 uses local source (nosource.commit).--impl-select,--impl-ignore,--relay-select, etc.) with the same semantics.TEST_KEYfromcompute_test_key) for namespace isolation; relay/listener publish, dialer waits (same publish/wait pattern as perf’s listener/dialer)."null"(local images), and writes ignored-test blocks (including snapshot lines) toworker_ignored— consistent with cached matrix and snapshot behaviour described in perf.