diff --git a/pkg/networkservice/chains/nsmgr/server_test.go b/pkg/networkservice/chains/nsmgr/server_test.go index 06a54cc7e..cd8aca343 100644 --- a/pkg/networkservice/chains/nsmgr/server_test.go +++ b/pkg/networkservice/chains/nsmgr/server_test.go @@ -35,7 +35,6 @@ import ( "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/cls" kernelmech "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" - "github.com/networkservicemesh/api/pkg/api/networkservice/payload" "github.com/networkservicemesh/api/pkg/api/registry" "github.com/networkservicemesh/sdk/pkg/networkservice/common/clienturl" @@ -49,6 +48,7 @@ import ( func TestNSMGR_RemoteUsecase_Parallel(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -77,10 +77,10 @@ func TestNSMGR_RemoteUsecase_Parallel(t *testing.T) { Name: "final-endpoint", NetworkServiceNames: []string{"my-service-remote"}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, counter) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, counter) require.NoError(t, err) }() - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[1].NSMgr.URL) + nsc := domain.Nodes[1].NewClient(ctx, sandbox.GenerateTestToken) conn, err := nsc.Request(ctx, request.Clone()) require.NoError(t, err) @@ -136,10 +136,10 @@ func TestNSMGR_SelectsRestartingEndpoint(t *testing.T) { NetworkServiceNames: []string{"ns-1"}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, &restartingEndpoint{startTime: time.Now().Add(time.Second * 2)}) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, &restartingEndpoint{startTime: time.Now().Add(time.Second * 2)}) require.NoError(t, err) - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) conn, err := nsc.Request(ctx, request.Clone()) require.NoError(t, err) @@ -151,7 +151,8 @@ func TestNSMGR_SelectsRestartingEndpoint(t *testing.T) { func TestNSMGR_RemoteUsecase_BusyEndpoints(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) - ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() domain := sandbox.NewBuilder(t). @@ -181,7 +182,7 @@ func TestNSMGR_RemoteUsecase_BusyEndpoints(t *testing.T) { Name: "final-endpoint-" + strconv.Itoa(id), NetworkServiceNames: []string{"my-service-remote"}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[1].NSMgr, newBusyEndpoint()) + _, err := domain.Nodes[1].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, newBusyEndpoint()) require.NoError(t, err) wg.Done() }(i) @@ -193,10 +194,10 @@ func TestNSMGR_RemoteUsecase_BusyEndpoints(t *testing.T) { Name: "final-endpoint-3", NetworkServiceNames: []string{"my-service-remote"}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[1].NSMgr, counter) + _, err := domain.Nodes[1].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, counter) require.NoError(t, err) }() - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) conn, err := nsc.Request(ctx, request.Clone()) require.NoError(t, err) @@ -218,6 +219,7 @@ func TestNSMGR_RemoteUsecase_BusyEndpoints(t *testing.T) { func TestNSMGR_RemoteUsecase(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -234,7 +236,7 @@ func TestNSMGR_RemoteUsecase(t *testing.T) { } counter := &counterServer{} - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, counter) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, counter) require.NoError(t, err) request := &networkservice.NetworkServiceRequest{ @@ -248,7 +250,7 @@ func TestNSMGR_RemoteUsecase(t *testing.T) { }, } - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[1].NSMgr.URL) + nsc := domain.Nodes[1].NewClient(ctx, sandbox.GenerateTestToken) conn, err := nsc.Request(ctx, request.Clone()) require.NoError(t, err) @@ -295,10 +297,10 @@ func TestNSMGR_ConnectToDeadNSE(t *testing.T) { counter := &counterServer{} nseCtx, killNse := context.WithCancel(ctx) - _, err := sandbox.NewEndpoint(nseCtx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, counter) + _, err := domain.Nodes[0].NewEndpoint(nseCtx, nseReg, sandbox.GenerateTestToken, counter) require.NoError(t, err) - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) request := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ @@ -329,6 +331,7 @@ func TestNSMGR_ConnectToDeadNSE(t *testing.T) { func TestNSMGR_LocalUsecase(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -345,10 +348,10 @@ func TestNSMGR_LocalUsecase(t *testing.T) { } counter := &counterServer{} - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, counter) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, counter) require.NoError(t, err) - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) request := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ @@ -387,6 +390,7 @@ func TestNSMGR_LocalUsecase(t *testing.T) { func TestNSMGR_PassThroughRemote(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -421,11 +425,11 @@ func TestNSMGR_PassThroughRemote(t *testing.T) { Name: fmt.Sprintf("endpoint-%v", i), NetworkServiceNames: []string{fmt.Sprintf("my-service-remote-%v", i)}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[i].NSMgr, additionalFunctionality...) + _, err := domain.Nodes[i].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, additionalFunctionality...) require.NoError(t, err) } - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[nodesCount-1].NSMgr.URL) + nsc := domain.Nodes[nodesCount-1].NewClient(ctx, sandbox.GenerateTestToken) request := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ @@ -449,6 +453,7 @@ func TestNSMGR_PassThroughRemote(t *testing.T) { func TestNSMGR_PassThroughLocal(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -482,11 +487,11 @@ func TestNSMGR_PassThroughLocal(t *testing.T) { Name: fmt.Sprintf("endpoint-%v", i), NetworkServiceNames: []string{fmt.Sprintf("my-service-remote-%v", i)}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr, additionalFunctionality...) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, additionalFunctionality...) require.NoError(t, err) } - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) request := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ @@ -552,10 +557,10 @@ func testNSEAndClient( ctx, cancel := context.WithCancel(ctx) defer cancel() - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr) + _, err := domain.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken) require.NoError(t, err) - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain.Nodes[0].NSMgr.URL) + nsc := domain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) conn, err := nsc.Request(ctx, &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ @@ -570,16 +575,16 @@ func testNSEAndClient( _, err = nsc.Close(ctx, conn) require.NoError(t, err) - _, err = domain.Nodes[0].NSMgr.NetworkServiceEndpointRegistryServer().Unregister(ctx, nseReg) + _, err = domain.Nodes[0].EndpointRegistryClient.Unregister(ctx, nseReg) require.NoError(t, err) - for _, name := range nseReg.NetworkServiceNames { - _, err = domain.Nodes[0].NSMgr.NetworkServiceRegistryServer().Unregister(ctx, ®istry.NetworkService{ - Name: name, - Payload: payload.IP, + require.Eventually(t, func() bool { + stream, err := domain.Nodes[0].NSRegistryClient.Find(ctx, ®istry.NetworkServiceQuery{ + NetworkService: new(registry.NetworkService), }) require.NoError(t, err) - } + return len(registry.ReadNetworkServiceList(stream)) == 0 + }, 100*time.Millisecond, 10*time.Millisecond) } type passThroughClient struct { diff --git a/pkg/networkservice/chains/nsmgrproxy/server_test.go b/pkg/networkservice/chains/nsmgrproxy/server_test.go index f41490444..e80d0c9d6 100644 --- a/pkg/networkservice/chains/nsmgrproxy/server_test.go +++ b/pkg/networkservice/chains/nsmgrproxy/server_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -21,19 +21,22 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" + "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/cls" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" "github.com/networkservicemesh/api/pkg/api/registry" - "github.com/stretchr/testify/require" - "go.uber.org/goleak" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" ) func TestNSMGR_InterdomainUseCase(t *testing.T) { defer goleak.VerifyNone(t, goleak.IgnoreCurrent()) + const remoteRegistryDomain = "domain2.local.registry" + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -60,10 +63,10 @@ func TestNSMGR_InterdomainUseCase(t *testing.T) { NetworkServiceNames: []string{"my-service-interdomain"}, } - _, err := sandbox.NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken, domain2.Nodes[0].NSMgr) + _, err := domain2.Nodes[0].NewEndpoint(ctx, nseReg, sandbox.GenerateTestToken) require.NoError(t, err) - nsc := sandbox.NewClient(ctx, sandbox.GenerateTestToken, domain1.Nodes[0].NSMgr.URL) + nsc := domain1.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken) request := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ diff --git a/pkg/registry/chains/memory/server.go b/pkg/registry/chains/memory/server.go index 6419b4c9f..e5c2fda76 100644 --- a/pkg/registry/chains/memory/server.go +++ b/pkg/registry/chains/memory/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -36,10 +36,10 @@ import ( ) // NewServer creates new registry server based on memory storage -func NewServer(ctx context.Context, proxyRegistryURL *url.URL, options ...grpc.DialOption) registryserver.Registry { +func NewServer(ctx context.Context, expiryDuration time.Duration, proxyRegistryURL *url.URL, options ...grpc.DialOption) registryserver.Registry { nseChain := chain.NewNetworkServiceEndpointRegistryServer( setid.NewNetworkServiceEndpointRegistryServer(), - expire.NewNetworkServiceEndpointRegistryServer(time.Minute), + expire.NewNetworkServiceEndpointRegistryServer(expiryDuration), memory.NewNetworkServiceEndpointRegistryServer(), proxy.NewNetworkServiceEndpointRegistryServer(proxyRegistryURL), connect.NewNetworkServiceEndpointRegistryServer(ctx, func(ctx context.Context, cc grpc.ClientConnInterface) registry.NetworkServiceEndpointRegistryClient { diff --git a/pkg/registry/core/interdomain/interdomain_ns_test.go b/pkg/registry/core/interdomain/interdomain_ns_test.go index accefb475..c7db47ed0 100644 --- a/pkg/registry/core/interdomain/interdomain_ns_test.go +++ b/pkg/registry/core/interdomain/interdomain_ns_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -22,12 +22,12 @@ import ( "testing" "time" - "github.com/networkservicemesh/api/pkg/api/registry" + registryapi "github.com/networkservicemesh/api/pkg/api/registry" "github.com/stretchr/testify/require" "go.uber.org/goleak" "google.golang.org/grpc" - registry2 "github.com/networkservicemesh/sdk/pkg/registry" + "github.com/networkservicemesh/sdk/pkg/registry" "github.com/networkservicemesh/sdk/pkg/registry/common/memory" "github.com/networkservicemesh/sdk/pkg/tools/grpcutils" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" @@ -79,7 +79,7 @@ func TestInterdomainNetworkServiceRegistry(t *testing.T) { _, err := domain2.Registry.NetworkServiceRegistryServer().Register( context.Background(), - ®istry.NetworkService{ + ®istryapi.NetworkService{ Name: "ns-1", }, ) @@ -91,17 +91,17 @@ func TestInterdomainNetworkServiceRegistry(t *testing.T) { _ = cc.Close() }() - client := registry.NewNetworkServiceRegistryClient(cc) + client := registryapi.NewNetworkServiceRegistryClient(cc) - stream, err := client.Find(ctx, ®istry.NetworkServiceQuery{ - NetworkService: ®istry.NetworkService{ + stream, err := client.Find(ctx, ®istryapi.NetworkServiceQuery{ + NetworkService: ®istryapi.NetworkService{ Name: "ns-1@" + remoteRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceList(stream) + list := registryapi.ReadNetworkServiceList(stream) require.Len(t, list, 1) require.Equal(t, "ns-1@"+remoteRegistryDomain, list[0].Name) @@ -144,7 +144,7 @@ func TestLocalDomain_NetworkServiceRegistry(t *testing.T) { expected, err := domain1.Registry.NetworkServiceRegistryServer().Register( context.Background(), - ®istry.NetworkService{ + ®istryapi.NetworkService{ Name: "ns-1", }, ) @@ -155,17 +155,17 @@ func TestLocalDomain_NetworkServiceRegistry(t *testing.T) { defer func() { _ = cc.Close() }() - client := registry.NewNetworkServiceRegistryClient(cc) + client := registryapi.NewNetworkServiceRegistryClient(cc) - stream, err := client.Find(context.Background(), ®istry.NetworkServiceQuery{ - NetworkService: ®istry.NetworkService{ + stream, err := client.Find(context.Background(), ®istryapi.NetworkServiceQuery{ + NetworkService: ®istryapi.NetworkService{ Name: expected.Name + "@" + localRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceList(stream) + list := registryapi.ReadNetworkServiceList(stream) require.Len(t, list, 1) require.Equal(t, expected.Name, list[0].Name) @@ -217,8 +217,8 @@ func TestInterdomainFloatingNetworkServiceRegistry(t *testing.T) { domain3 := sandbox.NewBuilder(t). SetNodesCount(0). - SetRegistrySupplier(func(context.Context, *url.URL, ...grpc.DialOption) registry2.Registry { - return registry2.NewServer(memory.NewNetworkServiceRegistryServer(), memory.NewNetworkServiceEndpointRegistryServer()) + SetRegistrySupplier(func(context.Context, time.Duration, *url.URL, ...grpc.DialOption) registry.Registry { + return registry.NewServer(memory.NewNetworkServiceRegistryServer(), memory.NewNetworkServiceEndpointRegistryServer()) }). SetRegistryProxySupplier(nil). Build() @@ -232,7 +232,7 @@ func TestInterdomainFloatingNetworkServiceRegistry(t *testing.T) { _, err := domain2.Registry.NetworkServiceRegistryServer().Register( context.Background(), - ®istry.NetworkService{ + ®istryapi.NetworkService{ Name: "ns-1@" + floatingRegistryDomain, }, ) @@ -244,17 +244,17 @@ func TestInterdomainFloatingNetworkServiceRegistry(t *testing.T) { _ = cc.Close() }() - client := registry.NewNetworkServiceRegistryClient(cc) + client := registryapi.NewNetworkServiceRegistryClient(cc) - stream, err := client.Find(ctx, ®istry.NetworkServiceQuery{ - NetworkService: ®istry.NetworkService{ + stream, err := client.Find(ctx, ®istryapi.NetworkServiceQuery{ + NetworkService: ®istryapi.NetworkService{ Name: "ns-1@" + floatingRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceList(stream) + list := registryapi.ReadNetworkServiceList(stream) require.Len(t, list, 1) require.Equal(t, "ns-1", list[0].Name) diff --git a/pkg/registry/core/interdomain/interdomain_nse_test.go b/pkg/registry/core/interdomain/interdomain_nse_test.go index 38d845c78..40f1c6617 100644 --- a/pkg/registry/core/interdomain/interdomain_nse_test.go +++ b/pkg/registry/core/interdomain/interdomain_nse_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -23,12 +23,12 @@ import ( "time" "github.com/golang/protobuf/ptypes" - "github.com/networkservicemesh/api/pkg/api/registry" + registryapi "github.com/networkservicemesh/api/pkg/api/registry" "github.com/stretchr/testify/require" "go.uber.org/goleak" "google.golang.org/grpc" - registry2 "github.com/networkservicemesh/sdk/pkg/registry" + "github.com/networkservicemesh/sdk/pkg/registry" "github.com/networkservicemesh/sdk/pkg/registry/common/memory" "github.com/networkservicemesh/sdk/pkg/tools/grpcutils" "github.com/networkservicemesh/sdk/pkg/tools/sandbox" @@ -78,7 +78,7 @@ func TestInterdomainNetworkServiceEndpointRegistry(t *testing.T) { _, err := domain2.Registry.NetworkServiceEndpointRegistryServer().Register( context.Background(), - ®istry.NetworkServiceEndpoint{ + ®istryapi.NetworkServiceEndpoint{ Name: "nse-1", Url: "nsmgr-url", ExpirationTime: expirationTime, @@ -93,17 +93,17 @@ func TestInterdomainNetworkServiceEndpointRegistry(t *testing.T) { _ = cc.Close() }() - client := registry.NewNetworkServiceEndpointRegistryClient(cc) + client := registryapi.NewNetworkServiceEndpointRegistryClient(cc) - stream, err := client.Find(ctx, ®istry.NetworkServiceEndpointQuery{ - NetworkServiceEndpoint: ®istry.NetworkServiceEndpoint{ + stream, err := client.Find(ctx, ®istryapi.NetworkServiceEndpointQuery{ + NetworkServiceEndpoint: ®istryapi.NetworkServiceEndpoint{ Name: "nse-1@" + remoteRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceEndpointList(stream) + list := registryapi.ReadNetworkServiceEndpointList(stream) require.Len(t, list, 1) require.Equal(t, "nse-1@nsmgr-url", list[0].Name) @@ -148,7 +148,7 @@ func TestLocalDomain_NetworkServiceEndpointRegistry(t *testing.T) { expected, err := domain1.Registry.NetworkServiceEndpointRegistryServer().Register( context.Background(), - ®istry.NetworkServiceEndpoint{ + ®istryapi.NetworkServiceEndpoint{ Name: "nse-1", Url: "test://publicNSMGRurl", ExpirationTime: expirationTime, @@ -162,17 +162,17 @@ func TestLocalDomain_NetworkServiceEndpointRegistry(t *testing.T) { _ = cc.Close() }() - client := registry.NewNetworkServiceEndpointRegistryClient(cc) + client := registryapi.NewNetworkServiceEndpointRegistryClient(cc) - stream, err := client.Find(context.Background(), ®istry.NetworkServiceEndpointQuery{ - NetworkServiceEndpoint: ®istry.NetworkServiceEndpoint{ + stream, err := client.Find(context.Background(), ®istryapi.NetworkServiceEndpointQuery{ + NetworkServiceEndpoint: ®istryapi.NetworkServiceEndpoint{ Name: expected.Name + "@" + localRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceEndpointList(stream) + list := registryapi.ReadNetworkServiceEndpointList(stream) require.Len(t, list, 1) require.Equal(t, expected.Name, list[0].Name) @@ -223,8 +223,8 @@ func TestInterdomainFloatingNetworkServiceEndpointRegistry(t *testing.T) { domain3 := sandbox.NewBuilder(t). SetNodesCount(0). - SetRegistrySupplier(func(context.Context, *url.URL, ...grpc.DialOption) registry2.Registry { - return registry2.NewServer(memory.NewNetworkServiceRegistryServer(), memory.NewNetworkServiceEndpointRegistryServer()) + SetRegistrySupplier(func(context.Context, time.Duration, *url.URL, ...grpc.DialOption) registry.Registry { + return registry.NewServer(memory.NewNetworkServiceRegistryServer(), memory.NewNetworkServiceEndpointRegistryServer()) }). SetRegistryProxySupplier(nil). Build() @@ -238,7 +238,7 @@ func TestInterdomainFloatingNetworkServiceEndpointRegistry(t *testing.T) { _, err := domain2.Registry.NetworkServiceEndpointRegistryServer().Register( context.Background(), - ®istry.NetworkServiceEndpoint{ + ®istryapi.NetworkServiceEndpoint{ Name: "nse-1@" + floatingRegistryDomain, Url: "test://publicNSMGRurl", ExpirationTime: expirationTime, @@ -252,17 +252,17 @@ func TestInterdomainFloatingNetworkServiceEndpointRegistry(t *testing.T) { _ = cc.Close() }() - client := registry.NewNetworkServiceEndpointRegistryClient(cc) + client := registryapi.NewNetworkServiceEndpointRegistryClient(cc) - stream, err := client.Find(ctx, ®istry.NetworkServiceEndpointQuery{ - NetworkServiceEndpoint: ®istry.NetworkServiceEndpoint{ + stream, err := client.Find(ctx, ®istryapi.NetworkServiceEndpointQuery{ + NetworkServiceEndpoint: ®istryapi.NetworkServiceEndpoint{ Name: "nse-1@" + floatingRegistryDomain, }, }) require.Nil(t, err) - list := registry.ReadNetworkServiceEndpointList(stream) + list := registryapi.ReadNetworkServiceEndpointList(stream) require.Len(t, list, 1) require.Equal(t, "nse-1@test://publicNSMGRurl", list[0].Name) diff --git a/pkg/tools/sandbox/README.md b/pkg/tools/sandbox/README.md index 98fd5a344..904443256 100644 --- a/pkg/tools/sandbox/README.md +++ b/pkg/tools/sandbox/README.md @@ -28,8 +28,9 @@ Solution: SetRegistryProxySupplier(nil). Build() defer localDomain.Cleanup() - registerMyNewEndpoint(localDomain.Nodes[0].NSMgr.URL) - ... + localDomain.Nodes[0].NewEndpoint(ctx, ®istry.Endpoint{...}, sandbox.GenerateTestToken, ...myNewEndpointChain) + client := localDomain.Nodes[0].NewClient(ctx, sandbox.GenerateTestToken, ...clientChain) + ... ``` Problem: setup my external NSMgr and Forwarder to checking my external NSMgr.\ @@ -43,7 +44,7 @@ Solution: SetNSMgrSupplier(myExternalNSMgrFunc) Build() defer localDomain.Cleanup() - ... + ... ``` Problem: setup my NSMgr and new Forwarder to checking my Forwarder chain.\ @@ -54,9 +55,10 @@ Solution: SetNodesCount(1). SetNSMgrProxySupplier(nil). SetRegistryProxySupplier(nil). - SetForwarderSupplier(myNewForwarderFunc) + SetNodeSetup(nil). Build() defer localDomain.Cleanup() + localDomain.Nodes[0].NewForwarder(ctx, ®istry.Endpoint{...}, sandbox.GenerateTestToken, ...myNewForwarderChain) ... ``` @@ -70,13 +72,30 @@ Solution: SetNodesCount(2). Build() defer localDomain.Cleanup() - urlForNSERegistration := localDomain.Nodes[1].NSMgr.URL - ... + localDomain.Nodes[1].NewEndpoint(ctx, ®istry.Endpoint{...}, sandbox.GenerateTestToken, ...remoteEndpointChain) + ... +``` + +Problem: setup NSMgr, set of Forwarders and set of Endpoints on each node to checking complex scenarios.\ +Solution: +```go + ... + localDomain := sandbox.NewBuilder(t). + SetNodesCount(nodesCount). + SetNSMgrProxySupplier(nil). + SetRegistryProxySupplier(nil). + SetNodeSetup(func(ctx context.Context, node *sandbox.Node) { + node.NewForwarder(ctx, ®istry.Endpoint{...}, sandbox.GenerateTestToken, ...forwarderChain) + node.NewEndpoint(ctx, ®istry.Endpoint{...}, sandbox.GenerateTestToken, ...endpointChain) + }). + Build() + defer localDomain.Cleanup() + ... ``` ### Setup only local registry -Problem: setup registry and to check API\ +Problem: setup registry and to check API.\ Solution: ```go ... @@ -97,7 +116,7 @@ Problem: setup NSMgrs, Forwarders, Registries to checking interdomain use-case v Solution: ```go ... - fakeServer := new(sandbox.FakeDNSResolver) + fakeServer := new(sandbox.FakeDNSResolver) domain1 := sandbox.NewBuilder(t). SetContext(ctx). SetNodesCount(1). diff --git a/pkg/tools/sandbox/builder.go b/pkg/tools/sandbox/builder.go index 32884e530..25fb70433 100644 --- a/pkg/tools/sandbox/builder.go +++ b/pkg/tools/sandbox/builder.go @@ -23,35 +23,29 @@ import ( "testing" "time" - "github.com/networkservicemesh/sdk/pkg/tools/logger" - "github.com/google/uuid" "github.com/stretchr/testify/require" "google.golang.org/grpc" registryapi "github.com/networkservicemesh/api/pkg/api/registry" - "github.com/networkservicemesh/sdk/pkg/networkservice/chains/client" - "github.com/networkservicemesh/sdk/pkg/networkservice/chains/endpoint" "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgr" "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgrproxy" "github.com/networkservicemesh/sdk/pkg/networkservice/common/authorize" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/clienturl" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/connect" - "github.com/networkservicemesh/sdk/pkg/networkservice/core/adapters" + "github.com/networkservicemesh/sdk/pkg/registry/chains/client" "github.com/networkservicemesh/sdk/pkg/registry/chains/memory" "github.com/networkservicemesh/sdk/pkg/registry/chains/proxydns" "github.com/networkservicemesh/sdk/pkg/registry/common/dnsresolve" - interpose_reg "github.com/networkservicemesh/sdk/pkg/registry/common/interpose" - adapter_registry "github.com/networkservicemesh/sdk/pkg/registry/core/adapters" - "github.com/networkservicemesh/sdk/pkg/registry/core/chain" - "github.com/networkservicemesh/sdk/pkg/tools/addressof" "github.com/networkservicemesh/sdk/pkg/tools/grpcutils" + "github.com/networkservicemesh/sdk/pkg/tools/logger" "github.com/networkservicemesh/sdk/pkg/tools/opentracing" "github.com/networkservicemesh/sdk/pkg/tools/token" ) -const defaultContextTimeout = time.Second * 15 +const ( + defaultContextTimeout = time.Second * 15 + defaultRegistryExpiryDuration = 500 * time.Millisecond +) // Builder implements builder pattern for building NSM Domain type Builder struct { @@ -60,11 +54,11 @@ type Builder struct { nodesCount int DNSDomainName string Resolver dnsresolve.Resolver - supplyForwarder SupplyForwarderFunc supplyNSMgr SupplyNSMgrFunc supplyNSMgrProxy SupplyNSMgrProxyFunc supplyRegistry SupplyRegistryFunc supplyRegistryProxy SupplyRegistryProxyFunc + setupNode SetupNodeFunc generateTokenFunc token.GeneratorFunc ctx context.Context } @@ -76,11 +70,11 @@ func NewBuilder(t *testing.T) *Builder { require: require.New(t), Resolver: net.DefaultResolver, supplyNSMgr: nsmgr.NewServer, - supplyForwarder: supplyDummyForwarder, DNSDomainName: "cluster.local", supplyRegistry: memory.NewServer, supplyRegistryProxy: proxydns.NewServer, supplyNSMgrProxy: nsmgrproxy.NewServer, + setupNode: defaultSetupNode(t), generateTokenFunc: GenerateTestToken, } } @@ -94,7 +88,8 @@ func (b *Builder) Build() *Domain { b.resources = append(b.resources, cancel) } ctx = logger.WithLog(ctx) - domain := &Domain{} + + domain := new(Domain) domain.NSMgrProxy = b.newNSMgrProxy(ctx) if domain.NSMgrProxy == nil { domain.RegistryProxy = b.newRegistryProxy(ctx, &url.URL{}) @@ -106,18 +101,13 @@ func (b *Builder) Build() *Domain { } else { domain.Registry = b.newRegistry(ctx, domain.RegistryProxy.URL) } + for i := 0; i < b.nodesCount; i++ { - var node = new(Node) - node.NSMgr = b.newNSMgr(ctx, domain.Registry.URL) - forwarderName := "cross-nse-" + uuid.New().String() - forwarderRegistrationClient := chain.NewNetworkServiceEndpointRegistryClient( - interpose_reg.NewNetworkServiceEndpointRegistryClient(), - adapter_registry.NetworkServiceEndpointServerToClient(node.NSMgr.NetworkServiceEndpointRegistryServer()), - ) - node.Forwarder = b.newCrossConnectNSE(ctx, forwarderName, node.NSMgr.URL, forwarderRegistrationClient) - domain.Nodes = append(domain.Nodes, node) + domain.Nodes = append(domain.Nodes, b.newNode(ctx, domain.Registry.URL)) } + domain.resources, b.resources = b.resources, nil + return domain } @@ -163,12 +153,6 @@ func (b *Builder) SetDNSDomainName(name string) *Builder { return b } -// SetForwarderSupplier replaces default dummy forwarder supplier to custom function -func (b *Builder) SetForwarderSupplier(f SupplyForwarderFunc) *Builder { - b.supplyForwarder = f - return b -} - // SetNSMgrProxySupplier replaces default nsmgr-proxy supplier to custom function func (b *Builder) SetNSMgrProxySupplier(f SupplyNSMgrProxyFunc) *Builder { b.supplyNSMgrProxy = f @@ -181,6 +165,12 @@ func (b *Builder) SetNSMgrSupplier(f SupplyNSMgrFunc) *Builder { return b } +// SetNodeSetup replaces default node setup to custom function +func (b *Builder) SetNodeSetup(f SetupNodeFunc) *Builder { + b.setupNode = f + return b +} + func (b *Builder) dialContext(ctx context.Context, u *url.URL) *grpc.ClientConn { conn, err := grpc.DialContext(ctx, grpcutils.URLToTarget(u), grpc.WithInsecure(), @@ -253,30 +243,6 @@ func serve(ctx context.Context, u *url.URL, register func(server *grpc.Server)) }() } -func (b *Builder) newCrossConnectNSE(ctx context.Context, name string, connectTo *url.URL, forwarderRegistrationClient registryapi.NetworkServiceEndpointRegistryClient) *EndpointEntry { - if b.supplyForwarder == nil { - panic("nodes without forwarder are not supported") - } - listener, err := net.Listen("tcp", "127.0.0.1:0") - b.require.NoError(err) - serveURL := grpcutils.AddressToURL(listener.Addr()) - b.require.NoError(listener.Close()) - - regForwarder, err := forwarderRegistrationClient.Register(context.Background(), ®istryapi.NetworkServiceEndpoint{ - Url: serveURL.String(), - Name: name, - }) - b.require.NoError(err) - - crossNSE := b.supplyForwarder(ctx, regForwarder.Name, b.generateTokenFunc, connectTo, grpc.WithInsecure(), grpc.WithDefaultCallOptions(grpc.WaitForReady(true))) - serve(ctx, serveURL, crossNSE.Register) - logger.Log(ctx).Infof("%v listen on: %v", name, serveURL) - return &EndpointEntry{ - Endpoint: crossNSE, - URL: serveURL, - } -} - func (b *Builder) newRegistryProxy(ctx context.Context, nsmgrProxyURL *url.URL) *RegistryEntry { if b.supplyRegistryProxy == nil { return nil @@ -295,7 +261,7 @@ func (b *Builder) newRegistry(ctx context.Context, proxyRegistryURL *url.URL) *R if b.supplyRegistry == nil { return nil } - result := b.supplyRegistry(ctx, proxyRegistryURL, grpc.WithInsecure(), grpc.WithBlock()) + result := b.supplyRegistry(ctx, defaultRegistryExpiryDuration, proxyRegistryURL, grpc.WithInsecure(), grpc.WithBlock()) serveURL := &url.URL{Scheme: "tcp", Host: "127.0.0.1:0"} serve(ctx, serveURL, result.Register) logger.Log(ctx).Infof("Registry listen on: %v", serveURL) @@ -305,22 +271,31 @@ func (b *Builder) newRegistry(ctx context.Context, proxyRegistryURL *url.URL) *R } } -func supplyDummyForwarder(ctx context.Context, name string, generateToken token.GeneratorFunc, connectTo *url.URL, dialOptions ...grpc.DialOption) endpoint.Endpoint { - var result endpoint.Endpoint - result = endpoint.NewServer(ctx, - name, - authorize.NewServer(), - generateToken, - // Statically set the url we use to the unix file socket for the NSMgr - clienturl.NewServer(connectTo), - connect.NewServer(ctx, - client.NewCrossConnectClientFactory( - name, - // What to call onHeal - addressof.NetworkServiceClient(adapters.NewServerToClient(result)), - generateToken), - dialOptions..., - ), - ) - return result +func (b *Builder) newNode(ctx context.Context, registryURL *url.URL) *Node { + nsmgrEntry := b.newNSMgr(ctx, registryURL) + nsmgrCC := b.dialContext(ctx, nsmgrEntry.URL) + + node := &Node{ + ctx: b.ctx, + NSMgr: nsmgrEntry, + ForwarderRegistryClient: client.NewNetworkServiceEndpointRegistryInterposeClient(ctx, nsmgrCC), + EndpointRegistryClient: client.NewNetworkServiceEndpointRegistryClient(ctx, nsmgrCC), + NSRegistryClient: client.NewNetworkServiceRegistryClient(nsmgrCC), + } + + if b.setupNode != nil { + b.setupNode(ctx, node) + } + + return node +} + +func defaultSetupNode(t *testing.T) SetupNodeFunc { + return func(ctx context.Context, node *Node) { + nseReg := ®istryapi.NetworkServiceEndpoint{ + Name: uuid.New().String(), + } + _, err := node.NewForwarder(ctx, nseReg, GenerateTestToken) + require.NoError(t, err) + } } diff --git a/pkg/tools/sandbox/node.go b/pkg/tools/sandbox/node.go new file mode 100644 index 000000000..998270ada --- /dev/null +++ b/pkg/tools/sandbox/node.go @@ -0,0 +1,172 @@ +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. +// +// 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 sandbox + +import ( + "context" + "fmt" + "net/url" + + "github.com/google/uuid" + "google.golang.org/grpc" + + "github.com/networkservicemesh/api/pkg/api/networkservice" + "github.com/networkservicemesh/api/pkg/api/networkservice/payload" + registryapi "github.com/networkservicemesh/api/pkg/api/registry" + + "github.com/networkservicemesh/sdk/pkg/networkservice/chains/client" + "github.com/networkservicemesh/sdk/pkg/networkservice/chains/endpoint" + "github.com/networkservicemesh/sdk/pkg/networkservice/common/authorize" + "github.com/networkservicemesh/sdk/pkg/networkservice/common/clienturl" + "github.com/networkservicemesh/sdk/pkg/networkservice/common/connect" + "github.com/networkservicemesh/sdk/pkg/networkservice/core/adapters" + "github.com/networkservicemesh/sdk/pkg/tools/addressof" + "github.com/networkservicemesh/sdk/pkg/tools/grpcutils" + "github.com/networkservicemesh/sdk/pkg/tools/logger" + "github.com/networkservicemesh/sdk/pkg/tools/token" +) + +// Node is a NSMgr with Forwarder, NSE registry clients +type Node struct { + ctx context.Context + NSMgr *NSMgrEntry + ForwarderRegistryClient registryapi.NetworkServiceEndpointRegistryClient + EndpointRegistryClient registryapi.NetworkServiceEndpointRegistryClient + NSRegistryClient registryapi.NetworkServiceRegistryClient +} + +// NewForwarder starts a new forwarder and registers it on the node NSMgr +func (n *Node) NewForwarder( + ctx context.Context, + nse *registryapi.NetworkServiceEndpoint, + generatorFunc token.GeneratorFunc, + additionalFunctionality ...networkservice.NetworkServiceServer, +) (*EndpointEntry, error) { + ep := new(EndpointEntry) + additionalFunctionality = append(additionalFunctionality, + clienturl.NewServer(n.NSMgr.URL), + connect.NewServer(ctx, + client.NewCrossConnectClientFactory( + nse.Name, + // What to call onHeal + addressof.NetworkServiceClient(adapters.NewServerToClient(ep)), + generatorFunc), + grpc.WithInsecure(), grpc.WithDefaultCallOptions(grpc.WaitForReady(true)), + )) + + entry, err := n.newEndpoint(ctx, nse, generatorFunc, n.ForwarderRegistryClient, additionalFunctionality...) + if err != nil { + return nil, err + } + *ep = *entry + + return ep, nil +} + +// NewEndpoint starts a new endpoint and registers it on the node NSMgr +func (n *Node) NewEndpoint( + ctx context.Context, + nse *registryapi.NetworkServiceEndpoint, + generatorFunc token.GeneratorFunc, + additionalFunctionality ...networkservice.NetworkServiceServer, +) (*EndpointEntry, error) { + return n.newEndpoint(ctx, nse, generatorFunc, n.EndpointRegistryClient, additionalFunctionality...) +} + +func (n *Node) newEndpoint( + ctx context.Context, + nse *registryapi.NetworkServiceEndpoint, + generatorFunc token.GeneratorFunc, + registryClient registryapi.NetworkServiceEndpointRegistryClient, + additionalFunctionality ...networkservice.NetworkServiceServer, +) (_ *EndpointEntry, err error) { + // 1. Create endpoint server + ep := endpoint.NewServer( + ctx, + nse.Name, + authorize.NewServer(), + generatorFunc, + additionalFunctionality..., + ) + + // 2. Start listening on URL + u := &url.URL{Scheme: "tcp", Host: "127.0.0.1:0"} + if nse.Url != "" { + u, err = url.Parse(nse.Url) + if err != nil { + return nil, err + } + } + + ctx = logger.WithLog(ctx) + serve(ctx, u, ep.Register) + + nse.Url = u.String() + + // 3. Register with the node registry client + + for _, nsName := range nse.NetworkServiceNames { + if _, err = n.NSRegistryClient.Register(ctx, ®istryapi.NetworkService{ + Name: nsName, + Payload: payload.IP, + }); err != nil { + return nil, err + } + } + + var reg *registryapi.NetworkServiceEndpoint + if reg, err = registryClient.Register(ctx, nse); err != nil { + return nil, err + } + + nse.Name = reg.Name + nse.ExpirationTime = reg.ExpirationTime + + logger.Log(ctx).Infof("Started listen endpoint %s on %s.", nse.Name, u.String()) + + return &EndpointEntry{Endpoint: ep, URL: u}, nil +} + +// NewClient starts a new client and connects it to the node NSMgr +func (n *Node) NewClient( + ctx context.Context, + generatorFunc token.GeneratorFunc, + additionalFunctionality ...networkservice.NetworkServiceClient, +) networkservice.NetworkServiceClient { + cc, err := grpc.DialContext(ctx, grpcutils.URLToTarget(n.NSMgr.URL), + grpc.WithInsecure(), + grpc.WithBlock(), + grpc.WithDefaultCallOptions(grpc.WaitForReady(true)), + ) + if err != nil { + logger.Log(ctx).Fatalf("Failed to dial node NSMgr: %s", err.Error()) + } + + go func() { + defer func() { _ = cc.Close() }() + <-ctx.Done() + }() + + return client.NewClient( + ctx, + fmt.Sprintf("nsc-%v", uuid.New().String()), + nil, + generatorFunc, + cc, + additionalFunctionality..., + ) +} diff --git a/pkg/tools/sandbox/types.go b/pkg/tools/sandbox/types.go index 2c3c5e61d..6b2cfe99b 100644 --- a/pkg/tools/sandbox/types.go +++ b/pkg/tools/sandbox/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Doc.ai and/or its affiliates. +// Copyright (c) 2020-2021 Doc.ai and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -19,6 +19,7 @@ package sandbox import ( "context" "net/url" + "time" "github.com/networkservicemesh/api/pkg/api/networkservice" registryapi "github.com/networkservicemesh/api/pkg/api/registry" @@ -37,20 +38,14 @@ type SupplyNSMgrProxyFunc func(context.Context, string, token.GeneratorFunc, ... // SupplyNSMgrFunc supplies NSMGR type SupplyNSMgrFunc func(context.Context, *registryapi.NetworkServiceEndpoint, networkservice.NetworkServiceServer, token.GeneratorFunc, grpc.ClientConnInterface, ...grpc.DialOption) nsmgr.Nsmgr -// SupplyForwarderFunc supplies Forwarder -type SupplyForwarderFunc func(context.Context, string, token.GeneratorFunc, *url.URL, ...grpc.DialOption) endpoint.Endpoint - // SupplyRegistryFunc supplies Registry -type SupplyRegistryFunc func(ctx context.Context, proxyRegistryURL *url.URL, options ...grpc.DialOption) registry.Registry +type SupplyRegistryFunc func(ctx context.Context, expiryDuration time.Duration, proxyRegistryURL *url.URL, options ...grpc.DialOption) registry.Registry // SupplyRegistryProxyFunc supplies registry proxy type SupplyRegistryProxyFunc func(ctx context.Context, dnsResolver dnsresolve.Resolver, handlingDNSDomain string, proxyNSMgrURL *url.URL, options ...grpc.DialOption) registry.Registry -// Node is pair of Forwarder and NSMgr -type Node struct { - Forwarder *EndpointEntry - NSMgr *NSMgrEntry -} +// SetupNodeFunc setups each node on Builder.Build() stage +type SetupNodeFunc func(ctx context.Context, node *Node) // RegistryEntry is pair of registry.Registry and url.URL type RegistryEntry struct { diff --git a/pkg/tools/sandbox/utils.go b/pkg/tools/sandbox/utils.go index 0d7515e20..10857019e 100644 --- a/pkg/tools/sandbox/utils.go +++ b/pkg/tools/sandbox/utils.go @@ -19,27 +19,15 @@ package sandbox import ( "context" "fmt" - "net/url" "time" - "google.golang.org/protobuf/types/known/timestamppb" - "github.com/google/uuid" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "github.com/networkservicemesh/api/pkg/api/networkservice" - "github.com/networkservicemesh/api/pkg/api/networkservice/payload" - "github.com/networkservicemesh/api/pkg/api/registry" "github.com/networkservicemesh/sdk/pkg/networkservice/chains/client" - "github.com/networkservicemesh/sdk/pkg/networkservice/chains/endpoint" - "github.com/networkservicemesh/sdk/pkg/networkservice/chains/nsmgr" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/authorize" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/clienturl" - "github.com/networkservicemesh/sdk/pkg/tools/clienturlctx" - "github.com/networkservicemesh/sdk/pkg/tools/logger" - "github.com/networkservicemesh/sdk/pkg/tools/opentracing" "github.com/networkservicemesh/sdk/pkg/tools/token" ) @@ -48,63 +36,6 @@ func GenerateTestToken(_ credentials.AuthInfo) (tokenValue string, expireTime ti return "TestToken", time.Date(3000, 1, 1, 1, 1, 1, 1, time.UTC), nil } -// NewEndpoint creates endpoint and registers it into passed NSMgr. -func NewEndpoint(ctx context.Context, nse *registry.NetworkServiceEndpoint, generatorFunc token.GeneratorFunc, mgr nsmgr.Nsmgr, additionalFunctionality ...networkservice.NetworkServiceServer) (*EndpointEntry, error) { - ep := endpoint.NewServer(ctx, nse.Name, authorize.NewServer(), generatorFunc, additionalFunctionality...) - - ctx = logger.WithLog(ctx) - - u := &url.URL{Scheme: "tcp", Host: "127.0.0.1:0"} - var err error - if nse.Url != "" { - u, err = url.Parse(nse.Url) - if err != nil { - return nil, err - } - } - serve(ctx, u, ep.Register) - - if nse.Url == "" { - nse.Url = u.String() - } - if nse.ExpirationTime == nil { - nse.ExpirationTime = timestamppb.New(time.Now().Add(time.Hour)) - } - - var reg *registry.NetworkServiceEndpoint - if reg, err = mgr.NetworkServiceEndpointRegistryServer().Register(ctx, nse); err != nil { - return nil, err - } - - nse.Name = reg.Name - nse.ExpirationTime = reg.ExpirationTime - - for _, service := range nse.NetworkServiceNames { - if _, err := mgr.NetworkServiceRegistryServer().Register(ctx, ®istry.NetworkService{ - Name: service, - Payload: payload.IP, - }); err != nil { - return nil, err - } - } - - logger.Log(ctx).Infof("Started listen endpoint %v on %v.", nse.Name, u.String()) - - return &EndpointEntry{Endpoint: ep, URL: u}, nil -} - -// NewClient is a client.NewClient over *url.URL with some fields preset for testing -func NewClient(ctx context.Context, generatorFunc token.GeneratorFunc, connectTo *url.URL, additionalFunctionality ...networkservice.NetworkServiceClient) networkservice.NetworkServiceClient { - return clienturl.NewClient( - clienturlctx.WithClientURL(ctx, connectTo), - client.NewClientFactory( - fmt.Sprintf("nsc-%v", uuid.New().String()), - nil, - generatorFunc, - additionalFunctionality...), - append(opentracing.WithTracingDial(), grpc.WithBlock(), grpc.WithInsecure())...) -} - // NewCrossConnectClientFactory is a client.NewCrossConnectClientFactory with some fields preset for testing func NewCrossConnectClientFactory(generatorFunc token.GeneratorFunc, additionalFunctionality ...networkservice.NetworkServiceClient) func(ctx context.Context, cc grpc.ClientConnInterface) networkservice.NetworkServiceClient { return client.NewCrossConnectClientFactory(