@mcp.tool()
def remove_firewall_from_resources(params: FirewallResourcesParams) -> Dict[str, Any]:
"""
Remove a firewall from resources.
Removes a firewall from multiple resources.
Examples:
- Remove from server: {"firewall_id": 12345, "resources": [{"type": "server", "server_id": 123}]}
- Remove by label: {"firewall_id": 12345, "resources": [{"type": "label_selector", "label_selector": "env=prod"}]}
"""
try:
firewall = client.firewalls.get_by_id(params.firewall_id)
if not firewall:
return {"error": f"Firewall with ID {params.firewall_id} not found"}
# Convert resource parameters to FirewallResource objects
resources = []
for resource_param in params.resources:
if resource_param.type == "server":
if not resource_param.server_id:
return {"error": "Server ID is required when resource type is 'server'"}
server = client.servers.get_by_id(resource_param.server_id)
if not server:
return {"error": f"Server with ID {resource_param.server_id} not found"}
resource = FirewallResource(type=resource_param.type, server=server)
elif resource_param.type == "label_selector":
if not resource_param.label_selector:
return {"error": "Label selector is required when resource type is 'label_selector'"}
label_selector = FirewallResourceLabelSelector(selector=resource_param.label_selector)
resource = FirewallResource(type=resource_param.type, label_selector=label_selector)
else:
return {"error": f"Invalid resource type: {resource_param.type}. Must be 'server' or 'label_selector'"}
resources.append(resource)
# Remove the firewall from the resources
actions = client.firewalls.remove_from_resources(firewall, resources)
# Format the response
return {
"success": True,
"actions": [
{
"id": action.id,
"status": action.status,
"command": action.command,
"progress": action.progress,
"error": action.error,
"started": action.started.isoformat() if action.started else None,
"finished": action.finished.isoformat() if action.finished else None,
}
for action in actions
] if actions else None,
}
except Exception as e:
return {"error": f"Failed to remove firewall from resources: {str(e)}"}