New plugin: Coolify deployment management (applications, deployments, servers). 10 plugins, 596 tools, 686 tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
163 lines
5.5 KiB
Python
163 lines
5.5 KiB
Python
"""Deployment Handler — manages Coolify deployments."""
|
|
|
|
import json
|
|
from typing import Any
|
|
|
|
from plugins.coolify.client import CoolifyClient
|
|
|
|
|
|
def get_tool_specifications() -> list[dict[str, Any]]:
|
|
"""Return tool specifications for ToolGenerator."""
|
|
return [
|
|
{
|
|
"name": "list_deployments",
|
|
"method_name": "list_deployments",
|
|
"description": "List all running deployments on the Coolify instance.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {},
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "get_deployment",
|
|
"method_name": "get_deployment",
|
|
"description": "Get details of a specific deployment by UUID.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"uuid": {
|
|
"type": "string",
|
|
"description": "Deployment UUID",
|
|
"minLength": 1,
|
|
},
|
|
},
|
|
"required": ["uuid"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "cancel_deployment",
|
|
"method_name": "cancel_deployment",
|
|
"description": "Cancel a running deployment.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"uuid": {
|
|
"type": "string",
|
|
"description": "Deployment UUID",
|
|
"minLength": 1,
|
|
},
|
|
},
|
|
"required": ["uuid"],
|
|
},
|
|
"scope": "write",
|
|
},
|
|
{
|
|
"name": "deploy",
|
|
"method_name": "deploy",
|
|
"description": (
|
|
"Trigger deployment by tag name or resource UUID. "
|
|
"Can deploy multiple resources at once using comma-separated values."
|
|
),
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"tag": {
|
|
"anyOf": [{"type": "string"}, {"type": "null"}],
|
|
"description": "Tag name(s), comma-separated",
|
|
},
|
|
"uuid": {
|
|
"anyOf": [{"type": "string"}, {"type": "null"}],
|
|
"description": "Resource UUID(s), comma-separated",
|
|
},
|
|
"force": {
|
|
"type": "boolean",
|
|
"description": "Force rebuild without cache",
|
|
"default": False,
|
|
},
|
|
},
|
|
},
|
|
"scope": "write",
|
|
},
|
|
{
|
|
"name": "list_app_deployments",
|
|
"method_name": "list_app_deployments",
|
|
"description": "List deployment history for a specific application.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"uuid": {
|
|
"type": "string",
|
|
"description": "Application UUID",
|
|
"minLength": 1,
|
|
},
|
|
"skip": {
|
|
"type": "integer",
|
|
"description": "Number of deployments to skip",
|
|
"default": 0,
|
|
"minimum": 0,
|
|
},
|
|
"take": {
|
|
"type": "integer",
|
|
"description": "Number of deployments to return",
|
|
"default": 10,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
"required": ["uuid"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
]
|
|
|
|
|
|
# --- Handler Functions ---
|
|
|
|
|
|
async def list_deployments(client: CoolifyClient) -> str:
|
|
"""List running deployments."""
|
|
deployments = await client.list_deployments()
|
|
result = {"success": True, "count": len(deployments), "deployments": deployments}
|
|
return json.dumps(result, indent=2, ensure_ascii=False)
|
|
|
|
|
|
async def get_deployment(client: CoolifyClient, uuid: str) -> str:
|
|
"""Get deployment details."""
|
|
deployment = await client.get_deployment(uuid)
|
|
result = {"success": True, "deployment": deployment}
|
|
return json.dumps(result, indent=2, ensure_ascii=False)
|
|
|
|
|
|
async def cancel_deployment(client: CoolifyClient, uuid: str) -> str:
|
|
"""Cancel a deployment."""
|
|
result_data = await client.cancel_deployment(uuid)
|
|
result = {
|
|
"success": True,
|
|
"message": f"Deployment '{uuid}' cancelled",
|
|
"data": result_data,
|
|
}
|
|
return json.dumps(result, indent=2, ensure_ascii=False)
|
|
|
|
|
|
async def deploy(
|
|
client: CoolifyClient,
|
|
tag: str | None = None,
|
|
uuid: str | None = None,
|
|
force: bool = False,
|
|
) -> str:
|
|
"""Deploy by tag or UUID."""
|
|
result_data = await client.deploy(tag=tag, uuid=uuid, force=force)
|
|
result = {"success": True, "message": "Deployment triggered", "data": result_data}
|
|
return json.dumps(result, indent=2, ensure_ascii=False)
|
|
|
|
|
|
async def list_app_deployments(
|
|
client: CoolifyClient, uuid: str, skip: int = 0, take: int = 10
|
|
) -> str:
|
|
"""List deployment history for an application."""
|
|
deployments = await client.list_app_deployments(uuid, skip=skip, take=take)
|
|
result = {"success": True, "count": len(deployments), "deployments": deployments}
|
|
return json.dumps(result, indent=2, ensure_ascii=False)
|