diff --git a/go.mod b/go.mod index e87bf323..2caacfee 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/edwarnicke/govpp v0.0.0-20210817123650-e0e3b4843cf5 github.com/golang/protobuf v1.4.3 github.com/hashicorp/go-multierror v1.0.0 - github.com/networkservicemesh/api v1.0.1-0.20210811070028-10403c0f20c8 - github.com/networkservicemesh/sdk v0.5.1-0.20210831085601-2e38282f43bc - github.com/networkservicemesh/sdk-kernel v0.0.0-20210903075154-02b4e9abcf32 + github.com/networkservicemesh/api v1.0.1-0.20210907194827-9a36433d7d6e + github.com/networkservicemesh/sdk v0.5.1-0.20210914140353-07ced33cad48 + github.com/networkservicemesh/sdk-kernel v0.0.0-20210914141039-db5ab40baee1 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 github.com/thanhpk/randstr v1.0.4 diff --git a/go.sum b/go.sum index 5d546193..51917a31 100644 --- a/go.sum +++ b/go.sum @@ -135,12 +135,12 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nats-io/stan.go v0.6.0/go.mod h1:eIcD5bi3pqbHT/xIIvXMwvzXYElgouBvaVRftaE+eac= -github.com/networkservicemesh/api v1.0.1-0.20210811070028-10403c0f20c8 h1:kr2/dA/ktBgnChorXBwjn7fdpRKB+eJI2xCPNCGt3ws= -github.com/networkservicemesh/api v1.0.1-0.20210811070028-10403c0f20c8/go.mod h1:B6meq/SWjWR6bGXZdXPfbOeaBK+T1JayLdtEJQCsXKU= -github.com/networkservicemesh/sdk v0.5.1-0.20210831085601-2e38282f43bc h1:MfwK031DQMKhu7WOoqGwGygZoUW0CZP1Vi3rCGJfjKM= -github.com/networkservicemesh/sdk v0.5.1-0.20210831085601-2e38282f43bc/go.mod h1:t4mwbFHDeOUbmrrFhkcpcyYd5CgkrzmaD7uu8LiLpKs= -github.com/networkservicemesh/sdk-kernel v0.0.0-20210903075154-02b4e9abcf32 h1:2t58IUrnGeTsbSh8woG+1EawgjstPGbFGx/IfE/EG6M= -github.com/networkservicemesh/sdk-kernel v0.0.0-20210903075154-02b4e9abcf32/go.mod h1:dW0C5WhbscK97EWCLpUXWovxBMPM5hvVc3tUkADkCp8= +github.com/networkservicemesh/api v1.0.1-0.20210907194827-9a36433d7d6e h1:PO6tDo/bGLJqz1qiqCecht/HqMWCKunAds2U9Hvc0yM= +github.com/networkservicemesh/api v1.0.1-0.20210907194827-9a36433d7d6e/go.mod h1:B6meq/SWjWR6bGXZdXPfbOeaBK+T1JayLdtEJQCsXKU= +github.com/networkservicemesh/sdk v0.5.1-0.20210914140353-07ced33cad48 h1:DHeDBnTrl6821apPSxg4NUciwRkLyF752nPXxEDwySY= +github.com/networkservicemesh/sdk v0.5.1-0.20210914140353-07ced33cad48/go.mod h1:eISPu+ySJJ46kg03ZTi/xmpNSU+K4cImwq++ZbDV4F4= +github.com/networkservicemesh/sdk-kernel v0.0.0-20210914141039-db5ab40baee1 h1:xfrljIVop5UYgdvFltm6xna5eg9YgUygFuf8MkBIHao= +github.com/networkservicemesh/sdk-kernel v0.0.0-20210914141039-db5ab40baee1/go.mod h1:ktY/U4T2KSicIk2kIMtorzJuVbBYvWGYc+hAFlQL5m0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -350,4 +350,4 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= \ No newline at end of file diff --git a/pkg/networkservice/mechanisms/memif/client.go b/pkg/networkservice/mechanisms/memif/client.go index 27524f8f..b127f93e 100644 --- a/pkg/networkservice/mechanisms/memif/client.go +++ b/pkg/networkservice/mechanisms/memif/client.go @@ -28,15 +28,18 @@ import ( "github.com/pkg/errors" "google.golang.org/grpc" + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/memif/memifproxy" + + "github.com/networkservicemesh/sdk/pkg/networkservice/common/switchcase" + "github.com/networkservicemesh/sdk/pkg/networkservice/core/chain" + "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/cls" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/memif" - "github.com/networkservicemesh/sdk/pkg/networkservice/core/chain" + "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" "github.com/networkservicemesh/sdk/pkg/tools/postpone" - - "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/memif/memifproxy" ) type memifClient struct { @@ -45,11 +48,19 @@ type memifClient struct { // NewClient provides a NetworkServiceClient chain elements that support the memif Mechanism func NewClient(vppConn api.Connection) networkservice.NetworkServiceClient { + m := &memifClient{ + vppConn: vppConn, + } + return chain.NewNetworkServiceClient( - &memifClient{ - vppConn: vppConn, - }, - memifproxy.New(), + m, + switchcase.NewClient(&switchcase.ClientCase{ + Condition: func(ctx context.Context, conn *networkservice.Connection) bool { + _, ok := loadDirectMemifInfo(ctx) + return !ok + }, + Client: memifproxy.New(), + }), ) } @@ -78,6 +89,13 @@ func (m *memifClient) Request(ctx context.Context, request *networkservice.Netwo return nil, err } + // if direct memif enabled save socket filename to metadata + _, ok := loadDirectMemifInfo(ctx) + if mechanism := memif.ToMechanism(conn.GetMechanism()); mechanism != nil && ok { + storeDirectMemifInfo(ctx, directMemifInfo{socketURL: mechanism.GetSocketFileURL()}) + return conn, nil + } + if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil { closeCtx, cancelClose := postponeCtxFunc() defer cancelClose() diff --git a/pkg/networkservice/mechanisms/memif/client_test.go b/pkg/networkservice/mechanisms/memif/client_test.go index 8d77586b..73eae847 100644 --- a/pkg/networkservice/mechanisms/memif/client_test.go +++ b/pkg/networkservice/mechanisms/memif/client_test.go @@ -27,10 +27,13 @@ import ( "github.com/stretchr/testify/require" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/memif" + + "github.com/networkservicemesh/sdk/pkg/networkservice/core/chain" + "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" ) func Test_MemifClient_ShouldAppendMechanismIfMemifMechanismMissed(t *testing.T) { - c := memif.NewClient(nil) + c := chain.NewNetworkServiceClient(metadata.NewClient(), memif.NewClient(nil)) req := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{}, @@ -52,7 +55,7 @@ func Test_MemifClient_ShouldAppendMechanismIfMemifMechanismMissed(t *testing.T) } func Test_MemifClient_ShouldNotDuplicateMechanisms(t *testing.T) { - c := memif.NewClient(nil) + c := chain.NewNetworkServiceClient(metadata.NewClient(), memif.NewClient(nil)) req := &networkservice.NetworkServiceRequest{ MechanismPreferences: []*networkservice.Mechanism{ diff --git a/pkg/networkservice/mechanisms/memif/memifproxy/client.go b/pkg/networkservice/mechanisms/memif/memifproxy/client.go index 2ebb31df..c49dd5de 100644 --- a/pkg/networkservice/mechanisms/memif/memifproxy/client.go +++ b/pkg/networkservice/mechanisms/memif/memifproxy/client.go @@ -69,6 +69,7 @@ func (m *memifProxyClient) Request(ctx context.Context, request *networkservice. // If we are already running a proxy... just keep running it if _, ok := load(ctx, true); ok { + mechanism.SetSocketFileURL((&url.URL{Scheme: memifMech.SocketFileScheme, Path: listenSocketFilename(conn)}).String()) return conn, nil } diff --git a/pkg/networkservice/mechanisms/memif/metatdata.go b/pkg/networkservice/mechanisms/memif/metatdata.go index 10b3b4f2..ac952aac 100644 --- a/pkg/networkservice/mechanisms/memif/metatdata.go +++ b/pkg/networkservice/mechanisms/memif/metatdata.go @@ -25,15 +25,12 @@ import ( ) type key struct{} +type directMemifKey struct{} func store(ctx context.Context, isClient bool, socket *memif.MemifSocketFilenameAddDel) { metadata.Map(ctx, isClient).Store(key{}, socket) } -func delete(ctx context.Context, isClient bool) { - metadata.Map(ctx, isClient).Delete(key{}) -} - func load(ctx context.Context, isClient bool) (value *memif.MemifSocketFilenameAddDel, ok bool) { rawValue, ok := metadata.Map(ctx, isClient).Load(key{}) if !ok { @@ -42,3 +39,20 @@ func load(ctx context.Context, isClient bool) (value *memif.MemifSocketFilenameA value, ok = rawValue.(*memif.MemifSocketFilenameAddDel) return value, ok } + +func storeDirectMemifInfo(ctx context.Context, val directMemifInfo) { + metadata.Map(ctx, true).Store(directMemifKey{}, val) +} + +func loadDirectMemifInfo(ctx context.Context) (value directMemifInfo, ok bool) { + rawValue, ok := metadata.Map(ctx, true).Load(directMemifKey{}) + if !ok { + return + } + value, ok = rawValue.(directMemifInfo) + return value, ok +} + +type directMemifInfo struct { + socketURL string +} diff --git a/pkg/networkservice/mechanisms/memif/option.go b/pkg/networkservice/mechanisms/memif/option.go index 4198b362..16327dc4 100644 --- a/pkg/networkservice/mechanisms/memif/option.go +++ b/pkg/networkservice/mechanisms/memif/option.go @@ -19,7 +19,7 @@ package memif // Option is an option for the connect server type Option func(s *memifServer) -// WithDirectMemif turn off direct memif logic +// WithDirectMemif turn on direct memif logic func WithDirectMemif() Option { return func(s *memifServer) { s.directMemifEnabled = true diff --git a/pkg/networkservice/mechanisms/memif/server.go b/pkg/networkservice/mechanisms/memif/server.go index 3dfba338..c2e97024 100644 --- a/pkg/networkservice/mechanisms/memif/server.go +++ b/pkg/networkservice/mechanisms/memif/server.go @@ -18,7 +18,6 @@ package memif import ( "context" - "net/url" "git.fd.io/govpp.git/api" "github.com/golang/protobuf/ptypes/empty" @@ -26,11 +25,10 @@ import ( "github.com/networkservicemesh/api/pkg/api/networkservice" memifMech "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/memif" + "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" "github.com/networkservicemesh/sdk/pkg/tools/postpone" - - "github.com/networkservicemesh/sdk-vpp/pkg/tools/ifindex" ) type memifServer struct { @@ -55,28 +53,22 @@ func NewServer(vppConn api.Connection, options ...Option) networkservice.Network func (m *memifServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { postponeCtxFunc := postpone.ContextWithValues(ctx) + // if direct memif we need pass mechanism to client further in request chain + if mechanism := memifMech.ToMechanism(request.GetConnection().GetMechanism()); mechanism != nil && m.directMemifEnabled { + storeDirectMemifInfo(ctx, directMemifInfo{}) + } + conn, err := next.Server(ctx).Request(ctx, request) if err != nil { return nil, err } - if mechanism := memifMech.ToMechanism(conn.GetMechanism()); mechanism != nil { - // Direct memif if applicable - if memifSocketAddDel, ok := load(ctx, true); ok && m.directMemifEnabled { - _, ok := ifindex.Load(ctx, true) - if ok { - if err := del(ctx, conn, m.vppConn, true); err != nil { - if closeErr := m.closeOnFailure(postponeCtxFunc, conn); closeErr != nil { - err = errors.Wrapf(err, "connection closed with error: %s", closeErr.Error()) - } - return nil, err - } - mechanism.SetSocketFileURL((&url.URL{Scheme: memifMech.SocketFileScheme, Path: memifSocketAddDel.SocketFilename}).String()) - delete(ctx, true) - ifindex.Delete(ctx, true) - return conn, nil - } - } + // if direct memif case - just set memif socket name in connection.Mechanism + // if not direct memif case - create memif as always + dirMemifInfo, ok := loadDirectMemifInfo(ctx) + if mechanism := memifMech.ToMechanism(conn.GetMechanism()); mechanism != nil && ok && len(dirMemifInfo.socketURL) > 0 { + mechanism.SetSocketFileURL(dirMemifInfo.socketURL) + return conn, nil } if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil { @@ -85,6 +77,7 @@ func (m *memifServer) Request(ctx context.Context, request *networkservice.Netwo } return nil, err } + return conn, nil } diff --git a/pkg/networkservice/up/server.go b/pkg/networkservice/up/server.go index 0c5fca6a..d186ba29 100644 --- a/pkg/networkservice/up/server.go +++ b/pkg/networkservice/up/server.go @@ -24,6 +24,7 @@ import ( "github.com/pkg/errors" "github.com/networkservicemesh/api/pkg/api/networkservice" + "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" "github.com/networkservicemesh/sdk/pkg/tools/postpone" )