working out the worker/execution interface
This commit is contained in:
333
work-summary/2026-02-07-env-vars-ui-execution.md
Normal file
333
work-summary/2026-02-07-env-vars-ui-execution.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# Work Summary: Environment Variables UI for Manual Executions
|
||||
|
||||
**Date:** 2026-02-07
|
||||
**Status:** ✅ Complete
|
||||
**Related:** Secure Action Parameter Migration
|
||||
|
||||
## Overview
|
||||
|
||||
Added support for custom environment variables in manual action executions. Users can now specify optional environment variables (e.g., `DEBUG=true`, `LOG_LEVEL=debug`) through the web UI and API when manually executing actions. These are distinct from action parameters and are used for runtime configuration rather than action-specific data.
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. Backend Changes
|
||||
|
||||
#### API Layer (`attune/crates/api`)
|
||||
|
||||
**File:** `crates/api/src/dto/execution.rs`
|
||||
- Added `env_vars: Option<JsonValue>` field to `CreateExecutionRequest` DTO
|
||||
- Allows API clients to pass custom environment variables when creating manual executions
|
||||
- Example: `{"DEBUG": "true", "LOG_LEVEL": "info"}`
|
||||
|
||||
**File:** `crates/api/src/routes/executions.rs`
|
||||
- Updated `create_execution` handler to accept and process `env_vars` from request
|
||||
- Passes env_vars to `CreateExecutionInput` for database storage
|
||||
- Environment variables are now part of execution creation flow
|
||||
|
||||
#### Repository Layer (`attune/crates/common`)
|
||||
|
||||
**File:** `crates/common/src/repositories/execution.rs`
|
||||
- Added `env_vars: Option<JsonDict>` to `CreateExecutionInput` struct
|
||||
- Updated all SQL queries to include `env_vars` column:
|
||||
- `INSERT` statement for creating executions
|
||||
- All `SELECT` statements (find_by_id, list, find_by_status, find_by_enforcement)
|
||||
- `UPDATE` RETURNING clause
|
||||
- Environment variables are now persisted with each execution
|
||||
|
||||
**Note:** The `Execution` model already had the `env_vars` field (added in previous migration), so no model changes were needed.
|
||||
|
||||
#### Executor Service (`attune/crates/executor`)
|
||||
|
||||
**File:** `crates/executor/src/enforcement_processor.rs`
|
||||
- Added `env_vars: None` to executions created from rule enforcements
|
||||
- Rule-triggered executions don't use custom env vars (only manual executions do)
|
||||
|
||||
**File:** `crates/executor/src/execution_manager.rs`
|
||||
- Updated child execution creation to inherit `env_vars` from parent
|
||||
- Ensures environment variables propagate through workflow hierarchies
|
||||
- `env_vars: parent.env_vars.clone()` pattern for parent-child relationships
|
||||
|
||||
#### Test Files
|
||||
|
||||
Updated all test files to include `env_vars: None` in `CreateExecutionInput` instances:
|
||||
- `crates/api/tests/sse_execution_stream_tests.rs`
|
||||
- `crates/common/tests/execution_repository_tests.rs` (20+ test cases)
|
||||
- `crates/common/tests/inquiry_repository_tests.rs` (15+ test cases)
|
||||
- `crates/executor/tests/fifo_ordering_integration_test.rs`
|
||||
- `crates/executor/tests/policy_enforcer_tests.rs`
|
||||
|
||||
Used Python script to bulk-update test files efficiently.
|
||||
|
||||
### 2. Frontend Changes
|
||||
|
||||
#### Web UI (`attune/web`)
|
||||
|
||||
**File:** `web/src/pages/actions/ActionsPage.tsx`
|
||||
|
||||
**ExecuteActionModal Component Updates:**
|
||||
|
||||
1. **State Management:**
|
||||
- Added `envVars` state: `Array<{ key: string; value: string }>`
|
||||
- Initialized with one empty row: `[{ key: "", value: "" }]`
|
||||
|
||||
2. **Form Section:**
|
||||
- Added "Environment Variables" section after Parameters section
|
||||
- Displays help text: "Optional environment variables for this execution (e.g., DEBUG, LOG_LEVEL)"
|
||||
- Multiple row support with add/remove functionality
|
||||
|
||||
3. **UI Components:**
|
||||
- Two input fields per row: Key and Value
|
||||
- Remove button (X icon) on each row (disabled when only one row remains)
|
||||
- "Add Environment Variable" button below rows
|
||||
- Consistent styling with rest of modal (Tailwind CSS)
|
||||
|
||||
4. **Event Handlers:**
|
||||
- `addEnvVar()` - Adds new empty row
|
||||
- `removeEnvVar(index)` - Removes row at index (minimum 1 row enforced)
|
||||
- `updateEnvVar(index, field, value)` - Updates key or value at index
|
||||
|
||||
5. **API Integration:**
|
||||
- Updated `mutationFn` to accept `{ parameters, envVars }` object
|
||||
- Filters out empty env vars (rows with blank keys)
|
||||
- Converts array to object: `{"DEBUG": "true", "LOG_LEVEL": "info"}`
|
||||
- Sends as `env_vars` field in POST request to `/api/v1/executions/execute`
|
||||
|
||||
**Example UI Flow:**
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Execute Action X │
|
||||
├─────────────────────────────────────────┤
|
||||
│ Action: core.http_request │
|
||||
│ │
|
||||
│ Parameters │
|
||||
│ ┌────────────────────┐ │
|
||||
│ │ url: https://... │ │
|
||||
│ │ method: GET │ │
|
||||
│ └────────────────────┘ │
|
||||
│ │
|
||||
│ Environment Variables │
|
||||
│ Optional environment variables... │
|
||||
│ ┌──────────┬──────────┬───┐ │
|
||||
│ │ DEBUG │ true │ X │ │
|
||||
│ ├──────────┼──────────┼───┤ │
|
||||
│ │ LOG_LEVEL│ debug │ X │ │
|
||||
│ └──────────┴──────────┴───┘ │
|
||||
│ + Add Environment Variable │
|
||||
│ │
|
||||
│ [Cancel] [Execute] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3. Documentation Updates
|
||||
|
||||
**File:** `docs/QUICKREF-execution-environment.md`
|
||||
|
||||
Added comprehensive section on custom environment variables:
|
||||
|
||||
1. **Custom Environment Variables Section:**
|
||||
- Purpose and use cases
|
||||
- Format and examples
|
||||
- Important distinctions from parameters and secrets
|
||||
- API usage examples
|
||||
- Web UI reference
|
||||
- Action script usage patterns
|
||||
- Security notes
|
||||
|
||||
2. **Environment Variable Precedence:**
|
||||
- System defaults → Standard Attune vars → Custom env vars
|
||||
- Custom vars cannot override standard Attune variables
|
||||
|
||||
3. **Enhanced Distinctions:**
|
||||
- Clarified difference between:
|
||||
- Standard environment variables (system-provided)
|
||||
- Custom environment variables (user-provided, optional)
|
||||
- Action parameters (user-provided, action-specific data)
|
||||
- Provided comprehensive example showing all three types
|
||||
|
||||
4. **Updated Examples:**
|
||||
- Added custom env vars to local testing script
|
||||
- Showed combined usage of all three variable types
|
||||
- Added security best practices
|
||||
|
||||
## Key Design Decisions
|
||||
|
||||
### 1. Separate from Action Parameters
|
||||
- Environment variables are NOT action parameters
|
||||
- Parameters go via stdin (JSON), env vars via environment
|
||||
- This matches standard Unix conventions and StackStorm patterns
|
||||
|
||||
### 2. UI/UX Design
|
||||
- Multi-row key-value input (like Postman/curl)
|
||||
- Dynamic add/remove with minimum 1 row
|
||||
- Clear help text explaining purpose
|
||||
- Placed after parameters section for logical flow
|
||||
|
||||
### 3. Security Boundaries
|
||||
- Custom env vars stored in database (not secrets)
|
||||
- Documentation warns against using for sensitive data
|
||||
- Recommend `secret: true` parameters for sensitive data instead
|
||||
- Used for debug flags, feature toggles, runtime config only
|
||||
|
||||
### 4. Inheritance in Workflows
|
||||
- Child executions inherit parent's env_vars
|
||||
- Ensures consistent runtime config through workflow hierarchies
|
||||
- Same pattern as config inheritance
|
||||
|
||||
### 5. Rule-Triggered Executions
|
||||
- Rule-triggered executions get `env_vars: None`
|
||||
- Only manual executions can specify custom env vars
|
||||
- Keeps automated executions deterministic
|
||||
|
||||
## Testing
|
||||
|
||||
### Compilation
|
||||
```bash
|
||||
# Rust code compiles successfully
|
||||
cargo check --workspace
|
||||
# Output: Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.41s
|
||||
|
||||
# Web UI builds successfully
|
||||
cd web && npm run build
|
||||
# Output: ✓ built in 4.71s
|
||||
```
|
||||
|
||||
### Test Updates
|
||||
- All existing tests updated with `env_vars: None`
|
||||
- Bulk-updated using Python script for efficiency
|
||||
- ~40+ test cases across 5 test files
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Via Web UI
|
||||
1. Navigate to Actions page
|
||||
2. Click "Execute" on any action
|
||||
3. Fill in required parameters
|
||||
4. Add environment variables:
|
||||
- Key: `DEBUG`, Value: `true`
|
||||
- Key: `LOG_LEVEL`, Value: `debug`
|
||||
5. Click "Execute"
|
||||
|
||||
### Via API
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/v1/executions/execute \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"action_ref": "core.http_request",
|
||||
"parameters": {
|
||||
"url": "https://api.example.com",
|
||||
"method": "GET"
|
||||
},
|
||||
"env_vars": {
|
||||
"DEBUG": "true",
|
||||
"LOG_LEVEL": "debug",
|
||||
"TIMEOUT_SECONDS": "30"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
### In Action Script
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Custom env vars available as environment variables
|
||||
if [ "$DEBUG" = "true" ]; then
|
||||
set -x # Enable bash debug mode
|
||||
fi
|
||||
|
||||
LOG_LEVEL="${LOG_LEVEL:-info}"
|
||||
echo "Log level: $LOG_LEVEL" >&2
|
||||
|
||||
# Read parameters from stdin
|
||||
INPUT=$(cat)
|
||||
URL=$(echo "$INPUT" | jq -r '.url')
|
||||
|
||||
# Execute with both env vars and parameters
|
||||
curl "$URL"
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **Improved Debugging:**
|
||||
- Users can enable debug mode per execution
|
||||
- Adjust log levels without changing action code
|
||||
- Test different configurations easily
|
||||
|
||||
2. **Runtime Flexibility:**
|
||||
- Feature flags for experimental features
|
||||
- Timeout adjustments for specific executions
|
||||
- Retry count overrides for troubleshooting
|
||||
|
||||
3. **Clean Separation:**
|
||||
- Environment for runtime config
|
||||
- Parameters for action data
|
||||
- Secrets for sensitive data
|
||||
|
||||
4. **Developer Experience:**
|
||||
- Intuitive UI with dynamic rows
|
||||
- Familiar pattern (like Postman headers)
|
||||
- Clear documentation and examples
|
||||
|
||||
## Related Work
|
||||
|
||||
- [QUICKREF-action-parameters.md](../docs/QUICKREF-action-parameters.md) - Parameter delivery via stdin
|
||||
- [QUICKREF-execution-environment.md](../docs/QUICKREF-execution-environment.md) - Standard env vars
|
||||
- [2026-02-07-core-pack-stdin-migration.md](./2026-02-07-core-pack-stdin-migration.md) - Secure parameter delivery
|
||||
|
||||
## Files Changed
|
||||
|
||||
### Backend (Rust)
|
||||
- `crates/api/src/dto/execution.rs`
|
||||
- `crates/api/src/routes/executions.rs`
|
||||
- `crates/common/src/repositories/execution.rs`
|
||||
- `crates/executor/src/enforcement_processor.rs`
|
||||
- `crates/executor/src/execution_manager.rs`
|
||||
- `crates/api/tests/sse_execution_stream_tests.rs`
|
||||
- `crates/common/tests/execution_repository_tests.rs`
|
||||
- `crates/common/tests/inquiry_repository_tests.rs`
|
||||
- `crates/executor/tests/fifo_ordering_integration_test.rs`
|
||||
- `crates/executor/tests/policy_enforcer_tests.rs`
|
||||
|
||||
### Frontend (TypeScript)
|
||||
- `web/src/pages/actions/ActionsPage.tsx`
|
||||
|
||||
### Documentation
|
||||
- `docs/QUICKREF-execution-environment.md`
|
||||
|
||||
## Next Steps
|
||||
|
||||
**Recommended:**
|
||||
1. Regenerate OpenAPI spec to include env_vars field
|
||||
2. Regenerate TypeScript API client from updated spec
|
||||
3. Add env_vars to execution detail page display
|
||||
4. Consider adding preset env var templates (common debug configs)
|
||||
|
||||
**Optional Enhancements:**
|
||||
5. Add env var validation (key format, reserved names)
|
||||
6. Add autocomplete for common env var names
|
||||
7. Add env var inheritance toggle in workflow UI
|
||||
8. Add execution replay with same env vars
|
||||
|
||||
## Notes
|
||||
|
||||
- Environment variables are optional - most executions won't use them
|
||||
- Primary use case is debugging and troubleshooting
|
||||
- Not intended for production workflow configuration (use parameters)
|
||||
- Complements but doesn't replace action parameters or secrets
|
||||
- Follows Unix/Linux environment variable conventions
|
||||
- Implementation aligns with StackStorm's `env:` execution parameter
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✅ Users can add custom env vars in UI
|
||||
✅ Env vars sent to API and stored in database
|
||||
✅ Env vars available to action scripts as environment variables
|
||||
✅ Child executions inherit parent env vars
|
||||
✅ Clear documentation and examples
|
||||
✅ All tests pass and code compiles
|
||||
✅ Security boundaries maintained (not for secrets)
|
||||
|
||||
---
|
||||
|
||||
**Implementation Time:** ~2 hours
|
||||
**Complexity:** Medium (backend + frontend + docs)
|
||||
**Impact:** High (improves debugging/troubleshooting workflow)
|
||||
Reference in New Issue
Block a user