1
16
17 package service
18
19 import (
20 "context"
21 "fmt"
22
23 apierrors "k8s.io/apimachinery/pkg/api/errors"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/util/wait"
26 clientset "k8s.io/client-go/kubernetes"
27 servicehelper "k8s.io/cloud-provider/service/helpers"
28 "k8s.io/kubernetes/test/e2e/framework"
29
30 "github.com/onsi/ginkgo/v2"
31 )
32
33
34 func WaitForServiceDeletedWithFinalizer(ctx context.Context, cs clientset.Interface, namespace, name string) {
35 ginkgo.By("Delete service with finalizer")
36 if err := cs.CoreV1().Services(namespace).Delete(ctx, name, metav1.DeleteOptions{}); err != nil {
37 framework.Failf("Failed to delete service %s/%s", namespace, name)
38 }
39
40 ginkgo.By("Wait for service to disappear")
41 if pollErr := wait.PollUntilContextTimeout(ctx, LoadBalancerPollInterval, GetServiceLoadBalancerCreationTimeout(ctx, cs), true, func(ctx context.Context) (bool, error) {
42 svc, err := cs.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{})
43 if err != nil {
44 if apierrors.IsNotFound(err) {
45 framework.Logf("Service %s/%s is gone.", namespace, name)
46 return true, nil
47 }
48 return false, err
49 }
50 framework.Logf("Service %s/%s still exists with finalizers: %v", namespace, name, svc.Finalizers)
51 return false, nil
52 }); pollErr != nil {
53 framework.Failf("Failed to wait for service to disappear: %v", pollErr)
54 }
55 }
56
57
58
59 func WaitForServiceUpdatedWithFinalizer(ctx context.Context, cs clientset.Interface, namespace, name string, hasFinalizer bool) {
60 ginkgo.By(fmt.Sprintf("Wait for service to hasFinalizer=%t", hasFinalizer))
61 if pollErr := wait.PollUntilContextTimeout(ctx, LoadBalancerPollInterval, GetServiceLoadBalancerCreationTimeout(ctx, cs), true, func(ctx context.Context) (bool, error) {
62 svc, err := cs.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{})
63 if err != nil {
64 return false, err
65 }
66 foundFinalizer := false
67 for _, finalizer := range svc.Finalizers {
68 if finalizer == servicehelper.LoadBalancerCleanupFinalizer {
69 foundFinalizer = true
70 break
71 }
72 }
73 if foundFinalizer != hasFinalizer {
74 framework.Logf("Service %s/%s hasFinalizer=%t, want %t", namespace, name, foundFinalizer, hasFinalizer)
75 return false, nil
76 }
77 return true, nil
78 }); pollErr != nil {
79 framework.Failf("Failed to wait for service to hasFinalizer=%t: %v", hasFinalizer, pollErr)
80 }
81 }
82
View as plain text