Skip to content

Commit a488e34

Browse files
authored
Create configmap for starting dispatcher pods (#4027) (#4101)
Signed-off-by: Pierangelo Di Pilato <pierdipi@redhat.com>
1 parent ff0b991 commit a488e34

File tree

9 files changed

+218
-13
lines changed

9 files changed

+218
-13
lines changed

control-plane/cmd/kafka-controller/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"knative.dev/eventing/pkg/auth"
3131
"knative.dev/eventing/pkg/eventingtls"
3232

33+
"knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing"
3334
"knative.dev/eventing-kafka-broker/control-plane/pkg/config"
3435
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/clientpool"
3536
"knative.dev/eventing-kafka-broker/control-plane/pkg/reconciler/broker"
@@ -67,6 +68,7 @@ func main() {
6768
ctx = filteredFactory.WithSelectors(ctx,
6869
eventingtls.TrustBundleLabelSelector,
6970
auth.OIDCLabelSelector,
71+
eventing.DispatcherLabelSelectorStr,
7072
)
7173
ctx = clientpool.WithKafkaClientPool(ctx)
7274

control-plane/pkg/apis/internals/kafka/eventing/data_plane.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ const (
2727
ConfigMapVolumeName = "kafka-resources"
2828

2929
DispatcherVolumeName = "contract-resources"
30+
31+
DataPlanePodKindLabelKey = "app.kubernetes.io/kind"
32+
DispatcherPodKindLabelValue = "kafka-dispatcher"
33+
34+
DispatcherLabelSelectorStr = DataPlanePodKindLabelKey + "=" + DispatcherPodKindLabelValue
3035
)
3136

3237
func ConfigMapNameFromPod(p *corev1.Pod) (string, error) {

control-plane/pkg/apis/internals/kafka/eventing/v1alpha1/register.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package v1alpha1
1818

1919
import (
20+
"strings"
21+
2022
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2123
"k8s.io/apimachinery/pkg/runtime"
2224
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -75,3 +77,16 @@ func IsKnownStatefulSet(name string) bool {
7577
name == ChannelStatefulSetName ||
7678
name == BrokerStatefulSetName
7779
}
80+
81+
func GetOwnerKindFromStatefulSetPrefix(name string) (string, bool) {
82+
if strings.HasPrefix(name, SourceStatefulSetName) {
83+
return "KafkaSource", true
84+
}
85+
if strings.HasPrefix(name, ChannelStatefulSetName) {
86+
return "KafkaChannel", true
87+
}
88+
if strings.HasPrefix(name, BrokerStatefulSetName) {
89+
return "Trigger", true
90+
}
91+
return "", false
92+
}

control-plane/pkg/reconciler/consumergroup/controller.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ import (
2727
"go.uber.org/multierr"
2828
"go.uber.org/zap"
2929
appsv1 "k8s.io/api/apps/v1"
30+
corev1 "k8s.io/api/core/v1"
3031
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3132
"k8s.io/apimachinery/pkg/labels"
3233
"k8s.io/apimachinery/pkg/types"
3334
"k8s.io/apiserver/pkg/storage/names"
3435
"k8s.io/client-go/tools/cache"
3536

37+
"knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing"
3638
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/clientpool"
3739
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/offset"
3840
"knative.dev/eventing-kafka-broker/control-plane/pkg/prober"
@@ -42,7 +44,7 @@ import (
4244
"knative.dev/pkg/client/injection/kube/informers/apps/v1/statefulset"
4345
configmapinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap"
4446
nodeinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/node"
45-
podinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/pod"
47+
podinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/pod/filtered"
4648
secretinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/secret"
4749
"knative.dev/pkg/configmap"
4850
"knative.dev/pkg/controller"
@@ -119,13 +121,15 @@ func NewController(ctx context.Context, watcher configmap.Watcher) *controller.I
119121

120122
clientPool := clientpool.Get(ctx)
121123

124+
dispatcherPodInformer := podinformer.Get(ctx, eventing.DispatcherLabelSelectorStr)
125+
122126
r := &Reconciler{
123127
SchedulerFunc: func(s string) (Scheduler, bool) { sched, ok := schedulers[strings.ToLower(s)]; return sched, ok },
124128
ConsumerLister: consumer.Get(ctx).Lister(),
125129
InternalsClient: internalsclient.Get(ctx).InternalV1alpha1(),
126130
SecretLister: secretinformer.Get(ctx).Lister(),
127131
ConfigMapLister: configmapinformer.Get(ctx).Lister(),
128-
PodLister: podinformer.Get(ctx).Lister(),
132+
PodLister: dispatcherPodInformer.Lister(),
129133
KubeClient: kubeclient.Get(ctx),
130134
NameGenerator: names.SimpleNameGenerator,
131135
GetKafkaClient: clientPool.GetClient,
@@ -195,6 +199,47 @@ func NewController(ctx context.Context, watcher configmap.Watcher) *controller.I
195199

196200
ResyncOnStatefulSetChange(ctx, globalResync)
197201

202+
dispatcherPodInformer.Informer().AddEventHandler(controller.HandleAll(func(obj interface{}) {
203+
pod, ok := obj.(*corev1.Pod)
204+
if !ok {
205+
return
206+
}
207+
208+
kind, ok := kafkainternals.GetOwnerKindFromStatefulSetPrefix(pod.Name)
209+
if !ok {
210+
return
211+
}
212+
213+
cmName, err := eventing.ConfigMapNameFromPod(pod)
214+
if err != nil {
215+
logger.Warnw("Failed to get ConfigMap name from pod", zap.String("pod", pod.Name), zap.Error(err))
216+
return
217+
}
218+
if err := r.ensureContractConfigMapExists(ctx, pod, cmName); err != nil {
219+
logger.Warnw("Failed to ensure ConfigMap for pod exists", zap.String("pod", pod.Name), zap.String("configmap", cmName), zap.Error(err))
220+
return
221+
}
222+
223+
impl.FilteredGlobalResync(
224+
func(obj interface{}) bool {
225+
cg, ok := obj.(*kafkainternals.ConsumerGroup)
226+
if !ok {
227+
return false
228+
}
229+
230+
uf := cg.GetUserFacingResourceRef()
231+
if uf == nil {
232+
return false
233+
}
234+
if strings.EqualFold(kind, uf.Kind) {
235+
return true
236+
}
237+
return false
238+
},
239+
consumerGroupInformer.Informer(),
240+
)
241+
}))
242+
198243
//Todo: ScaledObject informer when KEDA is installed
199244

200245
return impl

control-plane/pkg/reconciler/consumergroup/controller_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,30 @@
1717
package consumergroup
1818

1919
import (
20+
"context"
2021
"testing"
2122

2223
"github.com/stretchr/testify/require"
2324
corev1 "k8s.io/api/core/v1"
2425
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2526
"k8s.io/apimachinery/pkg/types"
26-
_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/injection/informers/sources/v1beta1/kafkasource/fake"
27-
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/clientpool"
2827
_ "knative.dev/pkg/client/injection/ducks/duck/v1/addressable/fake"
2928
kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
3029
_ "knative.dev/pkg/client/injection/kube/informers/apps/v1/statefulset/fake"
3130
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap/fake"
3231
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/node/fake"
3332
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/pod/fake"
33+
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/pod/filtered/fake"
3434
_ "knative.dev/pkg/client/injection/kube/informers/core/v1/secret/fake"
35+
filteredFactory "knative.dev/pkg/client/injection/kube/informers/factory/filtered"
36+
_ "knative.dev/pkg/client/injection/kube/informers/factory/filtered/fake"
3537
"knative.dev/pkg/configmap"
3638
reconcilertesting "knative.dev/pkg/reconciler/testing"
3739

40+
"knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing"
41+
_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/injection/informers/sources/v1beta1/kafkasource/fake"
42+
"knative.dev/eventing-kafka-broker/control-plane/pkg/kafka/clientpool"
43+
3844
kafkainternals "knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing/v1alpha1"
3945
_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/informers/eventing/v1alpha1/consumer/fake"
4046
_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/informers/eventing/v1alpha1/consumergroup/fake"
@@ -55,7 +61,11 @@ const (
5561
)
5662

5763
func TestNewController(t *testing.T) {
58-
ctx, _ := reconcilertesting.SetupFakeContext(t)
64+
ctx, _ := reconcilertesting.SetupFakeContext(t, func(ctx context.Context) context.Context {
65+
return filteredFactory.WithSelectors(ctx,
66+
eventing.DispatcherLabelSelectorStr,
67+
)
68+
})
5969
ctx, _ = kedaclient.With(ctx)
6070

6171
t.Setenv("SYSTEM_NAMESPACE", systemNamespace)

control-plane/pkg/reconciler/consumergroup/evictor_test.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package consumergroup
1818

1919
import (
20+
"context"
2021
"testing"
2122

2223
"github.com/stretchr/testify/require"
@@ -26,21 +27,23 @@ import (
2627
"k8s.io/utils/pointer"
2728
eventingduckv1alpha1 "knative.dev/eventing/pkg/apis/duck/v1alpha1"
2829
kubeclient "knative.dev/pkg/client/injection/kube/client/fake"
30+
filteredFactory "knative.dev/pkg/client/injection/kube/informers/factory/filtered"
2931
reconcilertesting "knative.dev/pkg/reconciler/testing"
3032

33+
"knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing"
3134
kafkainternals "knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing/v1alpha1"
3235
_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/client/fake"
3336
kafkainternalsclient "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/client/fake"
3437
)
3538

3639
func TestNewEvictor(t *testing.T) {
37-
ctx, _ := reconcilertesting.SetupFakeContext(t)
40+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
3841

3942
require.NotPanics(t, func() { newEvictor(ctx, zap.String("k", "n")) })
4043
}
4144

4245
func TestEvictorNilPodNoPanic(t *testing.T) {
43-
ctx, _ := reconcilertesting.SetupFakeContext(t)
46+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
4447

4548
var pod *corev1.Pod
4649

@@ -74,7 +77,7 @@ func TestEvictorNilPodNoPanic(t *testing.T) {
7477
}
7578

7679
func TestEvictorEvictSuccess(t *testing.T) {
77-
ctx, _ := reconcilertesting.SetupFakeContext(t)
80+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
7881

7982
pod := &corev1.Pod{
8083
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -111,7 +114,7 @@ func TestEvictorEvictSuccess(t *testing.T) {
111114
}
112115

113116
func TestEvictorNoEvictionEmptyPlacement(t *testing.T) {
114-
ctx, _ := reconcilertesting.SetupFakeContext(t)
117+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
115118

116119
pod := &corev1.Pod{
117120
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -145,7 +148,7 @@ func TestEvictorNoEvictionEmptyPlacement(t *testing.T) {
145148
}
146149

147150
func TestEvictorNoEviction(t *testing.T) {
148-
ctx, _ := reconcilertesting.SetupFakeContext(t)
151+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
149152

150153
pod := &corev1.Pod{
151154
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -181,7 +184,7 @@ func TestEvictorNoEviction(t *testing.T) {
181184
}
182185

183186
func TestEvictorEvictSuccessConsumerGroupSchedulingInProgress(t *testing.T) {
184-
ctx, _ := reconcilertesting.SetupFakeContext(t)
187+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
185188

186189
pod := &corev1.Pod{
187190
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -212,7 +215,7 @@ func TestEvictorEvictSuccessConsumerGroupSchedulingInProgress(t *testing.T) {
212215
}
213216

214217
func TestEvictorEvictPodNotFound(t *testing.T) {
215-
ctx, _ := reconcilertesting.SetupFakeContext(t)
218+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
216219

217220
pod := &corev1.Pod{
218221
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -238,7 +241,7 @@ func TestEvictorEvictPodNotFound(t *testing.T) {
238241
require.Nil(t, err)
239242
}
240243
func TestEvictorEvictConsumerGroupNotFound(t *testing.T) {
241-
ctx, _ := reconcilertesting.SetupFakeContext(t)
244+
ctx, _ := reconcilertesting.SetupFakeContext(t, withFilteredSelectors)
242245

243246
pod := &corev1.Pod{
244247
ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: "name"},
@@ -263,3 +266,9 @@ func TestEvictorEvictConsumerGroupNotFound(t *testing.T) {
263266

264267
require.Nil(t, err)
265268
}
269+
270+
func withFilteredSelectors(ctx context.Context) context.Context {
271+
return filteredFactory.WithSelectors(ctx,
272+
eventing.DispatcherLabelSelectorStr,
273+
)
274+
}

vendor/knative.dev/pkg/client/injection/kube/informers/core/v1/pod/filtered/fake/fake.go

Lines changed: 52 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)