# Pack Management API This document provides comprehensive documentation for the Pack Management API endpoints in Attune. ## Overview Packs are containers that bundle related automation components (actions, triggers, rules, and sensors) together. They provide: - **Organization**: Group related automation components by domain or service - **Versioning**: Track and manage versions of automation components - **Configuration**: Define pack-level configuration schemas and defaults - **Dependencies**: Declare runtime and pack dependencies - **Metadata**: Store tags, descriptions, and other metadata ## Pack Data Model ### Pack Structure ```json { "id": 1, "ref": "aws.ec2", "label": "AWS EC2 Pack", "description": "Actions and triggers for AWS EC2 management", "version": "1.0.0", "conf_schema": { "type": "object", "properties": { "region": {"type": "string"}, "access_key_id": {"type": "string"}, "secret_access_key": {"type": "string"} }, "required": ["region"] }, "config": { "region": "us-east-1" }, "meta": { "author": "Attune Team", "license": "MIT" }, "tags": ["aws", "ec2", "cloud"], "runtime_deps": [1, 2], "is_standard": true, "created": "2024-01-15T10:30:00Z", "updated": "2024-01-15T10:30:00Z" } ``` ### Field Descriptions | Field | Type | Required | Description | |-------|------|----------|-------------| | `id` | integer | auto | Unique pack identifier | | `ref` | string | yes | Unique reference (e.g., "aws.ec2", "core.http") | | `label` | string | yes | Human-readable pack name | | `description` | string | yes | Pack description and purpose | | `version` | string | no | Semantic version (e.g., "1.0.0") | | `conf_schema` | object | no | JSON Schema for pack configuration | | `config` | object | no | Default pack configuration values | | `meta` | object | no | Additional metadata (author, license, etc.) | | `tags` | array | no | Tags for categorization and search | | `runtime_deps` | array | no | Runtime IDs this pack depends on | | `is_standard` | boolean | no | Whether this is a standard/built-in pack | | `created` | timestamp | auto | Creation timestamp | | `updated` | timestamp | auto | Last update timestamp | ## API Endpoints ### 1. List Packs Retrieve a paginated list of all packs. **Endpoint:** `GET /api/v1/packs` **Query Parameters:** | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `page` | integer | 1 | Page number (1-based) | | `per_page` | integer | 50 | Items per page (max: 100) | **Example Request:** ```bash curl -X GET "http://localhost:3000/api/v1/packs?page=1&per_page=20" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "data": [ { "id": 1, "ref": "core.http", "label": "HTTP Core Pack", "description": "HTTP actions and triggers", "version": "1.0.0", "tags": ["http", "core"], "is_standard": true, "created": "2024-01-15T10:30:00Z", "updated": "2024-01-15T10:30:00Z" }, { "id": 2, "ref": "aws.ec2", "label": "AWS EC2 Pack", "description": "AWS EC2 management", "version": "1.0.0", "tags": ["aws", "ec2", "cloud"], "is_standard": false, "created": "2024-01-16T14:20:00Z", "updated": "2024-01-16T14:20:00Z" } ], "pagination": { "page": 1, "per_page": 20, "total": 2, "total_pages": 1 } } ``` ### 2. Get Pack by Reference Retrieve a specific pack by its reference identifier. **Endpoint:** `GET /api/v1/packs/:ref` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference (e.g., "aws.ec2") | **Example Request:** ```bash curl -X GET "http://localhost:3000/api/v1/packs/aws.ec2" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "data": { "id": 2, "ref": "aws.ec2", "label": "AWS EC2 Pack", "description": "Actions and triggers for AWS EC2 management", "version": "1.0.0", "conf_schema": { "type": "object", "properties": { "region": {"type": "string"}, "access_key_id": {"type": "string"} } }, "config": { "region": "us-east-1" }, "meta": { "author": "Attune Team" }, "tags": ["aws", "ec2", "cloud"], "runtime_deps": [1], "is_standard": false, "created": "2024-01-16T14:20:00Z", "updated": "2024-01-16T14:20:00Z" } } ``` ### 3. Create Pack Create a new pack. **Endpoint:** `POST /api/v1/packs` **Request Body:** ```json { "ref": "slack.notifications", "label": "Slack Notifications Pack", "description": "Actions for sending Slack notifications", "version": "1.0.0", "conf_schema": { "type": "object", "properties": { "webhook_url": {"type": "string"}, "default_channel": {"type": "string"} }, "required": ["webhook_url"] }, "config": { "default_channel": "#general" }, "meta": { "author": "Your Team", "license": "MIT" }, "tags": ["slack", "notifications", "messaging"], "runtime_deps": [1], "is_standard": false } ``` **Example Request:** ```bash curl -X POST "http://localhost:3000/api/v1/packs" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ref": "slack.notifications", "label": "Slack Notifications Pack", "description": "Actions for sending Slack notifications", "version": "1.0.0", "tags": ["slack", "notifications"], "is_standard": false }' ``` **Example Response:** ```json { "data": { "id": 3, "ref": "slack.notifications", "label": "Slack Notifications Pack", "description": "Actions for sending Slack notifications", "version": "1.0.0", "conf_schema": null, "config": null, "meta": null, "tags": ["slack", "notifications"], "runtime_deps": [], "is_standard": false, "created": "2024-01-17T09:15:00Z", "updated": "2024-01-17T09:15:00Z" }, "message": "Pack created successfully" } ``` **Status Codes:** - `201 Created`: Pack created successfully - `400 Bad Request`: Invalid request data or validation error - `409 Conflict`: Pack with the same ref already exists ### 4. Update Pack Update an existing pack. **Endpoint:** `PUT /api/v1/packs/:ref` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference to update | **Request Body:** (all fields optional) ```json { "label": "Updated Pack Label", "description": "Updated description", "version": "1.1.0", "conf_schema": {...}, "config": {...}, "meta": {...}, "tags": ["updated", "tags"], "runtime_deps": [1, 2], "is_standard": false } ``` **Example Request:** ```bash curl -X PUT "http://localhost:3000/api/v1/packs/slack.notifications" \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "version": "1.1.0", "description": "Enhanced Slack notifications with rich formatting" }' ``` **Example Response:** ```json { "data": { "id": 3, "ref": "slack.notifications", "label": "Slack Notifications Pack", "description": "Enhanced Slack notifications with rich formatting", "version": "1.1.0", "conf_schema": null, "config": null, "meta": null, "tags": ["slack", "notifications"], "runtime_deps": [], "is_standard": false, "created": "2024-01-17T09:15:00Z", "updated": "2024-01-17T09:30:00Z" }, "message": "Pack updated successfully" } ``` **Status Codes:** - `200 OK`: Pack updated successfully - `400 Bad Request`: Invalid request data or validation error - `404 Not Found`: Pack not found ### 5. Delete Pack Delete a pack and all its associated components. **Endpoint:** `DELETE /api/v1/packs/:ref` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference to delete | **Example Request:** ```bash curl -X DELETE "http://localhost:3000/api/v1/packs/slack.notifications" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "success": true, "message": "Pack 'slack.notifications' deleted successfully" } ``` **Status Codes:** - `200 OK`: Pack deleted successfully - `404 Not Found`: Pack not found **Warning:** Deleting a pack will cascade delete all actions, triggers, rules, and sensors that belong to it. This operation cannot be undone. ### 6. List Pack Actions Retrieve all actions that belong to a specific pack. **Endpoint:** `GET /api/v1/packs/:ref/actions` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference | **Example Request:** ```bash curl -X GET "http://localhost:3000/api/v1/packs/aws.ec2/actions" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "data": [ { "id": 1, "ref": "aws.ec2.start_instance", "pack_ref": "aws.ec2", "label": "Start EC2 Instance", "description": "Start an EC2 instance", "runtime": 1, "created": "2024-01-16T14:30:00Z", "updated": "2024-01-16T14:30:00Z" }, { "id": 2, "ref": "aws.ec2.stop_instance", "pack_ref": "aws.ec2", "label": "Stop EC2 Instance", "description": "Stop an EC2 instance", "runtime": 1, "created": "2024-01-16T14:35:00Z", "updated": "2024-01-16T14:35:00Z" } ] } ``` **Status Codes:** - `200 OK`: Actions retrieved successfully (empty array if none) - `404 Not Found`: Pack not found ### 7. List Pack Triggers Retrieve all triggers that belong to a specific pack. **Endpoint:** `GET /api/v1/packs/:ref/triggers` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference | **Example Request:** ```bash curl -X GET "http://localhost:3000/api/v1/packs/aws.ec2/triggers" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "data": [ { "id": 1, "ref": "aws.ec2.instance_state_change", "pack_ref": "aws.ec2", "label": "EC2 Instance State Change", "description": "Triggered when EC2 instance state changes", "enabled": true, "created": "2024-01-16T14:40:00Z", "updated": "2024-01-16T14:40:00Z" } ] } ``` **Status Codes:** - `200 OK`: Triggers retrieved successfully (empty array if none) - `404 Not Found`: Pack not found ### 8. List Pack Rules Retrieve all rules that belong to a specific pack. **Endpoint:** `GET /api/v1/packs/:ref/rules` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `ref` | string | Pack reference | **Example Request:** ```bash curl -X GET "http://localhost:3000/api/v1/packs/aws.ec2/rules" \ -H "Authorization: Bearer YOUR_TOKEN" ``` **Example Response:** ```json { "data": [ { "id": 1, "ref": "aws.ec2.auto_stop_idle", "pack_ref": "aws.ec2", "label": "Auto-stop Idle Instances", "description": "Automatically stop idle EC2 instances", "action_ref": "aws.ec2.stop_instance", "trigger_ref": "aws.ec2.instance_state_change", "enabled": true, "created": "2024-01-16T15:00:00Z", "updated": "2024-01-16T15:00:00Z" } ] } ``` **Status Codes:** - `200 OK`: Rules retrieved successfully (empty array if none) - `404 Not Found`: Pack not found ## Pack Lifecycle ### 1. Pack Creation Workflow ``` 1. Define pack metadata (ref, label, description) 2. Create configuration schema (optional) 3. Set default configuration values (optional) 4. Add metadata and tags 5. Specify runtime dependencies 6. POST to /api/v1/packs 7. Create pack actions, triggers, and rules ``` ### 2. Pack Update Workflow ``` 1. Retrieve current pack details (GET /api/v1/packs/:ref) 2. Modify desired fields 3. Update pack (PUT /api/v1/packs/:ref) 4. Update version number if making breaking changes 5. Update dependent components if needed ``` ### 3. Pack Deletion Workflow ``` 1. List all pack components: - GET /api/v1/packs/:ref/actions - GET /api/v1/packs/:ref/triggers - GET /api/v1/packs/:ref/rules 2. Verify no critical dependencies 3. Backup pack configuration if needed 4. DELETE /api/v1/packs/:ref 5. All components cascade deleted automatically ``` ## Configuration Schema Packs can define a JSON Schema for their configuration. This schema validates pack configuration values and provides documentation for users. ### Example Configuration Schema ```json { "type": "object", "properties": { "api_key": { "type": "string", "description": "API key for authentication" }, "region": { "type": "string", "enum": ["us-east-1", "us-west-2", "eu-west-1"], "default": "us-east-1", "description": "AWS region" }, "timeout": { "type": "integer", "minimum": 1000, "maximum": 30000, "default": 5000, "description": "Request timeout in milliseconds" }, "retry_count": { "type": "integer", "minimum": 0, "maximum": 5, "default": 3, "description": "Number of retry attempts" } }, "required": ["api_key", "region"] } ``` ### Using Configuration in Actions Actions within a pack can access pack configuration: ```python # In an action's Python script pack_config = context.pack.config api_key = pack_config.get("api_key") region = pack_config.get("region", "us-east-1") ``` ## Best Practices ### Pack Design 1. **Single Responsibility**: Each pack should focus on a specific domain or service 2. **Versioning**: Use semantic versioning (MAJOR.MINOR.PATCH) 3. **Documentation**: Provide clear descriptions for pack and configuration 4. **Dependencies**: Minimize runtime dependencies when possible 5. **Configuration**: Use sensible defaults in configuration schemas ### Naming Conventions - **Pack Ref**: Use dot notation (e.g., "aws.ec2", "slack.notifications") - **Labels**: Use title case (e.g., "AWS EC2 Pack") - **Tags**: Use lowercase, kebab-case if needed (e.g., "aws", "cloud-provider") ### Security 1. **Secrets**: Never store secrets in pack configuration 2. **Schema**: Define strict configuration schemas 3. **Validation**: Validate all configuration values 4. **Access Control**: Limit pack modification to authorized users ### Organization 1. **Standard Packs**: Mark built-in/core packs as `is_standard: true` 2. **Tagging**: Use consistent tags for discoverability 3. **Metadata**: Include author, license, and documentation URLs 4. **Dependencies**: Document runtime requirements clearly ## Error Handling ### Common Error Responses **404 Not Found:** ```json { "error": "Pack 'nonexistent.pack' not found" } ``` **409 Conflict:** ```json { "error": "Pack with ref 'aws.ec2' already exists" } ``` **400 Bad Request:** ```json { "error": "Validation failed", "details": { "ref": ["Must be between 1 and 255 characters"], "label": ["Field is required"] } } ``` ## Integration Examples ### Creating a Complete Pack ```bash #!/bin/bash # 1. Create the pack PACK_ID=$(curl -X POST "http://localhost:3000/api/v1/packs" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ref": "monitoring.healthcheck", "label": "Health Check Monitoring", "description": "Monitor endpoint health", "version": "1.0.0", "tags": ["monitoring", "health"], "is_standard": false }' | jq -r '.data.id') # 2. Create a trigger curl -X POST "http://localhost:3000/api/v1/triggers" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ref": "monitoring.healthcheck.endpoint_down", "pack_ref": "monitoring.healthcheck", "label": "Endpoint Down", "description": "Triggered when endpoint is unreachable" }' # 3. Create an action curl -X POST "http://localhost:3000/api/v1/actions" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ref": "monitoring.healthcheck.send_alert", "pack_ref": "monitoring.healthcheck", "label": "Send Alert", "description": "Send notification about endpoint status", "entrypoint": "actions/send_alert.py", "runtime": 1 }' # 4. Create a rule curl -X POST "http://localhost:3000/api/v1/rules" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ref": "monitoring.healthcheck.alert_on_down", "pack_ref": "monitoring.healthcheck", "label": "Alert on Down", "description": "Send alert when endpoint goes down", "action_ref": "monitoring.healthcheck.send_alert", "trigger_ref": "monitoring.healthcheck.endpoint_down", "enabled": true }' echo "Pack created successfully!" ``` ### Listing Pack Components ```bash #!/bin/bash PACK_REF="aws.ec2" echo "=== Pack Details ===" curl -s "http://localhost:3000/api/v1/packs/$PACK_REF" \ -H "Authorization: Bearer $TOKEN" | jq '.data' echo -e "\n=== Actions ===" curl -s "http://localhost:3000/api/v1/packs/$PACK_REF/actions" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | {ref, label}' echo -e "\n=== Triggers ===" curl -s "http://localhost:3000/api/v1/packs/$PACK_REF/triggers" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | {ref, label}' echo -e "\n=== Rules ===" curl -s "http://localhost:3000/api/v1/packs/$PACK_REF/rules" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | {ref, label, enabled}' ``` ## Related Documentation - [Action Management API](api-actions.md) - [Trigger & Sensor Management API](api-triggers-sensors.md) - [Rule Management API](api-rules.md) - [Authentication Guide](authentication.md) ## Summary The Pack Management API provides: - ✅ Full CRUD operations for packs - ✅ Pack component listing (actions, triggers, rules) - ✅ Configuration schema support - ✅ Version management - ✅ Dependency tracking - ✅ Comprehensive validation and error handling Packs are the organizational foundation of Attune, enabling modular and reusable automation components.