Skip to content

Commit 7d40c25

Browse files
feat(source): support --event flags with sources pod and node
Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
1 parent 18c47f0 commit 7d40c25

File tree

4 files changed

+80
-23
lines changed

4 files changed

+80
-23
lines changed

source/node.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
kubeinformers "k8s.io/client-go/informers"
2828
coreinformers "k8s.io/client-go/informers/core/v1"
2929
"k8s.io/client-go/kubernetes"
30-
"k8s.io/client-go/tools/cache"
3130

3231
"sigs.k8s.io/external-dns/endpoint"
3332
"sigs.k8s.io/external-dns/source/annotations"
@@ -69,13 +68,7 @@ func NewNodeSource(
6968
nodeInformer := informerFactory.Core().V1().Nodes()
7069

7170
// Add default resource event handler to properly initialize informer.
72-
nodeInformer.Informer().AddEventHandler(
73-
cache.ResourceEventHandlerFuncs{
74-
AddFunc: func(obj interface{}) {
75-
log.Debug("node added")
76-
},
77-
},
78-
)
71+
_, _ = nodeInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
7972

8073
informerFactory.Start(ctx.Done())
8174

@@ -172,7 +165,8 @@ func (ns *nodeSource) Endpoints(_ context.Context) ([]*endpoint.Endpoint, error)
172165
return endpointsSlice, nil
173166
}
174167

175-
func (ns *nodeSource) AddEventHandler(_ context.Context, _ func()) {
168+
func (ns *nodeSource) AddEventHandler(_ context.Context, handler func()) {
169+
_, _ = ns.nodeInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
176170
}
177171

178172
// nodeAddress returns the node's externalIP and if that's not found, the node's internalIP

source/node_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import (
2626

2727
log "github.com/sirupsen/logrus"
2828
"github.com/sirupsen/logrus/hooks/test"
29+
"github.com/stretchr/testify/mock"
2930
"k8s.io/client-go/kubernetes"
31+
corev1lister "k8s.io/client-go/listers/core/v1"
32+
"k8s.io/client-go/tools/cache"
3033

3134
"sigs.k8s.io/external-dns/internal/testutils"
3235

@@ -619,6 +622,39 @@ func TestResourceLabelIsSetForEachNodeEndpoint(t *testing.T) {
619622
}
620623
}
621624

625+
func TestNodeSource_AddEventHandler(t *testing.T) {
626+
fakeInformer := new(fakeNodeInformer)
627+
inf := testInformer{}
628+
fakeInformer.On("Informer").Return(&inf)
629+
630+
nSource := &nodeSource{
631+
nodeInformer: fakeInformer,
632+
}
633+
634+
handlerCalled := false
635+
handler := func() { handlerCalled = true }
636+
637+
nSource.AddEventHandler(t.Context(), handler)
638+
639+
fakeInformer.AssertNumberOfCalls(t, "Informer", 1)
640+
assert.False(t, handlerCalled)
641+
assert.Equal(t, 1, inf.times)
642+
}
643+
644+
type fakeNodeInformer struct {
645+
mock.Mock
646+
informer cache.SharedIndexInformer
647+
}
648+
649+
func (f *fakeNodeInformer) Informer() cache.SharedIndexInformer {
650+
args := f.Called()
651+
return args.Get(0).(cache.SharedIndexInformer)
652+
}
653+
654+
func (f *fakeNodeInformer) Lister() corev1lister.NodeLister {
655+
return corev1lister.NewNodeLister(f.Informer().GetIndexer())
656+
}
657+
622658
type nodeListBuilder struct {
623659
nodes []v1.Node
624660
}

source/pod.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
kubeinformers "k8s.io/client-go/informers"
3030
coreinformers "k8s.io/client-go/informers/core/v1"
3131
"k8s.io/client-go/kubernetes"
32-
"k8s.io/client-go/tools/cache"
3332

3433
"sigs.k8s.io/external-dns/endpoint"
3534
"sigs.k8s.io/external-dns/source/annotations"
@@ -76,18 +75,8 @@ func NewPodSource(
7675
return nil, fmt.Errorf("failed to add indexers to pod informer: %w", err)
7776
}
7877

79-
_, _ = podInformer.Informer().AddEventHandler(
80-
cache.ResourceEventHandlerFuncs{
81-
AddFunc: func(obj interface{}) {
82-
},
83-
},
84-
)
85-
_, _ = nodeInformer.Informer().AddEventHandler(
86-
cache.ResourceEventHandlerFuncs{
87-
AddFunc: func(obj interface{}) {
88-
},
89-
},
90-
)
78+
_, _ = podInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
79+
_, _ = nodeInformer.Informer().AddEventHandler(informers.DefaultEventHandler())
9180

9281
informerFactory.Start(ctx.Done())
9382

@@ -114,7 +103,8 @@ func NewPodSource(
114103
}, nil
115104
}
116105

117-
func (*podSource) AddEventHandler(_ context.Context, _ func()) {
106+
func (ps *podSource) AddEventHandler(_ context.Context, handler func()) {
107+
_, _ = ps.podInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
118108
}
119109

120110
func (ps *podSource) Endpoints(_ context.Context) ([]*endpoint.Endpoint, error) {

source/pod_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ import (
2323
"testing"
2424

2525
log "github.com/sirupsen/logrus"
26+
"github.com/stretchr/testify/assert"
27+
"github.com/stretchr/testify/mock"
2628
"github.com/stretchr/testify/require"
2729
corev1 "k8s.io/api/core/v1"
2830
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31+
corev1lister "k8s.io/client-go/listers/core/v1"
32+
"k8s.io/client-go/tools/cache"
2933

3034
"sigs.k8s.io/external-dns/endpoint"
3135
"sigs.k8s.io/external-dns/internal/testutils"
@@ -909,6 +913,39 @@ func TestPodSourceLogs(t *testing.T) {
909913
}
910914
}
911915

916+
func TestPodSource_AddEventHandler(t *testing.T) {
917+
fakeInformer := new(fakePodInformer)
918+
inf := testInformer{}
919+
fakeInformer.On("Informer").Return(&inf)
920+
921+
pSource := &podSource{
922+
podInformer: fakeInformer,
923+
}
924+
925+
handlerCalled := false
926+
handler := func() { handlerCalled = true }
927+
928+
pSource.AddEventHandler(t.Context(), handler)
929+
930+
fakeInformer.AssertNumberOfCalls(t, "Informer", 1)
931+
assert.False(t, handlerCalled)
932+
assert.Equal(t, 1, inf.times)
933+
}
934+
935+
type fakePodInformer struct {
936+
mock.Mock
937+
informer cache.SharedIndexInformer
938+
}
939+
940+
func (f *fakePodInformer) Informer() cache.SharedIndexInformer {
941+
args := f.Called()
942+
return args.Get(0).(cache.SharedIndexInformer)
943+
}
944+
945+
func (f *fakePodInformer) Lister() corev1lister.PodLister {
946+
return corev1lister.NewPodLister(f.Informer().GetIndexer())
947+
}
948+
912949
func nodesFixturesIPv6() []*corev1.Node {
913950
return []*corev1.Node{
914951
{

0 commit comments

Comments
 (0)