449 lines
10 KiB
Markdown
449 lines
10 KiB
Markdown
|
|
# Unified Workspace:Infrastructure Reference System
|
||
|
|
|
||
|
|
**Version**: 1.0.0
|
||
|
|
**Last Updated**: 2025-12-04
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The Workspace:Infrastructure Reference System provides a unified notation for managing workspaces and their associated infrastructure. This system eliminates the need to specify infrastructure separately and enables convenient defaults.
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
### Temporal Override (Single Command)
|
||
|
|
|
||
|
|
Use the `-ws` flag with `workspace:infra` notation:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Use production workspace with sgoyol infrastructure for this command only
|
||
|
|
provisioning server list -ws production:sgoyol
|
||
|
|
|
||
|
|
# Use default infrastructure of active workspace
|
||
|
|
provisioning taskserv create kubernetes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Persistent Activation
|
||
|
|
|
||
|
|
Activate a workspace with a default infrastructure:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Activate librecloud workspace and set wuji as default infra
|
||
|
|
provisioning workspace activate librecloud:wuji
|
||
|
|
|
||
|
|
# Now all commands use librecloud:wuji by default
|
||
|
|
provisioning server list
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Notation Syntax
|
||
|
|
|
||
|
|
### Basic Format
|
||
|
|
|
||
|
|
```plaintext
|
||
|
|
workspace:infra
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
| Part | Description | Example |
|
||
|
|
|------|-------------|---------|
|
||
|
|
| `workspace` | Workspace name | `librecloud` |
|
||
|
|
| `:` | Separator | - |
|
||
|
|
| `infra` | Infrastructure name | `wuji` |
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
| Notation | Workspace | Infrastructure |
|
||
|
|
|----------|-----------|-----------------|
|
||
|
|
| `librecloud:wuji` | librecloud | wuji |
|
||
|
|
| `production:sgoyol` | production | sgoyol |
|
||
|
|
| `dev:local` | dev | local |
|
||
|
|
| `librecloud` | librecloud | (from default or context) |
|
||
|
|
|
||
|
|
## Resolution Priority
|
||
|
|
|
||
|
|
When no infrastructure is explicitly specified, the system uses this priority order:
|
||
|
|
|
||
|
|
1. **Explicit `--infra` flag** (highest)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
provisioning server list --infra another-infra
|
||
|
|
```
|
||
|
|
|
||
|
|
1. **PWD Detection**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd workspace_librecloud/infra/wuji
|
||
|
|
provisioning server list # Auto-detects wuji
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Default Infrastructure**
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# If workspace has default_infra set
|
||
|
|
provisioning server list # Uses configured default
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Error** (no infra found)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Error: No infrastructure specified
|
||
|
|
```
|
||
|
|
|
||
|
|
## Usage Patterns
|
||
|
|
|
||
|
|
### Pattern 1: Temporal Override for Commands
|
||
|
|
|
||
|
|
Use `-ws` to override workspace:infra for a single command:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Currently in librecloud:wuji context
|
||
|
|
provisioning server list # Shows librecloud:wuji
|
||
|
|
|
||
|
|
# Temporary override for this command only
|
||
|
|
provisioning server list -ws production:sgoyol # Shows production:sgoyol
|
||
|
|
|
||
|
|
# Back to original context
|
||
|
|
provisioning server list # Shows librecloud:wuji again
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Pattern 2: Persistent Workspace Activation
|
||
|
|
|
||
|
|
Set a workspace as active with a default infrastructure:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# List available workspaces
|
||
|
|
provisioning workspace list
|
||
|
|
|
||
|
|
# Activate with infra notation
|
||
|
|
provisioning workspace activate production:sgoyol
|
||
|
|
|
||
|
|
# All subsequent commands use production:sgoyol
|
||
|
|
provisioning server list
|
||
|
|
provisioning taskserv create kubernetes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Pattern 3: PWD-Based Inference
|
||
|
|
|
||
|
|
The system auto-detects workspace and infrastructure from your current directory:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Your workspace structure
|
||
|
|
workspace_librecloud/
|
||
|
|
infra/
|
||
|
|
wuji/
|
||
|
|
settings.ncl
|
||
|
|
another/
|
||
|
|
settings.ncl
|
||
|
|
|
||
|
|
# Navigation auto-detects context
|
||
|
|
cd workspace_librecloud/infra/wuji
|
||
|
|
provisioning server list # Uses wuji automatically
|
||
|
|
|
||
|
|
cd ../another
|
||
|
|
provisioning server list # Switches to another
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Pattern 4: Default Infrastructure Management
|
||
|
|
|
||
|
|
Set a workspace-specific default infrastructure:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# During activation
|
||
|
|
provisioning workspace activate librecloud:wuji
|
||
|
|
|
||
|
|
# Or explicitly after activation
|
||
|
|
provisioning workspace set-default-infra librecloud another-infra
|
||
|
|
|
||
|
|
# View current defaults
|
||
|
|
provisioning workspace list
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Command Reference
|
||
|
|
|
||
|
|
### Workspace Commands
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Activate workspace with infra
|
||
|
|
provisioning workspace activate workspace:infra
|
||
|
|
|
||
|
|
# Switch to different workspace
|
||
|
|
provisioning workspace switch workspace_name
|
||
|
|
|
||
|
|
# List all workspaces
|
||
|
|
provisioning workspace list
|
||
|
|
|
||
|
|
# Show active workspace
|
||
|
|
provisioning workspace active
|
||
|
|
|
||
|
|
# Set default infrastructure
|
||
|
|
provisioning workspace set-default-infra workspace_name infra_name
|
||
|
|
|
||
|
|
# Get default infrastructure
|
||
|
|
provisioning workspace get-default-infra workspace_name
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Common Commands with `-ws`
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Server operations
|
||
|
|
provisioning server create -ws workspace:infra
|
||
|
|
provisioning server list -ws workspace:infra
|
||
|
|
provisioning server delete name -ws workspace:infra
|
||
|
|
|
||
|
|
# Task service operations
|
||
|
|
provisioning taskserv create kubernetes -ws workspace:infra
|
||
|
|
provisioning taskserv delete kubernetes -ws workspace:infra
|
||
|
|
|
||
|
|
# Infrastructure operations
|
||
|
|
provisioning infra validate -ws workspace:infra
|
||
|
|
provisioning infra list -ws workspace:infra
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
### ✅ Unified Notation
|
||
|
|
|
||
|
|
- Single `workspace:infra` format for all references
|
||
|
|
- Works with all provisioning commands
|
||
|
|
- Backward compatible with existing workflows
|
||
|
|
|
||
|
|
### ✅ Temporal Override
|
||
|
|
|
||
|
|
- Use `-ws` flag for single-command overrides
|
||
|
|
- No permanent state changes
|
||
|
|
- Automatically reverted after command
|
||
|
|
|
||
|
|
### ✅ Persistent Defaults
|
||
|
|
|
||
|
|
- Set default infrastructure per workspace
|
||
|
|
- Eliminates repetitive `--infra` flags
|
||
|
|
- Survives across sessions
|
||
|
|
|
||
|
|
### ✅ Smart Detection
|
||
|
|
|
||
|
|
- Auto-detects workspace from directory
|
||
|
|
- Auto-detects infrastructure from PWD
|
||
|
|
- Fallback to configured defaults
|
||
|
|
|
||
|
|
### ✅ Error Handling
|
||
|
|
|
||
|
|
- Clear error messages when infra not found
|
||
|
|
- Validation of workspace and infra existence
|
||
|
|
- Helpful hints for missing configurations
|
||
|
|
|
||
|
|
## Environment Context
|
||
|
|
|
||
|
|
### TEMP_WORKSPACE Variable
|
||
|
|
|
||
|
|
The system uses `$env.TEMP_WORKSPACE` for temporal overrides:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Set temporarily (via -ws flag automatically)
|
||
|
|
$env.TEMP_WORKSPACE = "production"
|
||
|
|
|
||
|
|
# Check current context
|
||
|
|
echo $env.TEMP_WORKSPACE
|
||
|
|
|
||
|
|
# Clear after use
|
||
|
|
hide-env TEMP_WORKSPACE
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Validation
|
||
|
|
|
||
|
|
### Validating Notation
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Valid notation formats
|
||
|
|
librecloud:wuji # Standard format
|
||
|
|
production:sgoyol.v2 # With dots and hyphens
|
||
|
|
dev-01:local-test # Multiple hyphens
|
||
|
|
prod123:infra456 # Numeric names
|
||
|
|
|
||
|
|
# Special characters
|
||
|
|
lib-cloud_01:wu-ji.v2 # Mix of all allowed chars
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Error Cases
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Workspace not found
|
||
|
|
provisioning workspace activate unknown:infra
|
||
|
|
# Error: Workspace 'unknown' not found in registry
|
||
|
|
|
||
|
|
# Infrastructure not found
|
||
|
|
provisioning workspace activate librecloud:unknown
|
||
|
|
# Error: Infrastructure 'unknown' not found in workspace 'librecloud'
|
||
|
|
|
||
|
|
# Empty specification
|
||
|
|
provisioning workspace activate ""
|
||
|
|
# Error: Workspace '' not found in registry
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
### User Configuration
|
||
|
|
|
||
|
|
Default infrastructure is stored in `~/Library/Application Support/provisioning/user_config.yaml`:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
active_workspace: "librecloud"
|
||
|
|
|
||
|
|
workspaces:
|
||
|
|
- name: "librecloud"
|
||
|
|
path: "/Users/you/workspaces/librecloud"
|
||
|
|
last_used: "2025-12-04T12:00:00Z"
|
||
|
|
default_infra: "wuji" # Default infrastructure
|
||
|
|
|
||
|
|
- name: "production"
|
||
|
|
path: "/opt/workspaces/production"
|
||
|
|
last_used: "2025-12-03T15:30:00Z"
|
||
|
|
default_infra: "sgoyol"
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Workspace Schema
|
||
|
|
|
||
|
|
In `provisioning/schemas/workspace_config.ncl`:
|
||
|
|
|
||
|
|
```nickel
|
||
|
|
{
|
||
|
|
InfraConfig = {
|
||
|
|
current | String, # Infrastructure context settings
|
||
|
|
default | String | optional, # Default infrastructure for workspace
|
||
|
|
},
|
||
|
|
}
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
### 1. Use Persistent Activation for Long Sessions
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Activate at start of session
|
||
|
|
provisioning workspace activate production:sgoyol
|
||
|
|
|
||
|
|
# Then use simple commands
|
||
|
|
provisioning server list
|
||
|
|
provisioning taskserv create kubernetes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### 2. Use Temporal Override for Ad-Hoc Operations
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Quick one-off operation
|
||
|
|
provisioning server list -ws production:other-infra
|
||
|
|
|
||
|
|
# Avoid: Repeated -ws flags
|
||
|
|
provisioning server list -ws prod:infra1
|
||
|
|
provisioning taskserv list -ws prod:infra1 # Better to activate once
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### 3. Navigate with PWD for Context Awareness
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Navigate to infrastructure directory
|
||
|
|
cd workspace_librecloud/infra/wuji
|
||
|
|
provisioning server list # Auto-detects context
|
||
|
|
|
||
|
|
# Works well with: cd - history, terminal multiplexer panes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### 4. Set Meaningful Defaults
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Default to production infrastructure
|
||
|
|
provisioning workspace activate production:main-infra
|
||
|
|
|
||
|
|
# Avoid: Default to dev infrastructure in production workspace
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Issue: "Workspace not found in registry"
|
||
|
|
|
||
|
|
**Solution**: Register the workspace first
|
||
|
|
|
||
|
|
```bash
|
||
|
|
provisioning workspace register librecloud /path/to/workspace_librecloud
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Issue: "Infrastructure not found"
|
||
|
|
|
||
|
|
**Solution**: Verify infrastructure directory exists
|
||
|
|
|
||
|
|
```bash
|
||
|
|
ls workspace_librecloud/infra/ # Check available infras
|
||
|
|
provisioning workspace activate librecloud:wuji # Use correct name
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Issue: Temporal override not working
|
||
|
|
|
||
|
|
**Solution**: Ensure you're using `-ws` flag correctly
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Correct
|
||
|
|
provisioning server list -ws production:sgoyol
|
||
|
|
|
||
|
|
# Incorrect (missing space)
|
||
|
|
provisioning server list-wsproduction:sgoyol
|
||
|
|
|
||
|
|
# Incorrect (ws is not a command)
|
||
|
|
provisioning -ws production:sgoyol server list
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### Issue: PWD detection not working
|
||
|
|
|
||
|
|
**Solution**: Navigate to proper infrastructure directory
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Must be in workspace structure
|
||
|
|
cd workspace_name/infra/infra_name
|
||
|
|
|
||
|
|
# Then run command
|
||
|
|
provisioning server list
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Migration from Old System
|
||
|
|
|
||
|
|
### Old Way
|
||
|
|
|
||
|
|
```bash
|
||
|
|
provisioning workspace activate librecloud
|
||
|
|
provisioning --infra wuji server list
|
||
|
|
provisioning --infra wuji taskserv create kubernetes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
### New Way
|
||
|
|
|
||
|
|
```bash
|
||
|
|
provisioning workspace activate librecloud:wuji
|
||
|
|
provisioning server list
|
||
|
|
provisioning taskserv create kubernetes
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## Performance Notes
|
||
|
|
|
||
|
|
- **Notation parsing**: <1 ms per command
|
||
|
|
- **Workspace detection**: <5 ms from PWD
|
||
|
|
- **Workspace switching**: ~100 ms (includes platform activation)
|
||
|
|
- **Temporal override**: No additional overhead
|
||
|
|
|
||
|
|
## Backward Compatibility
|
||
|
|
|
||
|
|
All existing commands and flags continue to work:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Old syntax still works
|
||
|
|
provisioning --infra wuji server list
|
||
|
|
|
||
|
|
# New syntax also works
|
||
|
|
provisioning server list -ws librecloud:wuji
|
||
|
|
|
||
|
|
# Mix and match
|
||
|
|
provisioning --infra other-infra server list -ws librecloud:wuji
|
||
|
|
# Uses other-infra (explicit flag takes priority)
|
||
|
|
```plaintext
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- `provisioning help workspace` - Workspace commands
|
||
|
|
- `provisioning help infra` - Infrastructure commands
|
||
|
|
- `docs/architecture/ARCHITECTURE_OVERVIEW.md` - Overall architecture
|
||
|
|
- `docs/user/WORKSPACE_SWITCHING_GUIDE.md` - Workspace switching details
|