333 lines
12 KiB
Markdown
333 lines
12 KiB
Markdown
# 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) |