fix(resource): align DETECTED->DISCOVERED rename and remove build artifacts
CI / lint (pull_request) Successful in 40s
CI / typecheck (pull_request) Successful in 1m13s
CI / security (pull_request) Successful in 1m2s
CI / quality (pull_request) Successful in 51s
CI / build (pull_request) Successful in 39s
CI / push-validation (pull_request) Successful in 18s
CI / helm (pull_request) Successful in 39s
CI / e2e_tests (pull_request) Successful in 3m36s
CI / integration_tests (pull_request) Successful in 5m2s
CI / unit_tests (pull_request) Has been cancelled
CI / coverage (pull_request) Has been cancelled
CI / benchmark-publish (pull_request) Has been cancelled
CI / status-check (pull_request) Has been cancelled
CI / benchmark-regression (pull_request) Has been cancelled
CI / docker (pull_request) Has been cancelled
CI / lint (pull_request) Successful in 40s
CI / typecheck (pull_request) Successful in 1m13s
CI / security (pull_request) Successful in 1m2s
CI / quality (pull_request) Successful in 51s
CI / build (pull_request) Successful in 39s
CI / push-validation (pull_request) Successful in 18s
CI / helm (pull_request) Successful in 39s
CI / e2e_tests (pull_request) Successful in 3m36s
CI / integration_tests (pull_request) Successful in 5m2s
CI / unit_tests (pull_request) Has been cancelled
CI / coverage (pull_request) Has been cancelled
CI / benchmark-publish (pull_request) Has been cancelled
CI / status-check (pull_request) Has been cancelled
CI / benchmark-regression (pull_request) Has been cancelled
CI / docker (pull_request) Has been cancelled
- Remove committed build artifacts (test_reports/summary.txt, test_reports/test_results.json) and add test_reports/ to .gitignore - Fix CLI resource.py: update lifecycle state condition and warning banner from 'detected (not built)' to 'discovered (not built)' and 'Devcontainer detected' to 'Devcontainer discovered' to align with ContainerLifecycleState.DISCOVERED rename - Fix BDD feature file: update resource_list_lifecycle_state.feature scenario title and assertion from 'Devcontainer detected' to 'Devcontainer discovered' - Fix robot/helper_devcontainer_lifecycle.py: update enum value check from 'detected' to 'discovered' in cmd_enum_values() - Fix robot/helper_devcontainer_handler.py: update strategy check assertion from 'none' to 'snapshot' to match PR #8304 change - Update CONTRIBUTORS.md with HAL 9000 feature contribution entry Closes #7555 (via PR #8304) Fixes: CI unit_tests and integration_tests failures from PR #8304
This commit is contained in:
@@ -180,3 +180,6 @@ output.xml
|
||||
report.html
|
||||
.agent-orchestration
|
||||
agents-test
|
||||
|
||||
# Generated test artifacts
|
||||
test_reports/
|
||||
|
||||
@@ -14,4 +14,5 @@ Below are some of the specific details of various contributions.
|
||||
|
||||
* Jeffrey Phillips Freeman has acted as Lead Developer, daily contributor, and Project Owner.
|
||||
* Brent E. Edwards has contributed quality assurance, test coverage, and CI pipeline improvements.
|
||||
* HAL 9000 has contributed the `--clone-into` CLI argument for `container-instance`, the `CloneIntoHandler` module, the `devcontainer-instance` snapshot sandbox strategy, and the `ContainerLifecycleState.DISCOVERED` terminology alignment (PR #8304, issue #7555).
|
||||
* This project was made possible thanks to considerable donation of time, money, and resources by CleverThis, Inc.
|
||||
|
||||
@@ -41,16 +41,16 @@ Feature: agents resource list shows devcontainer lifecycle state column
|
||||
Then the resource output should contain "local/my-repo"
|
||||
And the resource output should contain "git-checkout"
|
||||
|
||||
Scenario: resource list shows warning banner when devcontainer is in detected state
|
||||
Scenario: resource list shows warning banner when devcontainer is in discovered state
|
||||
Given a devcontainer-instance resource is registered
|
||||
When I run resource list with all flag
|
||||
Then the resource output should contain "Devcontainer detected"
|
||||
Then the resource output should contain "Devcontainer discovered"
|
||||
|
||||
Scenario: resource list does not show warning banner when devcontainer is running
|
||||
Given a devcontainer-instance resource is registered
|
||||
And the devcontainer lifecycle state is "running"
|
||||
When I run resource list with all flag
|
||||
Then the resource output should not contain "Devcontainer detected"
|
||||
Then the resource output should not contain "Devcontainer discovered"
|
||||
|
||||
@tdd_issue @tdd_issue_4263 @tdd_expected_fail
|
||||
Scenario: resource list JSON output includes lifecycle_state for devcontainer-instance
|
||||
|
||||
@@ -75,12 +75,11 @@ def cmd_protocol_check() -> None:
|
||||
def cmd_strategy_check() -> None:
|
||||
"""Verify DevcontainerHandler default strategy.
|
||||
|
||||
F22/F25 fix: handler uses ``none`` because SandboxFactory has not yet
|
||||
implemented ``snapshot``. The container itself provides isolation.
|
||||
Known limitation — will switch to ``snapshot`` once implemented.
|
||||
PR #8304 fix: handler now uses ``snapshot`` strategy for safe plan
|
||||
execution inside containers (ADR-043 devcontainer integration).
|
||||
"""
|
||||
handler = DevcontainerHandler()
|
||||
assert handler._default_strategy.value == "none"
|
||||
assert handler._default_strategy.value == "snapshot"
|
||||
print("strategy-check-ok")
|
||||
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ class _MockRunner:
|
||||
|
||||
def cmd_enum_values() -> None:
|
||||
"""Verify all six lifecycle states exist."""
|
||||
expected = {"detected", "building", "running", "stopping", "stopped", "failed"}
|
||||
expected = {"discovered", "building", "running", "stopping", "stopped", "failed"}
|
||||
actual = {s.value for s in ContainerLifecycleState}
|
||||
assert actual == expected, f"Expected {expected}, got {actual}"
|
||||
print("enum-values-ok")
|
||||
|
||||
@@ -159,7 +159,7 @@ def _get_lifecycle_state_str(resource: Any) -> str | None:
|
||||
resource: A Resource domain object.
|
||||
|
||||
Returns:
|
||||
Lifecycle state string (e.g. ``"detected (not built)"``, ``"running"``)
|
||||
Lifecycle state string (e.g. ``"discovered (not built)"``, ``"running"``)
|
||||
or ``None`` if the resource type has no lifecycle state.
|
||||
"""
|
||||
if resource.resource_type_name not in _CONTAINER_TYPES:
|
||||
@@ -877,7 +877,7 @@ def resource_list(
|
||||
if len(res_id) > 12:
|
||||
res_id = res_id[:12] + "..."
|
||||
lifecycle_state = _get_lifecycle_state_str(res)
|
||||
if lifecycle_state == "detected (not built)":
|
||||
if lifecycle_state == "discovered (not built)":
|
||||
detected_devcontainers.append(res)
|
||||
table.add_row(
|
||||
res_id,
|
||||
@@ -895,7 +895,7 @@ def resource_list(
|
||||
location = res.location or "(unknown path)"
|
||||
devcontainer_json = f"{location}/.devcontainer/devcontainer.json"
|
||||
console.print(
|
||||
f"[yellow]⚠ Devcontainer detected at {devcontainer_json}[/yellow]"
|
||||
f"[yellow]⚠ Devcontainer discovered at {devcontainer_json}[/yellow]"
|
||||
)
|
||||
console.print(" Container will be built lazily on first access.")
|
||||
console.print(
|
||||
|
||||
@@ -1,674 +0,0 @@
|
||||
Test Framework: generic
|
||||
Total Tests: 155
|
||||
Passed: 107
|
||||
Failed: 48
|
||||
|
||||
--- Test Results ---
|
||||
✓ Output Block 1
|
||||
✓ Output Block 2
|
||||
✓ Output Block 3
|
||||
✓ Output Block 4
|
||||
✓ Output Block 5
|
||||
✓ Output Block 6
|
||||
✓ Output Block 7
|
||||
✓ Output Block 8
|
||||
✓ Output Block 9
|
||||
✓ Output Block 10
|
||||
✗ Output Block 11
|
||||
✓ Output Block 12
|
||||
✓ Output Block 13
|
||||
✗ Output Block 14
|
||||
✗ Output Block 15
|
||||
✗ Output Block 16
|
||||
✓ Output Block 17
|
||||
✓ Output Block 18
|
||||
✓ Output Block 19
|
||||
✓ Output Block 20
|
||||
✓ Output Block 21
|
||||
✓ Output Block 22
|
||||
✗ Output Block 23
|
||||
✗ Output Block 24
|
||||
✗ Output Block 25
|
||||
✗ Output Block 26
|
||||
✓ Output Block 27
|
||||
✗ Output Block 28
|
||||
✗ Output Block 29
|
||||
✗ Output Block 30
|
||||
✗ Output Block 31
|
||||
✗ Output Block 32
|
||||
✗ Output Block 33
|
||||
✗ Output Block 34
|
||||
✗ Output Block 35
|
||||
✓ Output Block 36
|
||||
✓ Output Block 37
|
||||
✓ Output Block 38
|
||||
✓ Output Block 39
|
||||
✓ Output Block 40
|
||||
✓ Output Block 41
|
||||
✓ Output Block 42
|
||||
✓ Output Block 43
|
||||
✓ Output Block 44
|
||||
✗ Output Block 45
|
||||
✓ Output Block 46
|
||||
✓ Output Block 47
|
||||
✗ Output Block 48
|
||||
✓ Output Block 49
|
||||
✓ Output Block 50
|
||||
✗ FAIL: Output Block 51
|
||||
✓ Output Block 52
|
||||
✗ Output Block 53
|
||||
✗ FAIL: Output Block 54
|
||||
✓ Output Block 55
|
||||
✓ Output Block 56
|
||||
✗ Output Block 57
|
||||
✗ Output Block 58
|
||||
✓ Output Block 59
|
||||
✓ Output Block 60
|
||||
✗ Output Block 61
|
||||
✗ Output Block 62
|
||||
✓ Output Block 63
|
||||
✓ Output Block 64
|
||||
✓ Output Block 65
|
||||
✓ Output Block 66
|
||||
✓ Output Block 67
|
||||
✓ Output Block 68
|
||||
✓ Output Block 69
|
||||
✓ Output Block 70
|
||||
✓ Output Block 71
|
||||
✓ Output Block 72
|
||||
✓ Output Block 73
|
||||
✓ Output Block 74
|
||||
✓ Output Block 75
|
||||
✓ Output Block 76
|
||||
✓ Output Block 77
|
||||
✓ Output Block 78
|
||||
✓ Output Block 79
|
||||
✓ Output Block 80
|
||||
✓ Output Block 81
|
||||
✓ Output Block 82
|
||||
✗ Output Block 83
|
||||
✓ Output Block 84
|
||||
✓ Output Block 85
|
||||
✗ Output Block 86
|
||||
✓ Output Block 87
|
||||
✗ Output Block 88
|
||||
✓ Output Block 89
|
||||
✓ Output Block 90
|
||||
✓ Output Block 91
|
||||
✓ Output Block 92
|
||||
✗ Output Block 93
|
||||
✗ Output Block 94
|
||||
✓ Output Block 95
|
||||
✓ Output Block 96
|
||||
✓ Output Block 97
|
||||
✓ Output Block 98
|
||||
✗ Output Block 99
|
||||
✓ Output Block 100
|
||||
✓ Output Block 101
|
||||
✓ Output Block 102
|
||||
✓ Output Block 103
|
||||
✗ Output Block 104
|
||||
✓ Output Block 105
|
||||
✓ Output Block 106
|
||||
✗ Output Block 107
|
||||
✓ Output Block 108
|
||||
✓ Output Block 109
|
||||
✗ Output Block 110
|
||||
✓ Output Block 111
|
||||
✗ Output Block 112
|
||||
✓ Output Block 113
|
||||
✗ Output Block 114
|
||||
✓ Output Block 115
|
||||
✗ Output Block 116
|
||||
✓ Output Block 117
|
||||
✓ Output Block 118
|
||||
✓ Output Block 119
|
||||
✓ Output Block 120
|
||||
✓ Output Block 121
|
||||
✓ Output Block 122
|
||||
✗ Output Block 123
|
||||
✓ Output Block 124
|
||||
✓ Output Block 125
|
||||
✓ Output Block 126
|
||||
✓ Output Block 127
|
||||
✓ Output Block 128
|
||||
✓ Output Block 129
|
||||
✓ Output Block 130
|
||||
✗ Output Block 131
|
||||
✗ Output Block 132
|
||||
✓ Output Block 133
|
||||
✓ Output Block 134
|
||||
✓ Output Block 135
|
||||
✓ Output Block 136
|
||||
✓ Output Block 137
|
||||
✓ Output Block 138
|
||||
✓ Output Block 139
|
||||
✓ Output Block 140
|
||||
✗ Output Block 141
|
||||
✗ Output Block 142
|
||||
✗ Output Block 143
|
||||
✗ Output Block 144
|
||||
✓ Output Block 145
|
||||
✓ Output Block 146
|
||||
✓ Output Block 147
|
||||
✓ Output Block 148
|
||||
✓ Output Block 149
|
||||
✓ Output Block 150
|
||||
✓ Output Block 151
|
||||
✗ Output Block 152
|
||||
✗ Output Block 153
|
||||
✗ nox > Running session unit_tests-3.13
|
||||
✗ Error Output
|
||||
|
||||
--- Failed Tests ---
|
||||
✗ Output Block 11
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
10 scenarios passed, 0 failed, 0 skipped
|
||||
23 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.006s
|
||||
Feature: Devcontainer Lifecycle State Model
|
||||
As a CleverAgents developer
|
||||
I want the container lifecycle state model to enforce valid transitions
|
||||
So that containers follow a predictable state machine
|
||||
Scenario: ContainerLifecycleState has all required values
|
||||
When I inspect ContainerLifecycleState enum values
|
||||
Then the lifecycle enum should contain "discovered"
|
||||
And the lifecycle enum should contain "building"
|
||||
And the lifecycle enum should contain "running"
|
||||
And the lifecycle enum should contain "stopping"
|
||||
And the lifecycle enum should contain "stopped"
|
||||
And the lifecycle enum should contain "failed"
|
||||
|
||||
✗ Output Block 14
|
||||
Scenario: Invalid transition is rejected
|
||||
Given a lifecycle tracker for resource "01TESTLIFECYCLE0000000003"
|
||||
When I attempt to transition from "discovered" to "running"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 15
|
||||
Scenario: Stopping to error transition is valid
|
||||
Given a lifecycle tracker in "stopping" state for resource "01TESTLIFECYCLE0000000004"
|
||||
When I transition from "stopping" to "failed"
|
||||
Then the transition should succeed
|
||||
And the tracker state should be "failed"
|
||||
|
||||
✗ Output Block 16
|
||||
Scenario: Error to starting transition is valid for retry
|
||||
Given a lifecycle tracker in "failed" state for resource "01TESTLIFECYCLE0000000005"
|
||||
When I transition from "failed" to "building"
|
||||
Then the transition should succeed
|
||||
And the tracker state should be "building"
|
||||
|
||||
✗ Output Block 23
|
||||
Scenario: validate_transition rejects wrong types
|
||||
When I call validate_transition with non-enum arguments
|
||||
Then it should raise TypeError
|
||||
|
||||
✗ Output Block 24
|
||||
Scenario: validate_transition rejects wrong to_state type
|
||||
When I call validate_transition with non-enum to_state
|
||||
Then it should raise TypeError
|
||||
|
||||
✗ Output Block 25
|
||||
Scenario: transition_state rejects wrong tracker type
|
||||
When I call transition_state with non-tracker argument
|
||||
Then it should raise TypeError
|
||||
|
||||
✗ Output Block 26
|
||||
Scenario: transition_state rejects wrong to_state type
|
||||
When I call transition_state with non-enum to_state argument
|
||||
Then it should raise TypeError
|
||||
Feature: agents resource list shows devcontainer lifecycle state column
|
||||
As a CleverAgents user
|
||||
I want the resource list to show the lifecycle state for devcontainer-instance resources
|
||||
So that I can see whether a devcontainer is discovered, running, stopped, or failed
|
||||
Feature: agents resource list shows devcontainer lifecycle state column
|
||||
|
||||
✗ Output Block 28
|
||||
Scenario: get_lifecycle_tracker rejects empty resource_id
|
||||
When I attempt to get tracker with empty resource_id
|
||||
Then the get tracker should raise ValueError
|
||||
|
||||
✗ Output Block 29
|
||||
Scenario: set_lifecycle_tracker rejects wrong type
|
||||
When I attempt to set tracker with wrong type
|
||||
Then the set tracker should raise TypeError
|
||||
|
||||
✗ Output Block 30
|
||||
Scenario: Invalid transition running to building is rejected
|
||||
Given a lifecycle tracker in "running" state for resource "01TESTLIFECYCLE0000000240"
|
||||
When I attempt to transition from "running" to "building"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 31
|
||||
Scenario: Invalid transition stopped to running is rejected
|
||||
Given a lifecycle tracker in "stopped" state for resource "01TESTLIFECYCLE0000000241"
|
||||
When I attempt to transition from "stopped" to "running"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 32
|
||||
Scenario: Invalid transition building to stopped is rejected
|
||||
Given a lifecycle tracker in "building" state for resource "01TESTLIFECYCLE0000000242"
|
||||
When I attempt to transition from "building" to "stopped"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 33
|
||||
Scenario: Invalid transition failed to running is rejected
|
||||
Given a lifecycle tracker in "failed" state for resource "01TESTLIFECYCLE0000000243"
|
||||
When I attempt to transition from "failed" to "running"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 34
|
||||
Scenario: Invalid transition discovered to stopping is rejected
|
||||
Given a lifecycle tracker for resource "01TESTLIFECYCLE0000000244"
|
||||
When I attempt to transition from "discovered" to "stopping"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 35
|
||||
Scenario: Invalid transition building to discovered is rejected
|
||||
Given a lifecycle tracker in "building" state for resource "01TESTLIFECYCLE0000000245"
|
||||
When I attempt to transition from "building" to "discovered"
|
||||
Then the transition should raise ValueError
|
||||
|
||||
✗ Output Block 45
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
32 scenarios passed, 0 failed, 0 skipped
|
||||
106 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.037s
|
||||
And built-in types are bootstrapped
|
||||
Given a devcontainer-instance resource is registered
|
||||
When I run resource list with all flag
|
||||
Then the resource output should contain "discovered (not built)"
|
||||
|
||||
✗ Output Block 48
|
||||
Scenario: resource list shows "failed" state for a failed devcontainer
|
||||
Given a fresh in-memory resource registry
|
||||
And built-in types are bootstrapped
|
||||
Given a devcontainer-instance resource is registered
|
||||
And the devcontainer lifecycle state is "failed"
|
||||
When I run resource list with all flag
|
||||
Then the resource output should contain "failed"
|
||||
|
||||
✗ FAIL: Output Block 51
|
||||
ASSERT FAILED: Expected 'Devcontainer detected' in output, got:
|
||||
Resources (1 total)
|
||||
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ ID ┃ Name ┃ Type ┃ Status ┃ Kind ┃ Location ┃ Description ┃
|
||||
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩
|
||||
│ 01KP2TDV4GAR... │ (unnamed) │ devcontainer-instance │ discovered (not built) │ physical │ /tmp/test-project │ Test devcontainer │
|
||||
└─────────────────┴───────────┴───────────────────────┴────────────────────────┴──────────┴───────────────────┴───────────────────┘
|
||||
|
||||
✗ Output Block 53
|
||||
@tdd_issue @tdd_issue_4263 @tdd_expected_fail
|
||||
Scenario: resource list JSON output includes lifecycle_state for devcontainer-instance
|
||||
Given a fresh in-memory resource registry
|
||||
And built-in types are bootstrapped
|
||||
Given a devcontainer-instance resource is registered
|
||||
When I run resource list with all flag and format "json"
|
||||
Then the resource output should be valid JSON
|
||||
And the resource JSON output should contain key "lifecycle_state"
|
||||
|
||||
✗ FAIL: Output Block 54
|
||||
ASSERT FAILED: Key 'lifecycle_state' not found in JSON output
|
||||
|
||||
✗ Output Block 57
|
||||
Scenario: resource list succeeds gracefully when lifecycle tracker raises an error
|
||||
Given a fresh in-memory resource registry
|
||||
And built-in types are bootstrapped
|
||||
Feature: Devcontainer Resource Handler
|
||||
As a CleverAgents developer
|
||||
I want devcontainer resources to be auto-discovered and manually registered
|
||||
So that devcontainer environments integrate into the resource model Given a devcontainer-instance resource is registered
|
||||
|
||||
✗ Output Block 58
|
||||
Scenario: Register devcontainer-instance manually
|
||||
Given a temporary directory with a valid devcontainer.json
|
||||
When I create a devcontainer-instance resource at that path
|
||||
Then And the resource should have type "the lifecycle tracker raises an error for the resourcedevcontainer-instance"
|
||||
|
||||
✗ Output Block 61
|
||||
|
||||
Failing scenarios:
|
||||
features/resource_list_lifecycle_state.feature:44 resource list shows warning banner when devcontainer is in detected state
|
||||
|
||||
✗ Output Block 62
|
||||
0 features passed, 1 failed, 0 skipped
|
||||
11 scenarios passed, 1 failed, 0 skipped
|
||||
69 steps passed, 1 failed, 0 skipped
|
||||
Took 0min 1.827s
|
||||
|
||||
✗ Output Block 83
|
||||
Scenario Outline: validate_clone_into_url rejects invalid URLs -- @1.1
|
||||
When I validate clone-into URL "not-a-url"
|
||||
Then it should raise a ValueError
|
||||
Then the clone-into URL should be invalid
|
||||
|
||||
✗ Output Block 86
|
||||
Scenario: clone_repo_into_container rejects empty container_id
|
||||
When I call clone_repo_into_container with empty container_id
|
||||
Then it should raise ValueError mentioning "container_id"
|
||||
|
||||
✗ Output Block 88
|
||||
Scenario: clone_repo_into_container rejects empty repo_url
|
||||
When I call clone_repo_into_container with empty repo_url
|
||||
And the directory has a named devcontainer configuration "frontend"
|
||||
Then it should raise ValueError mentioning "repo_url"
|
||||
When I run devcontainer discovery on the directory as "git-checkout"
|
||||
Then discovery should return 2 results
|
||||
And the result config names should include "api"
|
||||
|
||||
✗ Output Block 93
|
||||
Scenario: clone_repo_into_container raises CloneIntoError when docker exec fails
|
||||
Given a mock docker exec that fails for clone with stderr "fatal: repository not found"
|
||||
When I clone "https://github.com/org/missing.git" into container "abc123def456"
|
||||
When I run devcontainer discovery on the directory as "git-checkout"
|
||||
Then the clone should raise CloneIntoError
|
||||
And the CloneIntoError should mention "repository not found"
|
||||
Then discovery should return 1 result
|
||||
And the first result should have no config name
|
||||
|
||||
✗ Output Block 94
|
||||
Scenario: CloneIntoError stores repo_url, container_id, and stderr
|
||||
Given a CloneIntoError with repo "https://example.com/repo.git" container "ctr-001" stderr "auth failed"
|
||||
Then the CloneIntoError repo_url should be "https://example.com/repo.git"
|
||||
And the CloneIntoError container_id should be "ctr-001"
|
||||
And the CloneIntoError stderr should be "auth failed"
|
||||
|
||||
✗ Output Block 99
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
17 scenarios passed, 0 failed, 0 skipped
|
||||
44 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.008s
|
||||
Then discovery should return 0 results
|
||||
|
||||
✗ Output Block 104
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
26 scenarios passed, 0 failed, 0 skipped
|
||||
90 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.026s
|
||||
Feature: Devcontainer Session Cleanup and CLI Commands
|
||||
As a CleverAgents developer
|
||||
I want session-scoped container cleanup and CLI stop/rebuild commands
|
||||
So that containers are cleaned up when sessions end and can be managed via CLI
|
||||
Scenario: Active containers stopped on session cleanup
|
||||
Given a mock devcontainer CLI runner
|
||||
And an active container "01TESTLIFECYCLE0000000040" with container ID "ctr-a"
|
||||
And an active container "01TESTLIFECYCLE0000000041" with container ID "ctr-b"
|
||||
When I run session cleanup for session "session-001"
|
||||
Then the container state for "01TESTLIFECYCLE0000000040" should be "stopped"
|
||||
And the container state for "01TESTLIFECYCLE0000000041" should be "stopped"
|
||||
|
||||
✗ Output Block 107
|
||||
Scenario: Session cleanup handles stop failure gracefully
|
||||
Given a mock devcontainer CLI runner
|
||||
And the runner configured to raise exception on stop
|
||||
And an active container "01TESTLIFECYCLE0000000130" with container ID "ctr-fail"
|
||||
When I run session cleanup for session "session-err"
|
||||
Then the cleanup should return 0 stopped containers
|
||||
|
||||
✗ Output Block 110
|
||||
Scenario: dcproto delete fails when container is stopped
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with location "/ws/project"
|
||||
And dcproto subprocess returns failed rm output with stderr "container not running"
|
||||
When dcproto I delete path "file.txt" from the resource
|
||||
Then the CLI exit code should be 0
|
||||
And the CLI output should contain "Stopped"
|
||||
Then dcproto the delete should fail
|
||||
And dcproto the delete failure message should contain "container not running"
|
||||
|
||||
✗ Output Block 112
|
||||
Scenario: dcproto delete from resource with no location raises ValueError
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with no location
|
||||
When dcproto I delete path "any/file.txt" from the resource
|
||||
Then dcproto the delete should raise ValueError containing "no location"
|
||||
|
||||
✗ Output Block 114
|
||||
Scenario: dcproto list_children returns empty list when container is stopped
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with location "/ws/project"
|
||||
And dcproto subprocess returns failed ls output
|
||||
When dcproto I list children of the resource
|
||||
Then dcproto the children list should have 0 entries
|
||||
|
||||
✗ Output Block 116
|
||||
Scenario: dcproto list_children from resource with no location raises ValueError
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with no location
|
||||
When dcproto I list children of the resource
|
||||
Then dcproto the list children should raise ValueError containing "no location"
|
||||
|
||||
✗ Output Block 123
|
||||
Scenario: dcproto diff from resource with no location raises ValueError
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with no location
|
||||
When dcproto I diff the resource against "/some/path"
|
||||
Then the devcontainer CLI exit code should be non-zero
|
||||
Then dcproto the diff should raise ValueError containing "no location"
|
||||
And the CLI output should contain "no location"
|
||||
|
||||
✗ Output Block 131
|
||||
Scenario: dcproto create_sandbox raises ValueError for resource with no location
|
||||
Given dcproto a devcontainer handler
|
||||
And dcproto a devcontainer-instance resource with no location
|
||||
And dcproto a mock sandbox manager that returns a valid sandbox
|
||||
When dcproto I create a sandbox for the resource with plan "plan-004"
|
||||
Then dcproto the create_sandbox should raise ValueError containing "no location"
|
||||
|
||||
✗ Output Block 132
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
18 scenarios passed, 0 failed, 0 skipped
|
||||
102 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.028s
|
||||
Then the CLI exit code should be 0
|
||||
And the CLI rebuild mock should have been called with "01TESTLIFECYCLE0000000221" and "/workspace/project"
|
||||
|
||||
✗ Output Block 141
|
||||
Scenario: CLI stop handles NotFoundError from show_resource
|
||||
Given a mock resource service that raises NotFoundError for "local/missing"
|
||||
When I invoke CLI resource stop "local/missing"
|
||||
Then the devcontainer CLI exit code should be non-zero
|
||||
And the CLI output should contain "Resource not found"
|
||||
|
||||
✗ Output Block 142
|
||||
Scenario: CLI rebuild handles NotFoundError from show_resource
|
||||
Given a mock resource service that raises NotFoundError for "local/missing-rb"
|
||||
When I invoke CLI resource rebuild "local/missing-rb"
|
||||
Then the devcontainer CLI exit code should be non-zero
|
||||
And the CLI output should contain "Resource not found"
|
||||
|
||||
✗ Output Block 143
|
||||
Scenario: CLI stop handles RuntimeError from stop_container
|
||||
Given a mock resource service with devcontainer "local/dc-rterr" id "01TESTLIFECYCLE0000000500" at "/workspace/project"
|
||||
And an active container "01TESTLIFECYCLE0000000500" with container ID "ctr-rterr"
|
||||
And CLI stop_container mock that raises RuntimeError
|
||||
When I invoke CLI resource stop with error mock "local/dc-rterr"
|
||||
Then the devcontainer CLI exit code should be non-zero
|
||||
And the CLI output should contain "Stop failed"
|
||||
|
||||
✗ Output Block 144
|
||||
Scenario: CLI rebuild handles RuntimeError from rebuild_container
|
||||
Given a mock resource service with devcontainer "local/dc-rberr" id "01TESTLIFECYCLE0000000501" at "/workspace/project"
|
||||
And a stopped container "01TESTLIFECYCLE0000000501"
|
||||
And CLI rebuild_container mock that raises RuntimeError
|
||||
When I invoke CLI resource rebuild with error mock "local/dc-rberr"
|
||||
Then the devcontainer CLI exit code should be non-zero
|
||||
And the CLI output should contain "Rebuild failed"
|
||||
|
||||
✗ Output Block 152
|
||||
1 feature passed, 0 failed, 0 skipped
|
||||
30 scenarios passed, 0 failed, 0 skipped
|
||||
143 steps passed, 0 failed, 0 skipped
|
||||
Took 0min 0.436s
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
2026-04-13 07:00:42 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:42 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:42 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:42 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
[1mIncluding unscoped container 01TESTLIFECYCLE0000000040 in session 'session-001' cleanup (container has no session_id set)[0m
|
||||
[1mIncluding unscoped container 01TESTLIFECYCLE0000000041 in session 'session-001' cleanup (container has no session_id set)[0m
|
||||
[1mContainer 01TESTLIFECYCLE0000000040: running -> stopping (manual stop)[0m
|
||||
[1mContainer 01TESTLIFECYCLE0000000040: stopping -> stopped (container stopped)[0m
|
||||
[1mStopped container 01TESTLIFECYCLE0000000040 (session=session-001)[0m
|
||||
[1mContainer 01TESTLIFECYCLE0000000041: running -> stopping (manual stop)[0m
|
||||
[1mContainer 01TESTLIFECYCLE0000000041: stopping -> stopped (container stopped)[0m
|
||||
[1mStopped container 01TESTLIFECYCLE0000000041 (session=session-001)[0m
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
[1mRegistered built-in resource type: fs-mount[0m
|
||||
[1mRegistered built-in resource type: git-checkout[0m
|
||||
[1mRegistered built-in resource type: fs-directory[0m
|
||||
[1mRegistered built-in resource type: container-instance[0m
|
||||
[1mRegistered built-in resource type: devcontainer-instance[0m
|
||||
[1mRegistered built-in resource type: devcontainer-file[0m
|
||||
[1mRegistered built-in resource type: git[0m
|
||||
[1mRegistered built-in resource type: git-remote[0m
|
||||
[1mRegistered built-in resource type: git-branch[0m
|
||||
[1mRegistered built-in resource type: git-tag[0m
|
||||
[1mRegistered built-in resource type: git-commit[0m
|
||||
[1mRegistered built-in resource type: git-tree[0m
|
||||
[1mRegistered built-in resource type: git-tree-entry[0m
|
||||
[1mRegistered built-in resource type: git-stash[0m
|
||||
[1mRegistered built-in resource type: git-submodule[0m
|
||||
[1mRegistered built-in resource type: fs-symlink[0m
|
||||
[1mRegistered built-in resource type: fs-hardlink[0m
|
||||
[1mRegistered built-in resource type: cloud-account[0m
|
||||
[1mRegistered built-in resource type: cloud-region[0m
|
||||
[1mRegistered built-in resource type: cloud-network[0m
|
||||
[1mRegistered built-in resource type: cloud-subnet[0m
|
||||
[1mRegistered built-in resource type: cloud-security-group[0m
|
||||
[1mRegistered built-in resource type: cloud-load-balancer[0m
|
||||
[1mRegistered built-in resource type: cloud-compute-instance[0m
|
||||
[1mRegistered built-in resource type: cloud-object-store[0m
|
||||
[1mRegistered built-in resource type: cloud-block-storage[0m
|
||||
[1mRegistered built-in resource type: cloud-identity-principal[0m
|
||||
[1mRegistered built-in resource type: cloud-role[0m
|
||||
[1mRegistered built-in resource type: cloud-policy[0m
|
||||
[1mRegistered built-in resource type: cloud-log-group[0m
|
||||
[1mRegistered built-in resource type: cloud-alarm[0m
|
||||
[1mRegistered built-in resource type: cloud-queue[0m
|
||||
[1mRegistered built-in resource type: cloud-topic[0m
|
||||
[1mRegistered built-in resource type: cloud-container-repo[0m
|
||||
[1mRegistered built-in resource type: cloud-container-cluster[0m
|
||||
[1mRegistered built-in resource type: cloud-container-service[0m
|
||||
[1mRegistered built-in resource type: aws-account[0m
|
||||
[1mRegistered built-in resource type: aws-region[0m
|
||||
[1mRegistered built-in resource type: aws-vpc[0m
|
||||
[1mRegistered built-in resource type: aws-subnet[0m
|
||||
[1mRegistered built-in resource type: aws-igw[0m
|
||||
[1mRegistered built-in resource type: aws-nat-gw[0m
|
||||
[1mRegistered built-in resource type: aws-route-table[0m
|
||||
[1mRegistered built-in resource type: aws-nacl[0m
|
||||
[1mRegistered built-in resource type: aws-security-group[0m
|
||||
[1mRegistered built-in resource type: aws-alb[0m
|
||||
[1mRegistered built-in resource type: aws-nlb[0m
|
||||
[1mRegistered built-in resource type: aws-target-group[0m
|
||||
[1mRegistered built-in resource type: aws-listener[0m
|
||||
[1mRegistered built-in resource type: aws-ec2-instance[0m
|
||||
[1mRegistered built-in resource type: aws-ami[0m
|
||||
[1mRegistered built-in resource type: aws-launch-template[0m
|
||||
[1mRegistered built-in resource type: aws-asg[0m
|
||||
[1mRegistered built-in resource type: aws-s3-bucket[0m
|
||||
[1mRegistered built-in resource type: aws-ebs-volume[0m
|
||||
[1mRegistered built-in resource type: aws-efs-filesystem[0m
|
||||
[1mRegistered built-in resource type: aws-iam-user[0m
|
||||
[1mRegistered built-in resource type: aws-iam-role[0m
|
||||
[1mRegistered built-in resource type: aws-iam-policy[0m
|
||||
[1mRegistered built-in resource type: aws-iam-instance-profile[0m
|
||||
[1mRegistered built-in resource type: aws-cloudwatch-log-group[0m
|
||||
[1mRegistered built-in resource type: aws-cloudwatch-alarm[0m
|
||||
[1mRegistered built-in resource type: aws-cloudwatch-metric[0m
|
||||
[1mRegistered built-in resource type: aws-eventbridge-bus[0m
|
||||
[1mRegistered built-in resource type: aws-eventbridge-rule[0m
|
||||
[1mRegistered built-in resource type: aws-eventbridge-target[0m
|
||||
[1mRegistered built-in resource type: aws-sqs-queue[0m
|
||||
[1mRegistered built-in resource type: aws-sns-topic[0m
|
||||
[1mRegistered built-in resource type: aws-sns-subscription[0m
|
||||
[1mRegistered built-in resource type: aws-ecr-repo[0m
|
||||
[1mRegistered built-in resource type: aws-ecs-cluster[0m
|
||||
[1mRegistered built-in resource type: aws-ecs-service[0m
|
||||
[1mRegistered built-in resource type: aws-ecs-task-def[0m
|
||||
[1mRegistered built-in resource type: aws-eks-cluster[0m
|
||||
[1mRegistered built-in resource type: aws-eks-nodegroup[0m
|
||||
[1mRegistered built-in resource type: gcp[0m
|
||||
[1mRegistered built-in resource type: azure[0m
|
||||
[1mRegistered built-in resource type: container-runtime[0m
|
||||
[1mRegistered built-in resource type: container-image[0m
|
||||
[1mRegistered built-in resource type: container-mount[0m
|
||||
[1mRegistered built-in resource type: container-exec-env[0m
|
||||
[1mRegistered built-in resource type: container-port[0m
|
||||
[1mRegistered built-in resource type: container-volume[0m
|
||||
[1mRegistered built-in resource type: container-network[0m
|
||||
[1mRegistered built-in resource type: postgres[0m
|
||||
[1mRegistered built-in resource type: mysql[0m
|
||||
[1mRegistered built-in resource type: sqlite[0m
|
||||
[1mRegistered built-in resource type: duckdb[0m
|
||||
[1mRegistered built-in resource type: file[0m
|
||||
[1mRegistered built-in resource type: directory[0m
|
||||
[1mRegistered built-in resource type: commit[0m
|
||||
[1mRegistered built-in resource type: branch[0m
|
||||
[1mRegistered built-in resource type: tag[0m
|
||||
[1mRegistered built-in resource type: tree[0m
|
||||
[1mRegistered built-in resource type: remote[0m
|
||||
[1mRegistered built-in resource type: submodule[0m
|
||||
[1mRegistered built-in resource type: symlink[0m
|
||||
[1mRegistered built-in resource type: executable[0m
|
||||
[1mRegistered built-in resource type: lsp-server[0m
|
||||
[1mRegistered built-in resource type: lsp-workspace[0m
|
||||
[1mRegistered built-in resource type: lsp-document[0m
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.created child_domain=uko-oo: parent_domain=uko-code:
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=MEMBER_LISTING domain=uko-oo: new_level=CLASS_HIERARCHY
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.insert_after after_level=SIGNATURES_WITH_DOCS domain=uko-oo: new_level=VISIBILITY_ANNOTATED
|
||||
2026-04-13 07:00:43 [debug ] detail_level_map_builder.built domain=uko-oo: max_depth=11 num_levels=12
|
||||
|
||||
✗ Output Block 153
|
||||
Overall summary:
|
||||
6 features passed, 1 failed, 0 errored, 0 skipped
|
||||
144 scenarios passed, 1 failed, 0 errored, 0 skipped
|
||||
553 steps passed, 1 failed, 0 errored, 0 skipped
|
||||
Took 2.366s
|
||||
Wall time: 2m 47.786s
|
||||
|
||||
✗ nox > Running session unit_tests-3.13
|
||||
nox > Running session unit_tests-3.13
|
||||
nox > Reusing existing virtual environment at .nox/unit_tests-3-13.
|
||||
nox > uv pip install -e '.[tests]'
|
||||
nox > uv pip install setuptools wheel
|
||||
nox > uv pip install .nox/unit_tests-3-13/tmp/behave-parallel-inprocess
|
||||
nox > python scripts/create_template_db.py /tmp/impl-worker-7555-20260413/build/.template-migrated.db
|
||||
nox > python -m compileall -q features/
|
||||
nox > /tmp/impl-worker-7555-20260413/.nox/unit_tests-3-13/bin/behave-parallel -q --processes 32 features/container_clone_into.feature features/devcontainer_sandbox_strategy.feature features/devcontainer_state.feature features/devcontainer_handler.feature features/devcontainer_cleanup.feature features/resource_list_lifecycle_state.feature features/devcontainer_handler_protocol_methods.feature
|
||||
nox > Command /tmp/impl-worker-7555-20260413/.nox/unit_tests-3-13/bin/behave-parallel -q --processes 32 features/container_clone_into.feature features/devcontainer_sandbox_strategy.feature features/devcontainer_state.feature features/devcontainer_handler.feature features/devcontainer_cleanup.feature features/resource_list_lifecycle_state.feature features/devcontainer_handler_protocol_methods.feature failed with exit code 1
|
||||
nox > Session unit_tests-3.13 failed.
|
||||
|
||||
✗ Error Output
|
||||
nox > Running session unit_tests-3.13
|
||||
nox > Reusing existing virtual environment at .nox/unit_tests-3-13.
|
||||
nox > uv pip install -e '.[tests]'
|
||||
nox > uv pip install setuptools wheel
|
||||
nox > uv pip install .nox/unit_tests-3-13/tmp/behave-parallel-inprocess
|
||||
nox > python scripts/create_template_db.py /tmp/impl-worker-7555-20260413/build/.template-migrated.db
|
||||
nox > python -m compileall -q features/
|
||||
nox > /tmp/impl-worker-7555-20260413/.nox/unit_tests-3-13/bin/behave-parallel -q --processes 32 features/container_clone_into.feature features/devcontainer_sandbox_strategy.feature features/devcontainer_state.feature features/devcontainer_handler.feature features/devcontainer_cleanup.feature features/resource_list_lifecycle_state.feature features/devcontainer_handler_protocol_methods.feature
|
||||
nox > Command /tmp/impl-worker-7555-20260413/.nox/unit_tests-3-13/bin/behave-parallel -q --processes 32 features/container_clone_into.feature features/devcontainer_sandbox_strategy.feature features/devcontainer_state.feature features/devcontainer_handler.feature features/devcontainer_cleanup.feature features/resource_list_lifecycle_state.feature features/devcontainer_handler_protocol_methods.feature failed with exit code 1
|
||||
nox > Session unit_tests-3.13 failed.
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user