@@ -19,8 +19,9 @@ package main
19
19
import (
20
20
"context"
21
21
"flag"
22
- "log "
22
+ "os "
23
23
24
+ "github.com/go-logr/logr"
24
25
appsv1 "k8s.io/api/apps/v1"
25
26
corev1 "k8s.io/api/core/v1"
26
27
"k8s.io/apimachinery/pkg/api/errors"
@@ -36,63 +37,78 @@ import (
36
37
"sigs.k8s.io/controller-runtime/pkg/source"
37
38
)
38
39
40
+ var (
41
+ log = logf .Log .WithName ("example-controller" )
42
+ )
43
+
39
44
func main () {
40
45
flag .Parse ()
41
46
logf .SetLogger (logf .ZapLogger (false ))
47
+ entryLog := log .WithName ("entrypoint" )
42
48
43
49
// Setup a Manager
44
50
mrg , err := manager .New (config .GetConfigOrDie (), manager.Options {})
45
51
if err != nil {
46
- log .Fatal (err )
52
+ entryLog .Error (err , "unable to set up overall controller manager" )
53
+ os .Exit (1 )
47
54
}
48
55
49
56
// Setup a new controller to Reconciler ReplicaSets
50
57
c , err := controller .New ("foo-controller" , mrg , controller.Options {
51
- Reconciler : & reconcileReplicaSet {client : mrg .GetClient ()},
58
+ Reconciler : & reconcileReplicaSet {client : mrg .GetClient (), log : log . WithName ( "reconciler" ) },
52
59
})
53
60
if err != nil {
54
- log .Fatal (err )
61
+ entryLog .Error (err , "unable to set up individual controller" )
62
+ os .Exit (1 )
55
63
}
56
64
57
65
// Watch ReplicaSets and enqueue ReplicaSet object key
58
66
if err := c .Watch (& source.Kind {Type : & appsv1.ReplicaSet {}}, & handler.EnqueueRequestForObject {}); err != nil {
59
- log .Fatal (err )
67
+ entryLog .Error (err , "unable to watch ReplicaSets" )
68
+ os .Exit (1 )
60
69
}
61
70
62
71
// Watch Pods and enqueue owning ReplicaSet key
63
72
if err := c .Watch (& source.Kind {Type : & corev1.Pod {}},
64
73
& handler.EnqueueRequestForOwner {OwnerType : & appsv1.ReplicaSet {}, IsController : true }); err != nil {
65
- log .Fatal (err )
74
+ entryLog .Error (err , "unable to watch Pods" )
75
+ os .Exit (1 )
66
76
}
67
77
68
- log .Fatal (mrg .Start (signals .SetupSignalHandler ()))
78
+ if err := mrg .Start (signals .SetupSignalHandler ()); err != nil {
79
+ entryLog .Error (err , "unable to run manager" )
80
+ os .Exit (1 )
81
+ }
69
82
}
70
83
71
84
// reconcileReplicaSet reconciles ReplicaSets
72
85
type reconcileReplicaSet struct {
73
86
client client.Client
87
+ log logr.Logger
74
88
}
75
89
76
90
// Implement reconcile.Reconciler so the controller can reconcile objects
77
91
var _ reconcile.Reconciler = & reconcileReplicaSet {}
78
92
79
93
func (r * reconcileReplicaSet ) Reconcile (request reconcile.Request ) (reconcile.Result , error ) {
94
+ // set up a convinient log object so we don't have to type request over and over again
95
+ log := r .log .WithValues ("request" , request )
96
+
80
97
// Fetch the ReplicaSet from the cache
81
98
rs := & appsv1.ReplicaSet {}
82
99
err := r .client .Get (context .TODO (), request .NamespacedName , rs )
83
100
if errors .IsNotFound (err ) {
84
- log .Printf ( "Could not find ReplicaSet %v. \n " , request )
101
+ log .Error ( nil , "Could not find ReplicaSet" )
85
102
return reconcile.Result {}, nil
86
103
}
87
104
88
105
if err != nil {
89
- log .Printf ( "Could not fetch ReplicaSet %v for %+v \n " , err , request )
106
+ log .Error ( err , "Could not fetch ReplicaSet" )
90
107
return reconcile.Result {}, err
91
108
}
92
109
93
110
// Print the ReplicaSet
94
- log .Printf ("ReplicaSet Name %s Namespace %s, Pod Name: %s\n " ,
95
- rs .Name , rs .Namespace , rs .Spec .Template .Spec .Containers [0 ].Name )
111
+ log .Info ("Reconciling ReplicaSet" , "container name" , rs .Spec .Template .Spec .Containers [0 ].Name )
96
112
97
113
// Set the label if it is missing
98
114
if rs .Labels == nil {
@@ -106,7 +122,7 @@ func (r *reconcileReplicaSet) Reconcile(request reconcile.Request) (reconcile.Re
106
122
rs .Labels ["hello" ] = "world"
107
123
err = r .client .Update (context .TODO (), rs )
108
124
if err != nil {
109
- log .Printf ( "Could not write ReplicaSet %v \n " , err )
125
+ log .Error ( err , "Could not write ReplicaSet" )
110
126
return reconcile.Result {}, err
111
127
}
112
128
0 commit comments