Ensure webhook validation ingress has a PathTypePrefix
This commit is contained in:
parent
bae9043171
commit
dbaefc8ee9
3 changed files with 25 additions and 17 deletions
|
@ -26,6 +26,7 @@ import (
|
||||||
"github.com/mitchellh/hashstructure"
|
"github.com/mitchellh/hashstructure"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
networking "k8s.io/api/networking/v1beta1"
|
networking "k8s.io/api/networking/v1beta1"
|
||||||
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
@ -219,6 +220,8 @@ func (n *NGINXController) CheckIngress(ing *networking.Ingress) error {
|
||||||
toCheck.ObjectMeta.Name == ing.ObjectMeta.Name
|
toCheck.ObjectMeta.Name == ing.ObjectMeta.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
k8s.SetDefaultPathTypeIfEmpty(ing)
|
||||||
|
|
||||||
ings := n.store.ListIngresses(filter)
|
ings := n.store.ListIngresses(filter)
|
||||||
ings = append(ings, &ingress.Ingress{
|
ings = append(ings, &ingress.Ingress{
|
||||||
Ingress: *ing,
|
Ingress: *ing,
|
||||||
|
@ -529,7 +532,7 @@ func (n *NGINXController) getBackendServers(ingresses []*ingress.Ingress) ([]*in
|
||||||
if loc.Path == nginxPath {
|
if loc.Path == nginxPath {
|
||||||
// Same paths but different types are allowed
|
// Same paths but different types are allowed
|
||||||
// (same type means overlap in the path definition)
|
// (same type means overlap in the path definition)
|
||||||
if *loc.PathType != *path.PathType {
|
if !apiequality.Semantic.DeepEqual(loc.PathType, path.PathType) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -963,28 +963,14 @@ func toIngress(obj interface{}) (*networkingv1beta1.Ingress, bool) {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
setDefaultPathTypeIfEmpty(ing)
|
k8s.SetDefaultPathTypeIfEmpty(ing)
|
||||||
return ing, true
|
return ing, true
|
||||||
}
|
}
|
||||||
|
|
||||||
if ing, ok := obj.(*networkingv1beta1.Ingress); ok {
|
if ing, ok := obj.(*networkingv1beta1.Ingress); ok {
|
||||||
setDefaultPathTypeIfEmpty(ing)
|
k8s.SetDefaultPathTypeIfEmpty(ing)
|
||||||
return ing, true
|
return ing, true
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, false
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -149,3 +149,22 @@ func NetworkingIngressAvailable(client clientset.Interface) (bool, bool) {
|
||||||
|
|
||||||
return runningVersion.AtLeast(version114), runningVersion.AtLeast(version118)
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue