Repository navigation
test(conformance): port the credential gating e2e tests - #5318
matthewgrossman wants to merge 8 commits into
Conversation
|
Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually. Contributors can view more details about this message here. |
|
Label |
|
🌿 Preview your docs: https://nvidia-preview-pr-5318.docs.buildwithfern.com/openshell |
Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Port the six credential gating scenarios from e2e/rust/tests/credential_gating.rs into a conformance suite. Each test imports its own provider profile and creates a provider under a run-unique name, creates sandboxes from the Python test image through the CLI, and reaches probe servers on the host through host.openshell.internal. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
The conformance suite now creates sandboxes from testkit::python_image(). Docker and Podman runners build openshell/e2e-python:dev also in e2e-conformance-only mode, and the Kubernetes and VM runners default OPENSHELL_TEST_PYTHON_IMAGE to the pullable uv Python image. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Add testkit::policy (a base policy from base-policy.yaml, allow(), and Endpoint settings), install_provider(), YamlFile, ExecOutput::success(), and PYTHON_BINARIES, so suites build policies and providers the same way. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Add host-server-support with HttpRecorder and WebSocketRecorder, servers on the test host that sandboxes reach through host.openshell.internal. Move the host-gateway feature test onto them and onto testkit's base policy. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
Use testkit's policy helpers and install_provider and host-server-support's recorders, and assert on the requests that reached the host server instead of verdicts the sandbox clients print. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
8e5c8d7 to
566b39d
Compare
|
/ok to test 566b39d |
The external-driver lane renders server.hostGatewayIP, but only the in-process driver reads it from the gateway TOML. The standalone driver takes OPENSHELL_HOST_GATEWAY_IP, which the post-renderer never set, so sandbox policy DNS refused host.openshell.internal on that lane. Copy the chart's rendered value into the driver container when present. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
|
/ok to test 99bbed4 |
Compatibility review (advisory)New or updated breaking changes; see the full report for all findings. 1. cli — No explicit risk acceptance foundOPENSHELL_E2E_KUBERNETES_FEATURES=e2e,e2e-kubernetes mise run e2e:kubernetes previously excluded host-dependent credential tests but now runs them unconditionally through openshell-conformance.
Review details
Advisory review; publication gates are unchanged. |
Summary
Port the six credential gating e2e tests from #5264 into the conformance family, and remove the old
e2e/rusttest. This is the pilot port for #5296. The pieces the port needed that other tests will need too are shared: policy helpers and provider install in testkit, and a newtests/support/host-servercrate for servers on the test host. The existinghost-gatewayfeature test now uses them as well.Related Issue
Closes #5317
Part of #5281. Pilot for #5296, which stays open. Ports the tests from #5264.
What the tests check, and what they needed
The #5264 tests check what the sandbox supervisor does with a provider credential when the sandbox sends traffic out:
tls: skip), unless the endpoint opts in.request_body_credential_rewriteis on.policy setadds its environment variable to a running sandbox, and unbinding removes it.Porting them needed four things. Each was added as a generic helper, and
host-gateway, an existing feature test that had its own copies, now uses the shared ones.tests/support/host-server(host-server-support):HttpRecorder::start(body)answers every request with200andbody.wait_for_requests(n)returns the raw requests (headers and body) oncenhave arrived.WebSocketRecorder::start()completes the WebSocket handshake.wait_for_handshake()waits for one, andbinary_seen()reports whether a binary frame followed.host.openshell.internal, and stop when dropped. It lives intests/support/, alongside the Keycloak fixture, because it's a service outside OpenShell that any suite can use.host-gatewayreplaces its hand-written server withHttpRecorder.protocol: restorwebsocket,tls: skip, body rewriting,credential_binding,allow_uninspected_credentials). Before this PR, tests wrote out a whole policy as a YAML string. New testkit moduletestkit::policy:base()readsbase-policy.yaml: the filesystem and process settings every sandbox needs, and no network access.allow(&mut policy, name, host, port, binaries)adds an endpoint. ItsEndpointsetters are named after the YAML fields, e.g..rest(Access::Full).credential_binding(&provider).to_yaml()renders the policy for CLI commands such aspolicy set.PYTHON_BINARIESnames the pathspython3runs from intestkit::python_image()images, which differ between the workload image and the pullable uv image.cx.sandbox(..).policy(..)rejected both, and these tests need all three.testkit::install_provider(cx, name, profile_yaml, credentials)registers cleanup for both before creating them.testkit::YamlFilewrites YAML to a temporary file for CLI commands that read one (profile import,policy set);host-gatewayreplaces itsPolicyFilecopy with it.ExecOutput::success()fails a test on a non-zeroexecexit, likeCliOutput::success().Helpers for OpenShell itself (sandboxes, policies, providers, the CLI) go in testkit. Fixtures for services outside OpenShell go in
tests/support/.Changes
credential_gating, one file with the same six scenarios and unique names as test(e2e): split credential_gating into independent parallel tests #5264, built on the helpers above.create()error. The CLI is used forprofile import,provider createandpolicy set --wait.openshell/e2e-python:devon every lane, includinge2e-conformance-only. The Kubernetes and VM scripts defaultOPENSHELL_TEST_PYTHON_IMAGEto the pinned uv image ine2e/support/conformance.sh, ande2e:testkitdepends one2e:workload:build. This keeps credential coverage on the lanes that still run conformance from these scripts (VM, GPU, Agent Sandbox, external driver) until a host provisioner replaces them.server.hostGatewayIPinto the standalone driver'sOPENSHELL_HOST_GATEWAY_IP. Before, only the in-process driver got it, so sandboxes on that lane couldn't resolvehost.openshell.internal. The lane hadn't run a host-reachability test before.e2e/rust/tests/credential_gating.rs, its[[test]]entry, and itsPODMAN_CI_TESTSentry.TESTING.mdlist the suite and note that it needshost.openshell.internal.Gaps found by the pilot (for #5296)
cx.sandbox(suffix). testkit doesn't check this before sending the request.e2e/rust/e2e-*.shscripts, not tmachine.Testing
cargo fmtandcargo clippy --locked --all-targets -D warningson testkit, support, features and conformance.testkit unit tests: 43 passed.
check_cargo_lockfile_alignment.pyandcheck-conformance-program.sh(22 tests) pass.Local Podman (macOS,
e2e/with-podman-gateway.sh):openshell-conformance run credential_gatingpassed 6/6 in 33.7s.host_gatewaypassed.policy_binding_requires_inspection_or_opt_inpolicy_binding_rest_body_keeps_placeholder_without_rewritepolicy_binding_rest_body_rewrite_sends_secret_upstreampolicy_binding_updates_provider_environment_liveprofile_rest_endpoint_keeps_body_placeholderprofile_websocket_endpoint_denies_binary_framesNot run locally: Docker (Docker Desktop requires sign-in), k3s, k3s-ha. CI covers these rows.
CI: copy-pr-bot doesn't sync draft PRs, so E2E runs only after a maintainer comments
/ok to test <sha>. In #5264, the WebSocket test took 60–120s on Kubernetes. If k3s or k3s-ha hit the per-test timeout, I'll raise it here rather than change.config/nextest.toml(see #5295).Checklist