This document provides a high-level introduction to Jumpstarter, explaining its purpose as a distributed hardware testing framework, the problems it solves, its architectural components, and how these components work together. For detailed information about specific subsystems, refer to the linked pages throughout this document.
Jumpstarter is an open-source distributed hardware testing framework designed to automate testing on both physical and virtual devices. It bridges the gap between local development workflows and production hardware environments by providing a unified abstraction layer over hardware interfaces. The system consists of Python client libraries and CLI tools, a Go-based Kubernetes controller for resource management, and Python-based exporters that interface directly with hardware.
This overview covers the system's architecture, core components, operating modes, and technology stack. For installation instructions, see Installation. For deeper technical details about specific components, see Architecture.
Sources: python/README.md1-71 python/docs/source/index.md1-62 python/docs/source/introduction/index.md1-200
Jumpstarter democratizes hardware-in-the-loop (HiL) testing by providing enterprise-grade testing capabilities as free, open-source software. While industries like automotive and manufacturing have traditionally used expensive proprietary HiL systems, Jumpstarter makes this technology accessible through a cloud-native approach.
The framework enables:
Jumpstarter works with existing testing tools including pytest, shell scripts, Makefiles, and standard CI/CD systems, requiring minimal changes to existing workflows.
Sources: python/docs/source/introduction/index.md1-23 python/README.md18-31
Jumpstarter's architecture consists of three distinct layers that communicate via gRPC and are coordinated through Kubernetes custom resources in distributed mode.
Sources: Diagram concepts from provided Diagram 1, python/docs/source/introduction/index.md24-48
All inter-component communication uses gRPC with Protocol Buffer message definitions located in the pkg/api directory. The protocol layer defines four primary service interfaces:
| Service | Purpose | Port | Implementation |
|---|---|---|---|
ControllerService | Registration, authentication, lease management | 8082 | pkg/controller |
RouterService | Bidirectional stream proxying between clients and exporters | 8083 | pkg/router |
ClientService | Client-side interface for exporter connections | N/A | packages/jumpstarter/jumpstarter/client |
ExporterService | Exporter-side interface exposing driver capabilities | N/A | packages/jumpstarter/jumpstarter/exporter |
Authentication flows through JWT tokens issued by the OIDC service on port 8085. The RouterService matches client and exporter streams using JWT subject claims to establish secure bidirectional communication channels.
Sources: Diagram concepts from provided Diagram 1, python/docs/source/introduction/index.md10-16
The following table summarizes the key components in the Jumpstarter system:
| Component | Type | Location | Purpose |
|---|---|---|---|
| Device Under Test (DUT) | Hardware/Virtual | N/A | Target device being tested or controlled |
| Driver | Python Package | packages/jumpstarter-driver-* | Abstracts hardware interfaces (power, serial, storage, etc.) |
| Adapter | Python Class | packages/jumpstarter/jumpstarter/adapter | Transforms driver connections into specialized formats |
| Exporter | Python Service | packages/jumpstarter/jumpstarter/exporter | Exposes drivers over gRPC, manages hardware lifecycle |
| Client | Python Library/CLI | packages/jumpstarter packages/jumpstarter-cli | Connects to exporters, manages leases, executes tests |
| Controller | Go Service | pkg/controller | Manages resources, enforces policies, issues tokens |
| Router | Go Service | pkg/router | Proxies connections between clients and exporters |
| Operator | Go Service | operator | Manages controller deployment and lifecycle |
Sources: python/docs/source/introduction/index.md24-48
Sources: Diagram concepts from provided Diagram 2, python/docs/source/introduction/index.md35-48
Jumpstarter supports two operating modes: local and distributed. The mode is determined by the presence of client configuration. For detailed information about operating modes, see Operating Modes.
In local mode, the client communicates directly with an exporter process running on the same machine via Unix socket. No Kubernetes infrastructure is required. The client library automatically spawns an exporter subprocess when using the jmp shell --exporter command.
Typical workflow:
Sources: python/docs/source/introduction/index.md56-102
In distributed mode, the system uses a Kubernetes controller to manage multi-user access to shared hardware. Clients authenticate via OIDC, acquire leases on exporters, and communicate through the RouterService. The LeaseReconciler implements sophisticated matching logic using label selectors and ExporterAccessPolicy resources.
Typical workflow:
Sources: python/docs/source/introduction/index.md104-191
The operating mode is determined automatically based on configuration:
| Condition | Mode | Connection Method |
|---|---|---|
No client config or JMP_CLIENT_CONFIG | Local | Unix socket to subprocess exporter |
| Client config present | Distributed | gRPC to controller, proxied through router |
Sources: python/docs/source/introduction/index.md56-102
| Technology | Purpose | Location |
|---|---|---|
| Python 3.10+ | Primary language for client libraries and exporters | packages/ |
| gRPC/Protobuf | RPC protocol for all communication | pkg/api |
| asyncio | Asynchronous I/O for concurrent operations | Throughout client code |
| Click | CLI framework for jmp command | packages/jumpstarter-cli |
| uv | Python package manager and build tool | pyproject.toml |
| Technology | Purpose | Location |
|---|---|---|
| Go 1.21+ | Primary language for controller and operator | pkg/ operator/ |
| Kubernetes | Orchestration platform for distributed mode | N/A |
| controller-runtime | Framework for building Kubernetes controllers | pkg/controller |
| kubebuilder | Tooling for CRD generation and scaffolding | N/A |
| gRPC | RPC protocol for controller services | pkg/api |
| JWT/OIDC | Authentication and authorization | pkg/oidc |
| Technology | Purpose | Location |
|---|---|---|
| buf | Protocol buffer code generation | buf.yaml |
| Makefile | Build orchestration | Makefile |
| Docker/Podman | Container image building | Containerfile |
| Helm | Kubernetes deployment | charts/ |
| pytest | Python testing framework | packages/*/tests |
| BATS | End-to-end testing framework | e2e/ |
Sources: python/README.md33-50 repository structure
The Jumpstarter repository is organized as a monorepo containing both Python and Go code:
jumpstarter/
├── packages/ # Python monorepo (45+ packages)
│ ├── jumpstarter/ # Core client library
│ ├── jumpstarter-cli/ # jmp CLI tool
│ ├── jumpstarter-protocol/ # Generated protobuf stubs
│ ├── jumpstarter-driver-*/ # ~40 driver packages
│ └── jumpstarter-example-*/ # Example implementations
├── pkg/ # Go controller and operator
│ ├── api/ # Protobuf definitions
│ ├── controller/ # ControllerService implementation
│ ├── router/ # RouterService implementation
│ └── oidc/ # OIDC service implementation
├── operator/ # Kubernetes operator
├── charts/ # Helm charts
├── e2e/ # End-to-end tests (BATS)
├── pyproject.toml # Python workspace definition
├── uv.lock # Python dependency lockfile (~7800 lines)
└── Makefile # Build orchestration
For detailed information about the repository structure, see Repository Structure.
Sources: Diagram concepts from provided Diagram 4, repository structure
Drivers provide a consistent interface to diverse hardware types:
jumpstarter_driver_powerjumpstarter_driver_pyserialjumpstarter_driver_opendaljumpstarter_driver_flashersFor information about specific drivers, see Driver System.
Sources: python/README.md26-27
The LeaseReconciler implements sophisticated resource allocation:
board=rpi4,model=v2)ExporterAccessPolicy rules to enforce access controlFor details about lease management, see Lease Management System.
Sources: Diagram concepts from provided Diagram 2, python/docs/source/introduction/index.md104-176
Distributed mode implements comprehensive security:
ExporterAccessPolicy resources define which clients can access which exportersFor authentication details, see Authentication and Authorization.
Sources: python/docs/source/introduction/index.md158-176
Jumpstarter follows cloud-native principles:
For deployment information, see Kubernetes Deployment.
Sources: Diagram concepts from provided Diagram 3, repository structure
To start using Jumpstarter:
For contributing to Jumpstarter, see Development Guide.
Sources: python/docs/source/index.md48-62
Refresh this wiki
This wiki was recently refreshed. Please wait 7 days to refresh again.