troubleshoot: handle tproxy dialed directly case (#16210)

This commit is contained in:
Nitya Dhanushkodi 2023-02-08 14:49:38 -08:00 committed by GitHub
parent a6de56c12f
commit 58aed4dc04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package validate
import ( import (
"fmt" "fmt"
"strings"
envoy_admin_v3 "github.com/envoyproxy/go-control-plane/envoy/admin/v3" envoy_admin_v3 "github.com/envoyproxy/go-control-plane/envoy/admin/v3"
envoy_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3" envoy_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
@ -181,6 +182,16 @@ func (v *Validate) GetMessages(validateEndpoints bool, endpointValidator Endpoin
}) })
} }
// If the resource is a passthrough cluster, it will not have endpoints, so we need to skip the endpoint
// validation.
if strings.Contains(sni, "passthrough~") {
messages = append(messages, Message{
Message: fmt.Sprintf("cluster %q is a passthrough cluster, skipping endpoint healthiness check", sni),
Success: true,
})
continue
}
if validateEndpoints { if validateEndpoints {
// If resource is a top-level cluster (any cluster that is an aggregate cluster or not a child of an aggregate // If resource is a top-level cluster (any cluster that is an aggregate cluster or not a child of an aggregate
// cluster), it will have an empty parent. If resource is a child cluster, it will have a nonempty parent. // cluster), it will have an empty parent. If resource is a child cluster, it will have a nonempty parent.

View File

@ -171,6 +171,28 @@ func TestErrors(t *testing.T) {
}, },
err: "no healthy endpoints for aggregate cluster \"db-sni\" for upstream \"db\"", err: "no healthy endpoints for aggregate cluster \"db-sni\" for upstream \"db\"",
}, },
"success: passthrough cluster doesn't error even though there are zero endpoints": {
validate: func() *Validate {
return &Validate{
envoyID: "db",
snis: map[string]struct{}{
"passthrough~db-sni": {},
},
listener: true,
usesRDS: true,
route: true,
resources: map[string]*resource{
"passthrough~db-sni": {
required: true,
cluster: true,
},
},
}
},
endpointValidator: func(r *resource, s string, clusters *envoy_admin_v3.Clusters) {
r.loadAssignment = true
},
},
} }
for n, tc := range cases { for n, tc := range cases {