in pilot/pkg/model/virtualservice.go [421:483]
func hasConflict(root, leaf *networking.HTTPMatchRequest) bool {
roots := []*networking.StringMatch{root.Uri, root.Scheme, root.Method, root.Authority}
leaves := []*networking.StringMatch{leaf.Uri, leaf.Scheme, leaf.Method, leaf.Authority}
for i := range roots {
if stringMatchConflict(roots[i], leaves[i]) {
return true
}
}
// header conflicts
for key, leafHeader := range leaf.Headers {
if stringMatchConflict(root.Headers[key], leafHeader) {
return true
}
}
// without headers
for key, leafValue := range leaf.WithoutHeaders {
if stringMatchConflict(root.WithoutHeaders[key], leafValue) {
return true
}
}
// query params conflict
for key, value := range leaf.QueryParams {
if stringMatchConflict(root.QueryParams[key], value) {
return true
}
}
if root.IgnoreUriCase != leaf.IgnoreUriCase {
return true
}
if root.Port > 0 && leaf.Port > 0 && root.Port != leaf.Port {
return true
}
// sourceNamespace
if root.SourceNamespace != "" && leaf.SourceNamespace != root.SourceNamespace {
return true
}
// sourceLabels should not conflict, root should have superset of sourceLabels.
for key, leafValue := range leaf.SourceLabels {
if v, ok := root.SourceLabels[key]; ok && v != leafValue {
return true
}
}
// gateways should not conflict, root should have superset of gateways.
if len(root.Gateways) > 0 && len(leaf.Gateways) > 0 {
if len(root.Gateways) < len(leaf.Gateways) {
return true
}
rootGateway := sets.New(root.Gateways...)
for _, gw := range leaf.Gateways {
if !rootGateway.Contains(gw) {
return true
}
}
}
return false
}