forked from cleveragents/cleveragents-core
9c4655fd5c
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
114 lines
5.0 KiB
Plaintext
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
|