From 71d316168bc8ad52916cede9689a1c8c3036bb87 Mon Sep 17 00:00:00 2001 From: Artem Glazychev Date: Wed, 27 Mar 2024 18:29:17 +0700 Subject: [PATCH] Fix kernel interface name generation Signed-off-by: Artem Glazychev --- .../common/mechanisms/kernel/server.go | 16 ++--- .../common/mechanisms/kernel/server_test.go | 63 +++++++++++++------ 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/pkg/networkservice/common/mechanisms/kernel/server.go b/pkg/networkservice/common/mechanisms/kernel/server.go index 2aa1f19b4..b9b98123e 100644 --- a/pkg/networkservice/common/mechanisms/kernel/server.go +++ b/pkg/networkservice/common/mechanisms/kernel/server.go @@ -54,14 +54,16 @@ func NewServer(opts ...Option) networkservice.NetworkServiceServer { func (m *kernelMechanismServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { if mechanism := kernelmech.ToMechanism(request.GetConnection().GetMechanism()); mechanism != nil { mechanism.SetNetNSURL(netNSURL) - if m.interfaceName != "" { - mechanism.SetInterfaceName(m.interfaceName) - } else { - ifname, err := generateInterfaceName(m.interfaceNameGenerator) - if err != nil { - return nil, errors.Wrap(err, "Failed to generate kernel interface name") + if mechanism.GetInterfaceName() == "" { + if m.interfaceName != "" { + mechanism.SetInterfaceName(m.interfaceName) + } else { + ifname, err := generateInterfaceName(m.interfaceNameGenerator) + if err != nil { + return nil, errors.Wrap(err, "Failed to generate kernel interface name") + } + mechanism.SetInterfaceName(ifname) } - mechanism.SetInterfaceName(ifname) } } return next.Server(ctx).Request(ctx, request) diff --git a/pkg/networkservice/common/mechanisms/kernel/server_test.go b/pkg/networkservice/common/mechanisms/kernel/server_test.go index 38b492ec2..dc2f6b626 100644 --- a/pkg/networkservice/common/mechanisms/kernel/server_test.go +++ b/pkg/networkservice/common/mechanisms/kernel/server_test.go @@ -37,50 +37,77 @@ func TestKernelMechanismServer_ShouldSetInterfaceName(t *testing.T) { expectedIfaceName += "a" } - c := kernel.NewClient(kernel.WithInterfaceName(expectedIfaceName + "long-suffix")) + s := kernel.NewServer(kernel.WithInterfaceName(expectedIfaceName + "long-suffix")) - req := &networkservice.NetworkServiceRequest{} - _, err := c.Request(context.Background(), req) + req := &networkservice.NetworkServiceRequest{ + Connection: &networkservice.Connection{ + Mechanism: kernelmech.New(""), + }, + } + conn, err := s.Request(context.Background(), req) require.NoError(t, err) + require.Equal(t, expectedIfaceName, conn.Mechanism.Parameters[kernelmech.InterfaceNameKey]) - require.Len(t, req.MechanismPreferences, 1) - require.Equal(t, expectedIfaceName, req.MechanismPreferences[0].Parameters[kernelmech.InterfaceNameKey]) + // Refresh + req.Connection = conn.Clone() + conn, err = s.Request(context.Background(), req) + require.NoError(t, err) + require.Equal(t, expectedIfaceName, conn.Mechanism.Parameters[kernelmech.InterfaceNameKey]) } func TestKernelMechanismServer_ShouldSetValidNetNSURL(t *testing.T) { - c := kernel.NewClient() + s := kernel.NewServer() req := &networkservice.NetworkServiceRequest{ - MechanismPreferences: []*networkservice.Mechanism{ - kernelmech.New("invalid-url"), + Connection: &networkservice.Connection{ + Mechanism: kernelmech.New("invalid-url"), }, } - _, err := c.Request(context.Background(), req) + conn, err := s.Request(context.Background(), req) require.NoError(t, err) - require.Equal(t, netNSURL, req.MechanismPreferences[0].Parameters[kernelmech.NetNSURL]) + require.Equal(t, netNSURL, conn.Mechanism.Parameters[kernelmech.NetNSURL]) + + // Refresh + req.Connection = conn.Clone() + conn, err = s.Request(context.Background(), req) + require.NoError(t, err) + require.Equal(t, netNSURL, conn.Mechanism.Parameters[kernelmech.NetNSURL]) } func TestKernelMechanismServer_ShouldSetRandomInteraceName(t *testing.T) { - c := kernel.NewClient() - req := &networkservice.NetworkServiceRequest{} + s := kernel.NewServer() + req := &networkservice.NetworkServiceRequest{ + Connection: &networkservice.Connection{ + Mechanism: kernelmech.New(""), + }, + } - _, err := c.Request(context.Background(), req) + conn, err := s.Request(context.Background(), req) require.NoError(t, err) - - ifname := req.MechanismPreferences[0].Parameters[kernelmech.InterfaceNameKey] + ifname := conn.Mechanism.Parameters[kernelmech.InterfaceNameKey] require.Len(t, ifname, kernelmech.LinuxIfMaxLength) require.True(t, strings.HasPrefix(ifname, "nsm")) for i := 0; i < kernelmech.LinuxIfMaxLength; i++ { require.Contains(t, nanoid.DefaultAlphabet, string(ifname[i])) } + + // Refresh + req.Connection = conn.Clone() + conn, err = s.Request(context.Background(), req) + require.NoError(t, err) + require.Equal(t, ifname, conn.Mechanism.Parameters[kernelmech.InterfaceNameKey]) } func TestKernelMechanismServer_FailedToGenerateRandomName(t *testing.T) { - c := kernel.NewClient(kernel.WithInterfaceNameGenerator(nanoid.New(nanoid.WithRandomByteGenerator(&brokenByteGenerator{})))) - req := &networkservice.NetworkServiceRequest{} + s := kernel.NewServer(kernel.WithInterfaceNameGenerator(nanoid.New(nanoid.WithRandomByteGenerator(&brokenByteGenerator{})))) + req := &networkservice.NetworkServiceRequest{ + Connection: &networkservice.Connection{ + Mechanism: kernelmech.New(""), + }, + } - _, err := c.Request(context.Background(), req) + _, err := s.Request(context.Background(), req) require.Error(t, err) }