Skip to content

Latest commit

Β 

History

History
606 lines (532 loc) Β· 32.4 KB

File metadata and controls

606 lines (532 loc) Β· 32.4 KB

Conductor Architecture Documentation

Overview

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.

System Components

1. Conductor (Coordinator)

  • Central orchestration node
  • Reads test configurations
  • Manages test phases
  • Collects results from players
  • Controls test flow and synchronization

2. Player (Worker)

  • Executes commands on remote systems
  • Listens for instructions from conductor
  • Returns execution results
  • Maintains persistent connection for multiple test runs

Architecture Diagrams

System Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        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  β”‚ β”‚               β”‚
β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚β””β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚β””β”€β”€β”€β”€β”€β”€β”˜ β”‚               β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                                                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Communication Flow

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)            β”‚
    β”‚                                β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Class Hierarchy

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

Core Classes

Reporter (reporter.py)

  • 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.)

Client (client.py)

  • Represents a player from conductor's perspective
  • Manages socket connection to a player
  • Sends phases and receives results
  • Handles configuration for each player

Phase (phase.py)

  • Container for multiple steps
  • Four types: Startup, Run, Collect, Reset
  • Executes steps sequentially (except Run phase)
  • Returns aggregated results to conductor

Step (step.py)

  • 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

RetVal (retval.py)

  • Communication protocol for results
  • Standardized return codes:
    • RETVAL_OK (0): Success
    • RETVAL_ERROR (1): Error
    • RETVAL_BAD_CMD (2): Unknown command
    • RETVAL_DONE (65535): Completion signal

Communication Protocol

JSON Protocol (v1)

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)β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Size Configuration

The maximum message size can be configured through:

  1. CLI Option: --max-message-size 20 (highest priority)
  2. Config File: max_message_size = 20 in [Test] or [Coordinator] section
  3. Default: 10 MB if not specified

This allows handling larger payloads when needed while maintaining secure defaults.

Message Types and Structure

// 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"
}

Data Flow Diagram

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Conductor                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  Config     │───►│   Client     │───►│  Socket Handler  β”‚   β”‚
β”‚  β”‚  Parser     β”‚    β”‚   Manager    β”‚    β”‚                  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                   β”‚            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                    β”‚
                              Network               β”‚
                         ═══════════════════════════β•ͺ═══════════
                                                    β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Player                    β”‚           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  Command         │◄───│   Phase      │◄───│  Socket    β”‚   β”‚
β”‚  β”‚  Executor        β”‚    β”‚   Handler    β”‚    β”‚  Listener  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚           β”‚                                                   β”‚
β”‚           β–Ό                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β”‚
β”‚  β”‚   Subprocess     │───►│   Result     β”‚                     β”‚
β”‚  β”‚     Runner       β”‚    β”‚   Sender     β”‚                     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Protocol Detail

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           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": [...]              β”‚    β”‚
β”‚  β”‚   }                             β”‚    β”‚
β”‚  β”‚ }                               β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Sequence Diagram

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 ═══════════════════════│                β”‚
    β”‚                 β”‚                β”‚                β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Ports

  • Command Port: Receives instructions (default: 6970)
  • Results Port: Sends execution results (default: 6971)

Test Execution Flow

State Machine

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ STARTUP β”œβ”€β”€β”€β”€β–Ίβ”‚   RUN    β”œβ”€β”€β”€β”€β–Ίβ”‚ COLLECT β”œβ”€β”€β”€β”€β–Ίβ”‚  RESET  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     β”‚               β”‚                 β”‚               β”‚
     β–Ό               β–Ό                 β–Ό               β–Ό
  Sequential      Parallel         Sequential     Sequential
  Execution       Execution        Execution      Execution

Detailed Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    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                     β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Configuration Structure

Test Configuration (test.cfg)

[Test]
trials: 1              # Number of test iterations

[Workers]
client1: dut.cfg       # Player configuration files
client2: server.cfg

Player Configuration (player.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/test

Execution Modes

Phase Execution Patterns

STARTUP 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

Command Execution Types

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    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    β”‚
β”‚                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Example Step Configurations

[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

Error Handling

Network Failures

  • Socket exceptions caught and logged
  • Player connection failures reported
  • Conductor continues with remaining players

Command Failures

  • Non-zero exit codes captured
  • Stderr output included in results
  • Failures don't stop phase execution

Timeout Handling

  • Processes killed after timeout
  • Timeout status returned in results
  • Cleanup of zombie processes

Scalability Considerations

Current Limitations

  • Synchronous communication with players
  • Sequential player setup
  • Single-threaded conductor

Potential Improvements

  • Asynchronous player communication
  • Parallel phase distribution
  • Result streaming vs batch collection
  • Player health monitoring

Security Notes

⚠️ IMPORTANT: Conductor is NOT secure for internet use! ⚠️

Critical Security Limitations

  • 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

Current State

  • 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 Improvements Made

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 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                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Remaining Recommendations

  • Add TLS encryption for confidentiality
  • Implement authentication tokens
  • Command whitelisting option
  • Audit logging
  • Consider mTLS for mutual authentication

Modern CLI Features

Enhanced Command-Line Interface

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    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                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Output Formats via Reporter

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            ]
                                  }
                                ]
                              }

Extension Points

Custom Phases

  • Extend Phase class
  • Add new phase types beyond four defaults
  • Custom execution strategies

Result Processing

  • Extend RetVal for richer data
  • Add result aggregation plugins
  • Real-time result streaming
  • Custom Reporter formats (XML, HTML, CSV)

Player Capabilities

  • Platform-specific command adapters
  • Resource monitoring integration
  • Custom step executors