467 lines
12 KiB
Markdown
467 lines
12 KiB
Markdown
|
|
# Orchestrator Plugin Usage Examples
|
||
|
|
|
||
|
|
This document provides comprehensive examples for using the `nu_plugin_orchestrator` plugin.
|
||
|
|
|
||
|
|
## Installation
|
||
|
|
|
||
|
|
First, register the plugin with Nushell:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build the plugin
|
||
|
|
cd provisioning/core/plugins/nushell-plugins/nu_plugin_orchestrator
|
||
|
|
cargo build --release
|
||
|
|
|
||
|
|
# Register with Nushell
|
||
|
|
plugin add target/release/nu_plugin_orchestrator
|
||
|
|
```
|
||
|
|
|
||
|
|
## Commands Overview
|
||
|
|
|
||
|
|
The plugin provides three main commands:
|
||
|
|
|
||
|
|
1. **`orch status`** - Get orchestrator status from local state
|
||
|
|
2. **`orch validate`** - Validate workflow KCL files
|
||
|
|
3. **`orch tasks`** - List orchestrator tasks from local queue
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Checking Orchestrator Status
|
||
|
|
|
||
|
|
### Basic Status Check
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch status
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
```
|
||
|
|
╭─────────────────┬────────────────────────────────────────────────────────╮
|
||
|
|
│ running │ false │
|
||
|
|
│ tasks_pending │ 5 │
|
||
|
|
│ tasks_running │ 2 │
|
||
|
|
│ tasks_completed │ 10 │
|
||
|
|
│ last_check │ 2025-10-09T12:00:00Z │
|
||
|
|
│ data_dir │ provisioning/platform/orchestrator/data │
|
||
|
|
╰─────────────────┴────────────────────────────────────────────────────────╯
|
||
|
|
```
|
||
|
|
|
||
|
|
### Custom Data Directory
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch status --data-dir /custom/path/to/orchestrator/data
|
||
|
|
```
|
||
|
|
|
||
|
|
### Format as JSON
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch status | to json
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"running": false,
|
||
|
|
"tasks_pending": 5,
|
||
|
|
"tasks_running": 2,
|
||
|
|
"tasks_completed": 10,
|
||
|
|
"last_check": "2025-10-09T12:00:00Z",
|
||
|
|
"data_dir": "provisioning/platform/orchestrator/data"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Check if Orchestrator is Running
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
if (orch status | get running) {
|
||
|
|
print "Orchestrator is running"
|
||
|
|
} else {
|
||
|
|
print "Orchestrator is not running"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Validating Workflow Files
|
||
|
|
|
||
|
|
### Basic Validation
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch validate test-workflow.k
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output (Valid):**
|
||
|
|
```
|
||
|
|
╭──────────┬──────╮
|
||
|
|
│ valid │ true │
|
||
|
|
│ errors │ [] │
|
||
|
|
│ warnings │ [] │
|
||
|
|
╰──────────┴──────╯
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output (Invalid):**
|
||
|
|
```
|
||
|
|
╭──────────┬─────────────────────────────────────────────────────────────╮
|
||
|
|
│ valid │ false │
|
||
|
|
│ errors │ ["File not found: nonexistent.k"] │
|
||
|
|
│ warnings │ [] │
|
||
|
|
╰──────────┴─────────────────────────────────────────────────────────────╯
|
||
|
|
```
|
||
|
|
|
||
|
|
### Strict Validation
|
||
|
|
|
||
|
|
Strict mode performs additional checks for required fields:
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch validate workflow.k --strict
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
```
|
||
|
|
╭──────────┬──────────────────────────────────────────────────────────╮
|
||
|
|
│ valid │ false │
|
||
|
|
│ errors │ ["Missing 'operations' field (required)"] │
|
||
|
|
│ warnings │ ["Missing 'name' field", "Missing 'version' field"] │
|
||
|
|
╰──────────┴──────────────────────────────────────────────────────────╯
|
||
|
|
```
|
||
|
|
|
||
|
|
### Validation Pipeline
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Validate and check if valid
|
||
|
|
orch validate workflow.k | if $in.valid {
|
||
|
|
print "✓ Workflow is valid"
|
||
|
|
} else {
|
||
|
|
print "✗ Workflow has errors"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Validate multiple files
|
||
|
|
ls workflows/*.k | each { |file|
|
||
|
|
let result = (orch validate $file.name)
|
||
|
|
{
|
||
|
|
file: $file.name,
|
||
|
|
valid: $result.valid,
|
||
|
|
error_count: ($result.errors | length)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Extract Validation Errors
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Show only errors
|
||
|
|
orch validate workflow.k | get errors
|
||
|
|
|
||
|
|
# Show errors and warnings
|
||
|
|
let result = (orch validate workflow.k --strict)
|
||
|
|
print $"Errors: ($result.errors)"
|
||
|
|
print $"Warnings: ($result.warnings)"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Listing Tasks
|
||
|
|
|
||
|
|
### List All Tasks
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch tasks
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
```
|
||
|
|
╭───┬──────────┬──────────┬──────────┬──────────────────────┬──────────────╮
|
||
|
|
│ # │ id │ status │ priority │ created_at │ workflow_id │
|
||
|
|
├───┼──────────┼──────────┼──────────┼──────────────────────┼──────────────┤
|
||
|
|
│ 0 │ task-001 │ pending │ 10 │ 2025-10-09T10:00:00Z │ workflow-123 │
|
||
|
|
│ 1 │ task-002 │ running │ 8 │ 2025-10-09T10:30:00Z │ workflow-123 │
|
||
|
|
│ 2 │ task-003 │ pending │ 5 │ 2025-10-09T11:00:00Z │ │
|
||
|
|
╰───┴──────────┴──────────┴──────────┴──────────────────────┴──────────────╯
|
||
|
|
```
|
||
|
|
|
||
|
|
### Filter by Status
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Show only pending tasks
|
||
|
|
orch tasks --status pending
|
||
|
|
|
||
|
|
# Show only running tasks
|
||
|
|
orch tasks --status running
|
||
|
|
|
||
|
|
# Show only completed tasks
|
||
|
|
orch tasks --status completed
|
||
|
|
```
|
||
|
|
|
||
|
|
### Limit Results
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Show only first 10 tasks
|
||
|
|
orch tasks --limit 10
|
||
|
|
|
||
|
|
# Show top 5 pending tasks
|
||
|
|
orch tasks --status pending --limit 5
|
||
|
|
```
|
||
|
|
|
||
|
|
### Combine Filters
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Top 3 pending tasks
|
||
|
|
orch tasks --status pending --limit 3
|
||
|
|
```
|
||
|
|
|
||
|
|
### Task Analysis
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Count tasks by status
|
||
|
|
orch tasks | group-by status | each { |key, items|
|
||
|
|
{status: $key, count: ($items | length)}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Find high-priority tasks
|
||
|
|
orch tasks | where priority > 7
|
||
|
|
|
||
|
|
# Tasks without workflow
|
||
|
|
orch tasks | where workflow_id == null
|
||
|
|
|
||
|
|
# Tasks created in last hour
|
||
|
|
orch tasks | where created_at > ((date now) - 1hr)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Export to JSON
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Export all tasks
|
||
|
|
orch tasks | to json > tasks.json
|
||
|
|
|
||
|
|
# Export pending tasks
|
||
|
|
orch tasks --status pending | to json > pending-tasks.json
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Advanced Usage Examples
|
||
|
|
|
||
|
|
### Monitoring Dashboard
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
def orch-dashboard [] {
|
||
|
|
let status = (orch status)
|
||
|
|
let tasks = (orch tasks)
|
||
|
|
|
||
|
|
print $"╭─────────────────────────────────────╮"
|
||
|
|
print $"│ Orchestrator Dashboard │"
|
||
|
|
print $"╰─────────────────────────────────────╯"
|
||
|
|
print ""
|
||
|
|
print $"Status: ($status.running | if $in { '🟢 Running' } else { '🔴 Stopped' })"
|
||
|
|
print $"Pending: ($status.tasks_pending)"
|
||
|
|
print $"Running: ($status.tasks_running)"
|
||
|
|
print $"Completed: ($status.tasks_completed)"
|
||
|
|
print ""
|
||
|
|
|
||
|
|
let by_status = ($tasks | group-by status | each { |key, items|
|
||
|
|
{status: $key, count: ($items | length)}
|
||
|
|
})
|
||
|
|
|
||
|
|
print "Tasks by Status:"
|
||
|
|
$by_status | table
|
||
|
|
}
|
||
|
|
|
||
|
|
orch-dashboard
|
||
|
|
```
|
||
|
|
|
||
|
|
### Validation Report
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
def validate-all-workflows [] {
|
||
|
|
ls workflows/*.k | each { |file|
|
||
|
|
let result = (orch validate $file.name --strict)
|
||
|
|
{
|
||
|
|
file: ($file.name | path basename),
|
||
|
|
valid: $result.valid,
|
||
|
|
errors: ($result.errors | length),
|
||
|
|
warnings: ($result.warnings | length)
|
||
|
|
}
|
||
|
|
} | table
|
||
|
|
}
|
||
|
|
|
||
|
|
validate-all-workflows
|
||
|
|
```
|
||
|
|
|
||
|
|
### Task Queue Monitor
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
def monitor-queue [interval: duration = 5sec] {
|
||
|
|
loop {
|
||
|
|
clear
|
||
|
|
print $"Last updated: (date now)"
|
||
|
|
print ""
|
||
|
|
orch tasks | table
|
||
|
|
sleep $interval
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
monitor-queue
|
||
|
|
```
|
||
|
|
|
||
|
|
### Automatic Workflow Validation
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
def submit-workflow [workflow: string] {
|
||
|
|
let validation = (orch validate $workflow --strict)
|
||
|
|
|
||
|
|
if $validation.valid {
|
||
|
|
print $"✓ Workflow ($workflow) is valid"
|
||
|
|
# Submit to orchestrator
|
||
|
|
# http post http://localhost:8080/workflows/batch/submit ...
|
||
|
|
} else {
|
||
|
|
print $"✗ Workflow ($workflow) has errors:"
|
||
|
|
$validation.errors | each { |err| print $" - ($err)" }
|
||
|
|
error make {msg: "Workflow validation failed"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
submit-workflow test-workflow.k
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Environment Variables
|
||
|
|
|
||
|
|
The plugin respects the following environment variables:
|
||
|
|
|
||
|
|
- **`ORCHESTRATOR_DATA_DIR`**: Override default data directory
|
||
|
|
```bash
|
||
|
|
export ORCHESTRATOR_DATA_DIR=/custom/orchestrator/data
|
||
|
|
orch status
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Data Directory Structure
|
||
|
|
|
||
|
|
The plugin expects the following directory structure:
|
||
|
|
|
||
|
|
```
|
||
|
|
provisioning/platform/orchestrator/data/
|
||
|
|
├── status.json # Orchestrator status
|
||
|
|
└── tasks/ # Task queue
|
||
|
|
├── task-001.json
|
||
|
|
├── task-002.json
|
||
|
|
└── task-003.json
|
||
|
|
```
|
||
|
|
|
||
|
|
### Status File Format (`status.json`)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"running": true,
|
||
|
|
"tasks_pending": 5,
|
||
|
|
"tasks_running": 2,
|
||
|
|
"tasks_completed": 10,
|
||
|
|
"last_check": "2025-10-09T12:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Task File Format (`task-XXX.json`)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"id": "task-001",
|
||
|
|
"status": "pending",
|
||
|
|
"created_at": "2025-10-09T10:00:00Z",
|
||
|
|
"priority": 10,
|
||
|
|
"workflow_id": "workflow-123"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Plugin Not Found
|
||
|
|
|
||
|
|
If you get "command not found", ensure the plugin is registered:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
plugin list | where name == nu_plugin_orchestrator
|
||
|
|
```
|
||
|
|
|
||
|
|
If not listed, register it:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
plugin add target/release/nu_plugin_orchestrator
|
||
|
|
```
|
||
|
|
|
||
|
|
### Data Directory Not Found
|
||
|
|
|
||
|
|
If status.json or tasks directory doesn't exist, the plugin returns default values:
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
orch status # Returns default status with 0 tasks
|
||
|
|
orch tasks # Returns empty list
|
||
|
|
```
|
||
|
|
|
||
|
|
Create the directory structure:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
mkdir -p provisioning/platform/orchestrator/data/tasks
|
||
|
|
```
|
||
|
|
|
||
|
|
### KCL Validation Fails
|
||
|
|
|
||
|
|
Ensure `kcl` is in your PATH:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
which kcl
|
||
|
|
kcl --version
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Integration Examples
|
||
|
|
|
||
|
|
### With CI/CD
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# .gitlab-ci.yml
|
||
|
|
validate-workflows:
|
||
|
|
script:
|
||
|
|
- nu -c "ls workflows/*.k | each { |f| orch validate $f.name --strict }"
|
||
|
|
```
|
||
|
|
|
||
|
|
### With Nushell Scripts
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# deploy.nu
|
||
|
|
use std assert
|
||
|
|
|
||
|
|
def main [workflow: string] {
|
||
|
|
# Validate workflow
|
||
|
|
let validation = (orch validate $workflow --strict)
|
||
|
|
assert ($validation.valid) "Workflow validation failed"
|
||
|
|
|
||
|
|
# Check orchestrator is running
|
||
|
|
let status = (orch status)
|
||
|
|
assert ($status.running) "Orchestrator is not running"
|
||
|
|
|
||
|
|
# Submit workflow
|
||
|
|
print "Submitting workflow..."
|
||
|
|
# ... submit logic ...
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Performance Notes
|
||
|
|
|
||
|
|
- **`orch status`**: Reads single JSON file (~1ms)
|
||
|
|
- **`orch tasks`**: Walks task directory, O(n) for n tasks (~10ms for 1000 tasks)
|
||
|
|
- **`orch validate`**: Spawns `kcl` process (~50-100ms depending on workflow size)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- [Orchestrator Architecture](/.claude/features/orchestrator-architecture.md)
|
||
|
|
- [Batch Workflow System](/.claude/features/batch-workflow-system.md)
|
||
|
|
- [KCL Idiomatic Patterns](/.claude/kcl_idiomatic_patterns.md)
|