Skip to content

Commit 7ba8e07

Browse files
committed
Add SyncIngressServiceUuid function to handle ingress service synchronization
1 parent 720262a commit 7ba8e07

File tree

2 files changed

+108
-30
lines changed

2 files changed

+108
-30
lines changed

cmd/icinga-kubernetes/main.go

+107
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"k8s.io/apimachinery/pkg/util/runtime"
3636
"k8s.io/client-go/informers"
3737
v2 "k8s.io/client-go/informers/core/v1"
38+
networkingv1 "k8s.io/client-go/informers/networking/v1"
3839
"k8s.io/client-go/kubernetes"
3940
kclientcmd "k8s.io/client-go/tools/clientcmd"
4041
"k8s.io/klog/v2"
@@ -303,6 +304,10 @@ func main() {
303304
return SyncServicePods(ctx, kdb, factory.Core().V1().Services(), factory.Core().V1().Pods())
304305
})
305306

307+
g.Go(func() error {
308+
return SyncIngressServiceUuid(ctx, kdb, factory.Networking().V1().Ingresses())
309+
})
310+
306311
err = internal.SyncPrometheusConfig(ctx, db, &cfg.Prometheus, clusterInstance.Uuid)
307312
if err != nil {
308313
klog.Error(errors.Wrap(err, "cannot sync prometheus config"))
@@ -702,3 +707,105 @@ func SyncServicePods(ctx context.Context, db *kdatabase.Database, serviceList v2
702707

703708
return g.Wait()
704709
}
710+
711+
func SyncIngressServiceUuid(ctx context.Context, db *kdatabase.Database, ingressList networkingv1.IngressInformer) error {
712+
// TODO: Respect delete events. At the moment, service link entries will only be deleted if the corresponding ingress is deleted.
713+
ingressBackendServices := make(chan any)
714+
ingressRules := make(chan any)
715+
716+
g, ctx := errgroup.WithContext(ctx)
717+
718+
g.Go(func() error {
719+
return db.UpsertStreamed(ctx, ingressBackendServices)
720+
})
721+
722+
g.Go(func() error {
723+
return db.UpsertStreamed(ctx, ingressRules)
724+
})
725+
726+
g.Go(func() error {
727+
ch := cachev1.Multiplexers().Services().UpsertEvents().Out()
728+
for {
729+
select {
730+
case service, more := <-ch:
731+
if !more {
732+
return nil
733+
}
734+
735+
ingresses, err := ingressList.Lister().Ingresses(service.(*schemav1.Service).Namespace).List(labels.Everything())
736+
if err != nil {
737+
return err
738+
}
739+
740+
for _, ingress := range ingresses {
741+
if ingress.Spec.DefaultBackend != nil {
742+
if ingress.Spec.DefaultBackend.Service != nil {
743+
if ingress.Spec.DefaultBackend.Service.Name == service.(*schemav1.Service).Name {
744+
select {
745+
case ingressBackendServices <- schemav1.IngressBackendService{
746+
ServiceUuid: service.(*schemav1.Service).Uuid,
747+
IngressUuid: schemav1.EnsureUUID(ingress.UID),
748+
ServiceName: ingress.Spec.DefaultBackend.Service.Name,
749+
ServicePortName: ingress.Spec.DefaultBackend.Service.Port.Name,
750+
ServicePortNumber: ingress.Spec.DefaultBackend.Service.Port.Number,
751+
}:
752+
case <-ctx.Done():
753+
return ctx.Err()
754+
}
755+
}
756+
}
757+
}
758+
759+
for _, rules := range ingress.Spec.Rules {
760+
if rules.HTTP == nil {
761+
continue
762+
}
763+
764+
for _, ruleValue := range rules.HTTP.Paths {
765+
if ruleValue.Backend.Service == nil {
766+
continue
767+
}
768+
769+
serviceName := ruleValue.Backend.Service.Name
770+
if service.(*schemav1.Service).Name == serviceName {
771+
serviceUuid := service.(*schemav1.Service).Uuid
772+
ingressUuid := schemav1.EnsureUUID(ingress.UID)
773+
ingressRuleUuid := schemav1.NewUUID(ingressUuid, rules.Host+ruleValue.Path+serviceName)
774+
775+
select {
776+
case ingressBackendServices <- schemav1.IngressBackendService{
777+
ServiceUuid: serviceUuid,
778+
IngressUuid: ingressUuid,
779+
IngressRuleUuid: ingressRuleUuid,
780+
ServiceName: serviceName,
781+
ServicePortName: ruleValue.Backend.Service.Port.Name,
782+
ServicePortNumber: ruleValue.Backend.Service.Port.Number,
783+
}:
784+
case <-ctx.Done():
785+
return ctx.Err()
786+
}
787+
788+
select {
789+
case ingressRules <- schemav1.IngressRule{
790+
Uuid: ingressRuleUuid,
791+
BackendUuid: serviceUuid,
792+
IngressUuid: ingressUuid,
793+
Host: schemav1.NewNullableString(rules.Host),
794+
Path: schemav1.NewNullableString(ruleValue.Path),
795+
PathType: string(*ruleValue.PathType),
796+
}:
797+
case <-ctx.Done():
798+
return ctx.Err()
799+
}
800+
}
801+
}
802+
}
803+
}
804+
case <-ctx.Done():
805+
return ctx.Err()
806+
}
807+
}
808+
})
809+
810+
return g.Wait()
811+
}

pkg/schema/v1/ingress.go

+1-30
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,6 @@ func (i *Ingress) Obtain(k8s kmetav1.Object, clusterUuid types.UUID) {
9090
}
9191

9292
if ingress.Spec.DefaultBackend != nil {
93-
if ingress.Spec.DefaultBackend.Service != nil {
94-
serviceUuid := NewUUID(i.Uuid, ingress.Spec.DefaultBackend.Service.Name+ingress.Spec.DefaultBackend.Service.Port.Name)
95-
i.IngressBackendService = append(i.IngressBackendService, IngressBackendService{
96-
ServiceUuid: serviceUuid,
97-
IngressUuid: i.Uuid,
98-
ServiceName: ingress.Spec.DefaultBackend.Service.Name,
99-
ServicePortName: ingress.Spec.DefaultBackend.Service.Port.Name,
100-
ServicePortNumber: ingress.Spec.DefaultBackend.Service.Port.Number,
101-
})
102-
}
10393
if ingress.Spec.DefaultBackend.Resource != nil {
10494
resourceUuid := NewUUID(i.Uuid, ingress.Spec.DefaultBackend.Resource.Kind+ingress.Spec.DefaultBackend.Resource.Name)
10595
var apiGroup sql.NullString
@@ -125,26 +115,7 @@ func (i *Ingress) Obtain(k8s kmetav1.Object, clusterUuid types.UUID) {
125115
for _, ruleValue := range rules.IngressRuleValue.HTTP.Paths {
126116
// It is safe to use the pointer directly here.
127117
pathType := string(*ruleValue.PathType)
128-
if ruleValue.Backend.Service != nil {
129-
ingressRuleUuid := NewUUID(i.Uuid, rules.Host+ruleValue.Path+ruleValue.Backend.Service.Name)
130-
serviceUuid := NewUUID(ingressRuleUuid, ruleValue.Backend.Service.Name)
131-
i.IngressBackendService = append(i.IngressBackendService, IngressBackendService{
132-
ServiceUuid: serviceUuid,
133-
IngressUuid: i.Uuid,
134-
IngressRuleUuid: ingressRuleUuid,
135-
ServiceName: ruleValue.Backend.Service.Name,
136-
ServicePortName: ruleValue.Backend.Service.Port.Name,
137-
ServicePortNumber: ruleValue.Backend.Service.Port.Number,
138-
})
139-
i.IngressRule = append(i.IngressRule, IngressRule{
140-
Uuid: ingressRuleUuid,
141-
BackendUuid: serviceUuid,
142-
IngressUuid: i.Uuid,
143-
Host: NewNullableString(rules.Host),
144-
Path: NewNullableString(ruleValue.Path),
145-
PathType: pathType,
146-
})
147-
} else if ruleValue.Backend.Resource != nil {
118+
if ruleValue.Backend.Resource != nil {
148119
ingressRuleUuid := NewUUID(i.Uuid, rules.Host+ruleValue.Path+ruleValue.Backend.Resource.Name)
149120
resourceUuid := NewUUID(ingressRuleUuid, ruleValue.Backend.Resource.Name)
150121
var apiGroup sql.NullString

0 commit comments

Comments
 (0)