Skip to content

Commit bf6e67a

Browse files
committed
pkg/logutil: SDK logging package for generated projects
pkg/*,example/,test/: use logutil in all code used in generated operators
1 parent a3a1a47 commit bf6e67a

File tree

22 files changed

+295
-197
lines changed

22 files changed

+295
-197
lines changed

example/memcached-operator/memcached_controller.go.tmpl

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package memcached
22

33
import (
44
"context"
5-
"log"
65
"reflect"
76

87
cachev1alpha1 "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1"
98

9+
"github.com/operator-framework/operator-sdk/pkg/logutil"
1010
appsv1 "k8s.io/api/apps/v1"
1111
corev1 "k8s.io/api/core/v1"
1212
"k8s.io/apimachinery/pkg/api/errors"
@@ -23,6 +23,8 @@ import (
2323
"sigs.k8s.io/controller-runtime/pkg/source"
2424
)
2525

26+
var log = logutil.SDKLog.WithName("controller_memcached")
27+
2628
/**
2729
* USER ACTION REQUIRED: This is a scaffold file intended for the user to modify with their own Controller
2830
* business logic. Delete these comments after modifying this file.*
@@ -85,7 +87,7 @@ type ReconcileMemcached struct {
8587
// The Controller will requeue the Request to be processed again if the returned error is non-nil or
8688
// Result.Requeue is true, otherwise upon completion it will remove the work from the queue.
8789
func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Result, error) {
88-
log.Printf("Reconciling Memcached %s/%s\n", request.Namespace, request.Name)
90+
log.Info("Reconciling Memcached", "Request.Namespace", request.Namespace, "Requst.Name", request.Name)
8991

9092
// Fetch the Memcached instance
9193
memcached := &cachev1alpha1.Memcached{}
@@ -95,11 +97,11 @@ func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Res
9597
// Request object not found, could have been deleted after reconcile request.
9698
// Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
9799
// Return and don't requeue
98-
log.Printf("Memcached %s/%s not found. Ignoring since object must be deleted\n", request.Namespace, request.Name)
100+
log.Error(err, "Memcached resource not found. Ignoring since object must be deleted", "Request.Namespace", request.Namespace, "Requst.Name", request.Name)
99101
return reconcile.Result{}, nil
100102
}
101103
// Error reading the object - requeue the request.
102-
log.Printf("Failed to get Memcached: %v", err)
104+
log.Error(err, "failed to get Memcached", "Request.Namespace", request.Namespace, "Requst.Name", request.Name)
103105
return reconcile.Result{}, err
104106
}
105107

@@ -109,16 +111,16 @@ func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Res
109111
if err != nil && errors.IsNotFound(err) {
110112
// Define a new deployment
111113
dep := r.deploymentForMemcached(memcached)
112-
log.Printf("Creating a new Deployment %s/%s\n", dep.Namespace, dep.Name)
114+
log.Info("Creating a new Deployment", "Deployment.Namespace", dep.Namespace, "Deployment.Name", dep.Name)
113115
err = r.client.Create(context.TODO(), dep)
114116
if err != nil {
115-
log.Printf("Failed to create new Deployment: %v\n", err)
117+
log.Error(err, "failed to create new Deployment", "Deployment.Namespace", dep.Namespace, "Deployment.Name", dep.Name)
116118
return reconcile.Result{}, err
117119
}
118120
// Deployment created successfully - return and requeue
119121
return reconcile.Result{Requeue: true}, nil
120122
} else if err != nil {
121-
log.Printf("Failed to get Deployment: %v\n", err)
123+
log.Error(err, "failed to get Deployment")
122124
return reconcile.Result{}, err
123125
}
124126

@@ -128,7 +130,7 @@ func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Res
128130
found.Spec.Replicas = &size
129131
err = r.client.Update(context.TODO(), found)
130132
if err != nil {
131-
log.Printf("Failed to update Deployment: %v\n", err)
133+
log.Error(err, "failed to update Deployment", "Deployment.Namespace", found.Namespace, "Deployment.Name", found.Name)
132134
return reconcile.Result{}, err
133135
}
134136
// Spec updated - return and requeue
@@ -142,7 +144,7 @@ func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Res
142144
listOps := &client.ListOptions{Namespace: memcached.Namespace, LabelSelector: labelSelector}
143145
err = r.client.List(context.TODO(), listOps, podList)
144146
if err != nil {
145-
log.Printf("Failed to list pods: %v", err)
147+
log.Error(err, "failed to list pods", "Memcached.Namespace", memcached.Namespace, "Memcached.Name", memcached.Name)
146148
return reconcile.Result{}, err
147149
}
148150
podNames := getPodNames(podList.Items)
@@ -152,7 +154,7 @@ func (r *ReconcileMemcached) Reconcile(request reconcile.Request) (reconcile.Res
152154
memcached.Status.Nodes = podNames
153155
err := r.client.Update(context.TODO(), memcached)
154156
if err != nil {
155-
log.Printf("failed to update memcached status: %v", err)
157+
log.Error(err, "failed to update Memcached status")
156158
return reconcile.Result{}, err
157159
}
158160
}

pkg/ansible/controller/controller.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ package controller
1616

1717
import (
1818
"fmt"
19-
"log"
19+
"os"
2020
"strings"
2121
"time"
2222

2323
"github.com/operator-framework/operator-sdk/pkg/ansible/events"
2424
"github.com/operator-framework/operator-sdk/pkg/ansible/runner"
25+
"github.com/operator-framework/operator-sdk/pkg/logutil"
2526

26-
"github.com/sirupsen/logrus"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2929
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -33,6 +33,8 @@ import (
3333
"sigs.k8s.io/controller-runtime/pkg/source"
3434
)
3535

36+
var log = logutil.SDKLog.WithName("controller")
37+
3638
// Options - options for your controller
3739
type Options struct {
3840
EventHandlers []events.EventHandler
@@ -44,7 +46,7 @@ type Options struct {
4446

4547
// Add - Creates a new ansible operator controller and adds it to the manager
4648
func Add(mgr manager.Manager, options Options) {
47-
logrus.Infof("Watching %s/%v, %s", options.GVK.Group, options.GVK.Version, options.GVK.Kind)
49+
log.Info("Watching resource", "Options.Group", options.GVK.Group, "Options.Version", options.GVK.Version, "Options.Kind", options.GVK.Kind)
4850
if options.EventHandlers == nil {
4951
options.EventHandlers = []events.EventHandler{}
5052
}
@@ -73,11 +75,13 @@ func Add(mgr manager.Manager, options Options) {
7375
Reconciler: aor,
7476
})
7577
if err != nil {
76-
log.Fatal(err)
78+
log.Error(err, "")
79+
os.Exit(1)
7780
}
7881
u := &unstructured.Unstructured{}
7982
u.SetGroupVersionKind(options.GVK)
8083
if err := c.Watch(&source.Kind{Type: u}, &crthandler.EnqueueRequestForObject{}); err != nil {
81-
log.Fatal(err)
84+
log.Error(err, "")
85+
os.Exit(1)
8286
}
8387
}

pkg/ansible/controller/reconcile.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import (
2929
"github.com/operator-framework/operator-sdk/pkg/ansible/proxy/kubeconfig"
3030
"github.com/operator-framework/operator-sdk/pkg/ansible/runner"
3131
"github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi"
32+
"github.com/operator-framework/operator-sdk/pkg/logutil"
3233

33-
"github.com/sirupsen/logrus"
3434
"k8s.io/api/core/v1"
3535
apierrors "k8s.io/apimachinery/pkg/api/errors"
3636
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -69,12 +69,11 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
6969
}
7070

7171
ident := strconv.Itoa(rand.Int())
72-
logger := logrus.WithFields(logrus.Fields{
73-
"component": "reconciler",
74-
"job": ident,
75-
"name": u.GetName(),
76-
"namespace": u.GetNamespace(),
77-
})
72+
logger := logutil.SDKLog.WithName("reconciler").WithValues(
73+
"job", ident,
74+
"name", u.GetName(),
75+
"namespace", u.GetNamespace(),
76+
)
7877

7978
reconcileResult := reconcile.Result{RequeueAfter: r.ReconcilePeriod}
8079
if ds, ok := u.GetAnnotations()[ReconcilePeriodAnnotation]; ok {
@@ -90,7 +89,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
9089
pendingFinalizers := u.GetFinalizers()
9190
// If the resource is being deleted we don't want to add the finalizer again
9291
if finalizerExists && !deleted && !contains(pendingFinalizers, finalizer) {
93-
logger.Debugf("Adding finalizer %s to resource", finalizer)
92+
logger.V(logutil.VDebug).Info("Adding finalizer to resource", "Finalizer", finalizer)
9493
finalizers := append(pendingFinalizers, finalizer)
9594
u.SetFinalizers(finalizers)
9695
err := r.Client.Update(context.TODO(), u)
@@ -106,7 +105,7 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
106105
spec := u.Object["spec"]
107106
_, ok := spec.(map[string]interface{})
108107
if !ok {
109-
logger.Debugf("spec was not found")
108+
logger.V(logutil.VDebug).Info("spec was not found")
110109
u.Object["spec"] = map[string]interface{}{}
111110
err = r.Client.Update(context.TODO(), u)
112111
if err != nil {
@@ -180,15 +179,14 @@ func (r *AnsibleOperatorReconciler) Reconcile(request reconcile.Request) (reconc
180179
}
181180
}
182181
if statusEvent.Event == "" {
183-
msg := "did not receive playbook_on_stats event"
184-
logger.Error(msg)
182+
eventErr := errors.New("did not receive playbook_on_stats event")
185183
stdout, err := result.Stdout()
186184
if err != nil {
187-
logger.Infof("failed to get ansible-runner stdout: %s\n", err.Error())
188-
} else {
189-
logger.Error(stdout)
185+
logger.Error(err, "failed to get ansible-runner stdout")
186+
return reconcileResult, err
190187
}
191-
return reconcileResult, errors.New(msg)
188+
logger.Error(eventErr, stdout)
189+
return reconcileResult, eventErr
192190
}
193191

194192
// We only want to update the CustomResource once, so we'll track changes and do it at the end

pkg/ansible/controller/status/types.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ import (
1818
"time"
1919

2020
"github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi"
21-
"github.com/sirupsen/logrus"
21+
"github.com/operator-framework/operator-sdk/pkg/logutil"
22+
2223
"k8s.io/api/core/v1"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
)
2526

27+
var log = logutil.SDKLog.WithName("controller.status")
28+
2629
const (
2730
host = "localhost"
2831
)
@@ -128,7 +131,7 @@ func createConditionFromMap(cm map[string]interface{}) Condition {
128131
if ok {
129132
t, err := time.Parse("2006-01-02T15:04:05Z", ltts)
130133
if err != nil {
131-
logrus.Warningf("unable to parse time for status condition: %v", ltts)
134+
log.V(logutil.VWarn).Info("unable to parse time for status condition", "Time", ltts)
132135
} else {
133136
ltt = metav1.NewTime(t)
134137
}
@@ -158,7 +161,7 @@ func CreateFromMap(statusMap map[string]interface{}) Status {
158161
for _, ci := range conditionsInterface {
159162
cm, ok := ci.(map[string]interface{})
160163
if !ok {
161-
logrus.Warningf("unknown condition, removing condition: %v", ci)
164+
log.V(logutil.VWarn).Info("unknown condition, removing condition", "ConditionInterface", ci)
162165
continue
163166
}
164167
conditions = append(conditions, createConditionFromMap(cm))

pkg/ansible/events/log_events.go

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
package events
1616

1717
import (
18+
"errors"
19+
1820
"github.com/operator-framework/operator-sdk/pkg/ansible/runner/eventapi"
19-
"github.com/sirupsen/logrus"
21+
"github.com/operator-framework/operator-sdk/pkg/logutil"
22+
2023
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2124
)
2225

@@ -44,44 +47,48 @@ type loggingEventHandler struct {
4447
}
4548

4649
func (l loggingEventHandler) Handle(ident string, u *unstructured.Unstructured, e eventapi.JobEvent) {
47-
log := logrus.WithFields(logrus.Fields{
48-
"component": "logging_event_handler",
49-
"name": u.GetName(),
50-
"namespace": u.GetNamespace(),
51-
"gvk": u.GroupVersionKind().String(),
52-
"event_type": e.Event,
53-
"job": ident,
54-
})
5550
if l.LogLevel == Nothing {
5651
return
5752
}
58-
// log only the following for the 'Tasks' LogLevel
53+
54+
logger := logutil.SDKLog.WithName("logging_event_handler").WithValues(
55+
"name", u.GetName(),
56+
"namespace", u.GetNamespace(),
57+
"gvk", u.GroupVersionKind().String(),
58+
"event_type", e.Event,
59+
"job", ident,
60+
)
61+
62+
// logger only the following for the 'Tasks' LogLevel
5963
t, ok := e.EventData["task"]
6064
if ok {
6165
setFactAction := e.EventData["task_action"] == eventapi.TaskActionSetFact
6266
debugAction := e.EventData["task_action"] == eventapi.TaskActionDebug
6367

6468
if e.Event == eventapi.EventPlaybookOnTaskStart && !setFactAction && !debugAction {
65-
log.Infof("[playbook task]: %s", e.EventData["name"])
69+
logger.Info("[playbook task]", "EventData.Name", e.EventData["name"])
6670
return
6771
}
6872
if e.Event == eventapi.EventRunnerOnOk && debugAction {
69-
log.Infof("[playbook debug]: %v", e.EventData["task_args"])
73+
logger.V(logutil.VDebug).Info("[playbook debug]", "EventData.TaskArgs", e.EventData["task_args"])
7074
return
7175
}
7276
if e.Event == eventapi.EventRunnerOnFailed {
73-
log.Errorf("[failed]: [playbook task] '%s' failed with task_args - %v",
74-
t, e.EventData["task_args"])
75-
taskPath, ok := e.EventData["task_path"]
76-
if ok {
77-
log.Errorf("failed task: %s\n", taskPath)
77+
errKVs := []interface{}{
78+
"EventData.Task", t,
79+
"EventData.TaskArgs", e.EventData["task_args"],
80+
}
81+
if taskPath, ok := e.EventData["task_path"]; ok {
82+
errKVs = append(errKVs, "EventData.FailedTaskPath", taskPath)
7883
}
84+
logger.Error(errors.New("[playbook task failed]"), "", errKVs...)
7985
return
8086
}
8187
}
88+
8289
// log everything else for the 'Everything' LogLevel
8390
if l.LogLevel == Everything {
84-
log.Infof("event: %#v", e.EventData)
91+
logger.Info("", "EventData", e.EventData)
8592
}
8693
}
8794

pkg/ansible/operator/operator.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import (
2020

2121
"github.com/operator-framework/operator-sdk/pkg/ansible/controller"
2222
"github.com/operator-framework/operator-sdk/pkg/ansible/runner"
23+
"github.com/operator-framework/operator-sdk/pkg/logutil"
24+
2325
"sigs.k8s.io/controller-runtime/pkg/manager"
2426
"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
25-
26-
"github.com/sirupsen/logrus"
2727
)
2828

2929
// Run - A blocking function which starts a controller-runtime manager
@@ -32,7 +32,7 @@ import (
3232
func Run(done chan error, mgr manager.Manager, watchesPath string, reconcilePeriod time.Duration) {
3333
watches, err := runner.NewFromWatches(watchesPath)
3434
if err != nil {
35-
logrus.Error("Failed to get watches")
35+
logutil.SDKLog.WithName("manager").Error(err, "Failed to get watches")
3636
done <- err
3737
return
3838
}

0 commit comments

Comments
 (0)