diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index 31f905b95..da7420c8b 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -26,6 +26,7 @@ import ( "github.com/mitchellh/hashstructure" apiv1 "k8s.io/api/core/v1" networking "k8s.io/api/networking/v1beta1" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" @@ -219,6 +220,8 @@ func (n *NGINXController) CheckIngress(ing *networking.Ingress) error { toCheck.ObjectMeta.Name == ing.ObjectMeta.Name } + k8s.SetDefaultPathTypeIfEmpty(ing) + ings := n.store.ListIngresses(filter) ings = append(ings, &ingress.Ingress{ Ingress: *ing, @@ -529,7 +532,7 @@ func (n *NGINXController) getBackendServers(ingresses []*ingress.Ingress) ([]*in if loc.Path == nginxPath { // Same paths but different types are allowed // (same type means overlap in the path definition) - if *loc.PathType != *path.PathType { + if !apiequality.Semantic.DeepEqual(loc.PathType, path.PathType) { break } diff --git a/internal/ingress/controller/store/store.go b/internal/ingress/controller/store/store.go index 976cbbd8d..74dc619cd 100644 --- a/internal/ingress/controller/store/store.go +++ b/internal/ingress/controller/store/store.go @@ -963,28 +963,14 @@ func toIngress(obj interface{}) (*networkingv1beta1.Ingress, bool) { return nil, false } - setDefaultPathTypeIfEmpty(ing) + k8s.SetDefaultPathTypeIfEmpty(ing) return ing, true } if ing, ok := obj.(*networkingv1beta1.Ingress); ok { - setDefaultPathTypeIfEmpty(ing) + k8s.SetDefaultPathTypeIfEmpty(ing) return ing, true } return nil, false } - -func setDefaultPathTypeIfEmpty(ing *networkingv1beta1.Ingress) { - for _, rule := range ing.Spec.Rules { - if rule.IngressRuleValue.HTTP == nil { - continue - } - - for _, path := range rule.IngressRuleValue.HTTP.Paths { - if path.PathType == nil { - path.PathType = &defaultPathType - } - } - } -} diff --git a/internal/k8s/main.go b/internal/k8s/main.go index c1b8d9c83..612a60dc2 100644 --- a/internal/k8s/main.go +++ b/internal/k8s/main.go @@ -149,3 +149,22 @@ func NetworkingIngressAvailable(client clientset.Interface) (bool, bool) { return runningVersion.AtLeast(version114), runningVersion.AtLeast(version118) } + +// Default path type is Prefix to not break existing definitions +var defaultPathType = networkingv1beta1.PathTypePrefix + +// SetDefaultPathTypeIfEmpty sets a default PathType when is not defined. +func SetDefaultPathTypeIfEmpty(ing *networkingv1beta1.Ingress) { + for _, rule := range ing.Spec.Rules { + if rule.IngressRuleValue.HTTP == nil { + continue + } + + for idx := range rule.IngressRuleValue.HTTP.Paths { + p := &rule.IngressRuleValue.HTTP.Paths[idx] + if p.PathType == nil { + p.PathType = &defaultPathType + } + } + } +}