Files
cleveragents-core/robot/container_lifecycle_server.robot
freemo 9c4655fd5c feat(server): container/devcontainer support lifecycle
Implement server-side container and devcontainer lifecycle management
for the CleverAgents server infrastructure.

New modules in src/cleveragents/infrastructure/server/containers/:
- DevcontainerSpec: Pydantic model for devcontainer.json parsing and
  validation (image, build, features, mounts, env vars, ports,
  hostRequirements, postCreateCommand, remoteUser, workspaceFolder).
- ResourceLimits: CPU, memory, storage, and PID limits model with
  Docker CLI argument generation and hostRequirements conversion.
- ContainerManager: Server-side lifecycle orchestration with
  create/start/stop/destroy operations using pluggable Docker CLI
  runner (mocked for tests).
- HealthMonitor: Periodic container health probing via docker
  inspect with background thread management and probe history.
- ContainerStatus enum: pending/created/running/stopped/destroyed/error
  with validated state transitions.

Tests:
- Behave BDD: 67 scenarios covering spec parsing, resource limits,
  lifecycle operations, health monitoring, and error handling
  (features/container_lifecycle.feature).
- Robot Framework: 13 integration test cases with mock Docker
  runner (robot/container_lifecycle_server.robot).

ISSUES CLOSED: #865
2026-03-23 22:50:51 +00:00

114 lines
5.0 KiB
Plaintext

*** Settings ***
Documentation Integration tests for server-side container lifecycle management (issue #865)
Resource ${CURDIR}/common.resource
Suite Setup Setup Test Environment
Suite Teardown Cleanup Test Environment
*** Variables ***
${HELPER} ${CURDIR}/helper_container_lifecycle_server.py
*** Test Cases ***
DevcontainerSpec Parse Image
[Documentation] Verify devcontainer.json parsing with image field
${result}= Run Process ${PYTHON} ${HELPER} parse-image cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} parse-image-ok
DevcontainerSpec Parse Build
[Documentation] Verify devcontainer.json parsing with build config
${result}= Run Process ${PYTHON} ${HELPER} parse-build cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} parse-build-ok
DevcontainerSpec Parse Features And Mounts
[Documentation] Verify features and mounts parsing
${result}= Run Process ${PYTHON} ${HELPER} parse-features-mounts cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} parse-features-mounts-ok
ResourceLimits Default Values
[Documentation] Verify default resource limits
${result}= Run Process ${PYTHON} ${HELPER} resource-limits-default cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} resource-limits-default-ok
ResourceLimits From Host Requirements
[Documentation] Verify resource limits from hostRequirements
${result}= Run Process ${PYTHON} ${HELPER} resource-limits-host-reqs cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} resource-limits-host-reqs-ok
ResourceLimits Docker Args
[Documentation] Verify docker args generation from limits
${result}= Run Process ${PYTHON} ${HELPER} resource-limits-docker-args cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} resource-limits-docker-args-ok
ContainerManager Create Container
[Documentation] Verify container creation with mock runner
${result}= Run Process ${PYTHON} ${HELPER} manager-create cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} manager-create-ok
ContainerManager Full Lifecycle
[Documentation] Verify full create/start/stop/destroy lifecycle
${result}= Run Process ${PYTHON} ${HELPER} manager-lifecycle cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} manager-lifecycle-ok
ContainerManager List Containers
[Documentation] Verify container listing by status
${result}= Run Process ${PYTHON} ${HELPER} manager-list cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} manager-list-ok
ContainerStatus Enum Values
[Documentation] Verify all container status values exist
${result}= Run Process ${PYTHON} ${HELPER} status-enum cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} status-enum-ok
HealthMonitor Probe Healthy
[Documentation] Verify health probe for healthy container
${result}= Run Process ${PYTHON} ${HELPER} health-probe-healthy cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} health-probe-healthy-ok
HealthMonitor Probe Unhealthy
[Documentation] Verify health probe for unhealthy container
${result}= Run Process ${PYTHON} ${HELPER} health-probe-unhealthy cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} health-probe-unhealthy-ok
HealthMonitor Probe Missing Container
[Documentation] Verify health probe for missing container
${result}= Run Process ${PYTHON} ${HELPER} health-probe-missing cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} health-probe-missing-ok