From 80ef2041e26af21837340f87e284796f04ea4830 Mon Sep 17 00:00:00 2001 From: Artem Glazychev Date: Wed, 4 May 2022 15:08:18 +0700 Subject: [PATCH 1/4] Add dnsresolve client chain elements Signed-off-by: Artem Glazychev --- pkg/networkservice/chains/nsmgr/heal_test.go | 5 +- pkg/networkservice/chains/nsmgr/suite_test.go | 4 +- pkg/registry/chains/client/ns_client.go | 11 +- pkg/registry/chains/client/nse_client.go | 11 +- pkg/registry/chains/client/option.go | 18 ++- pkg/registry/common/dnsresolve/ns_client.go | 124 ++++++++++++++++ pkg/registry/common/dnsresolve/nse_client.go | 136 ++++++++++++++++++ pkg/registry/common/heal/find_test.go | 9 +- pkg/tools/sandbox/node.go | 12 +- pkg/tools/sandbox/types.go | 6 +- 10 files changed, 314 insertions(+), 22 deletions(-) create mode 100644 pkg/registry/common/dnsresolve/ns_client.go create mode 100644 pkg/registry/common/dnsresolve/nse_client.go diff --git a/pkg/networkservice/chains/nsmgr/heal_test.go b/pkg/networkservice/chains/nsmgr/heal_test.go index dc15157d9..285e875c4 100644 --- a/pkg/networkservice/chains/nsmgr/heal_test.go +++ b/pkg/networkservice/chains/nsmgr/heal_test.go @@ -34,6 +34,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/common/null" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/count" "github.com/networkservicemesh/sdk/pkg/registry/chains/client" + "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -579,7 +580,9 @@ func testNSMGRCloseHeal(t *testing.T, withNSEExpiration bool) { if withNSEExpiration { // 3.1 Wait for the endpoint expiration time.Sleep(time.Second) - c := client.NewNetworkServiceEndpointRegistryClient(ctx, domain.Nodes[0].NSMgr.URL, client.WithDialOptions(sandbox.DialOptions(sandbox.WithTokenGenerator(sandbox.GenerateTestToken))...)) + c := client.NewNetworkServiceEndpointRegistryClient(ctx, + client.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(domain.Nodes[0].NSMgr.URL)), + client.WithDialOptions(sandbox.DialOptions(sandbox.WithTokenGenerator(sandbox.GenerateTestToken))...)) stream, err := c.Find(ctx, ®istry.NetworkServiceEndpointQuery{ NetworkServiceEndpoint: ®istry.NetworkServiceEndpoint{ diff --git a/pkg/networkservice/chains/nsmgr/suite_test.go b/pkg/networkservice/chains/nsmgr/suite_test.go index 5c1489f39..a8119c0af 100644 --- a/pkg/networkservice/chains/nsmgr/suite_test.go +++ b/pkg/networkservice/chains/nsmgr/suite_test.go @@ -47,6 +47,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/utils/count" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/inject/injecterror" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" + registryclienturl "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -161,7 +162,8 @@ func (s *nsmgrSuite) Test_SelectsRestartingEndpointUsecase() { }) require.NoError(t, err) - nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL), + nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, + registryclient.WithNSEClientURLResolver(registryclienturl.NewNetworkServiceEndpointRegistryClient(sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL))), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseReg, err = nseRegistryClient.Register(ctx, nseReg) diff --git a/pkg/registry/chains/client/ns_client.go b/pkg/registry/chains/client/ns_client.go index dc06db29e..37c00c1dc 100644 --- a/pkg/registry/chains/client/ns_client.go +++ b/pkg/registry/chains/client/ns_client.go @@ -18,24 +18,25 @@ package client import ( "context" - "net/url" "time" "github.com/networkservicemesh/api/pkg/api/registry" "github.com/networkservicemesh/sdk/pkg/registry/common/begin" "github.com/networkservicemesh/sdk/pkg/registry/common/clientconn" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/connect" "github.com/networkservicemesh/sdk/pkg/registry/common/dial" "github.com/networkservicemesh/sdk/pkg/registry/common/heal" + "github.com/networkservicemesh/sdk/pkg/registry/common/null" "github.com/networkservicemesh/sdk/pkg/registry/common/retry" "github.com/networkservicemesh/sdk/pkg/registry/core/chain" ) // NewNetworkServiceRegistryClient creates a new NewNetworkServiceRegistryClient that can be used for NS registration. -func NewNetworkServiceRegistryClient(ctx context.Context, connectTo *url.URL, opts ...Option) registry.NetworkServiceRegistryClient { - clientOpts := new(clientOptions) +func NewNetworkServiceRegistryClient(ctx context.Context, opts ...Option) registry.NetworkServiceRegistryClient { + clientOpts := &clientOptions{ + nsClientURLResolver: null.NewNetworkServiceRegistryClient(), + } for _, opt := range opts { opt(clientOpts) } @@ -46,7 +47,7 @@ func NewNetworkServiceRegistryClient(ctx context.Context, connectTo *url.URL, op begin.NewNetworkServiceRegistryClient(), retry.NewNetworkServiceRegistryClient(ctx), heal.NewNetworkServiceRegistryClient(ctx), - clienturl.NewNetworkServiceRegistryClient(connectTo), + clientOpts.nsClientURLResolver, clientconn.NewNetworkServiceRegistryClient(), dial.NewNetworkServiceRegistryClient(ctx, dial.WithDialOptions(clientOpts.dialOptions...), diff --git a/pkg/registry/chains/client/nse_client.go b/pkg/registry/chains/client/nse_client.go index 1157eb12f..ec1e1e015 100644 --- a/pkg/registry/chains/client/nse_client.go +++ b/pkg/registry/chains/client/nse_client.go @@ -19,24 +19,25 @@ package client import ( "context" - "net/url" "github.com/networkservicemesh/api/pkg/api/registry" "github.com/networkservicemesh/sdk/pkg/registry/common/begin" "github.com/networkservicemesh/sdk/pkg/registry/common/clientconn" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/connect" "github.com/networkservicemesh/sdk/pkg/registry/common/dial" "github.com/networkservicemesh/sdk/pkg/registry/common/heal" + "github.com/networkservicemesh/sdk/pkg/registry/common/null" "github.com/networkservicemesh/sdk/pkg/registry/common/refresh" "github.com/networkservicemesh/sdk/pkg/registry/common/retry" "github.com/networkservicemesh/sdk/pkg/registry/core/chain" ) // NewNetworkServiceEndpointRegistryClient creates a new NewNetworkServiceEndpointRegistryClient that can be used for NSE registration. -func NewNetworkServiceEndpointRegistryClient(ctx context.Context, connectTo *url.URL, opts ...Option) registry.NetworkServiceEndpointRegistryClient { - clientOpts := new(clientOptions) +func NewNetworkServiceEndpointRegistryClient(ctx context.Context, opts ...Option) registry.NetworkServiceEndpointRegistryClient { + clientOpts := &clientOptions{ + nseClientURLResolver: null.NewNetworkServiceEndpointRegistryClient(), + } for _, opt := range opts { opt(clientOpts) } @@ -48,7 +49,7 @@ func NewNetworkServiceEndpointRegistryClient(ctx context.Context, connectTo *url retry.NewNetworkServiceEndpointRegistryClient(ctx), heal.NewNetworkServiceEndpointRegistryClient(ctx), refresh.NewNetworkServiceEndpointRegistryClient(ctx), - clienturl.NewNetworkServiceEndpointRegistryClient(connectTo), + clientOpts.nseClientURLResolver, clientconn.NewNetworkServiceEndpointRegistryClient(), dial.NewNetworkServiceEndpointRegistryClient(ctx, dial.WithDialOptions(clientOpts.dialOptions...), diff --git a/pkg/registry/chains/client/option.go b/pkg/registry/chains/client/option.go index c1049a0d0..1f20e657d 100644 --- a/pkg/registry/chains/client/option.go +++ b/pkg/registry/chains/client/option.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Doc.ai and/or its affiliates. +// Copyright (c) 2021-2022 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -24,6 +24,20 @@ import ( // Option is an option pattern for NewNetworkServiceRegistryClient, NewNetworkServiceEndpointRegistryClient type Option func(clientOpts *clientOptions) +// WithNSClientURLResolver sets ns client URL resolver +func WithNSClientURLResolver(c registry.NetworkServiceRegistryClient) Option { + return func(clientOpts *clientOptions) { + clientOpts.nsClientURLResolver = c + } +} + +// WithNSEClientURLResolver sets nse client URL resolver +func WithNSEClientURLResolver(c registry.NetworkServiceEndpointRegistryClient) Option { + return func(clientOpts *clientOptions) { + clientOpts.nseClientURLResolver = c + } +} + // WithNSAdditionalFunctionality sets additional functionality func WithNSAdditionalFunctionality(additionalFunctionality ...registry.NetworkServiceRegistryClient) Option { return func(clientOpts *clientOptions) { @@ -46,6 +60,8 @@ func WithDialOptions(dialOptions ...grpc.DialOption) Option { } type clientOptions struct { + nsClientURLResolver registry.NetworkServiceRegistryClient + nseClientURLResolver registry.NetworkServiceEndpointRegistryClient nsAdditionalFunctionality []registry.NetworkServiceRegistryClient nseAdditionalFunctionality []registry.NetworkServiceEndpointRegistryClient dialOptions []grpc.DialOption diff --git a/pkg/registry/common/dnsresolve/ns_client.go b/pkg/registry/common/dnsresolve/ns_client.go new file mode 100644 index 000000000..dd35870c0 --- /dev/null +++ b/pkg/registry/common/dnsresolve/ns_client.go @@ -0,0 +1,124 @@ +// Copyright (c) 2022 Cisco Systems, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dnsresolve + +import ( + "context" + "errors" + "net" + + "github.com/golang/protobuf/ptypes/empty" + "google.golang.org/grpc" + + "github.com/networkservicemesh/api/pkg/api/registry" + + "github.com/networkservicemesh/sdk/pkg/registry/core/next" + + "github.com/networkservicemesh/sdk/pkg/tools/clienturlctx" + "github.com/networkservicemesh/sdk/pkg/tools/interdomain" +) + +type dnsNSResolveClient struct { + resolver Resolver + registryService string +} + +// NewNetworkServiceRegistryClient creates new NetworkServiceRegistryClient that can resolve passed domain to clienturl +func NewNetworkServiceRegistryClient(opts ...Option) registry.NetworkServiceRegistryClient { + var clientOptions = &options{ + resolver: net.DefaultResolver, + registryService: DefaultRegistryService, + } + + for _, opt := range opts { + opt(clientOptions) + } + + r := &dnsNSResolveClient{ + resolver: clientOptions.resolver, + registryService: clientOptions.registryService, + } + + return r +} + +func (d *dnsNSResolveClient) Register(ctx context.Context, ns *registry.NetworkService, opts ...grpc.CallOption) (*registry.NetworkService, error) { + domain := interdomain.Domain(ns.Name) + url, err := resolveDomain(ctx, d.registryService, domain, d.resolver) + if err != nil { + return nil, err + } + ctx = clienturlctx.WithClientURL(ctx, url) + ns.Name = interdomain.Target(ns.Name) + resp, err := next.NetworkServiceRegistryClient(ctx).Register(ctx, ns, opts...) + + resp.Name = interdomain.Join(resp.Name, domain) + + return resp, err +} + +type dnsNSResolveFindClient struct { + registry.NetworkServiceRegistry_FindClient + domain string +} + +func (c *dnsNSResolveFindClient) Recv() (*registry.NetworkServiceResponse, error) { + resp, err := c.NetworkServiceRegistry_FindClient.Recv() + if err != nil { + return resp, err + } + resp.NetworkService.Name = interdomain.Join(resp.NetworkService.Name, c.domain) + + return resp, err +} + +func (d *dnsNSResolveClient) Find(ctx context.Context, q *registry.NetworkServiceQuery, opts ...grpc.CallOption) (registry.NetworkServiceRegistry_FindClient, error) { + domain := interdomain.Domain(q.NetworkService.Name) + if domain == "" { + return nil, errors.New("domain cannot be empty") + } + url, err := resolveDomain(ctx, d.registryService, domain, d.resolver) + if err != nil { + return nil, err + } + ctx = clienturlctx.WithClientURL(ctx, url) + q.NetworkService.Name = interdomain.Target(q.NetworkService.Name) + + resp, err := next.NetworkServiceRegistryClient(ctx).Find(ctx, q, opts...) + if err != nil { + return nil, err + } + + return &dnsNSResolveFindClient{ + NetworkServiceRegistry_FindClient: resp, + domain: domain, + }, nil +} + +func (d *dnsNSResolveClient) Unregister(ctx context.Context, ns *registry.NetworkService, opts ...grpc.CallOption) (*empty.Empty, error) { + domain := interdomain.Domain(ns.Name) + url, err := resolveDomain(ctx, d.registryService, domain, d.resolver) + if err != nil { + return nil, err + } + ctx = clienturlctx.WithClientURL(ctx, url) + ns.Name = interdomain.Target(ns.Name) + defer func() { + ns.Name = interdomain.Join(ns.Name, domain) + }() + return next.NetworkServiceRegistryClient(ctx).Unregister(ctx, ns, opts...) +} diff --git a/pkg/registry/common/dnsresolve/nse_client.go b/pkg/registry/common/dnsresolve/nse_client.go new file mode 100644 index 000000000..1a26e56f7 --- /dev/null +++ b/pkg/registry/common/dnsresolve/nse_client.go @@ -0,0 +1,136 @@ +// Copyright (c) 2022 Cisco Systems, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dnsresolve + +import ( + "context" + "net" + + "github.com/networkservicemesh/api/pkg/api/registry" + + "github.com/golang/protobuf/ptypes/empty" + "google.golang.org/grpc" + + "github.com/networkservicemesh/sdk/pkg/tools/clienturlctx" + "github.com/networkservicemesh/sdk/pkg/tools/interdomain" + + "github.com/networkservicemesh/sdk/pkg/registry/core/next" +) + +type dnsNSEResolveClient struct { + resolver Resolver + registryService string +} + +// NewNetworkServiceEndpointRegistryClient creates new NetworkServiceEndpointRegistryClient that can resolve passed domain to clienturl +func NewNetworkServiceEndpointRegistryClient(opts ...Option) registry.NetworkServiceEndpointRegistryClient { + var clientOptions = &options{ + resolver: net.DefaultResolver, + registryService: DefaultRegistryService, + } + + for _, opt := range opts { + opt(clientOptions) + } + + r := &dnsNSEResolveClient{ + resolver: clientOptions.resolver, + registryService: clientOptions.registryService, + } + + return r +} + +func (d *dnsNSEResolveClient) Register(ctx context.Context, nse *registry.NetworkServiceEndpoint, opts ...grpc.CallOption) (*registry.NetworkServiceEndpoint, error) { + var domain = resolveNSE(nse) + var u, err = resolveDomain(ctx, d.registryService, domain, d.resolver) + + if err != nil { + return nil, err + } + + ctx = clienturlctx.WithClientURL(ctx, u) + + translateNSE(nse, interdomain.Target) + + resp, err := next.NetworkServiceEndpointRegistryClient(ctx).Register(ctx, nse, opts...) + + if err != nil { + return nil, err + } + + translateNSE(resp, func(s string) string { + return interdomain.Join(s, domain) + }) + + return resp, err +} + +type dnsNSEResolveFindClient struct { + registry.NetworkServiceEndpointRegistry_FindClient + domain string +} + +func (c *dnsNSEResolveFindClient) Recv() (*registry.NetworkServiceEndpointResponse, error) { + resp, err := c.NetworkServiceEndpointRegistry_FindClient.Recv() + if err != nil { + return resp, err + } + + translateNSE(resp.NetworkServiceEndpoint, func(str string) string { + return interdomain.Join(str, c.domain) + }) + + return resp, err +} + +func (d *dnsNSEResolveClient) Find(ctx context.Context, q *registry.NetworkServiceEndpointQuery, opts ...grpc.CallOption) (registry.NetworkServiceEndpointRegistry_FindClient, error) { + var domain = resolveNSE(q.NetworkServiceEndpoint) + var nsmgrProxyURL, err = resolveDomain(ctx, d.registryService, domain, d.resolver) + + if err != nil { + return nil, err + } + + ctx = clienturlctx.WithClientURL(ctx, nsmgrProxyURL) + translateNSE(q.NetworkServiceEndpoint, interdomain.Target) + + resp, err := next.NetworkServiceEndpointRegistryClient(ctx).Find(ctx, q, opts...) + if err != nil { + return nil, err + } + + return &dnsNSEResolveFindClient{ + NetworkServiceEndpointRegistry_FindClient: resp, + domain: domain, + }, nil +} + +func (d *dnsNSEResolveClient) Unregister(ctx context.Context, nse *registry.NetworkServiceEndpoint, opts ...grpc.CallOption) (*empty.Empty, error) { + var domain = resolveNSE(nse) + var u, err = resolveDomain(ctx, d.registryService, domain, d.resolver) + + if err != nil { + return nil, err + } + + ctx = clienturlctx.WithClientURL(ctx, u) + + translateNSE(nse, interdomain.Target) + + return next.NetworkServiceEndpointRegistryServer(ctx).Unregister(ctx, nse) +} diff --git a/pkg/registry/common/heal/find_test.go b/pkg/registry/common/heal/find_test.go index 34c556f56..43018a0ea 100644 --- a/pkg/registry/common/heal/find_test.go +++ b/pkg/registry/common/heal/find_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Doc.ai and/or its affiliates. +// Copyright (c) 2021-2022 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -28,6 +28,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgr" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" + "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -64,7 +65,8 @@ func TestHealClient_FindTest(t *testing.T) { // 1. Create NS, NSE find clients findCtx, findCancel := context.WithCancel(ctx) - nsRegistryClient := registryclient.NewNetworkServiceRegistryClient(ctx, sandbox.CloneURL(domain.Nodes[0].NSMgr.URL), + nsRegistryClient := registryclient.NewNetworkServiceRegistryClient(ctx, + registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL))), registryclient.WithDialOptions(sandbox.DialOptions()...)) nsRespStream, err := nsRegistryClient.Find(findCtx, ®istry.NetworkServiceQuery{ @@ -73,7 +75,8 @@ func TestHealClient_FindTest(t *testing.T) { }) require.NoError(t, err) - nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, sandbox.CloneURL(domain.Nodes[0].NSMgr.URL), + nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, + registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL))), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseRespStream, err := nseRegistryClient.Find(findCtx, ®istry.NetworkServiceEndpointQuery{ diff --git a/pkg/tools/sandbox/node.go b/pkg/tools/sandbox/node.go index 8b56050f8..2132b9422 100644 --- a/pkg/tools/sandbox/node.go +++ b/pkg/tools/sandbox/node.go @@ -36,6 +36,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/common/retry" "github.com/networkservicemesh/sdk/pkg/networkservice/common/roundrobin" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" + "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/recvfd" "github.com/networkservicemesh/sdk/pkg/registry/common/sendfd" "github.com/networkservicemesh/sdk/pkg/registry/core/chain" @@ -122,12 +123,15 @@ func (n *Node) NewForwarder( URL: serveURL, } nseClient := chain.NewNetworkServiceEndpointRegistryClient( - registryclient.NewNetworkServiceEndpointRegistryClient(ctx, CloneURL(n.NSMgr.URL), + registryclient.NewNetworkServiceEndpointRegistryClient(ctx, + registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), registryclient.WithNSEAdditionalFunctionality(recvfd.NewNetworkServiceEndpointRegistryClient()), registryclient.WithDialOptions(dialOptions...), ), ) - nsClient := registryclient.NewNetworkServiceRegistryClient(ctx, CloneURL(n.NSMgr.URL), registryclient.WithDialOptions(dialOptions...)) + nsClient := registryclient.NewNetworkServiceRegistryClient(ctx, + registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(CloneURL(n.NSMgr.URL))), + registryclient.WithDialOptions(dialOptions...)) entry.restartableServer = newRestartableServer(ctx, n.t, entry.URL, func(ctx context.Context) { entry.Endpoint = endpoint.NewServer(ctx, generatorFunc, endpoint.WithName(entry.Name), @@ -158,7 +162,7 @@ func (n *Node) NewForwarder( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - CloneURL(n.NSMgr.URL), + registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), registryclient.WithDialOptions(dialOptions...), ) @@ -206,7 +210,7 @@ func (n *Node) NewEndpoint( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - CloneURL(n.NSMgr.URL), + registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), registryclient.WithDialOptions(dialOptions...), registryclient.WithNSEAdditionalFunctionality(sendfd.NewNetworkServiceEndpointRegistryClient()), ) diff --git a/pkg/tools/sandbox/types.go b/pkg/tools/sandbox/types.go index e17aba236..566891067 100644 --- a/pkg/tools/sandbox/types.go +++ b/pkg/tools/sandbox/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2022 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -29,6 +29,7 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgrproxy" "github.com/networkservicemesh/sdk/pkg/registry" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" + "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/dnsresolve" "github.com/networkservicemesh/sdk/pkg/tools/token" ) @@ -100,6 +101,7 @@ func (d *Domain) NewNSRegistryClient(ctx context.Context, generatorFunc token.Ge return nil } - return registryclient.NewNetworkServiceRegistryClient(ctx, registryURL, + return registryclient.NewNetworkServiceRegistryClient(ctx, + registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(registryURL)), registryclient.WithDialOptions(DialOptions(WithTokenGenerator(generatorFunc))...)) } From 02702004e5947c85ea39af91077fb2012496f954 Mon Sep 17 00:00:00 2001 From: Artem Glazychev Date: Thu, 5 May 2022 17:09:08 +0700 Subject: [PATCH 2/4] Add ClientURL option Signed-off-by: Artem Glazychev --- pkg/networkservice/chains/nsmgr/heal_test.go | 3 +-- pkg/networkservice/chains/nsmgr/suite_test.go | 3 +-- pkg/registry/chains/client/option.go | 21 ++++++++++++++++++- pkg/registry/common/heal/find_test.go | 5 ++--- pkg/tools/sandbox/node.go | 9 ++++---- pkg/tools/sandbox/types.go | 3 +-- 6 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pkg/networkservice/chains/nsmgr/heal_test.go b/pkg/networkservice/chains/nsmgr/heal_test.go index 285e875c4..4bbc5afad 100644 --- a/pkg/networkservice/chains/nsmgr/heal_test.go +++ b/pkg/networkservice/chains/nsmgr/heal_test.go @@ -34,7 +34,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/common/null" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/count" "github.com/networkservicemesh/sdk/pkg/registry/chains/client" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -581,7 +580,7 @@ func testNSMGRCloseHeal(t *testing.T, withNSEExpiration bool) { // 3.1 Wait for the endpoint expiration time.Sleep(time.Second) c := client.NewNetworkServiceEndpointRegistryClient(ctx, - client.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(domain.Nodes[0].NSMgr.URL)), + client.WithNSEClientURL(domain.Nodes[0].NSMgr.URL), client.WithDialOptions(sandbox.DialOptions(sandbox.WithTokenGenerator(sandbox.GenerateTestToken))...)) stream, err := c.Find(ctx, ®istry.NetworkServiceEndpointQuery{ diff --git a/pkg/networkservice/chains/nsmgr/suite_test.go b/pkg/networkservice/chains/nsmgr/suite_test.go index a8119c0af..06261fcf5 100644 --- a/pkg/networkservice/chains/nsmgr/suite_test.go +++ b/pkg/networkservice/chains/nsmgr/suite_test.go @@ -47,7 +47,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/utils/count" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/inject/injecterror" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" - registryclienturl "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -163,7 +162,7 @@ func (s *nsmgrSuite) Test_SelectsRestartingEndpointUsecase() { require.NoError(t, err) nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURLResolver(registryclienturl.NewNetworkServiceEndpointRegistryClient(sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL))), + registryclient.WithNSEClientURL(sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseReg, err = nseRegistryClient.Register(ctx, nseReg) diff --git a/pkg/registry/chains/client/option.go b/pkg/registry/chains/client/option.go index 1f20e657d..e5940439b 100644 --- a/pkg/registry/chains/client/option.go +++ b/pkg/registry/chains/client/option.go @@ -17,8 +17,13 @@ package client import ( - "github.com/networkservicemesh/api/pkg/api/registry" + "net/url" + "google.golang.org/grpc" + + "github.com/networkservicemesh/api/pkg/api/registry" + + "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" ) // Option is an option pattern for NewNetworkServiceRegistryClient, NewNetworkServiceEndpointRegistryClient @@ -31,6 +36,13 @@ func WithNSClientURLResolver(c registry.NetworkServiceRegistryClient) Option { } } +// WithNSClientURL sets ns client URL +func WithNSClientURL(u *url.URL) Option { + return func(clientOpts *clientOptions) { + clientOpts.nsClientURLResolver = clienturl.NewNetworkServiceRegistryClient(u) + } +} + // WithNSEClientURLResolver sets nse client URL resolver func WithNSEClientURLResolver(c registry.NetworkServiceEndpointRegistryClient) Option { return func(clientOpts *clientOptions) { @@ -38,6 +50,13 @@ func WithNSEClientURLResolver(c registry.NetworkServiceEndpointRegistryClient) O } } +// WithNSEClientURL sets nse client URL +func WithNSEClientURL(u *url.URL) Option { + return func(clientOpts *clientOptions) { + clientOpts.nseClientURLResolver = clienturl.NewNetworkServiceEndpointRegistryClient(u) + } +} + // WithNSAdditionalFunctionality sets additional functionality func WithNSAdditionalFunctionality(additionalFunctionality ...registry.NetworkServiceRegistryClient) Option { return func(clientOpts *clientOptions) { diff --git a/pkg/registry/common/heal/find_test.go b/pkg/registry/common/heal/find_test.go index 43018a0ea..c19ea786d 100644 --- a/pkg/registry/common/heal/find_test.go +++ b/pkg/registry/common/heal/find_test.go @@ -28,7 +28,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgr" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) @@ -66,7 +65,7 @@ func TestHealClient_FindTest(t *testing.T) { findCtx, findCancel := context.WithCancel(ctx) nsRegistryClient := registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL))), + registryclient.WithNSClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nsRespStream, err := nsRegistryClient.Find(findCtx, ®istry.NetworkServiceQuery{ @@ -76,7 +75,7 @@ func TestHealClient_FindTest(t *testing.T) { require.NoError(t, err) nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL))), + registryclient.WithNSEClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseRespStream, err := nseRegistryClient.Find(findCtx, ®istry.NetworkServiceEndpointQuery{ diff --git a/pkg/tools/sandbox/node.go b/pkg/tools/sandbox/node.go index 2132b9422..44b7840b2 100644 --- a/pkg/tools/sandbox/node.go +++ b/pkg/tools/sandbox/node.go @@ -36,7 +36,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/common/retry" "github.com/networkservicemesh/sdk/pkg/networkservice/common/roundrobin" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/recvfd" "github.com/networkservicemesh/sdk/pkg/registry/common/sendfd" "github.com/networkservicemesh/sdk/pkg/registry/core/chain" @@ -124,13 +123,13 @@ func (n *Node) NewForwarder( } nseClient := chain.NewNetworkServiceEndpointRegistryClient( registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), + registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithNSEAdditionalFunctionality(recvfd.NewNetworkServiceEndpointRegistryClient()), registryclient.WithDialOptions(dialOptions...), ), ) nsClient := registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(CloneURL(n.NSMgr.URL))), + registryclient.WithNSClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...)) entry.restartableServer = newRestartableServer(ctx, n.t, entry.URL, func(ctx context.Context) { entry.Endpoint = endpoint.NewServer(ctx, generatorFunc, @@ -162,7 +161,7 @@ func (n *Node) NewForwarder( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), + registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...), ) @@ -210,7 +209,7 @@ func (n *Node) NewEndpoint( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - registryclient.WithNSEClientURLResolver(clienturl.NewNetworkServiceEndpointRegistryClient(CloneURL(n.NSMgr.URL))), + registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...), registryclient.WithNSEAdditionalFunctionality(sendfd.NewNetworkServiceEndpointRegistryClient()), ) diff --git a/pkg/tools/sandbox/types.go b/pkg/tools/sandbox/types.go index 566891067..bca58906c 100644 --- a/pkg/tools/sandbox/types.go +++ b/pkg/tools/sandbox/types.go @@ -29,7 +29,6 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgrproxy" "github.com/networkservicemesh/sdk/pkg/registry" registryclient "github.com/networkservicemesh/sdk/pkg/registry/chains/client" - "github.com/networkservicemesh/sdk/pkg/registry/common/clienturl" "github.com/networkservicemesh/sdk/pkg/registry/common/dnsresolve" "github.com/networkservicemesh/sdk/pkg/tools/token" ) @@ -102,6 +101,6 @@ func (d *Domain) NewNSRegistryClient(ctx context.Context, generatorFunc token.Ge } return registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURLResolver(clienturl.NewNetworkServiceRegistryClient(registryURL)), + registryclient.WithNSClientURL(registryURL), registryclient.WithDialOptions(DialOptions(WithTokenGenerator(generatorFunc))...)) } From 9de1240ba30d4e3968f9475ffd6d91ddd9533081 Mon Sep 17 00:00:00 2001 From: Artem Glazychev Date: Wed, 11 May 2022 15:22:10 +0700 Subject: [PATCH 3/4] Handle error Signed-off-by: Artem Glazychev --- pkg/registry/common/dnsresolve/ns_client.go | 3 +++ pkg/registry/common/dnsresolve/ns_server.go | 3 +++ pkg/registry/common/retry/ns_client.go | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/registry/common/dnsresolve/ns_client.go b/pkg/registry/common/dnsresolve/ns_client.go index dd35870c0..5fbb10d6a 100644 --- a/pkg/registry/common/dnsresolve/ns_client.go +++ b/pkg/registry/common/dnsresolve/ns_client.go @@ -65,6 +65,9 @@ func (d *dnsNSResolveClient) Register(ctx context.Context, ns *registry.NetworkS ctx = clienturlctx.WithClientURL(ctx, url) ns.Name = interdomain.Target(ns.Name) resp, err := next.NetworkServiceRegistryClient(ctx).Register(ctx, ns, opts...) + if err != nil { + return nil, err + } resp.Name = interdomain.Join(resp.Name, domain) diff --git a/pkg/registry/common/dnsresolve/ns_server.go b/pkg/registry/common/dnsresolve/ns_server.go index b904741b2..847b93c4a 100644 --- a/pkg/registry/common/dnsresolve/ns_server.go +++ b/pkg/registry/common/dnsresolve/ns_server.go @@ -65,6 +65,9 @@ func (d *dnsNSResolveServer) Register(ctx context.Context, ns *registry.NetworkS ctx = clienturlctx.WithClientURL(ctx, url) ns.Name = interdomain.Target(ns.Name) resp, err := next.NetworkServiceRegistryServer(ctx).Register(ctx, ns) + if err != nil { + return nil, err + } resp.Name = interdomain.Join(resp.Name, domain) diff --git a/pkg/registry/common/retry/ns_client.go b/pkg/registry/common/retry/ns_client.go index 14454d016..c0cf26ccc 100644 --- a/pkg/registry/common/retry/ns_client.go +++ b/pkg/registry/common/retry/ns_client.go @@ -59,7 +59,7 @@ func (r *retryNSClient) Register(ctx context.Context, in *registry.NetworkServic for ctx.Err() == nil && r.chainCtx.Err() == nil { registerCtx, cancel := c.WithTimeout(ctx, r.tryTimeout) - resp, err := next.NetworkServiceRegistryClient(registerCtx).Register(registerCtx, in, opts...) + resp, err := next.NetworkServiceRegistryClient(registerCtx).Register(registerCtx, in.Clone(), opts...) cancel() if err != nil { From a3cebf0efee412f0a7a831285baaa67a8d2dc840 Mon Sep 17 00:00:00 2001 From: Artem Glazychev Date: Wed, 11 May 2022 16:32:43 +0700 Subject: [PATCH 4/4] Unify WithClientURL option Signed-off-by: Artem Glazychev --- pkg/networkservice/chains/nsmgr/heal_test.go | 2 +- pkg/networkservice/chains/nsmgr/suite_test.go | 2 +- pkg/registry/chains/client/option.go | 20 +++++++------------ pkg/registry/common/heal/find_test.go | 4 ++-- pkg/tools/sandbox/node.go | 8 ++++---- pkg/tools/sandbox/types.go | 2 +- 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/pkg/networkservice/chains/nsmgr/heal_test.go b/pkg/networkservice/chains/nsmgr/heal_test.go index 4bbc5afad..aba6a1d70 100644 --- a/pkg/networkservice/chains/nsmgr/heal_test.go +++ b/pkg/networkservice/chains/nsmgr/heal_test.go @@ -580,7 +580,7 @@ func testNSMGRCloseHeal(t *testing.T, withNSEExpiration bool) { // 3.1 Wait for the endpoint expiration time.Sleep(time.Second) c := client.NewNetworkServiceEndpointRegistryClient(ctx, - client.WithNSEClientURL(domain.Nodes[0].NSMgr.URL), + client.WithClientURL(domain.Nodes[0].NSMgr.URL), client.WithDialOptions(sandbox.DialOptions(sandbox.WithTokenGenerator(sandbox.GenerateTestToken))...)) stream, err := c.Find(ctx, ®istry.NetworkServiceEndpointQuery{ diff --git a/pkg/networkservice/chains/nsmgr/suite_test.go b/pkg/networkservice/chains/nsmgr/suite_test.go index 06261fcf5..e484f1fdd 100644 --- a/pkg/networkservice/chains/nsmgr/suite_test.go +++ b/pkg/networkservice/chains/nsmgr/suite_test.go @@ -162,7 +162,7 @@ func (s *nsmgrSuite) Test_SelectsRestartingEndpointUsecase() { require.NoError(t, err) nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURL(sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL)), + registryclient.WithClientURL(sandbox.CloneURL(s.domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseReg, err = nseRegistryClient.Register(ctx, nseReg) diff --git a/pkg/registry/chains/client/option.go b/pkg/registry/chains/client/option.go index e5940439b..e5c7858de 100644 --- a/pkg/registry/chains/client/option.go +++ b/pkg/registry/chains/client/option.go @@ -29,17 +29,18 @@ import ( // Option is an option pattern for NewNetworkServiceRegistryClient, NewNetworkServiceEndpointRegistryClient type Option func(clientOpts *clientOptions) -// WithNSClientURLResolver sets ns client URL resolver -func WithNSClientURLResolver(c registry.NetworkServiceRegistryClient) Option { +// WithClientURL sets client URL +func WithClientURL(u *url.URL) Option { return func(clientOpts *clientOptions) { - clientOpts.nsClientURLResolver = c + clientOpts.nsClientURLResolver = clienturl.NewNetworkServiceRegistryClient(u) + clientOpts.nseClientURLResolver = clienturl.NewNetworkServiceEndpointRegistryClient(u) } } -// WithNSClientURL sets ns client URL -func WithNSClientURL(u *url.URL) Option { +// WithNSClientURLResolver sets ns client URL resolver +func WithNSClientURLResolver(c registry.NetworkServiceRegistryClient) Option { return func(clientOpts *clientOptions) { - clientOpts.nsClientURLResolver = clienturl.NewNetworkServiceRegistryClient(u) + clientOpts.nsClientURLResolver = c } } @@ -50,13 +51,6 @@ func WithNSEClientURLResolver(c registry.NetworkServiceEndpointRegistryClient) O } } -// WithNSEClientURL sets nse client URL -func WithNSEClientURL(u *url.URL) Option { - return func(clientOpts *clientOptions) { - clientOpts.nseClientURLResolver = clienturl.NewNetworkServiceEndpointRegistryClient(u) - } -} - // WithNSAdditionalFunctionality sets additional functionality func WithNSAdditionalFunctionality(additionalFunctionality ...registry.NetworkServiceRegistryClient) Option { return func(clientOpts *clientOptions) { diff --git a/pkg/registry/common/heal/find_test.go b/pkg/registry/common/heal/find_test.go index c19ea786d..20c942e03 100644 --- a/pkg/registry/common/heal/find_test.go +++ b/pkg/registry/common/heal/find_test.go @@ -65,7 +65,7 @@ func TestHealClient_FindTest(t *testing.T) { findCtx, findCancel := context.WithCancel(ctx) nsRegistryClient := registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), + registryclient.WithClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nsRespStream, err := nsRegistryClient.Find(findCtx, ®istry.NetworkServiceQuery{ @@ -75,7 +75,7 @@ func TestHealClient_FindTest(t *testing.T) { require.NoError(t, err) nseRegistryClient := registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), + registryclient.WithClientURL(sandbox.CloneURL(domain.Nodes[0].NSMgr.URL)), registryclient.WithDialOptions(sandbox.DialOptions()...)) nseRespStream, err := nseRegistryClient.Find(findCtx, ®istry.NetworkServiceEndpointQuery{ diff --git a/pkg/tools/sandbox/node.go b/pkg/tools/sandbox/node.go index 44b7840b2..9af355122 100644 --- a/pkg/tools/sandbox/node.go +++ b/pkg/tools/sandbox/node.go @@ -123,13 +123,13 @@ func (n *Node) NewForwarder( } nseClient := chain.NewNetworkServiceEndpointRegistryClient( registryclient.NewNetworkServiceEndpointRegistryClient(ctx, - registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), + registryclient.WithClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithNSEAdditionalFunctionality(recvfd.NewNetworkServiceEndpointRegistryClient()), registryclient.WithDialOptions(dialOptions...), ), ) nsClient := registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURL(CloneURL(n.NSMgr.URL)), + registryclient.WithClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...)) entry.restartableServer = newRestartableServer(ctx, n.t, entry.URL, func(ctx context.Context) { entry.Endpoint = endpoint.NewServer(ctx, generatorFunc, @@ -161,7 +161,7 @@ func (n *Node) NewForwarder( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), + registryclient.WithClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...), ) @@ -209,7 +209,7 @@ func (n *Node) NewEndpoint( entry.NetworkServiceEndpointRegistryClient = registryclient.NewNetworkServiceEndpointRegistryClient( ctx, - registryclient.WithNSEClientURL(CloneURL(n.NSMgr.URL)), + registryclient.WithClientURL(CloneURL(n.NSMgr.URL)), registryclient.WithDialOptions(dialOptions...), registryclient.WithNSEAdditionalFunctionality(sendfd.NewNetworkServiceEndpointRegistryClient()), ) diff --git a/pkg/tools/sandbox/types.go b/pkg/tools/sandbox/types.go index bca58906c..fbe690de4 100644 --- a/pkg/tools/sandbox/types.go +++ b/pkg/tools/sandbox/types.go @@ -101,6 +101,6 @@ func (d *Domain) NewNSRegistryClient(ctx context.Context, generatorFunc token.Ge } return registryclient.NewNetworkServiceRegistryClient(ctx, - registryclient.WithNSClientURL(registryURL), + registryclient.WithClientURL(registryURL), registryclient.WithDialOptions(DialOptions(WithTokenGenerator(generatorFunc))...)) }