Skip to content

Commit b90a008

Browse files
committed
OPTIM/MINOR: watch only specific configmaps
1 parent 5118dc8 commit b90a008

File tree

4 files changed

+39
-5
lines changed

4 files changed

+39
-5
lines changed

.aspell.yml

+1
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ allowed:
3737
- cfg
3838
- optim
3939
- prometheus
40+
- configmaps

pkg/k8s/main.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import (
3636
k8ssync "github.com/haproxytech/kubernetes-ingress/pkg/k8s/sync"
3737
"github.com/haproxytech/kubernetes-ingress/pkg/utils"
3838
crdclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
39+
"k8s.io/apimachinery/pkg/fields"
40+
3941
errGw "k8s.io/apimachinery/pkg/api/errors"
4042
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4143
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -256,6 +258,20 @@ func (k k8s) runCRInformers(eventChan chan k8ssync.SyncDataEvent, stop chan stru
256258
}
257259
}
258260

261+
func (k k8s) runConfigMapInformers(eventChan chan k8ssync.SyncDataEvent, stop chan struct{}, informersSynced *[]cache.InformerSynced, configMap utils.NamespaceValue) {
262+
if configMap.Name != "" {
263+
fieldSelector := fields.OneTermEqualSelector("metadata.name", configMap.Name).String()
264+
factory := k8sinformers.NewSharedInformerFactoryWithOptions(k.builtInClient, k.cacheResyncPeriod, k8sinformers.WithNamespace(configMap.Namespace),
265+
k8sinformers.WithTweakListOptions(func(opts *metav1.ListOptions) {
266+
opts.FieldSelector = fieldSelector
267+
}))
268+
269+
cmi := k.getConfigMapInformer(eventChan, factory)
270+
go cmi.Run(stop)
271+
*informersSynced = append(*informersSynced, cmi.HasSynced)
272+
}
273+
}
274+
259275
func (k k8s) runInformers(eventChan chan k8ssync.SyncDataEvent, stop chan struct{}, namespace string, informersSynced *[]cache.InformerSynced, osArgs utils.OSArgs) {
260276
factory := k8sinformers.NewSharedInformerFactoryWithOptions(k.builtInClient, k.cacheResyncPeriod, k8sinformers.WithNamespace(namespace))
261277
// Core.V1 Resources
@@ -265,10 +281,12 @@ func (k k8s) runInformers(eventChan chan k8ssync.SyncDataEvent, stop chan struct
265281
go svci.Run(stop)
266282
seci := k.getSecretInformer(eventChan, factory)
267283
go seci.Run(stop)
268-
cmi := k.getConfigMapInformer(eventChan, factory)
269-
go cmi.Run(stop)
284+
*informersSynced = append(*informersSynced, svci.HasSynced, nsi.HasSynced, seci.HasSynced)
270285

271-
*informersSynced = append(*informersSynced, svci.HasSynced, nsi.HasSynced, seci.HasSynced, cmi.HasSynced)
286+
k.runConfigMapInformers(eventChan, stop, informersSynced, osArgs.ConfigMap)
287+
k.runConfigMapInformers(eventChan, stop, informersSynced, osArgs.ConfigMapTCPServices)
288+
k.runConfigMapInformers(eventChan, stop, informersSynced, osArgs.ConfigMapErrorFiles)
289+
k.runConfigMapInformers(eventChan, stop, informersSynced, osArgs.ConfigMapPatternFiles)
272290

273291
// Ingress and IngressClass Resources
274292
ii, ici := k.getIngressInformers(eventChan, factory, osArgs)

pkg/store/events.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ func (k *K8s) EventConfigMap(ns *Namespace, data *ConfigMap) (updateRequired boo
216216
}
217217
*cm = *data
218218
cm.Loaded = true
219-
updateRequired = true
219+
if !cm.Empty() {
220+
updateRequired = true
221+
}
220222
logger.Debugf("configmap '%s/%s' processed", cm.Namespace, cm.Name)
221223
case MODIFIED:
222224
if cm.Equal(data) {
@@ -228,7 +230,9 @@ func (k *K8s) EventConfigMap(ns *Namespace, data *ConfigMap) (updateRequired boo
228230
case DELETED:
229231
cm.Loaded = false
230232
cm.Annotations = map[string]string{}
231-
updateRequired = true
233+
if !cm.Empty() {
234+
updateRequired = true
235+
}
232236
logger.Debugf("configmap '%s/%s' deleted", cm.Namespace, cm.Name)
233237
}
234238
return updateRequired

pkg/store/types-equal.go

+11
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ func (a *ConfigMap) Equal(b *ConfigMap) bool {
7777
return true
7878
}
7979

80+
// Empty checks if configmap is empty
81+
func (a *ConfigMap) Empty() bool {
82+
if a == nil {
83+
return true
84+
}
85+
if len(a.Annotations) == 0 {
86+
return true
87+
}
88+
return false
89+
}
90+
8091
// Equal compares two secrets, ignores statuses and old values
8192
func (a *Secret) Equal(b *Secret) bool {
8293
if a == nil || b == nil {

0 commit comments

Comments
 (0)