mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	test: Move waitForAllContainerRemoval() into node e2e util
This is used across multiple tests, so let's move into the util file. Also, refactor it a bit to provide a better error message in case of a failure. Signed-off-by: David Porter <david@porter.me>
This commit is contained in:
		@@ -31,11 +31,9 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/api/resource"
 | 
						"k8s.io/apimachinery/pkg/api/resource"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
						"k8s.io/apimachinery/pkg/runtime"
 | 
				
			||||||
	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
 | 
					 | 
				
			||||||
	kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
 | 
						kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/types"
 | 
					 | 
				
			||||||
	admissionapi "k8s.io/pod-security-admission/api"
 | 
						admissionapi "k8s.io/pod-security-admission/api"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
@@ -372,28 +370,6 @@ func runTopologyManagerPolicySuiteTests(ctx context.Context, f *framework.Framew
 | 
				
			|||||||
	runMultipleGuPods(ctx, f)
 | 
						runMultipleGuPods(ctx, f)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// waitForAllContainerRemoval waits until all the containers on a given pod are really gone.
 | 
					 | 
				
			||||||
// This is needed by the e2e tests which involve exclusive resource allocation (cpu, topology manager; podresources; etc.)
 | 
					 | 
				
			||||||
// In these cases, we need to make sure the tests clean up after themselves to make sure each test runs in
 | 
					 | 
				
			||||||
// a pristine environment. The only way known so far to do that is to introduce this wait.
 | 
					 | 
				
			||||||
// Worth noting, however, that this makes the test runtime much bigger.
 | 
					 | 
				
			||||||
func waitForAllContainerRemoval(ctx context.Context, podName, podNS string) {
 | 
					 | 
				
			||||||
	rs, _, err := getCRIClient()
 | 
					 | 
				
			||||||
	framework.ExpectNoError(err)
 | 
					 | 
				
			||||||
	gomega.Eventually(ctx, func(ctx context.Context) bool {
 | 
					 | 
				
			||||||
		containers, err := rs.ListContainers(ctx, &runtimeapi.ContainerFilter{
 | 
					 | 
				
			||||||
			LabelSelector: map[string]string{
 | 
					 | 
				
			||||||
				types.KubernetesPodNameLabel:      podName,
 | 
					 | 
				
			||||||
				types.KubernetesPodNamespaceLabel: podNS,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return len(containers) == 0
 | 
					 | 
				
			||||||
	}, 2*time.Minute, 1*time.Second).Should(gomega.BeTrue())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func runTopologyManagerPositiveTest(ctx context.Context, f *framework.Framework, numPods int, ctnAttrs, initCtnAttrs []tmCtnAttribute, envInfo *testEnvInfo) {
 | 
					func runTopologyManagerPositiveTest(ctx context.Context, f *framework.Framework, numPods int, ctnAttrs, initCtnAttrs []tmCtnAttribute, envInfo *testEnvInfo) {
 | 
				
			||||||
	podMap := make(map[string]*v1.Pod)
 | 
						podMap := make(map[string]*v1.Pod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,7 @@ import (
 | 
				
			|||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/component-base/featuregate"
 | 
						"k8s.io/component-base/featuregate"
 | 
				
			||||||
	internalapi "k8s.io/cri-api/pkg/apis"
 | 
						internalapi "k8s.io/cri-api/pkg/apis"
 | 
				
			||||||
 | 
						runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
 | 
				
			||||||
	"k8s.io/klog/v2"
 | 
						"k8s.io/klog/v2"
 | 
				
			||||||
	kubeletpodresourcesv1 "k8s.io/kubelet/pkg/apis/podresources/v1"
 | 
						kubeletpodresourcesv1 "k8s.io/kubelet/pkg/apis/podresources/v1"
 | 
				
			||||||
	kubeletpodresourcesv1alpha1 "k8s.io/kubelet/pkg/apis/podresources/v1alpha1"
 | 
						kubeletpodresourcesv1alpha1 "k8s.io/kubelet/pkg/apis/podresources/v1alpha1"
 | 
				
			||||||
@@ -51,6 +52,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/kubelet/cm"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cm"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/cri/remote"
 | 
						"k8s.io/kubernetes/pkg/kubelet/cri/remote"
 | 
				
			||||||
	kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
 | 
						kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/kubelet/types"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/util"
 | 
						"k8s.io/kubernetes/pkg/kubelet/util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
						"k8s.io/kubernetes/test/e2e/framework"
 | 
				
			||||||
@@ -437,3 +439,29 @@ func withFeatureGate(feature featuregate.Feature, desired bool) func() {
 | 
				
			|||||||
		utilfeature.DefaultMutableFeatureGate.Set(fmt.Sprintf("%s=%v", string(feature), current))
 | 
							utilfeature.DefaultMutableFeatureGate.Set(fmt.Sprintf("%s=%v", string(feature), current))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// waitForAllContainerRemoval waits until all the containers on a given pod are really gone.
 | 
				
			||||||
 | 
					// This is needed by the e2e tests which involve exclusive resource allocation (cpu, topology manager; podresources; etc.)
 | 
				
			||||||
 | 
					// In these cases, we need to make sure the tests clean up after themselves to make sure each test runs in
 | 
				
			||||||
 | 
					// a pristine environment. The only way known so far to do that is to introduce this wait.
 | 
				
			||||||
 | 
					// Worth noting, however, that this makes the test runtime much bigger.
 | 
				
			||||||
 | 
					func waitForAllContainerRemoval(ctx context.Context, podName, podNS string) {
 | 
				
			||||||
 | 
						rs, _, err := getCRIClient()
 | 
				
			||||||
 | 
						framework.ExpectNoError(err)
 | 
				
			||||||
 | 
						gomega.Eventually(ctx, func(ctx context.Context) error {
 | 
				
			||||||
 | 
							containers, err := rs.ListContainers(ctx, &runtimeapi.ContainerFilter{
 | 
				
			||||||
 | 
								LabelSelector: map[string]string{
 | 
				
			||||||
 | 
									types.KubernetesPodNameLabel:      podName,
 | 
				
			||||||
 | 
									types.KubernetesPodNamespaceLabel: podNS,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return fmt.Errorf("got error waiting for all containers to be removed from CRI: %v", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(containers) > 0 {
 | 
				
			||||||
 | 
								return fmt.Errorf("expected all containers to be removed from CRI but %v containers still remain. Containers: %+v", len(containers), containers)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}, 2*time.Minute, 1*time.Second).Should(gomega.Succeed())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user