Skip to content

Commit a28e7e1

Browse files
committed
implement InjectRecorder
1 parent 872f043 commit a28e7e1

File tree

6 files changed

+84
-2
lines changed

6 files changed

+84
-2
lines changed

pkg/client/config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,12 @@ func GetKubernetesClientSet() (*kubernetes.Clientset, error) {
102102
// in cluster and use the cluster provided kubeconfig.
103103
//
104104
// Will log.Fatal if KubernetesInformers cannot be created
105-
func GetKubernetesClientSetOrDie() (*kubernetes.Clientset, error) {
105+
func GetKubernetesClientSetOrDie() *kubernetes.Clientset {
106106
cs, err := GetKubernetesClientSet()
107107
if err != nil {
108108
log.Fatalf("%v", err)
109109
}
110-
return cs, nil
110+
return cs
111111
}
112112

113113
// GetKubernetesInformers creates a informers.SharedInformerFactory for talking to a Kubernetes apiserver.

pkg/controller/controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ func New(name string, mrg manager.Manager, options Options) (Controller, error)
8585
Name: name,
8686
}
8787

88+
// Inject dependencies into the controller.
89+
if err := mrg.SetFields(c); err != nil {
90+
return nil, err
91+
}
92+
8893
// Add the controller as a Manager components
8994
return c, mrg.Add(c)
9095
}

pkg/internal/controller/controller.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/kubernetes-sigs/controller-runtime/pkg/handler"
2727
"github.com/kubernetes-sigs/controller-runtime/pkg/predicate"
2828
"github.com/kubernetes-sigs/controller-runtime/pkg/reconcile"
29+
"github.com/kubernetes-sigs/controller-runtime/pkg/recorder"
2930
"github.com/kubernetes-sigs/controller-runtime/pkg/runtime/inject"
3031
logf "github.com/kubernetes-sigs/controller-runtime/pkg/runtime/log"
3132
"github.com/kubernetes-sigs/controller-runtime/pkg/source"
@@ -34,6 +35,7 @@ import (
3435
"k8s.io/apimachinery/pkg/util/wait"
3536
"k8s.io/client-go/rest"
3637
toolscache "k8s.io/client-go/tools/cache"
38+
"k8s.io/client-go/tools/record"
3739
"k8s.io/client-go/util/workqueue"
3840
)
3941

@@ -87,6 +89,10 @@ type Controller struct {
8789
// Started is true if the Controller has been Started
8890
Started bool
8991

92+
// recorder is an event recorder for recording Event resources to the
93+
// Kubernetes API.
94+
recorder record.EventRecorder
95+
9096
// TODO(community): Consider initializing a logger with the Controller Name as the tag
9197
}
9298

@@ -234,3 +240,14 @@ func (c *Controller) InjectFunc(f inject.Func) error {
234240
c.SetFields = f
235241
return nil
236242
}
243+
244+
var _ inject.Recorder = &Controller{}
245+
246+
// InjectRecorder is internal should be called only by the Controller.
247+
// InjectRecorder is used to inject the event recorder.
248+
func (c *Controller) InjectRecorder(scheme *runtime.Scheme, recorderGetFunc recorder.RecorderGetFuncType) error {
249+
if c.recorder == nil {
250+
c.recorder = recorderGetFunc(c.Name, scheme)
251+
}
252+
return nil
253+
}

pkg/manager/internal.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ func (cm *controllerManager) SetFields(i interface{}) error {
9393
if _, err := inject.CacheInto(cm.cache, i); err != nil {
9494
return err
9595
}
96+
if _, err := inject.RecorderInto(cm.scheme, i); err != nil {
97+
return err
98+
}
9699
if _, err := inject.InjectorInto(cm.SetFields, i); err != nil {
97100
return err
98101
}

pkg/recorder/recorder.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
Copyright 2018 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package recorder
18+
19+
import (
20+
"github.com/golang/glog"
21+
"github.com/kubernetes-sigs/controller-runtime/pkg/client/config"
22+
corev1 "k8s.io/api/core/v1"
23+
"k8s.io/apimachinery/pkg/runtime"
24+
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
25+
"k8s.io/client-go/tools/record"
26+
)
27+
28+
type RecorderGetFuncType func(string, *runtime.Scheme) record.EventRecorder
29+
30+
var eventBroadcaster record.EventBroadcaster
31+
32+
func GetEventRecorderFor(name string, scheme *runtime.Scheme) record.EventRecorder {
33+
if eventBroadcaster == nil {
34+
cs := config.GetKubernetesClientSetOrDie()
35+
eventBroadcaster := record.NewBroadcaster()
36+
eventBroadcaster.StartLogging(glog.Infof)
37+
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: cs.CoreV1().Events("")})
38+
}
39+
40+
return eventBroadcaster.NewRecorder(scheme, corev1.EventSource{Component: name})
41+
}

pkg/runtime/inject/inject.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package inject
1919
import (
2020
"github.com/kubernetes-sigs/controller-runtime/pkg/cache"
2121
"github.com/kubernetes-sigs/controller-runtime/pkg/client"
22+
"github.com/kubernetes-sigs/controller-runtime/pkg/recorder"
2223
"k8s.io/apimachinery/pkg/runtime"
2324
"k8s.io/client-go/rest"
2425
)
@@ -83,6 +84,21 @@ func SchemeInto(scheme *runtime.Scheme, i interface{}) (bool, error) {
8384
return false, nil
8485
}
8586

87+
// Recorder is used by the ControllerManager to inject recorder into Sources, EventHandlers, Predicates, and
88+
// Reconciles
89+
type Recorder interface {
90+
InjectRecorder(scheme *runtime.Scheme, recorderGetFunc recorder.RecorderGetFuncType) error
91+
}
92+
93+
// RecorderInto will set recorder and return the result on i if it implements Recorder. Returns
94+
// false if i does not implement Recorder.
95+
func RecorderInto(scheme *runtime.Scheme, i interface{}) (bool, error) {
96+
if is, ok := i.(Recorder); ok {
97+
return true, is.InjectRecorder(scheme, recorder.GetEventRecorderFor)
98+
}
99+
return false, nil
100+
}
101+
86102
// Func injects dependencies into i.
87103
type Func func(i interface{}) error
88104

0 commit comments

Comments
 (0)