pkg/k8scontext/ingress_handlers.go (113 lines of code) (raw):

package k8scontext import ( "reflect" v1 "k8s.io/api/core/v1" networking "k8s.io/api/networking/v1" "k8s.io/client-go/tools/cache" "k8s.io/klog/v2" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/events" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/k8scontext/convert" "github.com/Azure/application-gateway-kubernetes-ingress/pkg/utils" ) // ingress resource handlers func (h handlers) ingressAdd(obj interface{}) { ing, _ := convert.ToIngressV1(obj) if _, exists := namespacesToIgnore[ing.Namespace]; exists { return } if _, exists := h.context.namespaces[ing.Namespace]; len(h.context.namespaces) > 0 && !exists { return } if !h.context.IsIngressClass(ing) { return } if ing.Spec.TLS != nil && len(ing.Spec.TLS) > 0 { ingKey := utils.GetResourceKey(ing.Namespace, ing.Name) for _, tls := range ing.Spec.TLS { secKey := utils.GetResourceKey(ing.Namespace, tls.SecretName) if h.context.ingressSecretsMap.ContainsPair(ingKey, secKey) { continue } if secret, exists, err := h.context.Caches.Secret.GetByKey(secKey); exists && err == nil { if !h.context.ingressSecretsMap.ContainsValue(secKey) { if err := h.context.CertificateSecretStore.ConvertSecret(secKey, secret.(*v1.Secret)); err != nil { klog.Error(err.Error()) } } } h.context.ingressSecretsMap.Insert(ingKey, secKey) } } h.context.Work <- events.Event{ Type: events.Create, Value: obj, } h.context.MetricStore.IncK8sAPIEventCounter() } func (h handlers) ingressDelete(obj interface{}) { ing, ok := convert.ToIngressV1(obj) if _, exists := namespacesToIgnore[ing.Namespace]; exists { return } if _, exists := h.context.namespaces[ing.Namespace]; len(h.context.namespaces) > 0 && !exists { return } if !ok { tombstone, ok := obj.(cache.DeletedFinalStateUnknown) if !ok { // unable to get from tombstone return } ing, _ = tombstone.Obj.(*networking.Ingress) } if ing == nil { return } if !h.context.IsIngressClass(ing) { return } ingKey := utils.GetResourceKey(ing.Namespace, ing.Name) h.context.ingressSecretsMap.Erase(ingKey) h.context.Work <- events.Event{ Type: events.Delete, Value: obj, } h.context.MetricStore.IncK8sAPIEventCounter() } func (h handlers) ingressUpdate(oldObj, newObj interface{}) { ing, _ := convert.ToIngressV1(newObj) if _, exists := namespacesToIgnore[ing.Namespace]; exists { return } if _, exists := h.context.namespaces[ing.Namespace]; len(h.context.namespaces) > 0 && !exists { return } if reflect.DeepEqual(oldObj, newObj) { return } oldIng, _ := convert.ToIngressV1(oldObj) if !h.context.IsIngressClass(ing) && !h.context.IsIngressClass(oldIng) { return } if ing.Spec.TLS != nil && len(ing.Spec.TLS) > 0 { ingKey := utils.GetResourceKey(ing.Namespace, ing.Name) h.context.ingressSecretsMap.Clear(ingKey) for _, tls := range ing.Spec.TLS { secKey := utils.GetResourceKey(ing.Namespace, tls.SecretName) if h.context.ingressSecretsMap.ContainsPair(ingKey, secKey) { continue } if secret, exists, err := h.context.Caches.Secret.GetByKey(secKey); exists && err == nil { if !h.context.ingressSecretsMap.ContainsValue(secKey) { if err := h.context.CertificateSecretStore.ConvertSecret(secKey, secret.(*v1.Secret)); err != nil { klog.Error(err.Error()) } } } h.context.ingressSecretsMap.Insert(ingKey, secKey) } } h.context.Work <- events.Event{ Type: events.Update, Value: newObj, } h.context.MetricStore.IncK8sAPIEventCounter() }