Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .cursor/rules/creating-new-drivers.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,16 @@ Once the driver is created:
The script creates:
```
python/packages/jumpstarter-driver-<driver_package>/
├── jumpstarter_driver_<driver_package>/
├── __init__.py
├── client.py
├── driver.py
└── driver_test.py
├── examples/
└── exporter.yaml
├── .gitignore
├── pyproject.toml
└── README.md
|-- jumpstarter_driver_<driver_package>/
| |-- __init__.py
| |-- client.py
| |-- driver.py
| \-- driver_test.py
|-- examples/
| \-- exporter.yaml
|-- .gitignore
|-- pyproject.toml
\-- README.md
```

## 8. Documentation
Expand Down
60 changes: 30 additions & 30 deletions .cursor/rules/project-structure.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ This project follows a monorepo structure with a top-level `pyproject.toml` that

```
jumpstarter/
├── python/ # Python workspace root
├── pyproject.toml # Main workspace configuration
├── packages/ # All Python packages
├── examples/ # Example applications
├── docs/ # Documentation (Sphinx)
└── source/
└── internal/ # JEPs (rendered as part of docs)
└── jeps/ # Jumpstarter Enhancement Proposals
└── __templates__/ # Templates for creating new drivers
├── controller/ # Controller components
├── protocol/ # Protocol definitions
└── .cursor/ # Cursor AI rules
|-- python/ # Python workspace root
| |-- pyproject.toml # Main workspace configuration
| |-- packages/ # All Python packages
| |-- examples/ # Example applications
| |-- docs/ # Documentation (Sphinx)
| | \-- source/
| | \-- internal/ # JEPs (rendered as part of docs)
| | \-- jeps/ # Jumpstarter Enhancement Proposals
| \-- __templates__/ # Templates for creating new drivers
|-- controller/ # Controller components
|-- protocol/ # Protocol definitions
\-- .cursor/ # Cursor AI rules
```

## Workspace Configuration
Expand Down Expand Up @@ -69,16 +69,16 @@ Each package follows this structure:

```
python/packages/jumpstarter-driver-<name>/
├── jumpstarter_driver_<name>/ # Main Python package
├── __init__.py
├── driver.py # Driver implementation
├── client.py # Client implementation
└── driver_test.py # Tests
├── examples/ # Example configurations
└── exporter.yaml
├── pyproject.toml # Package configuration
├── README.md # Package documentation
└── .gitignore
|-- jumpstarter_driver_<name>/ # Main Python package
| |-- __init__.py
| |-- driver.py # Driver implementation
| |-- client.py # Client implementation
| \-- driver_test.py # Tests
|-- examples/ # Example configurations
| \-- exporter.yaml
|-- pyproject.toml # Package configuration
|-- README.md # Package documentation
\-- .gitignore
```

## Package Configuration
Expand All @@ -95,14 +95,14 @@ Each package's `pyproject.toml` includes:

```
python/examples/
├── automotive/ # Automotive testing example
├── jumpstarter_example_automotive/
├── pyproject.toml
└── README.md
└── soc-pytest/ # SoC testing example
├── jumpstarter_example_soc_pytest/
├── pyproject.toml
└── README.md
|-- automotive/ # Automotive testing example
| |-- jumpstarter_example_automotive/
| |-- pyproject.toml
| \-- README.md
\-- soc-pytest/ # SoC testing example
|-- jumpstarter_example_soc_pytest/
|-- pyproject.toml
\-- README.md
```

## Development Workflow
Expand Down
2 changes: 1 addition & 1 deletion .cursor/rules/releasing-operator.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ multiple channel heads found in graph: jumpstarter-operator.vA, jumpstarter-oper
**Rule**: `REPLACES` must always point to the _most recently published_ version in the channel, forming a linear chain. When release candidates are published to the channel before the final release, the chain must include them:

```
v0.8.0 v0.8.1-rc.1 v0.8.1
v0.8.0 -> v0.8.1-rc.1 -> v0.8.1
```

The `skipRange` (e.g. `>=0.8.0 <0.8.1`) allows users on any intermediate version to upgrade directly, but `replaces` must still form a valid graph with a single head.
Expand Down
38 changes: 19 additions & 19 deletions .cursor/rules/working-with-operator.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,25 @@ The Jumpstarter operator is a Kubernetes operator that manages Jumpstarter deplo

```
controller/
├── deploy/
├── operator/ # Operator code
├── api/v1alpha1/ # CRD type definitions
└── jumpstarter_types.go # Main types file
├── internal/controller/ # Controller logic
└── jumpstarter/
├── jumpstarter_controller.go # Main reconciler
├── endpoints/ # Endpoint handling (routes, ingress, etc.)
└── rbac.go # RBAC reconciliation
├── config/ # Kustomize configurations
├── crd/bases/ # Generated CRD YAML
└── samples/ # Sample CR files
├── bundle/ # OLM bundle manifests
├── test/e2e/ # E2E tests
└── Makefile # Operator-specific make targets
├── api/ # Jumpstarter core CRDs (Client, Exporter, Lease, etc.)
├── internal/ # Controller business logic
└── config/ # Config structs used by controller
└── Makefile # Top-level controller make targets
|-- deploy/
| |-- operator/ # Operator code
| | |-- api/v1alpha1/ # CRD type definitions
| | | \-- jumpstarter_types.go # Main types file
| | |-- internal/controller/ # Controller logic
| | | \-- jumpstarter/
| | | |-- jumpstarter_controller.go # Main reconciler
| | | |-- endpoints/ # Endpoint handling (routes, ingress, etc.)
| | | \-- rbac.go # RBAC reconciliation
| | |-- config/ # Kustomize configurations
| | | |-- crd/bases/ # Generated CRD YAML
| | | \-- samples/ # Sample CR files
| | |-- bundle/ # OLM bundle manifests
| | |-- test/e2e/ # E2E tests
| | \-- Makefile # Operator-specific make targets
|-- api/ # Jumpstarter core CRDs (Client, Exporter, Lease, etc.)
|-- internal/ # Controller business logic
| \-- config/ # Config structs used by controller
\-- Makefile # Top-level controller make targets
```

## Key Files
Expand Down
20 changes: 20 additions & 0 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,23 @@ jobs:
uses: crate-ci/typos@37bb98842b0d8c4ffebdb75301a13db0267cef89 # v1.47.2
with:
config: ./typos.toml

ascii-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- name: Install ripgrep
run: sudo apt-get install -y ripgrep
- name: Check for non-ASCII characters
shell: bash {0}
run: |
rg '[^\p{ASCII}]' --glob '!*.min.js' --line-number
status=$?
if [ "$status" -eq 0 ]; then
echo "::error::Non-ASCII characters found. Replace with ASCII equivalents."
exit 1
elif [ "$status" -eq 1 ]; then
exit 0
else
exit "$status"
fi
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ e2e-clean:
echo "Removing exporter configs..."; \
rm -rf /etc/jumpstarter/exporters/* 2>/dev/null || true; \
fi
@echo " E2E test environment cleaned"
@echo "[ok] E2E test environment cleaned"
@echo ""
@echo "Note: You may need to manually remove the dex entry from /etc/hosts:"
@echo " sudo sed -i.bak '/dex.dex.svc.cluster.local/d' /etc/hosts"
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ scripts, CI pipelines, and AI agents interact with devices through the same APIs

## Highlights

- 🧪 **Unified Testing** - One tool for physical and virtual devices under test
- 🔌 **Hardware Abstraction** - Control UART, CAN, SPI, GPIO, power, and USB through drivers
- 🐍 **Python-Powered** - Integrate with PyTest and Python's testing ecosystem
- 🌐 **Collaborative** - Share and securely lease test hardware across teams
- ⚙️ **Automation Ready** - Same APIs for humans, test scripts, CI pipelines, and AI agents
- 💻 **Cross-Platform** - Supports Linux and macOS
- **Unified Testing** - One tool for physical and virtual devices under test
- **Hardware Abstraction** - Control UART, CAN, SPI, GPIO, power, and USB through drivers
- **Python-Powered** - Integrate with PyTest and Python's testing ecosystem
- **Collaborative** - Share and securely lease test hardware across teams
- **Automation Ready** - Same APIs for humans, test scripts, CI pipelines, and AI agents
- **Cross-Platform** - Supports Linux and macOS

## Repository Structure

Expand Down
28 changes: 14 additions & 14 deletions controller/deploy/microshift-bootc/config-svc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@ A modular web service for configuring Jumpstarter deployment settings on MicroSh

```
config-svc/
├── __init__.py # Package initialization
├── app.py # Main application entry point
├── auth.py # Authentication and validation logic
├── system.py # System utility functions
├── api.py # API route handlers
├── routes.py # Main UI route handlers
├── templates/ # HTML and CSS templates
├── index.html # Main page template
├── password_required.html # Password change page
└── styles.css # Application styles
├── pyproject.toml # Project configuration and dependencies
├── config-svc.service # Systemd service file
├── update-banner.service # Banner update service
└── update-banner.sh # Banner update script
|-- __init__.py # Package initialization
|-- app.py # Main application entry point
|-- auth.py # Authentication and validation logic
|-- system.py # System utility functions
|-- api.py # API route handlers
|-- routes.py # Main UI route handlers
|-- templates/ # HTML and CSS templates
| |-- index.html # Main page template
| |-- password_required.html # Password change page
| +-- styles.css # Application styles
|-- pyproject.toml # Project configuration and dependencies
|-- config-svc.service # Systemd service file
|-- update-banner.service # Banner update service
+-- update-banner.sh # Banner update script
```

## Module Organization
Expand Down
2 changes: 1 addition & 1 deletion controller/deploy/microshift-bootc/config-svc/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,7 @@ def generate():
</head>
<body>
<div class="header">
<h1>📋 Pod Logs</h1>
<h1>Pod Logs</h1>
<div class="info">Namespace: {namespace} | Pod: {pod_name}</div>
</div>
<pre><div class="log-line">"""
Expand Down
26 changes: 13 additions & 13 deletions controller/deploy/microshift-bootc/config-svc/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,20 +231,20 @@ def update_login_banner():
url = f"http://{hostname}:{port}"

# Format URL line to fit properly in the box (62 chars content width)
url_line = f" {url}"
url_line = f" -> {url}"

banner = f"""
╔══════════════════════════════════════════════════════════════════╗
Jumpstarter Controller Community Edition
Powered by MicroShift
Web Configuration UI:
{url_line:<64}
Login with: root / <your-password>
╚══════════════════════════════════════════════════════════════════╝
+------------------------------------------------------------------+
| |
| Jumpstarter Controller Community Edition |
| Powered by MicroShift |
| |
| Web Configuration UI: |
| {url_line:<64}|
| |
| Login with: root / <your-password> |
| |
+------------------------------------------------------------------+

"""

Expand Down
Loading
Loading