1
16
17 package utils
18
19 import (
20 "context"
21 "fmt"
22 "testing"
23 "time"
24
25 apps "k8s.io/api/apps/v1"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 "k8s.io/apimachinery/pkg/util/wait"
28 clientset "k8s.io/client-go/kubernetes"
29 )
30
31 type UpdateReplicaSetFunc func(d *apps.ReplicaSet)
32
33 func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*apps.ReplicaSet, error) {
34 var rs *apps.ReplicaSet
35 var updateErr error
36 pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
37 var err error
38 if rs, err = c.AppsV1().ReplicaSets(namespace).Get(context.TODO(), name, metav1.GetOptions{}); err != nil {
39 return false, err
40 }
41
42 applyUpdate(rs)
43 if rs, err = c.AppsV1().ReplicaSets(namespace).Update(context.TODO(), rs, metav1.UpdateOptions{}); err == nil {
44 logf("Updating replica set %q", name)
45 return true, nil
46 }
47 updateErr = err
48 return false, nil
49 })
50 if wait.Interrupted(pollErr) {
51 pollErr = fmt.Errorf("couldn't apply the provided updated to replicaset %q: %v", name, updateErr)
52 }
53 return rs, pollErr
54 }
55
56
57 func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaSet, pollInterval, pollTimeout time.Duration) error {
58 desiredGeneration := rs.Generation
59 if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
60 newRS, err := clientSet.AppsV1().ReplicaSets(rs.Namespace).Get(context.TODO(), rs.Name, metav1.GetOptions{})
61 if err != nil {
62 return false, err
63 }
64 return newRS.Status.ObservedGeneration >= desiredGeneration && newRS.Status.Replicas == *rs.Spec.Replicas, nil
65 }); err != nil {
66 return fmt.Errorf("failed to verify .Status.Replicas is equal to .Spec.Replicas for replicaset %q: %v", rs.Name, err)
67 }
68 return nil
69 }
70
71 func UpdateReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*apps.ReplicaSet, error) {
72 var rs *apps.ReplicaSet
73 var updateErr error
74 pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) {
75 var err error
76 if rs, err = c.AppsV1().ReplicaSets(namespace).Get(context.TODO(), name, metav1.GetOptions{}); err != nil {
77 return false, err
78 }
79
80 applyUpdate(rs)
81 if rs, err = c.AppsV1().ReplicaSets(namespace).UpdateStatus(context.TODO(), rs, metav1.UpdateOptions{}); err == nil {
82 logf("Updating replica set %q", name)
83 return true, nil
84 }
85 updateErr = err
86 return false, nil
87 })
88 if wait.Interrupted(pollErr) {
89 pollErr = fmt.Errorf("couldn't apply the provided update to replicaset %q: %v", name, updateErr)
90 }
91 return rs, pollErr
92 }
93
View as plain text