kubernetes/test/e2e/framework
Davanum Srinivas 1ee1ff97fb
staging: extract CRI streaming modules with client-go compatibility
Extract streaming code into dedicated staging modules while keeping stable
compatibility APIs for external client-go consumers.

This commit:
- adds `k8s.io/cri-streaming` for CRI exec/attach/portforward server code
- adds `k8s.io/streaming` as the canonical home for shared transport
  primitives (`httpstream`, `spdy`, `wsstream`, runtime helpers)
- switches in-tree transport consumers to `k8s.io/streaming`
- removes in-tree kubelet CRI streaming package
- preserves NO_PROXY/no_proxy CIDR handling in extracted SPDY proxier logic
- adds deprecated `k8s.io/apimachinery/pkg/util/httpstream` compatibility
  wrappers (`httpstream`, `spdy`, `wsstream`) backed by `k8s.io/streaming`
- restores exported client-go SPDY/portforward API signatures to
  apimachinery `httpstream` types for downstream compatibility
- adds streaming-native client-go adapters/constructors so in-tree callers
  can use `k8s.io/streaming` without changing external compatibility APIs
- deduplicates SPDY-over-websocket dial negotiation shared by compat and
  streaming tunneling dialers
- logs dropped unknown stream types in `RemoveStreams` adapter fallbacks to
  improve compatibility-path debuggability
- adds integration coverage for the streaming-upgrader-to-client-go-compat
  adapter path against a real cri-streaming exec endpoint
- clarifies kubectl streaming import aliasing to avoid `httpstream` package
  ambiguity
- updates tests, import restrictions, publishing metadata, and vendor/module
  metadata for the new staging modules

Signed-off-by: Davanum Srinivas <davanum@gmail.com>
2026-03-12 09:59:55 -04:00
..
auth Merge pull request #131409 from bertinatto/fix-authz-test 2025-05-08 14:39:15 -07:00
autoscaling Re-use existing helper for port-forwarding in autoscaling utils 2026-03-11 15:24:15 +01:00
config e2e framework: control k/k/pkg imports 2023-04-17 00:17:16 +03:00
conformance DRA: CRUD conformance tests 2025-10-02 17:43:33 +02:00
daemonset KEP-5471: Extend tolerations operators (#134665) 2025-11-10 12:42:54 -08:00
debug Lint: Use modernize/rangeint in test/{e2e,e2e_node,images,soak} 2026-03-07 10:17:31 +01:00
deployment e2e: add TERM trap to pod sleep command 2024-06-11 13:52:47 +08:00
endpointslice Add e2eendpointslice.WaitForEndpointPorts, use in some tests. 2025-07-17 15:34:34 -04:00
events use PollUntilContextTimeout to replace PollImmediateWithContext in test 2023-10-19 22:50:21 +08:00
gpu Remove remants of broken stuff - nvidia/autoscaling 2024-09-23 13:17:00 +00:00
internal Merge pull request #135788 from BenTheElder/etcd-tag 2026-02-03 14:16:28 +05:30
job Add Complete reason verification to all e2e conformance tests 2025-03-11 06:14:55 +09:00
kubectl Lint: Use modernize/rangeint in test/{e2e,e2e_node,images,soak} 2026-03-07 10:17:31 +01:00
kubelet fix check errRaw != nil but return a nil value error err 2024-12-17 20:45:17 +08:00
kubesystem e2e framework: control k/k/pkg imports 2023-04-17 00:17:16 +03:00
manifest e2e framework: control k/k/pkg imports 2023-04-17 00:17:16 +03:00
metrics test: add retry to getMetricsFromNode 2025-11-06 13:56:17 -06:00
network Lint: Use modernize/rangeint in test/{e2e,e2e_node,images,soak} 2026-03-07 10:17:31 +01:00
node Drop e2enode.FirstAddress 2026-03-07 10:45:07 -05:00
perf e2e framework: remove dependency on k8s.io/kubernetes/pkg/api/v1/pod 2023-05-12 08:39:37 +08:00
pod staging: extract CRI streaming modules with client-go compatibility 2026-03-12 09:59:55 -04:00
providers Remove gcp in-tree cloud provider and credential provider 2024-05-01 09:03:53 -04:00
pv Lint: Use modernize/rangeint in test/{e2e,e2e_node,images,soak} 2026-03-07 10:17:31 +01:00
rc chore: depr. pointer pkg replacement for test/e2e and utils 2025-07-06 22:18:03 +02:00
registry Add the fake registry server functionality to agnhost windows 2026-02-02 19:00:29 +00:00
replicaset drop deprecated PollWithContext and adopt PollUntilContextTimeout instead 2024-06-21 19:23:31 +08:00
resource use PollUntilContextTimeout to replace PollImmediateWithContext in test 2023-10-19 22:50:21 +08:00
security Update AppArmor e2e tests 2024-03-05 12:22:50 -08:00
service Merge pull request #137535 from danwinship/nodeip-e2e-cleanups 2026-03-10 02:59:19 +05:30
skipper Merge pull request #123981 from lzhecheng/update-traffic-distribution-test 2024-10-01 15:53:49 +01:00
ssh Fix the semantics of e2essh.NodeSSHHosts on error 2026-03-07 10:52:48 -05:00
statefulset Remove unneeded use of fmt.Sprintf in test/{integration,e2e} 2026-02-08 14:34:13 +01:00
testfiles fix: enable and fixes rules from testifylint on test package 2024-06-30 05:44:47 +00:00
timer remove deprecated framework.ExpectEqual 2023-10-11 12:43:10 +08:00
volume Lint: Use modernize/rangeint in test/{e2e,e2e_node,images,soak} 2026-03-07 10:17:31 +01:00
websocket e2e framework: control k/k/pkg imports 2023-04-17 00:17:16 +03:00
.import-restrictions Lock down gofuzz in deps 2025-03-08 15:22:01 -08:00
bugs.go e2e framework: track and report internal bugs 2023-10-10 18:15:46 +02:00
expect.go e2e framework: better documentation of ExpectNoError 2024-09-23 10:58:06 +02:00
expect_test.go fix: enable and fixes rules from testifylint on test package 2024-06-30 05:44:47 +00:00
flake_reporting_util.go Fix Go vet errors for master golang 2024-09-20 12:36:38 +05:30
framework.go E2E framework: fix nil pointer crash in TContext 2026-01-19 10:51:24 +01:00
get.go E2E framework: retry also on EOF errors 2025-07-15 12:52:26 +02:00
ginkgologger.go e2e framework: fix inconsistency in log output 2026-01-05 13:45:03 +01:00
ginkgowrapper.go E2E framework: introduce WithKubeletMinVersion 2026-03-11 09:47:27 +01:00
ginkgowrapper_test.go e2e storage: use framework to tag tests 2023-10-23 17:32:06 +02:00
gomega.go DRA: CRUD conformance tests 2025-10-02 17:43:33 +02:00
log.go e2e framework: unify logging, support skipping helpers 2024-01-20 18:23:31 +01:00
log_test.go enhance boolean assertions 2024-07-31 15:58:15 +00:00
namespacedname.go e2e framework: add NamespacedName 2023-01-16 09:05:37 +01:00
nodes_util.go e2e framework: move NodeKiller into framework/node 2022-10-06 08:16:47 +02:00
OWNERS update sig cl owners in k/k 2025-02-12 11:04:11 +02:00
ports.go refactor(e2e): grab metrics from controller-manager via nginx 2021-05-03 00:12:06 +08:00
provider.go e2e: use Ginkgo context 2022-12-16 20:14:04 +01:00
README.md Fix typos in markdown 2023-10-17 10:55:40 -04:00
size.go Separate e2enetwork from e2e core framework 2019-10-25 17:58:20 +00:00
test_context.go Fix vet error 2026-03-05 18:11:02 -05:00
timeouts.go DRA: e2e: test non-graceful node shutdown 2023-10-19 22:09:11 +03:00
util.go Remove unused WaitForServiceEndpointsNum function 2025-09-21 14:48:13 +02:00

Overview

The Kubernetes E2E framework simplifies writing Ginkgo tests suites. It's main usage is for these tests suites in the Kubernetes repository itself:

  • test/e2e: runs as client for a Kubernetes cluster. The e2e.test binary is used for conformance testing.
  • test/e2e_node: runs on the same node as a kubelet instance. Used for testing kubelet.
  • test/e2e_kubeadm: test suite for kubeadm.

Usage of the framework outside of Kubernetes is possible, but not encouraged. Downstream users have to be prepared to deal with API changes.

Code Organization

The core framework is the k8s.io/kubernetes/test/e2e/framework package. It contains functionality that all E2E suites are expected to need:

  • connecting to the apiserver
  • managing per-test namespaces
  • logging (Logf)
  • failure handling (Fail, Failf)
  • writing concise JUnit test results

It also contains a TestContext with settings that can be controlled via command line flags. For historic reasons, this also contains settings for individual tests or packages that are not part of the core framework.

Optional functionality is placed in sub packages like test/e2e/framework/pod. The core framework does not depend on those. Sub packages may depend on the core framework.

The advantages of splitting the code like this are:

  • leaner go doc packages by grouping related functions together
  • not forcing all E2E suites to import all functionality
  • avoiding import cycles

Execution Flow

When a test suite gets invoked, the top-level Describe calls register the callbacks that define individual tests, but does not invoke them yet. After that init phase, command line flags are parsed and the Describe callbacks are invoked. Those then define the actual tests for the test suite. Command line flags can be used to influence the test definitions.

Now Context/BeforeEach/AfterEach/It define code that will be called later when executing a specific test. During this setup phase, f := framework.NewDefaultFramework("some tests") creates a Framework instance for one or more tests. NewDefaultFramework initializes that instance anew for each test with a BeforeEach callback. Starting with Kubernetes 1.26, that instance gets cleaned up after all other code for a test has been invoked, so the following code is correct:

f := framework.NewDefaultFramework("some tests")

ginkgo.AfterEach(func() {
    # Do something with f.ClientSet.
}

ginkgo.It("test something", func(ctx context.Context) {
    # The actual test.
})

Optional functionality can be injected into each test by adding a callback to NewFrameworkExtensions in an init function. NewDefaultFramework will invoke those callbacks as if the corresponding code had been added to each test like this:

f := framework.NewDefaultFramework("some tests")

optional.SomeCallback(f)

SomeCallback then can register additional BeforeEach or AfterEach callbacks that use the test's Framework instance.

When a test runs, callbacks defined for it with BeforeEach and AfterEach are called in first-in-first-out order. Since the migration to ginkgo v2 in Kubernetes 1.25, the AfterEach callback is called also when there has been a test failure. This can be used to run cleanup code for a test reliably. However, ginkgo.DeferCleanup is often a better alternative. Its callbacks are executed in first-in-last-out order.

test/e2e/framework/internal/unittests/cleanup/cleanup.go shows how these different callbacks can be used and in which order they are going to run.