Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

changes in direct memif implementation #377

Merged
merged 2 commits into from
Sep 20, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 7 additions & 7 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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=
31 changes: 23 additions & 8 deletions pkg/networkservice/mechanisms/memif/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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(),
}),
)
}

Expand Down Expand Up @@ -78,7 +89,11 @@ func (m *memifClient) Request(ctx context.Context, request *networkservice.Netwo
return nil, err
}

if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil {
// 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()})
} else if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil {
Mixaster995 marked this conversation as resolved.
Show resolved Hide resolved
closeCtx, cancelClose := postponeCtxFunc()
defer cancelClose()

Expand Down
7 changes: 5 additions & 2 deletions pkg/networkservice/mechanisms/memif/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{},
Expand All @@ -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{
Expand Down
1 change: 1 addition & 0 deletions pkg/networkservice/mechanisms/memif/memifproxy/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
22 changes: 18 additions & 4 deletions pkg/networkservice/mechanisms/memif/metatdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,12 @@ import (
)

type key struct{}
type key2 struct{}
Mixaster995 marked this conversation as resolved.
Show resolved Hide resolved

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 {
Expand All @@ -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(key2{}, val)
}

func loadDirectMemifInfo(ctx context.Context) (value directMemifInfo, ok bool) {
rawValue, ok := metadata.Map(ctx, true).Load(key2{})
if !ok {
return
}
value, ok = rawValue.(directMemifInfo)
return value, ok
}

type directMemifInfo struct {
socketURL string
}
2 changes: 1 addition & 1 deletion pkg/networkservice/mechanisms/memif/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
36 changes: 13 additions & 23 deletions pkg/networkservice/mechanisms/memif/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,17 @@ package memif

import (
"context"
"net/url"

"git.fd.io/govpp.git/api"
"github.com/golang/protobuf/ptypes/empty"
"github.com/pkg/errors"

"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 {
Expand All @@ -55,36 +53,28 @@ 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 err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != 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 && m.directMemifEnabled && ok && len(dirMemifInfo.socketURL) > 0 {
Mixaster995 marked this conversation as resolved.
Show resolved Hide resolved
mechanism.SetSocketFileURL(dirMemifInfo.socketURL)
} else if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil {
Mixaster995 marked this conversation as resolved.
Show resolved Hide resolved
if closeErr := m.closeOnFailure(postponeCtxFunc, conn); closeErr != nil {
err = errors.Wrapf(err, "connection closed with error: %s", closeErr.Error())
}
return nil, err
}

return conn, nil
}

Expand Down
4 changes: 4 additions & 0 deletions pkg/networkservice/up/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ 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/log"
"github.com/networkservicemesh/sdk/pkg/tools/postpone"
)

Expand Down Expand Up @@ -59,13 +61,15 @@ func (u *upServer) Request(ctx context.Context, request *networkservice.NetworkS
if closeErr := u.closeOnFailure(postponeCtxFunc, conn); closeErr != nil {
err = errors.Wrapf(err, "connection closed with error: %s", closeErr.Error())
}
log.FromContext(ctx).Errorf("SOME UGLY ERROR: %v", err.Error())
Mixaster995 marked this conversation as resolved.
Show resolved Hide resolved
return nil, err
}

if err := up(ctx, u.vppConn, false); err != nil {
if closeErr := u.closeOnFailure(postponeCtxFunc, conn); closeErr != nil {
err = errors.Wrapf(err, "connection closed with error: %s", closeErr.Error())
}
log.FromContext(ctx).Errorf("SOME UGLY ERROR: %v", err.Error())
return nil, err
}

Expand Down