...
1
16
17 package statefulset
18
19 import (
20 "context"
21 "fmt"
22
23 apps "k8s.io/api/apps/v1"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
26 clientset "k8s.io/client-go/kubernetes"
27 appslisters "k8s.io/client-go/listers/apps/v1"
28 "k8s.io/client-go/util/retry"
29 )
30
31
32
33 type StatefulSetStatusUpdaterInterface interface {
34
35
36 UpdateStatefulSetStatus(ctx context.Context, set *apps.StatefulSet, status *apps.StatefulSetStatus) error
37 }
38
39
40
41 func NewRealStatefulSetStatusUpdater(
42 client clientset.Interface,
43 setLister appslisters.StatefulSetLister) StatefulSetStatusUpdaterInterface {
44 return &realStatefulSetStatusUpdater{client, setLister}
45 }
46
47 type realStatefulSetStatusUpdater struct {
48 client clientset.Interface
49 setLister appslisters.StatefulSetLister
50 }
51
52 func (ssu *realStatefulSetStatusUpdater) UpdateStatefulSetStatus(
53 ctx context.Context,
54 set *apps.StatefulSet,
55 status *apps.StatefulSetStatus) error {
56
57 return retry.RetryOnConflict(retry.DefaultRetry, func() error {
58 set.Status = *status
59
60 _, updateErr := ssu.client.AppsV1().StatefulSets(set.Namespace).UpdateStatus(context.TODO(), set, metav1.UpdateOptions{})
61 if updateErr == nil {
62 return nil
63 }
64 if updated, err := ssu.setLister.StatefulSets(set.Namespace).Get(set.Name); err == nil {
65
66 set = updated.DeepCopy()
67 } else {
68 utilruntime.HandleError(fmt.Errorf("error getting updated StatefulSet %s/%s from lister: %v", set.Namespace, set.Name, err))
69 }
70
71 return updateErr
72 })
73 }
74
75 var _ StatefulSetStatusUpdaterInterface = &realStatefulSetStatusUpdater{}
76
View as plain text