Conductor is a distributed testing framework designed to orchestrate tests across multiple networked systems. It follows a coordinator-worker pattern where a central conductor controls multiple players executing commands.
- Central orchestration node
- Reads test configurations
- Manages test phases
- Collects results from players
- Controls test flow and synchronization
- Executes commands on remote systems
- Listens for instructions from conductor
- Returns execution results
- Maintains persistent connection for multiple test runs
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Test Environment β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββ β
β β Conductor β β
β β(Coordinator Node)β β
β β β β
β β βββββββββββββββ β β
β β β test.cfg β β β
β β βββββββββββββββ β β
β ββββββββββ¬βββββββββ β
β β β
β β TCP Sockets (JSON Protocol v1) β
β β β
β ββββββββ΄βββββββ¬βββββββββββ¬βββββββββββ β
β β β β β β
β ββββΌββββββββ ββββΌββββββββ ββΌβββββββββ ββΌβββββββββ β
β β Player 1 β β Player 2 β βPlayer 3 β βPlayer N β β
β β β β β β β β β β
β β ββββββββ β β ββββββββ β βββββββββ β βββββββββ β β
β β β DUT β β β βServerβ β ββClientβ β ββ Load β β β
β β β .cfg β β β β .cfg β β ββ .cfg β β ββ Gen β β β
β β ββββββββ β β ββββββββ β βββββββββ β βββββββββ β β
β ββββββββββββ ββββββββββββ βββββββββββ βββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Conductor Player
β β
βββββββββ 1. Connect βββββββββββΊβ
β (Port 6970) β
β β
βββββββββ 2. Send Config ββββββββΊβ
βββββββββ 3. ACK (OK) ββββββββββββ€
β β
βββββββββ 4. Send Phase βββββββββΊβ
βββββββββ 5. ACK (OK) ββββββββββββ€
β β
βββββββββ 6. Send Run Cmd βββββββΊβ
β ββββ 7. Execute Steps
β β βββ Step 1
β β βββ Step 2
β β βββ Step N
β β
βββββββββ 8. Send Results ββββββββ€
β (Port 6971) β
β β
ββββββββββββββββββββββββββββββββββ
conductor/
β
βββ client.Client ββββββββββ¬ββββΊ phase.Phase βββββ¬βββΊ step.Step
β βββ config β βββ steps[] β βββ cmd
β βββ phases[] β βββ run() β βββ spawn
β βββ startup() β βββ results[] β βββ timeout
β βββ run() β β βββ run()
β βββ collect() β β
β βββ reset() β β
β β β
βββ config.Config ββββββββββ β
β βββ host β
β βββ port β
β β
βββ retval.RetVal ββββββββββββββββββββββββββββββββ
βββ code (OK/ERROR/BAD_CMD/DONE)
βββ message
- Handles output formatting for test results
- Supports multiple output formats:
- Text: Human-readable console output (default)
- JSON: Machine-parseable structured data
- Abstracts output logic from core execution
- Enables easy addition of new formats (XML, HTML, etc.)
- Represents a player from conductor's perspective
- Manages socket connection to a player
- Sends phases and receives results
- Handles configuration for each player
- Container for multiple steps
- Four types: Startup, Run, Collect, Reset
- Executes steps sequentially (except Run phase)
- Returns aggregated results to conductor
- Individual command execution unit
- Supports different execution modes:
- Normal: Wait for completion
- Spawn: Fire and forget
- Timeout: Execute with time limit
- Uses subprocess for command execution
- Communication protocol for results
- Standardized return codes:
RETVAL_OK(0): SuccessRETVAL_ERROR(1): ErrorRETVAL_BAD_CMD(2): Unknown commandRETVAL_DONE(65535): Completion signal
The conductor uses a JSON-based protocol (transmitted in PLAIN TEXT) replacing the previous pickle implementation:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β JSON Protocol Benefits β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Security: No arbitrary code execution β
β β’ Portability: Language-agnostic format β
β β’ Debuggability: Human-readable messages β
β β’ Versioning: Protocol version field for compatibility β
β β’ Size limits: Configurable max message size (default: 10MB)β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The maximum message size can be configured through:
- CLI Option:
--max-message-size 20(highest priority) - Config File:
max_message_size = 20in[Test]or[Coordinator]section - Default: 10 MB if not specified
This allows handling larger payloads when needed while maintaining secure defaults.
// Config Message
{
"version": 1,
"type": "config",
"data": {
"host": "192.168.1.10",
"port": 6970
}
}
// Phase Message
{
"version": 1,
"type": "phase",
"data": {
"name": "startup",
"steps": ["mkdir -p /tmp/test", "echo 'Starting test'"]
}
}
// RetVal Message
{
"version": 1,
"type": "retval",
"data": {
"retval": 0,
"message": "Command executed successfully"
}
}
// Run Command
{
"version": 1,
"type": "run",
"data": "execute"
}ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Conductor β
β βββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ β
β β Config βββββΊβ Client βββββΊβ Socket Handler β β
β β Parser β β Manager β β β β
β βββββββββββββββ ββββββββββββββββ βββββββββββ¬βββββββββ β
β β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββ
β
Network β
ββββββββββββββββββββββββββββͺβββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββ
β Player β β
β ββββββββββββββββββββ ββββββββββββββββ ββββββΌββββββββ β
β β Command ββββββ Phase ββββββ Socket β β
β β Executor β β Handler β β Listener β β
β ββββββββββ¬ββββββββββ ββββββββββββββββ ββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββ ββββββββββββββββ β
β β Subprocess βββββΊβ Result β β
β β Runner β β Sender β β
β ββββββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββ
β Message Structure β
βββββββββββββββββββββββββββββββββββββββββββ€
β Bytes 0-3: Message Length (uint32) β
β βββββ¬ββββ¬ββββ¬ββββ β
β β L β E β N β β (Big Endian) β
β βββββ΄ββββ΄ββββ΄ββββ β
βββββββββββββββββββββββββββββββββββββββββββ€
β Bytes 4-N: JSON Payload β
β βββββββββββββββββββββββββββββββββββ β
β β { β β
β β "version": 1, β β
β β "type": "phase", β β
β β "data": { β β
β β "name": "startup", β β
β β "steps": [...] β β
β β } β β
β β } β β
β βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββ
Conductor Player 1 Player 2 Player N
β β β β
ββββ Connect βββββΊβ β β
ββββ Accept βββββββ β β
β β β β
βββ Connect βββββββββββββββββββββββΊβ β
βββ Accept βββββββββββββββββββββββββ β
β β β β
βββ Config βββββββΊβ β β
βββ ACK βββββββββββ β β
β β β β
βββ Config ββββββββββββββββββββββββΊβ β
βββ ACK ββββββββββββββββββββββββββββ β
β β β β
ββ Phase(Startup)βΊβ β β
βββ ACK βββββββββββ β β
β β β β
βββ Phase(Startup)βββββββββββββββββΊβ β
βββ ACK ββββββββββββββββββββββββββββ β
β β β β
βββ Run βββββββββΊ β β β
β βββExecuteβββ β β
β βββββββββββββ β β
β β β β
βββ Run βββββββββββββββββββββββββββΊβ β
β β βββExecuteβββ β
β β βββββββββββββ β
β β β β
βββ Results βββββββ β β
βββ Results ββββββββββββββββββββββββ β
β β β β
βββββββββββββββββββ΄βββββββββββββββββ΄βββββββββββββββββ
- Command Port: Receives instructions (default: 6970)
- Results Port: Sends execution results (default: 6971)
βββββββββββ ββββββββββββ βββββββββββ βββββββββββ
β STARTUP ββββββΊβ RUN ββββββΊβ COLLECT ββββββΊβ RESET β
βββββββββββ ββββββββββββ βββββββββββ βββββββββββ
β β β β
βΌ βΌ βΌ βΌ
Sequential Parallel Sequential Sequential
Execution Execution Execution Execution
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Conductor Start β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Initialization Phase β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Read test.cfg β β
β β β’ Parse [Test] section for trials count β β
β β β’ Parse [Workers] section for player configs β β
β β β’ Load each player's configuration file β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. Player Connection Phase β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β For each player: β β
β β 1. Create socket to player:cmdport β β
β β 2. Send Config object β β
β β 3. Receive ACK β β
β β 4. Store connection reference β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. Test Execution Loop β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β For trial in range(trials): β β
β β For phase in [Startup, Run, Collect, Reset]: β β
β β a. Send phase to all players β β
β β b. Send run command to all players β β
β β c. Collect results from all players β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. Cleanup Phase β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Close all socket connections β β
β β β’ Aggregate test results β β
β β β’ Generate reports (if configured) β β
β β β’ Exit with appropriate code β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[Test]
trials: 1 # Number of test iterations
[Workers]
client1: dut.cfg # Player configuration files
client2: server.cfg[Coordinator]
player: 192.168.1.10 # Player's IP address
conductor: 192.168.1.1 # Conductor's IP address
cmdport: 6970 # Command port
resultsport: 6971 # Results port
[Startup]
step1: mkdir -p /tmp/test
[Run]
step1: spawn:iperf -s
step2: timeout30:ping -c 100 target
[Collect]
step1: tar -czf results.tgz /tmp/test
[Reset]
step1: rm -rf /tmp/testSTARTUP Phase (Sequential) RUN Phase (Parallel)
βββββββββββββββββββββββββ βββββββββββββββββββββ
Step 1 βββββββΊβ Step 1 βββββ
βΌ β
Step 2 βββββββΊβ Step 2 βββββΌβββββΊ All
βΌ β Start
Step 3 βββββββΊβ Step 3 βββββ€ Together
βΌ β
Done Step N βββββ
COLLECT Phase (Sequential) RESET Phase (Sequential)
ββββββββββββββββββββββββββ βββββββββββββββββββββββ
Step 1 βββββββΊβ Step 1 βββββββΊβ
βΌ βΌ
Step 2 βββββββΊβ Step 2 βββββββΊβ
βΌ βΌ
Done Done
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step Execution Modes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Normal Execution (Default) β
β ββββββββββββ β
β β Command ββββΊ Wait for βββΊ Get Exit βββΊ Continue β
β ββββββββββββ Completion Code β
β β
β 2. Spawn Execution (spawn: prefix) β
β ββββββββββββ β
β β Command ββββΊ Start βββΊ Continue β
β ββββββββββββ Process (Don't Wait) β
β β
β 3. Timeout Execution (timeout<N>: prefix) β
β ββββββββββββ β
β β Command ββββΊ Start βββΊ Wait Max βββΊ Kill if β
β ββββββββββββ N seconds Still Running β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[Startup]
# Normal execution - waits for completion
step1: mkdir -p /tmp/test
step2: cp config.txt /tmp/test/
[Run]
# Spawn execution - fire and forget
step1: spawn:iperf3 -s -D
step2: spawn:tcpdump -i eth0 -w capture.pcap
# Timeout execution - max 30 seconds
step3: timeout30:wget http://example.com/large_file.zip
[Collect]
# Normal execution again
step1: tar -czf results.tgz /tmp/test
step2: scp results.tgz conductor:/results/
[Reset]
# Cleanup
step1: killall iperf3
step2: rm -rf /tmp/test- Socket exceptions caught and logged
- Player connection failures reported
- Conductor continues with remaining players
- Non-zero exit codes captured
- Stderr output included in results
- Failures don't stop phase execution
- Processes killed after timeout
- Timeout status returned in results
- Cleanup of zombie processes
- Synchronous communication with players
- Sequential player setup
- Single-threaded conductor
- Asynchronous player communication
- Parallel phase distribution
- Result streaming vs batch collection
- Player health monitoring
- NO ENCRYPTION: All network traffic is PLAINTEXT
- NO AUTHENTICATION: Anyone who can connect can execute commands
- FULL SYSTEM ACCESS: Players execute arbitrary shell commands
- PRIVATE NETWORKS ONLY: Must be used behind firewalls on isolated test networks
- JSON Protocol: Replaced insecure pickle serialization
- Protocol Versioning: Ensures compatibility and security
- Size Limits: 10MB max message size prevents DoS
- No Code Execution: JSON cannot execute arbitrary code
- No authentication between conductor/player
- Plaintext communication (but safe JSON)
- Command execution still requires trust
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Security Evolution β
βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββ€
β Previous (v0) β Current (v1) β
βββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββ€
β Pickle Protocol β JSON Protocol β
β β’ Code executionβ β’ No code execution β
β β’ Python-only β β’ Language agnostic β
β β’ Security risk β β’ Safe serialization β
β β’ No validation β β’ Schema validation β
β β’ No size limit β β’ 10MB size limit β
βββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββ
- Add TLS encryption for confidentiality
- Implement authentication tokens
- Command whitelisting option
- Audit logging
- Consider mTLS for mutual authentication
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLI Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Conductor CLI (conduct) β
β βββ --trials N Override trial count β
β βββ --phases PHASE Run specific phases only β
β βββ --clients CLIENT Test specific clients β
β βββ --dry-run Preview execution plan β
β βββ --format FORMAT Output format (text/json) β
β βββ --output FILE Write results to file β
β βββ --verbose/-v Debug logging β
β βββ --quiet/-q Suppress output β
β β
β Player CLI (player) β
β βββ --log-file FILE Log to file β
β βββ --verbose/-v Debug logging β
β βββ config.cfg Configuration file β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Text Format (Default) JSON Format (--format json)
βββββββββββββββββββββ ββββββββββββββββββββββββββ
Phase: startup {
Client: web_server "phase": "startup",
Step 1: OK "results": [
Step 2: OK {
"client": "web_server",
Phase: run "steps": [
Client: web_server {"index": 1, "status": "OK"},
Step 1: OK {"index": 2, "status": "OK"}
Output: Server started ]
}
]
}
- Extend Phase class
- Add new phase types beyond four defaults
- Custom execution strategies
- Extend RetVal for richer data
- Add result aggregation plugins
- Real-time result streaming
- Custom Reporter formats (XML, HTML, CSV)
- Platform-specific command adapters
- Resource monitoring integration
- Custom step executors