383 lines
8.7 KiB
Markdown
383 lines
8.7 KiB
Markdown
# Pack Installation with Testing Integration
|
|
|
|
## Overview
|
|
|
|
Pack installation and registration now includes automatic test execution to validate that packs work correctly in the target environment. This provides fail-fast validation and ensures quality across the pack ecosystem.
|
|
|
|
## Features
|
|
|
|
- **Automatic Test Execution**: Tests run automatically during pack installation/registration
|
|
- **Fail-Fast Validation**: Installation fails if tests don't pass (unless forced)
|
|
- **Test Result Storage**: All test results are stored in the database for audit trails
|
|
- **Flexible Control**: Skip tests or force installation with command-line flags
|
|
- **Test Result Display**: CLI shows test results with pass/fail status
|
|
|
|
## Installation Methods
|
|
|
|
### 1. Register Pack (Local Directory)
|
|
|
|
Register a pack from a local filesystem directory:
|
|
|
|
```bash
|
|
# Basic registration with automatic testing
|
|
attune pack register /path/to/pack
|
|
|
|
# Force registration even if pack already exists
|
|
attune pack register /path/to/pack --force
|
|
|
|
# Skip tests during registration
|
|
attune pack register /path/to/pack --skip-tests
|
|
|
|
# Combine flags
|
|
attune pack register /path/to/pack --force --skip-tests
|
|
```
|
|
|
|
**How it works:**
|
|
1. Reads `pack.yaml` from the directory
|
|
2. Creates pack record in database
|
|
3. Syncs workflows from pack directory
|
|
4. **Runs pack tests** (if not skipped)
|
|
5. **Fails registration if tests fail** (unless `--force` is used)
|
|
6. Stores test results in database
|
|
|
|
### 2. Install Pack (Remote Source)
|
|
|
|
**Status**: Not yet implemented
|
|
|
|
Install a pack from a git repository or remote source:
|
|
|
|
```bash
|
|
# Install from git repository (future)
|
|
attune pack install https://github.com/attune/pack-slack.git
|
|
|
|
# Install specific version (future)
|
|
attune pack install https://github.com/attune/pack-slack.git --ref v1.0.0
|
|
```
|
|
|
|
This feature will be implemented in a future release.
|
|
|
|
## API Endpoints
|
|
|
|
### Register Pack
|
|
|
|
**Endpoint**: `POST /api/v1/packs/register`
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"path": "/path/to/pack/directory",
|
|
"force": false,
|
|
"skip_tests": false
|
|
}
|
|
```
|
|
|
|
**Response** (201 Created):
|
|
```json
|
|
{
|
|
"data": {
|
|
"pack": {
|
|
"id": 1,
|
|
"ref": "mypack",
|
|
"label": "My Pack",
|
|
"version": "1.0.0",
|
|
...
|
|
},
|
|
"test_result": {
|
|
"pack_ref": "mypack",
|
|
"pack_version": "1.0.0",
|
|
"status": "passed",
|
|
"total_tests": 10,
|
|
"passed": 10,
|
|
"failed": 0,
|
|
"skipped": 0,
|
|
"pass_rate": 1.0,
|
|
"duration_ms": 1234,
|
|
"test_suites": [...]
|
|
},
|
|
"tests_skipped": false
|
|
},
|
|
"message": "Pack registered successfully"
|
|
}
|
|
```
|
|
|
|
**Error Response** (400 Bad Request) - Tests Failed:
|
|
```json
|
|
{
|
|
"error": "Pack registration failed: tests did not pass. Use force=true to register anyway.",
|
|
"code": "BAD_REQUEST"
|
|
}
|
|
```
|
|
|
|
### Install Pack
|
|
|
|
**Endpoint**: `POST /api/v1/packs/install`
|
|
|
|
**Status**: Returns 501 Not Implemented
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"source": "https://github.com/attune/pack-slack.git",
|
|
"ref_spec": "main",
|
|
"force": false,
|
|
"skip_tests": false
|
|
}
|
|
```
|
|
|
|
This endpoint will be implemented in a future release.
|
|
|
|
## Test Execution Behavior
|
|
|
|
### Default Behavior (Tests Enabled)
|
|
|
|
When registering a pack with tests configured in `pack.yaml`:
|
|
|
|
1. **Tests are automatically executed** after pack creation
|
|
2. **Test results are stored** in the `pack_test_execution` table
|
|
3. **Registration fails** if any test fails
|
|
4. **Pack record is rolled back** if tests fail (unless `--force` is used)
|
|
|
|
### Skip Tests (`--skip-tests` flag)
|
|
|
|
Use this flag when:
|
|
- Tests are known to be slow or flaky
|
|
- Testing in a non-standard environment
|
|
- Manually verifying pack functionality later
|
|
|
|
```bash
|
|
attune pack register /path/to/pack --skip-tests
|
|
```
|
|
|
|
**Behavior**:
|
|
- Tests are not executed
|
|
- No test results are stored
|
|
- Registration always succeeds (no validation)
|
|
- Response includes `"tests_skipped": true`
|
|
|
|
### Force Registration (`--force` flag)
|
|
|
|
Use this flag when:
|
|
- Pack already exists and you want to reinstall
|
|
- Tests are failing but you need to proceed anyway
|
|
- Developing and iterating on pack tests
|
|
|
|
```bash
|
|
attune pack register /path/to/pack --force
|
|
```
|
|
|
|
**Behavior**:
|
|
- Deletes existing pack if it exists
|
|
- Tests still run (unless `--skip-tests` is also used)
|
|
- **Registration succeeds even if tests fail**
|
|
- Warning logged if tests fail
|
|
|
|
### Combined Flags
|
|
|
|
```bash
|
|
# Force reinstall and skip tests entirely
|
|
attune pack register /path/to/pack --force --skip-tests
|
|
```
|
|
|
|
## CLI Output Examples
|
|
|
|
### Successful Registration with Tests
|
|
|
|
```
|
|
✓ Pack 'core' registered successfully
|
|
Version: 0.1.0
|
|
ID: 1
|
|
✓ All tests passed
|
|
Tests: 76/76 passed
|
|
```
|
|
|
|
### Failed Registration (Tests Failed)
|
|
|
|
```
|
|
✗ Error: Pack registration failed: tests did not pass. Use force=true to register anyway.
|
|
```
|
|
|
|
### Registration with Skipped Tests
|
|
|
|
```
|
|
✓ Pack 'core' registered successfully
|
|
Version: 0.1.0
|
|
ID: 1
|
|
Tests were skipped
|
|
```
|
|
|
|
### Forced Registration with Failed Tests
|
|
|
|
```
|
|
⚠ Pack 'mypack' registered successfully
|
|
Version: 1.0.0
|
|
ID: 2
|
|
✗ Some tests failed
|
|
Tests: 8/10 passed
|
|
```
|
|
|
|
## Testing Requirements
|
|
|
|
For a pack to support automatic testing during installation:
|
|
|
|
1. **`pack.yaml` must include a `testing` section**:
|
|
|
|
```yaml
|
|
testing:
|
|
enabled: true
|
|
test_suites:
|
|
- name: "Unit Tests"
|
|
runner: "python_unittest"
|
|
working_dir: "tests"
|
|
test_files:
|
|
- "test_*.py"
|
|
timeout_seconds: 60
|
|
```
|
|
|
|
2. **Test files must exist** in the specified locations
|
|
3. **Tests must be executable** in the target environment
|
|
|
|
See [Pack Testing Framework](./PACK_TESTING.md) for detailed test configuration.
|
|
|
|
## Database Storage
|
|
|
|
All test executions are stored in the `attune.pack_test_execution` table:
|
|
|
|
- **pack_id**: Reference to the pack
|
|
- **pack_version**: Version tested
|
|
- **trigger_reason**: How tests were triggered (e.g., "register", "manual")
|
|
- **total_tests**, **passed**, **failed**, **skipped**: Test counts
|
|
- **pass_rate**: Percentage of tests passed
|
|
- **duration_ms**: Total execution time
|
|
- **result**: Full test results as JSON
|
|
|
|
Query test history:
|
|
```bash
|
|
attune pack test-history core
|
|
```
|
|
|
|
Or via API:
|
|
```bash
|
|
curl -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8080/api/v1/packs/core/tests
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Pack Directory Not Found
|
|
|
|
```json
|
|
{
|
|
"error": "Pack directory does not exist: /invalid/path",
|
|
"code": "BAD_REQUEST"
|
|
}
|
|
```
|
|
|
|
### Missing pack.yaml
|
|
|
|
```json
|
|
{
|
|
"error": "pack.yaml not found in directory: /path/to/pack",
|
|
"code": "BAD_REQUEST"
|
|
}
|
|
```
|
|
|
|
### No Testing Configuration
|
|
|
|
```json
|
|
{
|
|
"error": "No testing configuration found in pack.yaml for pack 'mypack'",
|
|
"code": "BAD_REQUEST"
|
|
}
|
|
```
|
|
|
|
### Testing Disabled
|
|
|
|
```json
|
|
{
|
|
"error": "Testing is disabled for pack 'mypack'",
|
|
"code": "BAD_REQUEST"
|
|
}
|
|
```
|
|
|
|
### Pack Already Exists
|
|
|
|
```json
|
|
{
|
|
"error": "Pack 'mypack' already exists. Use force=true to reinstall.",
|
|
"code": "CONFLICT"
|
|
}
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### Development Workflow
|
|
|
|
1. **During active development**: Use `--skip-tests` for faster iteration
|
|
```bash
|
|
attune pack register ./my-pack --force --skip-tests
|
|
```
|
|
|
|
2. **Before committing**: Run tests explicitly to validate
|
|
```bash
|
|
attune pack test my-pack
|
|
```
|
|
|
|
3. **For production**: Let tests run automatically during registration
|
|
```bash
|
|
attune pack register ./my-pack
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
In your CI/CD pipeline:
|
|
|
|
```bash
|
|
# Register pack (tests will run automatically)
|
|
attune pack register ./pack-directory
|
|
|
|
# Exit code will be non-zero if tests fail
|
|
echo $? # 0 = success, 1 = failure
|
|
```
|
|
|
|
### Production Deployment
|
|
|
|
For production deployments:
|
|
|
|
1. **Never skip tests** unless you have a specific reason
|
|
2. **Use `--force`** only when redeploying a known-good version
|
|
3. **Monitor test results** via the API or database
|
|
4. **Set up alerts** for test failures
|
|
|
|
## Future Enhancements
|
|
|
|
Planned improvements to pack installation:
|
|
|
|
1. **Remote Pack Installation**: Install packs from git repositories
|
|
2. **Dependency Resolution**: Automatically install required packs
|
|
3. **Version Management**: Support multiple versions of the same pack
|
|
4. **Async Testing**: Return immediately and poll for test results
|
|
5. **Test Result Comparison**: Compare test results across versions
|
|
6. **Webhooks**: Notify external systems of test results
|
|
7. **Pack Registry**: Central repository for discovering and installing packs
|
|
|
|
## Related Documentation
|
|
|
|
- [Pack Testing Framework](./PACK_TESTING.md) - Complete testing guide
|
|
- [Pack Testing API Reference](./api-pack-testing.md) - API documentation
|
|
- [Pack Development Guide](./PACK_DEVELOPMENT.md) - Creating packs
|
|
- [Pack Structure](./pack-structure.md) - pack.yaml format
|
|
|
|
## Examples
|
|
|
|
See the `packs/core` directory for a complete example of a pack with testing enabled:
|
|
|
|
- `packs/core/pack.yaml` - Testing configuration
|
|
- `packs/core/tests/` - Test files
|
|
- `packs/core/actions/` - Actions being tested
|
|
|
|
Register the core pack:
|
|
|
|
```bash
|
|
attune pack register packs/core
|
|
```
|