Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
d4edcd9
test(oci): share OCI image checks across Docker and Podman
matthewgrossman Sep 30, 2026
0b207ce
test(oci): require WorkspaceValidationFailed and cover image USER fal…
matthewgrossman Sep 30, 2026
27bfea8
test(podman): leave shared OCI identity checks to the oci-image suite
matthewgrossman Sep 30, 2026
9ebe52b
test(oci): accept existing workspace rejection diagnostics
matthewgrossman Oct 6, 2026
77540f2
test(oci): fix cleanup ordering and restore coverage parity
matthewgrossman Oct 6, 2026
9642f7e
test(oci): remove migrated legacy workspace helpers and checks
matthewgrossman Oct 7, 2026
6d02951
fix(drivers): report rejected OCI working directories as WorkspaceVal…
matthewgrossman Oct 8, 2026
2b1c5d2
test(oci): require WorkspaceValidationFailed for unwritable WORKDIR
matthewgrossman Oct 8, 2026
7fbdc23
fix(oci): keep exit 78 reserved and report fixed workspace diagnostics
matthewgrossman Oct 8, 2026
2ce1cdb
Merge remote-tracking branch 'origin/main' into podman-workdir/a-oci-…
matthewgrossman Oct 9, 2026
d181609
refactor(oci): simplify workspace failure handling and OCI image tests
matthewgrossman Oct 9, 2026
255f73d
Merge remote-tracking branch 'origin/main' into podman-workdir/a-oci-…
matthewgrossman Oct 12, 2026
e69b2e4
test(oci): replace podman_oci_identity with shared and driver suite c…
matthewgrossman Oct 12, 2026
6884f1d
test(oci): keep podman_oci_identity for Podman-only isolation checks
matthewgrossman Oct 12, 2026
3c0990e
refactor(oci): simplify workspace failure reporting and OCI image suite
matthewgrossman Oct 12, 2026
7fdecf3
test(oci): move shared container checks into the OCI image suite
matthewgrossman Oct 12, 2026
2bb7f66
test(oci): check the workspace rejection reason from sandbox JSON
matthewgrossman Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/branch-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,10 @@ jobs:
test-matrix: >-
[
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"}
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"ubuntu-docker-rootful","installer":"deb","testsuite":"oci-image"},
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"oci-image"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"oci-image"}
]

# Run driver-specific integration tests:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e-docker-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ on:
required: false
type: string
default: >-
[{"suite":"python","cmd":"mise run --no-deps --skip-deps e2e:python","apt_packages":"","python_proto":true,"mcp":false},{"suite":"oidc-python","cmd":"mise run --no-deps --skip-deps e2e:oidc-python:docker","apt_packages":"","python_proto":true,"mcp":false},{"suite":"oidc-pkce-docker","cmd":"mise run --no-deps --skip-deps e2e:oidc-pkce:docker","apt_packages":"openssh-client","python_proto":false,"mcp":false},{"suite":"rust-docker","cmd":"mise run --no-deps --skip-deps e2e:rust","apt_packages":"openssh-client","python_proto":false,"mcp":false},{"suite":"mcp","cmd":"mise run --no-deps --skip-deps e2e:mcp","apt_packages":"","python_proto":false,"mcp":true}]
[{"suite":"python","cmd":"mise run --no-deps --skip-deps e2e:python","apt_packages":"","python_proto":true,"mcp":false},{"suite":"oidc-python","cmd":"mise run --no-deps --skip-deps e2e:oidc-python:docker","apt_packages":"","python_proto":true,"mcp":false},{"suite":"oidc-pkce-docker","cmd":"mise run --no-deps --skip-deps e2e:oidc-pkce:docker","apt_packages":"openssh-client","python_proto":false,"mcp":false},{"suite":"rust-docker","cmd":"mise run --no-deps --skip-deps e2e:rust","apt_packages":"openssh-client","python_proto":false,"mcp":false},{"suite":"oci-image","cmd":"mise run --no-deps --skip-deps e2e:oci-image","apt_packages":"openssh-client","python_proto":false,"mcp":false},{"suite":"mcp","cmd":"mise run --no-deps --skip-deps e2e:mcp","apt_packages":"","python_proto":false,"mcp":true}]

permissions:
actions: read
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/release-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,10 @@ jobs:
test-matrix: >-
[
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"}
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"ubuntu-docker-rootful","installer":"deb","testsuite":"oci-image"},
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"oci-image"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"oci-image"}
]

docker-e2e:
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/release-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,10 @@ jobs:
test-matrix: >-
[
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"}
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"provider-refresh"},
{"environment":"ubuntu-docker-rootful","installer":"deb","testsuite":"oci-image"},
{"environment":"fedora-podman-rootful","installer":"rpm","testsuite":"oci-image"},
{"environment":"fedora-podman-rootless","installer":"rpm","testsuite":"oci-image"}
]

docker-e2e:
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 27 additions & 1 deletion TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,32 @@ binary. `tests/artifacts.nix` keeps the follow-up exclusions explicit and uses
the same filter for the generated inventory, so excluded binaries cannot appear
as false passes or silently re-enter the archive.

The `oci-image` feature testsuite (`tests/suites/features/oci-image`) checks
OCI image identity and working-directory behavior shared by the Docker and
Podman drivers against installed deb packages on Ubuntu and rpm packages on
Fedora. CI runs it on Docker rootful, Podman rootful, and Podman rootless guests:

```shell
nix run .#tmachine -- test ubuntu-docker-rootful deb oci-image
```

The shared suite also runs in the existing ARM64 Docker E2E workflow for
branch checks and both release workflows. That interim lane compiles the same
test crate natively and uses the architecture-matched prebuilt candidate CLI
and gateway plus the candidate multi-architecture sandbox and supervisor
images through `e2e/with-docker-gateway.sh`. The tmachine lanes still use
x86_64 artifacts; they do not replace ARM64 image coverage.

Run it against a local Docker or Podman gateway:

```shell
mise run e2e:oci-image
mise run e2e:oci-image:podman
```

Both tasks set `OPENSHELL_TEST_CONTAINER_ENGINE`, the command that builds test
images into the gateway's image store.

Run the VM-backed Rust CLI e2e suite:

```shell
Expand Down Expand Up @@ -499,7 +525,7 @@ cargo test --manifest-path e2e/rust/Cargo.toml --features e2e --test sync
Run a single Docker-only test directly with cargo:

```shell
cargo test --manifest-path e2e/rust/Cargo.toml --features e2e-docker --test custom_image
cargo test --manifest-path e2e/rust/Cargo.toml --features e2e-docker --test docker_preflight
```

The harness (`e2e/rust/src/harness/`) provides:
Expand Down
13 changes: 12 additions & 1 deletion crates/openshell-core/src/driver_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,22 @@ pub const CONDITION_WORKSPACE_VALIDATION_FAILED: &str = "WorkspaceValidationFail

/// Supervisor exit status reserved for OCI workspace validation failures.
///
/// Local container drivers translate this status into
/// Local container drivers translate a supervisor exit with this status into
/// [`CONDITION_WORKSPACE_VALIDATION_FAILED`] so users receive the specific
/// provisioning failure rather than a generic container exit.
pub const SUPERVISOR_EXIT_WORKSPACE_VALIDATION_FAILED: i32 = 78;

/// Error context for a rejected image-provided OCI working directory.
///
/// The supervisor recognizes it in a failed agent start and exits with
/// [`SUPERVISOR_EXIT_WORKSPACE_VALIDATION_FAILED`].
pub const WORKSPACE_VALIDATION_ERROR_CONTEXT: &str = "image workspace validation failed";

/// Driver condition message for [`CONDITION_WORKSPACE_VALIDATION_FAILED`].
/// Fixed text, because supervisor output may contain secrets.
pub const WORKSPACE_VALIDATION_FAILED_MESSAGE: &str =
"OCI WorkingDir is not usable by the sandbox identity";

/// Ready-condition reason when a container was terminated by an external signal.
///
/// SIGKILL/SIGTERM (exit 137/143) is what a Podman/Docker machine or daemon
Expand Down
Loading
Loading