14 KiB
Pack Installation Workflow API
This document describes the API endpoints for the Pack Installation Workflow system, which enables downloading, analyzing, building environments, and registering packs through a multi-stage process.
Overview
The pack installation workflow consists of four main stages:
- Download - Fetch pack source code from various sources (Git, registry, local)
- Dependencies - Analyze pack dependencies and runtime requirements
- Build Environments - Prepare Python/Node.js runtime environments
- Register - Register pack components in the Attune database
Each stage is exposed as an API endpoint and can be called independently or orchestrated through a workflow.
Authentication
All endpoints require authentication via Bearer token:
Authorization: Bearer <access_token>
Endpoints
1. Download Packs
Downloads packs from various sources to a destination directory.
Endpoint: POST /api/v1/packs/download
Request Body:
{
"packs": ["core", "github:attune-io/pack-aws@v1.0.0"],
"destination_dir": "/tmp/pack-downloads",
"registry_url": "https://registry.attune.io/index.json",
"ref_spec": "main",
"timeout": 300,
"verify_ssl": true
}
Parameters:
packs(array, required) - List of pack sources to download- Can be pack names (registry lookup), Git URLs, or local paths
- Examples:
"core","github:org/repo@tag","https://github.com/org/repo.git"
destination_dir(string, required) - Directory to download packs toregistry_url(string, optional) - Pack registry URL for name resolution- Default:
https://registry.attune.io/index.json
- Default:
ref_spec(string, optional) - Git ref spec for Git sources (branch/tag/commit)timeout(integer, optional) - Download timeout in seconds- Default: 300
verify_ssl(boolean, optional) - Verify SSL certificates for HTTPS- Default: true
Response:
{
"data": {
"downloaded_packs": [
{
"source": "core",
"source_type": "registry",
"pack_path": "/tmp/pack-downloads/core",
"pack_ref": "core",
"pack_version": "1.0.0",
"git_commit": null,
"checksum": "sha256:abc123..."
}
],
"failed_packs": [
{
"source": "invalid-pack",
"error": "Pack not found in registry"
}
],
"total_count": 2,
"success_count": 1,
"failure_count": 1
}
}
Status Codes:
200 OK- Request processed (check individual pack results)400 Bad Request- Invalid request parameters401 Unauthorized- Missing or invalid authentication500 Internal Server Error- Server error during download
2. Get Pack Dependencies
Analyzes pack dependencies and runtime requirements.
Endpoint: POST /api/v1/packs/dependencies
Request Body:
{
"pack_paths": [
"/tmp/pack-downloads/core",
"/tmp/pack-downloads/aws"
],
"skip_validation": false
}
Parameters:
pack_paths(array, required) - List of pack directory paths to analyzeskip_validation(boolean, optional) - Skip validation checks- Default: false
Response:
{
"data": {
"dependencies": [
{
"pack_ref": "core",
"version_spec": ">=1.0.0",
"required_by": "aws",
"already_installed": true
}
],
"runtime_requirements": {
"aws": {
"pack_ref": "aws",
"python": {
"version": ">=3.9",
"requirements_file": "/tmp/pack-downloads/aws/requirements.txt"
},
"nodejs": null
}
},
"missing_dependencies": [],
"analyzed_packs": [
{
"pack_ref": "core",
"pack_path": "/tmp/pack-downloads/core",
"has_dependencies": false,
"dependency_count": 0
},
{
"pack_ref": "aws",
"pack_path": "/tmp/pack-downloads/aws",
"has_dependencies": true,
"dependency_count": 1
}
],
"errors": []
}
}
Response Fields:
dependencies- All pack dependencies foundruntime_requirements- Python/Node.js requirements by packmissing_dependencies- Dependencies not yet installedanalyzed_packs- Summary of analyzed packserrors- Any errors encountered during analysis
Status Codes:
200 OK- Analysis completed (check errors array for issues)400 Bad Request- Invalid request parameters401 Unauthorized- Missing or invalid authentication500 Internal Server Error- Server error during analysis
3. Build Pack Environments
Detects and validates runtime environments for packs.
Endpoint: POST /api/v1/packs/build-envs
Request Body:
{
"pack_paths": [
"/tmp/pack-downloads/aws"
],
"packs_base_dir": "/opt/attune/packs",
"python_version": "3.11",
"nodejs_version": "20",
"skip_python": false,
"skip_nodejs": false,
"force_rebuild": false,
"timeout": 600
}
Parameters:
pack_paths(array, required) - List of pack directory pathspacks_base_dir(string, optional) - Base directory for pack installations- Default:
/opt/attune/packs
- Default:
python_version(string, optional) - Preferred Python version- Default:
3.11
- Default:
nodejs_version(string, optional) - Preferred Node.js version- Default:
20
- Default:
skip_python(boolean, optional) - Skip Python environment checks- Default: false
skip_nodejs(boolean, optional) - Skip Node.js environment checks- Default: false
force_rebuild(boolean, optional) - Force rebuild existing environments- Default: false
timeout(integer, optional) - Build timeout in seconds- Default: 600
Response:
{
"data": {
"built_environments": [
{
"pack_ref": "aws",
"pack_path": "/tmp/pack-downloads/aws",
"environments": {
"python": {
"virtualenv_path": "/tmp/pack-downloads/aws/venv",
"requirements_installed": true,
"package_count": 15,
"python_version": "Python 3.11.4"
},
"nodejs": null
},
"duration_ms": 2500
}
],
"failed_environments": [],
"summary": {
"total_packs": 1,
"success_count": 1,
"failure_count": 0,
"python_envs_built": 1,
"nodejs_envs_built": 0,
"total_duration_ms": 2500
}
}
}
Note: In the current implementation, this endpoint detects and validates runtime availability but does not perform actual environment building. It reports existing environment status. Full environment building (creating virtualenvs, installing dependencies) is planned for future containerized worker implementation.
Status Codes:
200 OK- Environment detection completed400 Bad Request- Invalid request parameters401 Unauthorized- Missing or invalid authentication500 Internal Server Error- Server error during detection
4. Register Packs (Batch)
Registers multiple packs and their components in the database.
Endpoint: POST /api/v1/packs/register-batch
Request Body:
{
"pack_paths": [
"/opt/attune/packs/core",
"/opt/attune/packs/aws"
],
"packs_base_dir": "/opt/attune/packs",
"skip_validation": false,
"skip_tests": false,
"force": false
}
Parameters:
pack_paths(array, required) - List of pack directory paths to registerpacks_base_dir(string, optional) - Base directory for packs- Default:
/opt/attune/packs
- Default:
skip_validation(boolean, optional) - Skip pack validation- Default: false
skip_tests(boolean, optional) - Skip running pack tests- Default: false
force(boolean, optional) - Force re-registration if pack exists- Default: false
Response:
{
"data": {
"registered_packs": [
{
"pack_ref": "core",
"pack_id": 1,
"pack_version": "1.0.0",
"storage_path": "/opt/attune/packs/core",
"components_registered": {
"actions": 25,
"sensors": 5,
"triggers": 10,
"rules": 3,
"workflows": 2,
"policies": 1
},
"test_result": {
"status": "passed",
"total_tests": 27,
"passed": 27,
"failed": 0
},
"validation_results": {
"valid": true,
"errors": []
}
}
],
"failed_packs": [],
"summary": {
"total_packs": 2,
"success_count": 2,
"failure_count": 0,
"total_components": 46,
"duration_ms": 1500
}
}
}
Response Fields:
registered_packs- Successfully registered packs with detailsfailed_packs- Packs that failed registration with error detailssummary- Overall registration statistics
Status Codes:
200 OK- Registration completed (check individual pack results)400 Bad Request- Invalid request parameters401 Unauthorized- Missing or invalid authentication500 Internal Server Error- Server error during registration
Action Wrappers
These API endpoints are wrapped by shell actions in the core pack for workflow orchestration:
Actions
core.download_packs- Wraps/api/v1/packs/downloadcore.get_pack_dependencies- Wraps/api/v1/packs/dependenciescore.build_pack_envs- Wraps/api/v1/packs/build-envscore.register_packs- Wraps/api/v1/packs/register-batch
Action Parameters
Each action accepts parameters that map directly to the API request body, plus:
api_url(string, optional) - API base URL- Default:
http://localhost:8080
- Default:
api_token(string, optional) - Authentication token- If not provided, uses system authentication
Example Action Execution
attune action execute core.download_packs \
--param packs='["core","aws"]' \
--param destination_dir=/tmp/packs
Workflow Example
Complete pack installation workflow using the API:
# workflows/install_pack.yaml
name: install_pack
description: Complete pack installation workflow
version: 1.0.0
input:
- pack_source
- destination_dir
tasks:
# Stage 1: Download
download:
action: core.download_packs
input:
packs:
- <% ctx().pack_source %>
destination_dir: <% ctx().destination_dir %>
next:
- when: <% succeeded() %>
publish:
- pack_paths: <% result().downloaded_packs.select($.pack_path) %>
do: analyze_deps
# Stage 2: Analyze Dependencies
analyze_deps:
action: core.get_pack_dependencies
input:
pack_paths: <% ctx().pack_paths %>
next:
- when: <% succeeded() and result().missing_dependencies.len() = 0 %>
do: build_envs
- when: <% succeeded() and result().missing_dependencies.len() > 0 %>
do: fail
publish:
- error: "Missing dependencies: <% result().missing_dependencies %>"
# Stage 3: Build Environments
build_envs:
action: core.build_pack_envs
input:
pack_paths: <% ctx().pack_paths %>
next:
- when: <% succeeded() %>
do: register
# Stage 4: Register Packs
register:
action: core.register_packs
input:
pack_paths: <% ctx().pack_paths %>
skip_tests: false
output:
- registered_packs: <% task(register).result.registered_packs %>
Error Handling
All endpoints return consistent error responses:
{
"error": "Error message",
"message": "Detailed error description",
"status": 400
}
Common Error Scenarios
-
Missing Authentication
- Status: 401
- Solution: Provide valid Bearer token
-
Invalid Pack Path
- Reported in
errorsarray within 200 response - Solution: Verify pack paths exist and are readable
- Reported in
-
Missing Dependencies
- Reported in
missing_dependenciesarray - Solution: Install dependencies first or use
skip_deps: true
- Reported in
-
Runtime Not Available
- Reported in
failed_environmentsarray - Solution: Install required Python/Node.js version
- Reported in
-
Pack Already Registered
- Status: 400 (or in
failed_packsfor batch) - Solution: Use
force: trueto re-register
- Status: 400 (or in
Best Practices
1. Download Strategy
- Registry packs: Use pack names (
"core","aws") - Git repos: Use full URLs with version tags
- Local packs: Use absolute paths
2. Dependency Management
- Always run dependency analysis after download
- Install missing dependencies before registration
- Use pack registry to resolve dependency versions
3. Environment Building
- Check for existing environments before rebuilding
- Use
force_rebuild: truesparingly (time-consuming) - Verify Python/Node.js availability before starting
4. Registration
- Run tests unless in development (
skip_tests: falsein production) - Use validation to catch configuration errors early
- Enable
force: trueonly when intentionally updating
5. Error Recovery
- Check individual pack results in batch operations
- Retry failed downloads with exponential backoff
- Log all errors for troubleshooting
CLI Integration
Use the Attune CLI to execute pack installation actions:
# Download packs
attune action execute core.download_packs \
--param packs='["core"]' \
--param destination_dir=/tmp/packs
# Analyze dependencies
attune action execute core.get_pack_dependencies \
--param pack_paths='["/tmp/packs/core"]'
# Build environments
attune action execute core.build_pack_envs \
--param pack_paths='["/tmp/packs/core"]'
# Register packs
attune action execute core.register_packs \
--param pack_paths='["/tmp/packs/core"]'
Future Enhancements
Planned Features
-
Actual Environment Building
- Create Python virtualenvs
- Install requirements.txt dependencies
- Run npm/yarn install for Node.js packs
-
Progress Streaming
- WebSocket updates during long operations
- Real-time download/build progress
-
Pack Validation
- Schema validation before registration
- Dependency conflict detection
- Version compatibility checks
-
Rollback Support
- Snapshot packs before updates
- Rollback to previous versions
- Automatic cleanup on failure
-
Cache Management
- Cache downloaded packs
- Reuse existing environments
- Clean up stale installations