1
16
17 package controllerruntime_test
18
19 import (
20 "context"
21 "encoding/json"
22 "fmt"
23 "os"
24 "time"
25
26 appsv1 "k8s.io/api/apps/v1"
27 corev1 "k8s.io/api/core/v1"
28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29 "k8s.io/apimachinery/pkg/runtime"
30 "k8s.io/apimachinery/pkg/types"
31
32 ctrl "sigs.k8s.io/controller-runtime"
33 "sigs.k8s.io/controller-runtime/pkg/client"
34 "sigs.k8s.io/controller-runtime/pkg/handler"
35 "sigs.k8s.io/controller-runtime/pkg/reconcile"
36
37
38 _ "github.com/onsi/ginkgo/v2"
39 )
40
41
42
43
44
45
46
47 func Example() {
48 log := ctrl.Log.WithName("builder-examples")
49
50 manager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})
51 if err != nil {
52 log.Error(err, "could not create manager")
53 os.Exit(1)
54 }
55
56 err = ctrl.
57 NewControllerManagedBy(manager).
58 For(&appsv1.ReplicaSet{}).
59 Owns(&corev1.Pod{}).
60 Complete(&ReplicaSetReconciler{Client: manager.GetClient()})
61 if err != nil {
62 log.Error(err, "could not create controller")
63 os.Exit(1)
64 }
65
66 if err := manager.Start(ctrl.SetupSignalHandler()); err != nil {
67 log.Error(err, "could not start manager")
68 os.Exit(1)
69 }
70 }
71
72 type ExampleCRDWithConfigMapRef struct {
73 metav1.TypeMeta `json:",inline"`
74 metav1.ObjectMeta `json:"metadata,omitempty"`
75 ConfigMapRef corev1.LocalObjectReference `json:"configMapRef"`
76 }
77
78 func deepCopyObject(arg any) runtime.Object {
79
80
81 argBytes, err := json.Marshal(arg)
82 if err != nil {
83 panic(err)
84 }
85 out := &ExampleCRDWithConfigMapRefList{}
86 if err := json.Unmarshal(argBytes, out); err != nil {
87 panic(err)
88 }
89 return out
90 }
91
92
93 func (in *ExampleCRDWithConfigMapRef) DeepCopyObject() runtime.Object {
94 return deepCopyObject(in)
95 }
96
97 type ExampleCRDWithConfigMapRefList struct {
98 metav1.TypeMeta `json:",inline"`
99 metav1.ListMeta `json:"metadata,omitempty"`
100 Items []ExampleCRDWithConfigMapRef `json:"items"`
101 }
102
103
104 func (in *ExampleCRDWithConfigMapRefList) DeepCopyObject() runtime.Object {
105 return deepCopyObject(in)
106 }
107
108
109
110
111 func Example_customHandler() {
112 log := ctrl.Log.WithName("builder-examples")
113
114 manager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})
115 if err != nil {
116 log.Error(err, "could not create manager")
117 os.Exit(1)
118 }
119
120 err = ctrl.
121 NewControllerManagedBy(manager).
122 For(&ExampleCRDWithConfigMapRef{}).
123 Watches(&corev1.ConfigMap{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, cm client.Object) []ctrl.Request {
124
125 crList := &ExampleCRDWithConfigMapRefList{}
126 if err := manager.GetClient().List(ctx, crList); err != nil {
127 manager.GetLogger().Error(err, "while listing ExampleCRDWithConfigMapRefs")
128 return nil
129 }
130
131 reqs := make([]ctrl.Request, 0, len(crList.Items))
132 for _, item := range crList.Items {
133 if item.ConfigMapRef.Name == cm.GetName() {
134 reqs = append(reqs, ctrl.Request{
135 NamespacedName: types.NamespacedName{
136 Namespace: item.GetNamespace(),
137 Name: item.GetName(),
138 },
139 })
140 }
141 }
142
143 return reqs
144 })).
145 Complete(reconcile.Func(func(ctx context.Context, r reconcile.Request) (reconcile.Result, error) {
146
147 return reconcile.Result{}, nil
148 }))
149 if err != nil {
150 log.Error(err, "could not create controller")
151 os.Exit(1)
152 }
153
154 if err := manager.Start(ctrl.SetupSignalHandler()); err != nil {
155 log.Error(err, "could not start manager")
156 os.Exit(1)
157 }
158 }
159
160
161
162
163
164
165
166
167
168
169
170
171
172 func Example_updateLeaderElectionDurations() {
173 log := ctrl.Log.WithName("builder-examples")
174 leaseDuration := 100 * time.Second
175 renewDeadline := 80 * time.Second
176 retryPeriod := 20 * time.Second
177 manager, err := ctrl.NewManager(
178 ctrl.GetConfigOrDie(),
179 ctrl.Options{
180 LeaseDuration: &leaseDuration,
181 RenewDeadline: &renewDeadline,
182 RetryPeriod: &retryPeriod,
183 })
184 if err != nil {
185 log.Error(err, "could not create manager")
186 os.Exit(1)
187 }
188
189 err = ctrl.
190 NewControllerManagedBy(manager).
191 For(&appsv1.ReplicaSet{}).
192 Owns(&corev1.Pod{}).
193 Complete(&ReplicaSetReconciler{Client: manager.GetClient()})
194 if err != nil {
195 log.Error(err, "could not create controller")
196 os.Exit(1)
197 }
198
199 if err := manager.Start(ctrl.SetupSignalHandler()); err != nil {
200 log.Error(err, "could not start manager")
201 os.Exit(1)
202 }
203 }
204
205
206 type ReplicaSetReconciler struct {
207 client.Client
208 }
209
210
211
212
213
214
215
216
217 func (a *ReplicaSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
218
219 rs := &appsv1.ReplicaSet{}
220 err := a.Get(ctx, req.NamespacedName, rs)
221 if err != nil {
222 return ctrl.Result{}, err
223 }
224
225
226 pods := &corev1.PodList{}
227 err = a.List(ctx, pods, client.InNamespace(req.Namespace), client.MatchingLabels(rs.Spec.Template.Labels))
228 if err != nil {
229 return ctrl.Result{}, err
230 }
231
232
233 rs.Labels["pod-count"] = fmt.Sprintf("%v", len(pods.Items))
234 err = a.Update(ctx, rs)
235 if err != nil {
236 return ctrl.Result{}, err
237 }
238
239 return ctrl.Result{}, nil
240 }
241
View as plain text