docs: add comprehensive documentation for sunbeam CLI
This commit is contained in:
518
docs/api-reference.md
Normal file
518
docs/api-reference.md
Normal file
@@ -0,0 +1,518 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: API Reference
|
||||||
|
description: Comprehensive API documentation for all Sunbeam modules
|
||||||
|
parent: index
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# API Reference
|
||||||
|
|
||||||
|
This section provides comprehensive API documentation for all Sunbeam modules, including function signatures, parameters, return values, and usage examples.
|
||||||
|
|
||||||
|
## CLI Module (`sunbeam.cli`)
|
||||||
|
|
||||||
|
### Main Function
|
||||||
|
|
||||||
|
```python
|
||||||
|
def main() -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:** Main entry point for the Sunbeam CLI. Parses arguments and dispatches to appropriate command handlers.
|
||||||
|
|
||||||
|
**Environment Variables:**
|
||||||
|
- `SUNBEAM_SSH_HOST`: Required for production environment
|
||||||
|
|
||||||
|
**Global Arguments:**
|
||||||
|
- `--env`: Target environment (`local` or `production`)
|
||||||
|
- `--context`: kubectl context override
|
||||||
|
- `--domain`: Domain suffix for production
|
||||||
|
- `--email`: ACME email for cert-manager
|
||||||
|
|
||||||
|
### Command Dispatch
|
||||||
|
|
||||||
|
The main function uses a dispatch pattern to route commands to their handlers:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Example dispatch pattern
|
||||||
|
if args.verb == "up":
|
||||||
|
from sunbeam.cluster import cmd_up
|
||||||
|
cmd_up()
|
||||||
|
elif args.verb == "status":
|
||||||
|
from sunbeam.services import cmd_status
|
||||||
|
cmd_status(args.target)
|
||||||
|
# ... additional commands
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kubernetes Module (`sunbeam.kube`)
|
||||||
|
|
||||||
|
### Context Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def set_context(ctx: str, ssh_host: str = "") -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ctx`: Kubernetes context name
|
||||||
|
- `ssh_host`: SSH host for production tunnel (optional)
|
||||||
|
|
||||||
|
**Description:** Sets the active kubectl context and SSH host for production environments.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def context_arg() -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Returns:** `--context=<active>` string for subprocess calls
|
||||||
|
|
||||||
|
### Kubernetes Operations
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kube(*args, input=None, check=True) -> subprocess.CompletedProcess
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `*args`: kubectl arguments
|
||||||
|
- `input`: stdin input (optional)
|
||||||
|
- `check`: Whether to raise exception on non-zero exit (default: True)
|
||||||
|
|
||||||
|
**Returns:** CompletedProcess result
|
||||||
|
|
||||||
|
**Description:** Run kubectl against active context with automatic SSH tunnel management.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kube_out(*args) -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `*args`: kubectl arguments
|
||||||
|
|
||||||
|
**Returns:** stdout output (empty string on failure)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kube_ok(*args) -> bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `*args`: kubectl arguments
|
||||||
|
|
||||||
|
**Returns:** True if command succeeds
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kube_apply(manifest: str, *, server_side: bool = True) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `manifest`: YAML manifest string
|
||||||
|
- `server_side`: Use server-side apply (default: True)
|
||||||
|
|
||||||
|
**Description:** Apply YAML manifest via kubectl.
|
||||||
|
|
||||||
|
### Resource Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ns_exists(ns: str) -> bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ns`: Namespace name
|
||||||
|
|
||||||
|
**Returns:** True if namespace exists
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ensure_ns(ns: str) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ns`: Namespace name
|
||||||
|
|
||||||
|
**Description:** Ensure namespace exists, creating if necessary.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def create_secret(ns: str, name: str, **literals) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ns`: Namespace name
|
||||||
|
- `name`: Secret name
|
||||||
|
- `**literals`: Key-value pairs for secret data
|
||||||
|
|
||||||
|
**Description:** Create or update Kubernetes secret idempotently.
|
||||||
|
|
||||||
|
### Kustomize Integration
|
||||||
|
|
||||||
|
```python
|
||||||
|
def kustomize_build(overlay: Path, domain: str, email: str = "") -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `overlay`: Path to kustomize overlay directory
|
||||||
|
- `domain`: Domain suffix for substitution
|
||||||
|
- `email`: ACME email for substitution (optional)
|
||||||
|
|
||||||
|
**Returns:** Built manifest YAML with substitutions applied
|
||||||
|
|
||||||
|
**Description:** Build kustomize overlay with domain/email substitution and helm support.
|
||||||
|
|
||||||
|
### SSH Tunnel Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ensure_tunnel() -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:** Open SSH tunnel to production cluster if needed. Automatically checks if tunnel is already open.
|
||||||
|
|
||||||
|
### Utility Functions
|
||||||
|
|
||||||
|
```python
|
||||||
|
def parse_target(s: str | None) -> tuple[str | None, str | None]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `s`: Target string in format `namespace/name` or `namespace`
|
||||||
|
|
||||||
|
**Returns:** Tuple of (namespace, name)
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```python
|
||||||
|
parse_target("ory/kratos") # ("ory", "kratos")
|
||||||
|
parse_target("lasuite") # ("lasuite", None)
|
||||||
|
parse_target(None) # (None, None)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def domain_replace(text: str, domain: str) -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `text`: Input text containing DOMAIN_SUFFIX placeholders
|
||||||
|
- `domain`: Domain to substitute
|
||||||
|
|
||||||
|
**Returns:** Text with DOMAIN_SUFFIX replaced by domain
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_lima_ip() -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Returns:** IP address of Lima VM
|
||||||
|
|
||||||
|
**Description:** Discover Lima VM IP using multiple fallback methods.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_domain() -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Returns:** Active domain from cluster state
|
||||||
|
|
||||||
|
**Description:** Discover domain from various cluster sources with fallback to Lima IP.
|
||||||
|
|
||||||
|
### Command Functions
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_k8s(kubectl_args: list[str]) -> int
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `kubectl_args`: Arguments to pass to kubectl
|
||||||
|
|
||||||
|
**Returns:** Exit code
|
||||||
|
|
||||||
|
**Description:** Transparent kubectl passthrough for active context.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_bao(bao_args: list[str]) -> int
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `bao_args`: Arguments to pass to bao CLI
|
||||||
|
|
||||||
|
**Returns:** Exit code
|
||||||
|
|
||||||
|
**Description:** Run bao CLI inside OpenBao pod with root token injection.
|
||||||
|
|
||||||
|
## Manifests Module (`sunbeam.manifests`)
|
||||||
|
|
||||||
|
### Main Command
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_apply(env: str = "local", domain: str = "", email: str = "", namespace: str = "") -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `env`: Environment (`local` or `production`)
|
||||||
|
- `domain`: Domain suffix (required for production)
|
||||||
|
- `email`: ACME email for cert-manager
|
||||||
|
- `namespace`: Limit apply to specific namespace (optional)
|
||||||
|
|
||||||
|
**Description:** Build kustomize overlay, apply domain/email substitution, and apply manifests with convergence handling.
|
||||||
|
|
||||||
|
### Cleanup Functions
|
||||||
|
|
||||||
|
```python
|
||||||
|
def pre_apply_cleanup(namespaces=None) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `namespaces`: List of namespaces to clean (default: all managed namespaces)
|
||||||
|
|
||||||
|
**Description:** Clean up immutable resources and stale secrets before apply.
|
||||||
|
|
||||||
|
### ConfigMap Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _snapshot_configmaps() -> dict
|
||||||
|
```
|
||||||
|
|
||||||
|
**Returns:** Dictionary of `{ns/name: resourceVersion}` for all ConfigMaps
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _restart_for_changed_configmaps(before: dict, after: dict) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `before`: ConfigMap snapshot before apply
|
||||||
|
- `after`: ConfigMap snapshot after apply
|
||||||
|
|
||||||
|
**Description:** Restart deployments that mount changed ConfigMaps.
|
||||||
|
|
||||||
|
### Webhook Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _wait_for_webhook(ns: str, svc: str, timeout: int = 120) -> bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `ns`: Namespace of webhook service
|
||||||
|
- `svc`: Service name
|
||||||
|
- `timeout`: Maximum wait time in seconds
|
||||||
|
|
||||||
|
**Returns:** True if webhook becomes ready
|
||||||
|
|
||||||
|
**Description:** Wait for webhook service endpoint to become available.
|
||||||
|
|
||||||
|
### Utility Functions
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _filter_by_namespace(manifests: str, namespace: str) -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `manifests`: Multi-document YAML string
|
||||||
|
- `namespace`: Namespace to filter by
|
||||||
|
|
||||||
|
**Returns:** Filtered YAML containing only resources for specified namespace
|
||||||
|
|
||||||
|
**Description:** Filter manifests by namespace using string matching.
|
||||||
|
|
||||||
|
## Services Module (`sunbeam.services`)
|
||||||
|
|
||||||
|
### Status Command
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_status(target: str | None) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `target`: Optional target in format `namespace` or `namespace/name`
|
||||||
|
|
||||||
|
**Description:** Show pod health across managed namespaces with VSO sync status.
|
||||||
|
|
||||||
|
### Log Command
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_logs(target: str, follow: bool) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `target`: Target in format `namespace/name`
|
||||||
|
- `follow`: Whether to stream logs
|
||||||
|
|
||||||
|
**Description:** Stream logs for a service using label-based pod selection.
|
||||||
|
|
||||||
|
### Get Command
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_get(target: str, output: str = "yaml") -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `target`: Target in format `namespace/name`
|
||||||
|
- `output`: Output format (`yaml`, `json`, or `wide`)
|
||||||
|
|
||||||
|
**Description:** Get raw kubectl output for a resource.
|
||||||
|
|
||||||
|
### Restart Command
|
||||||
|
|
||||||
|
```python
|
||||||
|
def cmd_restart(target: str | None) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `target`: Optional target in format `namespace` or `namespace/name`
|
||||||
|
|
||||||
|
**Description:** Rolling restart of services. If no target, restarts all managed services.
|
||||||
|
|
||||||
|
### VSO Sync Status
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _vso_sync_status() -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:** Print VaultStaticSecret and VaultDynamicSecret sync health status.
|
||||||
|
|
||||||
|
## Tools Module (`sunbeam.tools`)
|
||||||
|
|
||||||
|
### Tool Management
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ensure_tool(name: str) -> Path
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `name`: Tool name (must be in TOOLS dictionary)
|
||||||
|
|
||||||
|
**Returns:** Path to executable
|
||||||
|
|
||||||
|
**Raises:**
|
||||||
|
- `ValueError`: Unknown tool
|
||||||
|
- `RuntimeError`: SHA256 verification failure
|
||||||
|
|
||||||
|
**Description:** Ensure tool is available, downloading and verifying if necessary.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def run_tool(name: str, *args, **kwargs) -> subprocess.CompletedProcess
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `name`: Tool name
|
||||||
|
- `*args`: Arguments to pass to tool
|
||||||
|
- `**kwargs`: Additional subprocess.run parameters
|
||||||
|
|
||||||
|
**Returns:** CompletedProcess result
|
||||||
|
|
||||||
|
**Description:** Run tool, ensuring it's downloaded first. Handles PATH setup for kustomize/helm integration.
|
||||||
|
|
||||||
|
### Internal Utilities
|
||||||
|
|
||||||
|
```python
|
||||||
|
def _sha256(path: Path) -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `path`: Path to file
|
||||||
|
|
||||||
|
**Returns:** SHA256 hash of file contents
|
||||||
|
|
||||||
|
**Description:** Calculate SHA256 hash (internal utility).
|
||||||
|
|
||||||
|
## Output Module (`sunbeam.output`)
|
||||||
|
|
||||||
|
### Output Functions
|
||||||
|
|
||||||
|
```python
|
||||||
|
def step(msg: str) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: Message to display
|
||||||
|
|
||||||
|
**Description:** Print step header with `==>` prefix.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def ok(msg: str) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: Message to display
|
||||||
|
|
||||||
|
**Description:** Print success/info message with indentation.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def warn(msg: str) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: Warning message
|
||||||
|
|
||||||
|
**Description:** Print warning to stderr.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def die(msg: str) -> None
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: Error message
|
||||||
|
|
||||||
|
**Description:** Print error to stderr and exit with code 1.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def table(rows: list[list[str]], headers: list[str]) -> str
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `rows`: List of row data
|
||||||
|
- `headers`: List of column headers
|
||||||
|
|
||||||
|
**Returns:** Formatted table string
|
||||||
|
|
||||||
|
**Description:** Generate aligned text table with automatic column sizing.
|
||||||
|
|
||||||
|
## Usage Patterns
|
||||||
|
|
||||||
|
### Typical Command Flow
|
||||||
|
|
||||||
|
```python
|
||||||
|
# CLI entry point
|
||||||
|
from sunbeam.cli import main
|
||||||
|
main()
|
||||||
|
|
||||||
|
# Module usage example
|
||||||
|
from sunbeam.kube import kube, kube_out, set_context
|
||||||
|
from sunbeam.output import step, ok, warn
|
||||||
|
|
||||||
|
# Set context
|
||||||
|
set_context("sunbeam")
|
||||||
|
|
||||||
|
# Check cluster status
|
||||||
|
step("Checking cluster status...")
|
||||||
|
if kube_ok("get", "nodes"):
|
||||||
|
ok("Cluster is ready")
|
||||||
|
node_count = kube_out("get", "nodes", "--no-headers").count("\n") + 1
|
||||||
|
ok(f"Found {node_count} nodes")
|
||||||
|
else:
|
||||||
|
warn("Cluster not ready")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling Pattern
|
||||||
|
|
||||||
|
```python
|
||||||
|
from sunbeam.output import step, ok, die
|
||||||
|
from sunbeam.kube import kube_ok
|
||||||
|
|
||||||
|
step("Validating cluster requirements...")
|
||||||
|
|
||||||
|
# Check required components
|
||||||
|
required = [
|
||||||
|
("kube-system", "kube-dns"),
|
||||||
|
("ingress-nginx", "ingress-nginx-controller")
|
||||||
|
]
|
||||||
|
|
||||||
|
for ns, deployment in required:
|
||||||
|
if not kube_ok("get", "deployment", deployment, "-n", ns):
|
||||||
|
die(f"Required deployment {ns}/{deployment} not found")
|
||||||
|
|
||||||
|
ok("All requirements satisfied")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tool Usage Pattern
|
||||||
|
|
||||||
|
```python
|
||||||
|
from sunbeam.tools import ensure_tool, run_tool
|
||||||
|
|
||||||
|
# Ensure kubectl is available
|
||||||
|
kubectl_path = ensure_tool("kubectl")
|
||||||
|
|
||||||
|
# Run kubectl command
|
||||||
|
result = run_tool("kubectl", "get", "pods", "-A",
|
||||||
|
capture_output=True, text=True)
|
||||||
|
print(result.stdout)
|
||||||
|
```
|
||||||
254
docs/cli-reference.md
Normal file
254
docs/cli-reference.md
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: CLI Reference
|
||||||
|
description: Complete command reference for Sunbeam CLI
|
||||||
|
parent: index
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# CLI Reference
|
||||||
|
|
||||||
|
The Sunbeam CLI provides a comprehensive set of commands for managing local development environments.
|
||||||
|
|
||||||
|
## Command Structure
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam [global-options] <verb> [verb-options]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Global Options
|
||||||
|
|
||||||
|
| Option | Description | Default |
|
||||||
|
|--------|-------------|---------|
|
||||||
|
| `--env` | Target environment (`local` or `production`) | `local` |
|
||||||
|
| `--context` | kubectl context override | Auto-determined |
|
||||||
|
| `--domain` | Domain suffix for production deploys | `` |
|
||||||
|
| `--email` | ACME email for cert-manager | `` |
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
### Cluster Management
|
||||||
|
|
||||||
|
#### `sunbeam up`
|
||||||
|
Bring up the full local cluster including Lima VM and Kubernetes.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam up
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam down`
|
||||||
|
Tear down the Lima VM and local cluster.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Status and Information
|
||||||
|
|
||||||
|
#### `sunbeam status [target]`
|
||||||
|
Show pod health across all namespaces, optionally filtered.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# All pods
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Specific namespace
|
||||||
|
sunbeam status ory
|
||||||
|
|
||||||
|
# Specific service
|
||||||
|
sunbeam status ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manifest Management
|
||||||
|
|
||||||
|
#### `sunbeam apply [namespace]`
|
||||||
|
Build kustomize overlay, apply domain substitution, and apply manifests.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply all manifests
|
||||||
|
sunbeam apply
|
||||||
|
|
||||||
|
# Apply specific namespace only
|
||||||
|
sunbeam apply lasuite
|
||||||
|
|
||||||
|
# Production environment with custom domain
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service Operations
|
||||||
|
|
||||||
|
#### `sunbeam logs <ns/name> [-f]`
|
||||||
|
View logs for a service.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View recent logs
|
||||||
|
sunbeam logs ory/kratos
|
||||||
|
|
||||||
|
# Stream logs
|
||||||
|
sunbeam logs ory/kratos -f
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam get <ns/name> [-o yaml|json|wide]`
|
||||||
|
Get raw kubectl output for a resource.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get pod details
|
||||||
|
sunbeam get ory/kratos-abc -o yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam restart [target]`
|
||||||
|
Rolling restart of services.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Restart all services
|
||||||
|
sunbeam restart
|
||||||
|
|
||||||
|
# Restart specific namespace
|
||||||
|
sunbeam restart ory
|
||||||
|
|
||||||
|
# Restart specific service
|
||||||
|
sunbeam restart ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam check [target]`
|
||||||
|
Run functional service health checks.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check all services
|
||||||
|
sunbeam check
|
||||||
|
|
||||||
|
# Check specific service
|
||||||
|
sunbeam check ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build and Deployment
|
||||||
|
|
||||||
|
#### `sunbeam build <what> [--push] [--deploy]`
|
||||||
|
Build artifacts and optionally push and deploy.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build proxy
|
||||||
|
sunbeam build proxy
|
||||||
|
|
||||||
|
# Build and push
|
||||||
|
sunbeam build proxy --push
|
||||||
|
|
||||||
|
# Build, push, and deploy
|
||||||
|
sunbeam build proxy --deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
Available build targets:
|
||||||
|
- `proxy`, `integration`, `kratos-admin`, `meet`
|
||||||
|
- `docs-frontend`, `people-frontend`, `people`
|
||||||
|
|
||||||
|
#### `sunbeam mirror`
|
||||||
|
Mirror amd64-only La Suite images.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam mirror
|
||||||
|
```
|
||||||
|
|
||||||
|
### Secret Management
|
||||||
|
|
||||||
|
#### `sunbeam seed`
|
||||||
|
Generate and store all credentials in OpenBao.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam seed
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam verify`
|
||||||
|
End-to-end VSO + OpenBao integration test.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam verify
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bootstrap Operations
|
||||||
|
|
||||||
|
#### `sunbeam bootstrap`
|
||||||
|
Create Gitea orgs/repos and set up Lima registry.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam bootstrap
|
||||||
|
```
|
||||||
|
|
||||||
|
### Kubernetes Operations
|
||||||
|
|
||||||
|
#### `sunbeam k8s [kubectl args...]`
|
||||||
|
Transparent kubectl passthrough.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Any kubectl command
|
||||||
|
sunbeam k8s get pods -A
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam bao [bao args...]`
|
||||||
|
Run bao CLI inside OpenBao pod with root token.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run bao commands
|
||||||
|
sunbeam bao secrets list
|
||||||
|
```
|
||||||
|
|
||||||
|
### User Management
|
||||||
|
|
||||||
|
#### `sunbeam user list [--search email]`
|
||||||
|
List identities.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# List all users
|
||||||
|
sunbeam user list
|
||||||
|
|
||||||
|
# Search by email
|
||||||
|
sunbeam user list --search user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user get <target>`
|
||||||
|
Get identity by email or ID.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user get user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user create <email> [--name name] [--schema schema]`
|
||||||
|
Create identity.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user create user@example.com --name "User Name"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user delete <target>`
|
||||||
|
Delete identity.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user delete user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user recover <target>`
|
||||||
|
Generate recovery link.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user recover user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user disable <target>`
|
||||||
|
Disable identity and revoke sessions.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user disable user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user enable <target>`
|
||||||
|
Re-enable a disabled identity.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user enable user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `sunbeam user set-password <target> <password>`
|
||||||
|
Set password for an identity.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sunbeam user set-password user@example.com newpassword
|
||||||
|
```
|
||||||
262
docs/core-modules.md
Normal file
262
docs/core-modules.md
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Core Modules
|
||||||
|
description: Detailed documentation of Sunbeam's core modules
|
||||||
|
parent: index
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Core Modules
|
||||||
|
|
||||||
|
Sunbeam's functionality is organized into several core modules, each responsible for specific aspects of cluster and service management.
|
||||||
|
|
||||||
|
## Module Overview
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
cli[CLI Entry Point] --> kube[Kubernetes Interface]
|
||||||
|
cli --> manifests[Manifest Management]
|
||||||
|
cli --> services[Service Operations]
|
||||||
|
cli --> secrets[Secret Management]
|
||||||
|
cli --> users[User Management]
|
||||||
|
cli --> images[Image Building]
|
||||||
|
cli --> cluster[Cluster Lifecycle]
|
||||||
|
cli --> tools[Tool Management]
|
||||||
|
cli --> output[Output Utilities]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kubernetes Interface (`sunbeam.kube`)
|
||||||
|
|
||||||
|
The Kubernetes interface module provides core functionality for interacting with Kubernetes clusters.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `set_context(ctx: str, ssh_host: str = "")`
|
||||||
|
Set the active kubectl context and optional SSH host for production tunnels.
|
||||||
|
|
||||||
|
#### `kube(*args, input=None, check=True)`
|
||||||
|
Run kubectl commands against the active context with automatic SSH tunnel management.
|
||||||
|
|
||||||
|
#### `kube_out(*args) -> str`
|
||||||
|
Run kubectl and return stdout.
|
||||||
|
|
||||||
|
#### `kube_ok(*args) -> bool`
|
||||||
|
Return True if kubectl command succeeds.
|
||||||
|
|
||||||
|
#### `kube_apply(manifest: str, server_side: bool = True)`
|
||||||
|
Apply YAML manifest via kubectl.
|
||||||
|
|
||||||
|
#### `kustomize_build(overlay: Path, domain: str, email: str = "") -> str`
|
||||||
|
Build kustomize overlay with domain/email substitution.
|
||||||
|
|
||||||
|
### Environment Management
|
||||||
|
|
||||||
|
- **Local Development**: Uses Lima VM with context `sunbeam`
|
||||||
|
- **Production**: Supports SSH tunneling to remote clusters
|
||||||
|
- **Domain Handling**: Automatic domain discovery and substitution
|
||||||
|
|
||||||
|
### SSH Tunnel Management
|
||||||
|
|
||||||
|
The module automatically manages SSH tunnels for production environments:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Automatic tunnel opening when needed
|
||||||
|
def ensure_tunnel():
|
||||||
|
# Check if tunnel is already open
|
||||||
|
# Open SSH tunnel if needed
|
||||||
|
# Verify tunnel is working
|
||||||
|
```
|
||||||
|
|
||||||
|
## Manifest Management (`sunbeam.manifests`)
|
||||||
|
|
||||||
|
Handles kustomize-based manifest building, application, and lifecycle management.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `cmd_apply(env: str = "local", domain: str = "", email: str = "", namespace: str = "")`
|
||||||
|
Main entry point for manifest application:
|
||||||
|
|
||||||
|
1. **Pre-apply Cleanup**: Remove immutable resources and stale secrets
|
||||||
|
2. **ConfigMap Snapshotting**: Track ConfigMap versions for restart detection
|
||||||
|
3. **Kustomize Build**: Build overlay with domain/email substitution
|
||||||
|
4. **Namespace Filtering**: Apply only specific namespaces if requested
|
||||||
|
5. **Webhook Waiting**: Wait for cert-manager webhook before convergence
|
||||||
|
6. **ConfigMap Change Detection**: Restart deployments when ConfigMaps change
|
||||||
|
|
||||||
|
#### `pre_apply_cleanup(namespaces=None)`
|
||||||
|
Clean up resources that must be recreated:
|
||||||
|
- Delete completed Jobs
|
||||||
|
- Remove test Pods
|
||||||
|
- Prune stale VaultStaticSecrets
|
||||||
|
|
||||||
|
#### `_wait_for_webhook(ns: str, svc: str, timeout: int = 120) -> bool`
|
||||||
|
Wait for webhook services to become ready.
|
||||||
|
|
||||||
|
#### `_restart_for_changed_configmaps(before: dict, after: dict)`
|
||||||
|
Restart deployments when mounted ConfigMaps change.
|
||||||
|
|
||||||
|
### Manifest Processing Flow
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A[Start] --> B[Pre-apply Cleanup]
|
||||||
|
B --> C[Snapshot ConfigMaps]
|
||||||
|
C --> D[Build Kustomize Overlay]
|
||||||
|
D --> E[Apply Domain/Email Substitution]
|
||||||
|
E --> F[First Apply Pass]
|
||||||
|
F --> G{Webhook Present?}
|
||||||
|
G -->|Yes| H[Wait for Webhook]
|
||||||
|
H --> I[Convergence Pass]
|
||||||
|
G -->|No| I
|
||||||
|
I --> J[Detect ConfigMap Changes]
|
||||||
|
J --> K[Restart Affected Deployments]
|
||||||
|
K --> L[Complete]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Service Operations (`sunbeam.services`)
|
||||||
|
|
||||||
|
Provides service management capabilities including status checks, log viewing, and restarts.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `cmd_status(target: str | None)`
|
||||||
|
Show pod health across managed namespaces:
|
||||||
|
- Filter by namespace or namespace/service
|
||||||
|
- Color-coded status indicators
|
||||||
|
- VSO secret sync status
|
||||||
|
|
||||||
|
#### `cmd_logs(target: str, follow: bool)`
|
||||||
|
Stream logs for a service:
|
||||||
|
- Automatic pod selection via labels
|
||||||
|
- Follow mode for real-time logging
|
||||||
|
|
||||||
|
#### `cmd_get(target: str, output: str = "yaml")`
|
||||||
|
Get raw kubectl output for resources.
|
||||||
|
|
||||||
|
#### `cmd_restart(target: str | None)`
|
||||||
|
Rolling restart of services:
|
||||||
|
- Restart all, by namespace, or specific service
|
||||||
|
- Uses predefined service list
|
||||||
|
|
||||||
|
### Managed Namespaces
|
||||||
|
|
||||||
|
```
|
||||||
|
["data", "devtools", "ingress", "lasuite", "media", "ory", "storage", "vault-secrets-operator"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service Health Monitoring
|
||||||
|
|
||||||
|
The status command provides comprehensive health monitoring:
|
||||||
|
|
||||||
|
- **Pod Status**: Running, Completed, Failed, Pending
|
||||||
|
- **Readiness**: Container ready ratios
|
||||||
|
- **VSO Sync**: VaultStaticSecret and VaultDynamicSecret synchronization
|
||||||
|
|
||||||
|
## Secret Management (`sunbeam.secrets`)
|
||||||
|
|
||||||
|
Handles credential generation and OpenBao integration.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `cmd_seed()`
|
||||||
|
Generate and store all credentials in OpenBao.
|
||||||
|
|
||||||
|
#### `cmd_verify()`
|
||||||
|
End-to-end VSO + OpenBao integration test.
|
||||||
|
|
||||||
|
### OpenBao Integration
|
||||||
|
|
||||||
|
- **Root Token Management**: Automatic injection into bao commands
|
||||||
|
- **Secret Generation**: Comprehensive credential seeding
|
||||||
|
- **Integration Testing**: Verify VSO-OpenBao connectivity
|
||||||
|
|
||||||
|
## User Management (`sunbeam.users`)
|
||||||
|
|
||||||
|
Provides identity management for development environments.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### User Operations
|
||||||
|
- `cmd_user_list(search: str)` - List identities
|
||||||
|
- `cmd_user_get(target: str)` - Get identity details
|
||||||
|
- `cmd_user_create(email: str, name: str, schema_id: str)` - Create identity
|
||||||
|
- `cmd_user_delete(target: str)` - Delete identity
|
||||||
|
- `cmd_user_recover(target: str)` - Generate recovery link
|
||||||
|
- `cmd_user_disable(target: str)` - Disable identity
|
||||||
|
- `cmd_user_enable(target: str)` - Enable identity
|
||||||
|
- `cmd_user_set_password(target: str, password: str)` - Set password
|
||||||
|
|
||||||
|
### Identity Management
|
||||||
|
|
||||||
|
- Email-based identity lookup
|
||||||
|
- Schema-based identity creation
|
||||||
|
- Session management and recovery
|
||||||
|
- Password management
|
||||||
|
|
||||||
|
## Image Building (`sunbeam.images`)
|
||||||
|
|
||||||
|
Handles container image building, pushing, and deployment.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `cmd_build(what: str, push: bool, deploy: bool)`
|
||||||
|
Build Docker images with optional push and deploy:
|
||||||
|
|
||||||
|
- **Build Targets**: proxy, integration, kratos-admin, meet, frontend apps
|
||||||
|
- **Push Integration**: Automatic registry pushing
|
||||||
|
- **Deploy Integration**: Manifest application and rollout
|
||||||
|
|
||||||
|
#### `cmd_mirror()`
|
||||||
|
Mirror amd64-only La Suite images for ARM compatibility.
|
||||||
|
|
||||||
|
## Cluster Management (`sunbeam.cluster`)
|
||||||
|
|
||||||
|
Handles cluster lifecycle operations.
|
||||||
|
|
||||||
|
### Key Functions
|
||||||
|
|
||||||
|
#### `cmd_up()`
|
||||||
|
Bring up the full local cluster including Lima VM.
|
||||||
|
|
||||||
|
#### `cmd_down()`
|
||||||
|
Tear down the Lima VM and cluster.
|
||||||
|
|
||||||
|
## Tool Management (`sunbeam.tools`)
|
||||||
|
|
||||||
|
Automatic binary management for required tools.
|
||||||
|
|
||||||
|
### Key Features
|
||||||
|
|
||||||
|
- **Binary Caching**: Download and cache kubectl, kustomize, helm
|
||||||
|
- **SHA256 Verification**: Security verification of downloaded binaries
|
||||||
|
- **Version Pinning**: Specific versions for reproducibility
|
||||||
|
- **Automatic Updates**: Re-download when versions change
|
||||||
|
|
||||||
|
### Supported Tools
|
||||||
|
|
||||||
|
| Tool | Version | Purpose |
|
||||||
|
|------|---------|---------|
|
||||||
|
| kubectl | v1.32.2 | Kubernetes CLI |
|
||||||
|
| kustomize | v5.8.1 | Manifest customization |
|
||||||
|
| helm | v4.1.0 | Helm chart management |
|
||||||
|
|
||||||
|
## Output Utilities (`sunbeam.output`)
|
||||||
|
|
||||||
|
Consistent output formatting and user feedback.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
- `step(msg: str)` - Step headers
|
||||||
|
- `ok(msg: str)` - Success messages
|
||||||
|
- `warn(msg: str)` - Warnings
|
||||||
|
- `die(msg: str)` - Error messages with exit
|
||||||
|
- `table(rows: list, headers: list)` - Formatted tables
|
||||||
|
|
||||||
|
### Output Style Guide
|
||||||
|
|
||||||
|
```python
|
||||||
|
step("Starting cluster...") # ==> Starting cluster...
|
||||||
|
ok("Cluster ready") # Cluster ready
|
||||||
|
warn("Low memory") # WARN: Low memory
|
||||||
|
die("Failed to start") # ERROR: Failed to start (exits)
|
||||||
|
```
|
||||||
67
docs/index.md
Normal file
67
docs/index.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Sunbeam CLI Documentation
|
||||||
|
description: Comprehensive documentation for the Sunbeam local dev stack manager
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Sunbeam CLI Documentation
|
||||||
|
|
||||||
|
Welcome to the comprehensive documentation for **Sunbeam CLI** - a powerful local development stack manager for Kubernetes-based applications.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Sunbeam is a command-line tool designed to simplify the management of local development environments for Kubernetes applications. It provides a comprehensive suite of commands to handle cluster operations, service management, secret handling, and more.
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
- **Cluster Management**: Bring up and tear down local Kubernetes clusters
|
||||||
|
- **Service Operations**: Manage services, logs, and health checks
|
||||||
|
- **Secret Management**: Secure credential handling with OpenBao integration
|
||||||
|
- **Manifest Management**: Kustomize-based manifest application with domain substitution
|
||||||
|
- **User Management**: Identity management for development environments
|
||||||
|
- **Tool Bundling**: Automatic download and management of required binaries
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/your-org/sunbeam.git
|
||||||
|
cd sunbeam/cli
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pip install .
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
sunbeam --help
|
||||||
|
```
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start your local cluster
|
||||||
|
sunbeam up
|
||||||
|
|
||||||
|
# Check cluster status
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Apply manifests
|
||||||
|
sunbeam apply
|
||||||
|
|
||||||
|
# View service logs
|
||||||
|
sunbeam logs ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation Structure
|
||||||
|
|
||||||
|
- **[CLI Reference](cli-reference)**: Complete command reference
|
||||||
|
- **[Core Modules](core-modules)**: Detailed module documentation
|
||||||
|
- **[Architecture](architecture)**: System architecture and design
|
||||||
|
- **[Usage Examples](usage-examples)**: Practical usage scenarios
|
||||||
|
- **[Development Guide](development)**: Contributing and extending Sunbeam
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues, questions, or contributions, please refer to the [GitHub repository](https://github.com/your-org/sunbeam).
|
||||||
486
docs/usage-examples.md
Normal file
486
docs/usage-examples.md
Normal file
@@ -0,0 +1,486 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Usage Examples
|
||||||
|
description: Practical usage examples and best practices for Sunbeam CLI
|
||||||
|
parent: index
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Usage Examples and Best Practices
|
||||||
|
|
||||||
|
This section provides practical usage examples and best practices for working with Sunbeam CLI.
|
||||||
|
|
||||||
|
## Common Workflows
|
||||||
|
|
||||||
|
### Starting a New Development Session
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start the local cluster
|
||||||
|
sunbeam up
|
||||||
|
|
||||||
|
# Check cluster status
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Apply manifests with local domain
|
||||||
|
sunbeam apply
|
||||||
|
|
||||||
|
# Seed secrets
|
||||||
|
sunbeam seed
|
||||||
|
|
||||||
|
# Verify everything is working
|
||||||
|
sunbeam verify
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set environment variables
|
||||||
|
export SUNBEAM_SSH_HOST=user@your-server.example.com
|
||||||
|
|
||||||
|
# Apply production manifests with custom domain
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt --email ops@sunbeam.pt
|
||||||
|
|
||||||
|
# Check production status
|
||||||
|
sunbeam status --env production
|
||||||
|
|
||||||
|
# Restart specific service in production
|
||||||
|
sunbeam restart ory/kratos --env production
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging a Service Issue
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check service status
|
||||||
|
sunbeam status ory/kratos
|
||||||
|
|
||||||
|
# View recent logs
|
||||||
|
sunbeam logs ory/kratos
|
||||||
|
|
||||||
|
# Stream logs in real-time
|
||||||
|
sunbeam logs ory/kratos -f
|
||||||
|
|
||||||
|
# Get pod details
|
||||||
|
sunbeam get ory/kratos-abc123
|
||||||
|
|
||||||
|
# Restart the service
|
||||||
|
sunbeam restart ory/kratos
|
||||||
|
|
||||||
|
# Run health checks
|
||||||
|
sunbeam check ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage Patterns
|
||||||
|
|
||||||
|
### Partial Manifest Application
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply only specific namespace
|
||||||
|
sunbeam apply lasuite
|
||||||
|
|
||||||
|
# Apply multiple namespaces individually
|
||||||
|
sunbeam apply ingress
|
||||||
|
sunbeam apply ory
|
||||||
|
|
||||||
|
# Apply all manifests
|
||||||
|
sunbeam apply
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build and Deploy Workflow
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build an image
|
||||||
|
sunbeam build proxy
|
||||||
|
|
||||||
|
# Build and push to registry
|
||||||
|
sunbeam build proxy --push
|
||||||
|
|
||||||
|
# Build, push, and deploy
|
||||||
|
sunbeam build proxy --deploy
|
||||||
|
|
||||||
|
# Build multiple components
|
||||||
|
sunbeam build people-backend --push
|
||||||
|
sunbeam build people-frontend --push
|
||||||
|
sunbeam build proxy --deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### User Management Workflow
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new user
|
||||||
|
sunbeam user create user@example.com --name "User Name"
|
||||||
|
|
||||||
|
# Set user password
|
||||||
|
sunbeam user set-password user@example.com "securepassword123"
|
||||||
|
|
||||||
|
# List all users
|
||||||
|
sunbeam user list
|
||||||
|
|
||||||
|
# Get user details
|
||||||
|
sunbeam user get user@example.com
|
||||||
|
|
||||||
|
# Disable a user (lockout)
|
||||||
|
sunbeam user disable user@example.com
|
||||||
|
|
||||||
|
# Re-enable a user
|
||||||
|
sunbeam user enable user@example.com
|
||||||
|
|
||||||
|
# Generate recovery link
|
||||||
|
sunbeam user recover user@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Environment Management
|
||||||
|
|
||||||
|
**Use separate contexts for different environments:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Local development (default)
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Production with explicit context
|
||||||
|
sunbeam status --env production --context production
|
||||||
|
```
|
||||||
|
|
||||||
|
**Set domain appropriately:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Local development uses automatic Lima IP domain
|
||||||
|
sunbeam apply
|
||||||
|
|
||||||
|
# Production requires explicit domain
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service Management
|
||||||
|
|
||||||
|
**Use targeted restarts:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Restart specific service instead of all
|
||||||
|
sunbeam restart ory/kratos
|
||||||
|
|
||||||
|
# Restart namespace instead of entire cluster
|
||||||
|
sunbeam restart lasuite
|
||||||
|
```
|
||||||
|
|
||||||
|
**Monitor service health:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check status before and after operations
|
||||||
|
sunbeam status ory
|
||||||
|
|
||||||
|
# Use health checks for functional verification
|
||||||
|
sunbeam check ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manifest Management
|
||||||
|
|
||||||
|
**Apply in logical order:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply infrastructure first
|
||||||
|
sunbeam apply ingress
|
||||||
|
sunbeam apply data
|
||||||
|
|
||||||
|
# Then apply application layers
|
||||||
|
sunbeam apply ory
|
||||||
|
sunbeam apply lasuite
|
||||||
|
```
|
||||||
|
|
||||||
|
**Handle webhook dependencies:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# cert-manager must be ready before applying certificates
|
||||||
|
# Sunbeam automatically handles this with convergence passes
|
||||||
|
sunbeam apply
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging Techniques
|
||||||
|
|
||||||
|
**Use kubectl passthrough for advanced debugging:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Direct kubectl access
|
||||||
|
sunbeam k8s get pods -A -o wide
|
||||||
|
|
||||||
|
# Describe resources
|
||||||
|
sunbeam k8s describe pod ory/kratos-abc123
|
||||||
|
|
||||||
|
# View events
|
||||||
|
sunbeam k8s get events --sort-by=.metadata.creationTimestamp
|
||||||
|
```
|
||||||
|
|
||||||
|
**Check VSO secret sync status:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Status command includes VSO sync information
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Look for sync indicators in output
|
||||||
|
# ✓ indicates synced, ✗ indicates issues
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Management
|
||||||
|
|
||||||
|
**Use environment variables for sensitive data:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set ACME email via environment
|
||||||
|
export SUNBEAM_ACME_EMAIL=ops@sunbeam.pt
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt
|
||||||
|
```
|
||||||
|
|
||||||
|
**Manage multiple clusters:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use context overrides for different clusters
|
||||||
|
sunbeam status --context cluster1
|
||||||
|
sunbeam status --context cluster2
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Guide
|
||||||
|
|
||||||
|
### Common Issues and Solutions
|
||||||
|
|
||||||
|
**Issue: Cluster not starting**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check Lima VM status
|
||||||
|
limactl list
|
||||||
|
limactl start sunbeam
|
||||||
|
|
||||||
|
# Check cluster components
|
||||||
|
sunbeam k8s get nodes
|
||||||
|
sunbeam k8s get pods -A
|
||||||
|
```
|
||||||
|
|
||||||
|
**Issue: Manifest apply failures**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check for webhook issues
|
||||||
|
sunbeam k8s get validatingwebhookconfigurations
|
||||||
|
sunbeam k8s get mutatingwebhookconfigurations
|
||||||
|
|
||||||
|
# Check cert-manager status
|
||||||
|
sunbeam status cert-manager
|
||||||
|
sunbeam logs cert-manager/cert-manager
|
||||||
|
```
|
||||||
|
|
||||||
|
**Issue: Secret sync problems**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check VSO status
|
||||||
|
sunbeam status
|
||||||
|
|
||||||
|
# Check OpenBao connection
|
||||||
|
sunbeam bao status
|
||||||
|
|
||||||
|
# Verify secrets exist
|
||||||
|
sunbeam k8s get vaultstaticsecrets -A
|
||||||
|
sunbeam k8s get vaultdynamicsecrets -A
|
||||||
|
```
|
||||||
|
|
||||||
|
**Issue: Service not responding**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check service status
|
||||||
|
sunbeam status ory/kratos
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
sunbeam logs ory/kratos -f
|
||||||
|
|
||||||
|
# Check service and endpoint
|
||||||
|
sunbeam k8s get service ory/kratos
|
||||||
|
sunbeam k8s get endpoints ory/kratos
|
||||||
|
|
||||||
|
# Restart service
|
||||||
|
sunbeam restart ory/kratos
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integration Patterns
|
||||||
|
|
||||||
|
### CI/CD Integration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Example GitHub Actions workflow
|
||||||
|
- name: Deploy to production
|
||||||
|
env:
|
||||||
|
SUNBEAM_SSH_HOST: ${{ secrets.PRODUCTION_SSH_HOST }}
|
||||||
|
run: |
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt --email ops@sunbeam.pt
|
||||||
|
sunbeam check
|
||||||
|
```
|
||||||
|
|
||||||
|
### Local Development Workflow
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start fresh each day
|
||||||
|
sunbeam down
|
||||||
|
sunbeam up
|
||||||
|
sunbeam apply
|
||||||
|
sunbeam seed
|
||||||
|
|
||||||
|
# During development
|
||||||
|
sunbeam restart lasuite/people-backend
|
||||||
|
sunbeam logs lasuite/people-backend -f
|
||||||
|
|
||||||
|
# End of day cleanup
|
||||||
|
sunbeam down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Team Collaboration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Bootstrap new environment
|
||||||
|
sunbeam up
|
||||||
|
sunbeam apply
|
||||||
|
sunbeam seed
|
||||||
|
sunbeam bootstrap
|
||||||
|
|
||||||
|
# Onboard new team member
|
||||||
|
sunbeam user create newuser@company.com --name "New User"
|
||||||
|
sunbeam user set-password newuser@company.com "temporary123"
|
||||||
|
|
||||||
|
# Share access information
|
||||||
|
sunbeam user recover newuser@company.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Tips
|
||||||
|
|
||||||
|
**Targeted operations:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply only what's needed
|
||||||
|
sunbeam apply lasuite # Instead of sunbeam apply
|
||||||
|
|
||||||
|
# Restart only affected services
|
||||||
|
sunbeam restart ory/kratos # Instead of sunbeam restart
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use namespace filtering:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Focus on specific areas
|
||||||
|
sunbeam status lasuite
|
||||||
|
sunbeam logs lasuite/people-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
**Monitor resource usage:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check cluster resource usage
|
||||||
|
sunbeam k8s top nodes
|
||||||
|
sunbeam k8s top pods -A
|
||||||
|
|
||||||
|
# Check specific namespace
|
||||||
|
sunbeam k8s top pods -n lasuite
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Best Practices
|
||||||
|
|
||||||
|
**Secret management:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use sunbeam's built-in secret management
|
||||||
|
sunbeam seed
|
||||||
|
sunbeam verify
|
||||||
|
|
||||||
|
# Avoid hardcoding secrets in manifests
|
||||||
|
```
|
||||||
|
|
||||||
|
**User management:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Regularly audit users
|
||||||
|
sunbeam user list
|
||||||
|
|
||||||
|
# Disable unused accounts
|
||||||
|
sunbeam user disable olduser@company.com
|
||||||
|
|
||||||
|
# Rotate passwords regularly
|
||||||
|
sunbeam user set-password user@company.com "newsecurepassword"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Production access:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use SSH host environment variable securely
|
||||||
|
export SUNBEAM_SSH_HOST=user@server.example.com
|
||||||
|
|
||||||
|
# Never commit SSH host in code
|
||||||
|
# Use secret management for production credentials
|
||||||
|
```
|
||||||
|
|
||||||
|
## Monitoring and Maintenance
|
||||||
|
|
||||||
|
**Regular health checks:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Daily health monitoring
|
||||||
|
sunbeam status
|
||||||
|
sunbeam check
|
||||||
|
|
||||||
|
# Weekly deep checks
|
||||||
|
sunbeam verify
|
||||||
|
sunbeam k8s get events -A --sort-by=.metadata.creationTimestamp
|
||||||
|
```
|
||||||
|
|
||||||
|
**Log management:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check logs for errors
|
||||||
|
sunbeam logs ory/kratos | grep ERROR
|
||||||
|
sunbeam logs lasuite/people-backend | grep Exception
|
||||||
|
|
||||||
|
# Monitor specific services
|
||||||
|
sunbeam logs ingress/nginx-ingress -f
|
||||||
|
```
|
||||||
|
|
||||||
|
**Resource cleanup:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clean up completed jobs
|
||||||
|
sunbeam k8s delete jobs --field-selector=status.successful=1
|
||||||
|
|
||||||
|
# Remove old resources
|
||||||
|
sunbeam k8s delete pods --field-selector=status.phase=Succeeded
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Patterns
|
||||||
|
|
||||||
|
### Custom Domain Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Discover current domain
|
||||||
|
CURRENT_DOMAIN=$(sunbeam k8s get cm gitea-inline-config -n devtools -o jsonpath='{.data.server}' | grep DOMAIN= | cut -d= -f2)
|
||||||
|
|
||||||
|
# Apply with custom domain
|
||||||
|
sunbeam apply --domain custom.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-environment Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test changes in local first
|
||||||
|
sunbeam apply --env local
|
||||||
|
sunbeam check
|
||||||
|
|
||||||
|
# Then apply to production
|
||||||
|
sunbeam apply --env production --domain sunbeam.pt
|
||||||
|
sunbeam check --env production
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration with Other Tools
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use with kubectl
|
||||||
|
kubectl --context=sunbeam get pods -A
|
||||||
|
|
||||||
|
# Use with helm
|
||||||
|
helm --kube-context=sunbeam list -A
|
||||||
|
|
||||||
|
# Use with k9s (set context first)
|
||||||
|
sunbeam k8s config use-context sunbeam
|
||||||
|
k9s
|
||||||
|
```
|
||||||
286
docs/utility-modules.md
Normal file
286
docs/utility-modules.md
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Utility Modules
|
||||||
|
description: Documentation of Sunbeam's utility and helper modules
|
||||||
|
parent: index
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Utility Modules
|
||||||
|
|
||||||
|
Sunbeam includes several utility modules that provide essential helper functionality.
|
||||||
|
|
||||||
|
## Output Utilities (`sunbeam.output`)
|
||||||
|
|
||||||
|
The output module provides consistent formatting for user feedback and status messages.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
#### `step(msg: str)`
|
||||||
|
Print a step header with `==>` prefix.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: The message to display
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
step("Starting cluster initialization...")
|
||||||
|
# Output: ==> Starting cluster initialization...
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `ok(msg: str)`
|
||||||
|
Print a success or informational message with indentation.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: The message to display
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
ok("Cluster initialized successfully")
|
||||||
|
# Output: Cluster initialized successfully
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `warn(msg: str)`
|
||||||
|
Print a warning message to stderr.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: The warning message
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
warn("Low memory detected")
|
||||||
|
# Output: WARN: Low memory detected
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `die(msg: str)`
|
||||||
|
Print an error message and exit the program.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `msg`: The error message
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
die("Failed to connect to cluster")
|
||||||
|
# Output: ERROR: Failed to connect to cluster
|
||||||
|
# Exits with status code 1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `table(rows: list[list[str]], headers: list[str]) -> str`
|
||||||
|
Generate an aligned text table.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `rows`: List of row data (list of strings)
|
||||||
|
- `headers`: List of column headers
|
||||||
|
|
||||||
|
**Returns:** Formatted table string
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
table_data = table([
|
||||||
|
["pod-1", "Running", "2/2"],
|
||||||
|
["pod-2", "Pending", "0/1"]
|
||||||
|
], ["Name", "Status", "Ready"])
|
||||||
|
|
||||||
|
# Output:
|
||||||
|
# Name Status Ready
|
||||||
|
# -------------------------
|
||||||
|
# pod-1 Running 2/2
|
||||||
|
# pod-2 Pending 0/1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage Patterns
|
||||||
|
|
||||||
|
```python
|
||||||
|
from sunbeam.output import step, ok, warn, die, table
|
||||||
|
|
||||||
|
# Progress reporting
|
||||||
|
step("Deploying application...")
|
||||||
|
ok("Namespace created")
|
||||||
|
ok("ConfigMaps applied")
|
||||||
|
|
||||||
|
# Error handling
|
||||||
|
if not cluster_ready:
|
||||||
|
die("Cluster not ready - aborting deployment")
|
||||||
|
|
||||||
|
# Warning conditions
|
||||||
|
if memory_low:
|
||||||
|
warn("System memory is low - performance may be affected")
|
||||||
|
|
||||||
|
# Tabular data display
|
||||||
|
pod_data = [
|
||||||
|
["kratos-abc", "Running", "2/2"],
|
||||||
|
["hydra-xyz", "Running", "1/1"]
|
||||||
|
]
|
||||||
|
print(table(pod_data, ["Pod", "Status", "Ready"]))
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tool Management (`sunbeam.tools`)
|
||||||
|
|
||||||
|
The tools module handles automatic downloading, caching, and verification of required binaries.
|
||||||
|
|
||||||
|
### Constants
|
||||||
|
|
||||||
|
#### `CACHE_DIR`
|
||||||
|
Default cache directory: `~/.local/share/sunbeam/bin`
|
||||||
|
|
||||||
|
#### `TOOLS`
|
||||||
|
Dictionary of supported tools with version and download information:
|
||||||
|
|
||||||
|
```python
|
||||||
|
TOOLS = {
|
||||||
|
"kubectl": {
|
||||||
|
"version": "v1.32.2",
|
||||||
|
"url": "https://dl.k8s.io/release/v1.32.2/bin/darwin/arm64/kubectl",
|
||||||
|
"sha256": ""
|
||||||
|
},
|
||||||
|
"kustomize": {
|
||||||
|
"version": "v5.8.1",
|
||||||
|
"url": "https://github.com/kubernetes-sigs/kustomize/releases/download/...",
|
||||||
|
"sha256": "",
|
||||||
|
"extract": "kustomize"
|
||||||
|
},
|
||||||
|
"helm": {
|
||||||
|
"version": "v4.1.0",
|
||||||
|
"url": "https://get.helm.sh/helm-v4.1.0-darwin-arm64.tar.gz",
|
||||||
|
"sha256": "82f7065bf4e08d4c8d7881b85c0a080581ef4968a4ae6df4e7b432f8f7a88d0c",
|
||||||
|
"extract": "darwin-arm64/helm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
#### `ensure_tool(name: str) -> Path`
|
||||||
|
Ensure a tool is available, downloading and verifying if necessary.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `name`: Tool name (must be in TOOLS dictionary)
|
||||||
|
|
||||||
|
**Returns:** Path to the executable
|
||||||
|
|
||||||
|
**Behavior:**
|
||||||
|
- Checks cache for existing binary
|
||||||
|
- Verifies version and SHA256 hash
|
||||||
|
- Downloads if missing or verification fails
|
||||||
|
- Extracts from archives if needed
|
||||||
|
- Makes executable and sets permissions
|
||||||
|
- Caches version information
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
kubectl_path = ensure_tool("kubectl")
|
||||||
|
subprocess.run([str(kubectl_path), "version"])
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `run_tool(name: str, *args, **kwargs) -> subprocess.CompletedProcess`
|
||||||
|
Run a tool, ensuring it's downloaded first.
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `name`: Tool name
|
||||||
|
- `*args`: Arguments to pass to the tool
|
||||||
|
- `**kwargs`: Additional subprocess.run parameters
|
||||||
|
|
||||||
|
**Returns:** CompletedProcess result
|
||||||
|
|
||||||
|
**Special Handling:**
|
||||||
|
- For kustomize: Adds CACHE_DIR to PATH so helm is found
|
||||||
|
- Automatically ensures tool is available before running
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
result = run_tool("kustomize", "build", "overlays/local",
|
||||||
|
capture_output=True, text=True)
|
||||||
|
print(result.stdout)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `_sha256(path: Path) -> str`
|
||||||
|
Calculate SHA256 hash of a file (internal utility).
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `path`: Path to file
|
||||||
|
|
||||||
|
**Returns:** Hexadecimal SHA256 hash
|
||||||
|
|
||||||
|
### Tool Management Workflow
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A[ensure_tool] --> B{Tool in cache?}
|
||||||
|
B -->|Yes| C{Version matches?}
|
||||||
|
C -->|Yes| D{SHA256 matches?}
|
||||||
|
D -->|Yes| E[Return cached path]
|
||||||
|
B -->|No| F[Download]
|
||||||
|
C -->|No| F
|
||||||
|
D -->|No| F
|
||||||
|
F --> G{Extract needed?}
|
||||||
|
G -->|Yes| H[Extract from archive]
|
||||||
|
G -->|No| I[Save binary]
|
||||||
|
H --> I
|
||||||
|
I --> J{Verify SHA256?}
|
||||||
|
J -->|Yes| K{Hash matches?}
|
||||||
|
K -->|Yes| L[Set executable]
|
||||||
|
K -->|No| M[Error: Hash mismatch]
|
||||||
|
J -->|No| L
|
||||||
|
L --> N[Write version file]
|
||||||
|
N --> E
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
The module includes comprehensive error handling:
|
||||||
|
|
||||||
|
- **Unknown tools**: Raises `ValueError` for unsupported tools
|
||||||
|
- **Download failures**: Propagates network errors
|
||||||
|
- **SHA256 mismatches**: Raises `RuntimeError` with expected vs actual hashes
|
||||||
|
- **Permission issues**: Handles file system errors gracefully
|
||||||
|
|
||||||
|
## Helper Functions
|
||||||
|
|
||||||
|
### Target Parsing (`sunbeam.kube.parse_target`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def parse_target(s: str | None) -> tuple[str | None, str | None]:
|
||||||
|
"""Parse 'ns/name' -> ('ns', 'name'), 'ns' -> ('ns', None), None -> (None, None)."""
|
||||||
|
```
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```python
|
||||||
|
parse_target("ory/kratos") # ("ory", "kratos")
|
||||||
|
parse_target("lasuite") # ("lasuite", None)
|
||||||
|
parse_target(None) # (None, None)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Domain Replacement (`sunbeam.kube.domain_replace`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def domain_replace(text: str, domain: str) -> str:
|
||||||
|
"""Replace all occurrences of DOMAIN_SUFFIX with domain."""
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```python
|
||||||
|
manifest = "apiVersion: v1\nkind: Service\nspec:\n host: app.DOMAIN_SUFFIX"
|
||||||
|
domain_replace(manifest, "example.com")
|
||||||
|
# Returns: "apiVersion: v1\nkind: Service\nspec:\n host: app.example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lima VM IP Discovery (`sunbeam.kube.get_lima_ip`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_lima_ip() -> str:
|
||||||
|
"""Get the socket_vmnet IP of the Lima sunbeam VM (192.168.105.x)."""
|
||||||
|
```
|
||||||
|
|
||||||
|
Uses multiple fallback methods to discover the Lima VM IP address.
|
||||||
|
|
||||||
|
### Domain Discovery (`sunbeam.kube.get_domain`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_domain() -> str:
|
||||||
|
"""Discover the active domain from cluster state."""
|
||||||
|
```
|
||||||
|
|
||||||
|
Discovery priority:
|
||||||
|
1. Gitea inline-config secret
|
||||||
|
2. La Suite OIDC provider configmap
|
||||||
|
3. Lima VM IP with sslip.io domain
|
||||||
Reference in New Issue
Block a user