-
Notifications
You must be signed in to change notification settings - Fork 4.6k
delegatingresolver: add default port to addresses #8613
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
4186a66
2156251
07add50
abc1773
0702e0c
2f50b78
aee0066
3d93bc1
80a3e98
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,10 +23,12 @@ import ( | |
"errors" | ||
"net/http" | ||
"net/url" | ||
"strings" | ||
"testing" | ||
"time" | ||
|
||
"github.com/google/go-cmp/cmp" | ||
"google.golang.org/grpc/internal/envconfig" | ||
"google.golang.org/grpc/internal/grpctest" | ||
"google.golang.org/grpc/internal/proxyattributes" | ||
"google.golang.org/grpc/internal/resolver/delegatingresolver" | ||
|
@@ -246,17 +248,110 @@ func (s) TestDelegatingResolverwithDNSAndProxyWithTargetResolution(t *testing.T) | |
} | ||
} | ||
|
||
// Tests the scenario where a proxy is configured, the target URI contains the | ||
// "dns" scheme, and target resolution is disabled(default behavior). The test | ||
// verifies that the addresses returned by the delegating resolver include the | ||
// proxy resolver's addresses, with the unresolved target URI as an attribute | ||
// of the proxy address. | ||
// Tests the creation of a delegating resolver when a proxy is configured. It | ||
// verifies both successful creation for valid targets and correct error | ||
// handling for invalid ones. | ||
// | ||
// For successful cases, it ensures the final address is from the proxy resolver | ||
// and contains the original, correctly-formatted target address as an | ||
// attribute. | ||
func (s) TestDelegatingResolverwithDNSAndProxyWithNoTargetResolution(t *testing.T) { | ||
const ( | ||
envProxyAddr = "proxytest.com" | ||
resolvedProxyTestAddr1 = "11.11.11.11:7687" | ||
) | ||
tests := []struct { | ||
name string | ||
target string | ||
wantConnectAddress string | ||
wantErrorSubstring string | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you add another test param for the env variable and tests cases for the env variable being disabled? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I already have a seperate test for it : TestDelegatingResolverEnvVarForDefaultPortDisable There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we combine the tests using an additional param? That should help reduce duplicate code. |
||
}{ | ||
{ | ||
name: "no port in target", | ||
target: "test.com", | ||
wantConnectAddress: "test.com:443", | ||
}, | ||
{ | ||
name: "port specified in target", | ||
target: "test.com:8080", | ||
wantConnectAddress: "test.com:8080", | ||
}, | ||
{ | ||
name: "colon after host in target but no post", | ||
target: "test.com:", | ||
wantErrorSubstring: "missing port after port-separator colon", | ||
}, | ||
} | ||
|
||
for _, test := range tests { | ||
t.Run(test.name, func(t *testing.T) { | ||
overrideTestHTTPSProxy(t, envProxyAddr) | ||
|
||
targetResolver := manual.NewBuilderWithScheme("dns") | ||
target := targetResolver.Scheme() + ":///" + test.target | ||
// Set up a manual DNS resolver to control the proxy address resolution. | ||
proxyResolver, proxyResolverBuilt := setupDNS(t) | ||
|
||
tcc, stateCh, _ := createTestResolverClientConn(t) | ||
_, err := delegatingresolver.New(resolver.Target{URL: *testutils.MustParseURL(target)}, tcc, resolver.BuildOptions{}, targetResolver, false) | ||
if test.wantErrorSubstring != "" { | ||
// Case 1: We expected an error. | ||
if err == nil { | ||
t.Fatalf("Delegating resolver created, want error containing %q", test.wantErrorSubstring) | ||
} | ||
if !strings.Contains(err.Error(), test.wantErrorSubstring) { | ||
t.Fatalf("Delegating resolver failed with error %v, want error containing %v", err.Error(), test.wantErrorSubstring) | ||
} | ||
return | ||
} | ||
|
||
// Case 2: We did NOT expect an error. | ||
if err != nil { | ||
t.Fatalf("Delegating resolver creation failed unexpectedly with error: %v", err) | ||
} | ||
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) | ||
defer cancel() | ||
|
||
// Wait for the proxy resolver to be built before calling UpdateState. | ||
mustBuildResolver(ctx, t, proxyResolverBuilt) | ||
proxyResolver.UpdateState(resolver.State{ | ||
Addresses: []resolver.Address{ | ||
{Addr: resolvedProxyTestAddr1}, | ||
}, | ||
}) | ||
|
||
wantState := resolver.State{ | ||
Addresses: []resolver.Address{proxyAddressWithTargetAttribute(resolvedProxyTestAddr1, test.wantConnectAddress)}, | ||
Endpoints: []resolver.Endpoint{{Addresses: []resolver.Address{proxyAddressWithTargetAttribute(resolvedProxyTestAddr1, test.wantConnectAddress)}}}, | ||
} | ||
|
||
var gotState resolver.State | ||
select { | ||
case gotState = <-stateCh: | ||
case <-ctx.Done(): | ||
t.Fatal("Context timed out when waiting for a state update from the delegating resolver") | ||
} | ||
|
||
if diff := cmp.Diff(gotState, wantState); diff != "" { | ||
t.Fatalf("Unexpected state from delegating resolver. Diff (-got +want):\n%v", diff) | ||
} | ||
}) | ||
} | ||
} | ||
|
||
// Tests the scenario where a proxy is configured, the target URI scheme is | ||
// "dns", target resolution is disabled, and the environment variable to add | ||
// default port is disabled. The test verifies that the addresses returned by | ||
// the delegating resolver include the resolved proxy address and the unresolved | ||
// target address without a port as attributes of the proxy address. | ||
func (s) TestDelegatingResolverEnvVarForDefaultPortDisabled(t *testing.T) { | ||
const ( | ||
targetTestAddr = "test.com" | ||
envProxyAddr = "proxytest.com" | ||
resolvedProxyTestAddr1 = "11.11.11.11:7687" | ||
) | ||
|
||
testutils.SetEnvConfig(t, &envconfig.EnableDefaultPortForProxyTarget, false) | ||
overrideTestHTTPSProxy(t, envProxyAddr) | ||
|
||
targetResolver := manual.NewBuilderWithScheme("dns") | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should guard this call to
parseTarget
behind the feature flag since it can potentially lead to new/different failures after this PR is merged.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can have only one block guarded by the feature flag if we instead do the following:
This way we can use the
parseTarget
function from the dns resolver without any modifications.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My thinking was we should do the basic check and add localhost for all addresses if no host is present irrespective of the resolver being used, but adding default port 443 is only for DNS resolver with target resolution disabled. And the first part should not be behind the flag , but only 2nd part should. That is my understanding, let me know if I am missing something.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From my understanding, only the DNS resolver was defaulting the hostname to
localhost
. Applying this logic to all resolvers would be a behaviour change which could potentially break some custom resolver that isn't expecting this. I would recommend avoiding such a change to be safe.Also, since we're providing a env variable flag, we should ensure the flag can revert all (if not most) changes in this PR.