Files
cli/docs/api-reference.md

518 lines
11 KiB
Markdown
Raw Normal View History

---
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)
```