9b9bb80e05
CI / lint (push) Waiting to run
CI / typecheck (push) Waiting to run
CI / security (push) Waiting to run
CI / quality (push) Waiting to run
CI / unit_tests (push) Waiting to run
CI / integration_tests (push) Waiting to run
CI / e2e_tests (push) Waiting to run
CI / coverage (push) Blocked by required conditions
CI / build (push) Waiting to run
CI / docker (push) Blocked by required conditions
CI / helm (push) Waiting to run
CI / push-validation (push) Waiting to run
CI / status-check (push) Blocked by required conditions
CI / benchmark-publish (push) Waiting to run
devcontainer-file is a read-only config file resource, not a running container. Including it in CONTAINER_RESOURCE_TYPES causes validate_container_available() to return True when only a config file is linked, even though no actual container is available. Closes #10598
149 lines
7.3 KiB
Gherkin
149 lines
7.3 KiB
Gherkin
Feature: Execution environment routing
|
|
As the tool execution engine
|
|
I need to route tool execution to host or container environments
|
|
With a priority chain: tool > plan > project > default (host)
|
|
|
|
# ── ExecutionEnvironment enum ───────────────────────────────────────
|
|
|
|
Scenario: ExecutionEnvironment enum has HOST value
|
|
Given I import ExecutionEnvironment
|
|
Then the HOST value should be "host"
|
|
|
|
Scenario: ExecutionEnvironment enum has CONTAINER value
|
|
Given I import ExecutionEnvironment
|
|
Then the CONTAINER value should be "container"
|
|
|
|
Scenario: ExecutionEnvironment is a StrEnum
|
|
Given I import ExecutionEnvironment
|
|
Then ExecutionEnvironment should be a StrEnum subclass
|
|
|
|
# ── Plan model field ────────────────────────────────────────────────
|
|
|
|
Scenario: Plan model has execution_environment field defaulting to None
|
|
Given I create a plan with default fields
|
|
Then the plan execution_environment should be None
|
|
|
|
Scenario: Plan model accepts execution_environment host
|
|
Given I create a plan with execution_environment "host"
|
|
Then the plan execution_environment should be "host"
|
|
|
|
Scenario: Plan model accepts execution_environment container
|
|
Given I create a plan with execution_environment "container"
|
|
Then the plan execution_environment should be "container"
|
|
|
|
# ── ContextConfig model field ───────────────────────────────────────
|
|
|
|
Scenario: ContextConfig has execution_environment field defaulting to None
|
|
Given I create a ContextConfig with default fields
|
|
Then the context config execution_environment should be None
|
|
|
|
Scenario: ContextConfig accepts execution_environment host
|
|
Given I create a ContextConfig with execution_environment "host"
|
|
Then the context config execution_environment should be "host"
|
|
|
|
Scenario: ContextConfig accepts execution_environment container
|
|
Given I create a ContextConfig with execution_environment "container"
|
|
Then the context config execution_environment should be "container"
|
|
|
|
# ── Resolver: default resolution ────────────────────────────────────
|
|
|
|
Scenario: Resolver defaults to host when nothing is set
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with no overrides
|
|
Then the resolved environment should be "host"
|
|
|
|
Scenario: Resolver uses explicit default
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with default "container"
|
|
Then the resolved environment should be "container"
|
|
|
|
# ── Resolver: priority chain ────────────────────────────────────────
|
|
|
|
Scenario: Project-level overrides default
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with project_env "container"
|
|
Then the resolved environment should be "container"
|
|
|
|
Scenario: Plan-level overrides project-level
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with plan_env "host" and project_env "container"
|
|
Then the resolved environment should be "host"
|
|
|
|
Scenario: Tool-level overrides plan-level
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with tool_env "container" and plan_env "host"
|
|
Then the resolved environment should be "container"
|
|
|
|
Scenario: Full priority chain tool wins
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve the full chain with tool_env "container" and plan_env "host" and project_env "host"
|
|
Then the resolved environment should be "container"
|
|
|
|
# ── Resolver: validation ────────────────────────────────────────────
|
|
|
|
Scenario: Resolver raises ValueError on invalid environment
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve with tool_env "invalid_env"
|
|
Then exec-env a ValueError should be raised
|
|
|
|
# ── Container availability ──────────────────────────────────────────
|
|
|
|
Scenario: validate_container_available succeeds with container resource
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I validate container available with types "devcontainer-instance,git-checkout"
|
|
Then validation should succeed
|
|
|
|
Scenario: validate_container_available raises when no container resource
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I validate container available with types "git-checkout,fs-directory"
|
|
Then a ContainerUnavailableError should be raised
|
|
|
|
Scenario: resolve_and_validate passes for host
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve_and_validate with project_env "host" and types "git-checkout"
|
|
Then the resolved environment should be "host"
|
|
|
|
Scenario: resolve_and_validate raises for container without resource
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve_and_validate with plan_env "container" and types "git-checkout"
|
|
Then a ContainerUnavailableError should be raised
|
|
|
|
Scenario: resolve_and_validate passes for container with resource
|
|
Given I create an ExecutionEnvironmentResolver
|
|
When I resolve_and_validate with plan_env "container" and types "devcontainer-instance"
|
|
Then the resolved environment should be "container"
|
|
|
|
# ── ToolRunner integration ──────────────────────────────────────────
|
|
|
|
Scenario: ToolRunner routes to host by default
|
|
Given I create a ToolRunner with a mock registry
|
|
When I execute a tool with no environment overrides
|
|
Then the tool should execute successfully on host
|
|
|
|
Scenario: ToolRunner returns error for container without resource
|
|
Given I create a ToolRunner with a mock registry
|
|
When I execute a tool with plan_env "container" and no container resources
|
|
Then the tool result should have an error about container unavailable
|
|
|
|
# ── Container resource types ────────────────────────────────────────
|
|
|
|
Scenario: CONTAINER_RESOURCE_TYPES includes expected types
|
|
Given I import CONTAINER_RESOURCE_TYPES
|
|
Then it should contain "container-instance"
|
|
And it should contain "devcontainer-instance"
|
|
And it should not contain "devcontainer-file"
|
|
And it should not contain "git-checkout"
|
|
|
|
# ── ContainerUnavailableError ───────────────────────────────────────
|
|
|
|
Scenario: ContainerUnavailableError includes project name
|
|
When I create a ContainerUnavailableError for project "my-project"
|
|
Then exec-env the error message should contain "my-project"
|
|
And exec-env the error message should contain "Container resource unavailable"
|
|
|
|
Scenario: ContainerUnavailableError without project name
|
|
When I create a ContainerUnavailableError without project name
|
|
Then exec-env the error message should contain "Container resource unavailable"
|
|
And exec-env the error message should not contain "for project"
|
|
|