Skip to content

Commit 3799507

Browse files
committed
added kernel to vxlan to kernel test
Signed-off-by: Mikhail Avramenko <[email protected]>
1 parent c06c5d8 commit 3799507

File tree

6 files changed

+353
-1394
lines changed

6 files changed

+353
-1394
lines changed

go.mod

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ require (
1111
github.com/edwarnicke/grpcfd v0.1.0
1212
github.com/edwarnicke/vpphelper v0.0.0-20210512223648-f914b171f679
1313
github.com/golang/protobuf v1.4.3
14+
github.com/google/uuid v1.1.2 // indirect
1415
github.com/kelseyhightower/envconfig v1.4.0
15-
github.com/networkservicemesh/api v0.5.1-0.20210618184350-e3fc29dc170b
16-
github.com/networkservicemesh/sdk v0.5.1-0.20210630092016-3b8e683e3d9c
16+
github.com/networkservicemesh/api v1.0.1-0.20210715134717-6e4a0f8eae3e
17+
github.com/networkservicemesh/sdk v1.0.0
18+
github.com/networkservicemesh/sdk-kernel v0.0.0-20210811064243-0548354e4811
1719
github.com/networkservicemesh/sdk-vpp v0.0.0-20210702090826-b6ed43b14a02
1820
github.com/pkg/errors v0.9.1
1921
github.com/sirupsen/logrus v1.7.0
@@ -24,3 +26,5 @@ require (
2426
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae
2527
google.golang.org/grpc v1.35.0
2628
)
29+
30+
replace github.com/networkservicemesh/sdk-vpp => github.com/Mixaster995/sdk-vpp v0.0.0-20210811094428-725a2a321882

go.sum

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
55
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
66
github.com/HdrHistogram/hdrhistogram-go v1.0.1 h1:GX8GAYDuhlFQnI2fRDHQhTlkHMz8bEn0jTI6LJU0mpw=
77
github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM=
8+
github.com/Mixaster995/sdk-vpp v0.0.0-20210811094428-725a2a321882/go.mod h1:bIRy8a8ELFstX+/SotbrHKGwYcBrstDPc1r1Ga+19yg=
89
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
910
github.com/OneOfOne/xxhash v1.2.3 h1:wS8NNaIgtzapuArKIAjsyXtEN/IUjQkbw90xszUdS40=
1011
github.com/OneOfOne/xxhash v1.2.3/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -150,8 +151,16 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
150151
github.com/nats-io/stan.go v0.6.0/go.mod h1:eIcD5bi3pqbHT/xIIvXMwvzXYElgouBvaVRftaE+eac=
151152
github.com/networkservicemesh/api v0.5.1-0.20210618184350-e3fc29dc170b h1:sylDyLDA6UkwtyByLos62/jLQOx0Hymw3O1qELYtdIo=
152153
github.com/networkservicemesh/api v0.5.1-0.20210618184350-e3fc29dc170b/go.mod h1:B6meq/SWjWR6bGXZdXPfbOeaBK+T1JayLdtEJQCsXKU=
154+
github.com/networkservicemesh/api v1.0.0/go.mod h1:B6meq/SWjWR6bGXZdXPfbOeaBK+T1JayLdtEJQCsXKU=
155+
github.com/networkservicemesh/api v1.0.1-0.20210715134717-6e4a0f8eae3e/go.mod h1:B6meq/SWjWR6bGXZdXPfbOeaBK+T1JayLdtEJQCsXKU=
153156
github.com/networkservicemesh/sdk v0.5.1-0.20210630092016-3b8e683e3d9c h1:PXSbJGzstgLMpnDbpJGN2ds9l8BNkLkb1rNSP4YxTBk=
154157
github.com/networkservicemesh/sdk v0.5.1-0.20210630092016-3b8e683e3d9c/go.mod h1:Z1IJPdvcBsS2X8pHeCGwo91Fs+BJTEvUQKpinAfG/hM=
158+
github.com/networkservicemesh/sdk v0.5.1-0.20210811063905-15a33a429304/go.mod h1:7whufn2CIGBX+KW3U5b0IWB6f7bJJizY1vV1a5t2HXI=
159+
github.com/networkservicemesh/sdk v1.0.0/go.mod h1:fkkI+GO5nMQL0G5bnmMLiWxIZUHZOFPOrlv5oWlSxys=
160+
github.com/networkservicemesh/sdk-kernel v0.0.0-20210811064243-0548354e4811 h1:6BEC8aed4vUzRGO8ngRTiQk+hxb/D75PdIEB5NxoTrk=
161+
github.com/networkservicemesh/sdk-kernel v0.0.0-20210811064243-0548354e4811/go.mod h1:I/gLTrgmGShoKlObcvHpQ9J7fCjsPL8BIvfWkjaqk6g=
162+
github.com/networkservicemesh/sdk-kernel v1.0.1 h1:Jty3FkjMxSI47C9kGEGSFQZjao6tqa4wBlIRzByk0w0=
163+
github.com/networkservicemesh/sdk-kernel v1.0.1/go.mod h1:EiVrGipqU2Y6n7FcBZuBcROOzrZs+euVruVKJQRgxBk=
155164
github.com/networkservicemesh/sdk-vpp v0.0.0-20210702090826-b6ed43b14a02 h1:Y3wBK3kxcKITqiWDT/ovBR1DS0FTWPKfmJIB1OI6VVE=
156165
github.com/networkservicemesh/sdk-vpp v0.0.0-20210702090826-b6ed43b14a02/go.mod h1:BUxM0Vxaw2EEYV8JE/a6iu9+T0Jm/cTQ7GhEhylOa6Q=
157166
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=

internal/tests/copyfile/server.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (c) 2020 Doc.ai and/or its affiliates.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
// Licensed under the Apache License, Version 2.0 (the "License");
6+
// you may not use this file except in compliance with the License.
7+
// You may obtain a copy of the License at:
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing, software
12+
// distributed under the License is distributed on an "AS IS" BASIS,
13+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
// See the License for the specific language governing permissions and
15+
// limitations under the License.
16+
17+
// Package copyfile provides the necessary mechanisms to request and inject a kernel interface.
18+
package copyfile
19+
20+
import (
21+
"context"
22+
"github.com/golang/protobuf/ptypes/empty"
23+
"github.com/networkservicemesh/api/pkg/api/networkservice"
24+
"github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel"
25+
"github.com/networkservicemesh/sdk/pkg/networkservice/core/next"
26+
"net/url"
27+
)
28+
29+
type copyFileServer struct{
30+
name string
31+
}
32+
33+
// NewServer - creates a NetworkServiceServer that requests a kernel interface and populates the netns inode
34+
func NewServer(name string) networkservice.NetworkServiceServer {
35+
return &copyFileServer{
36+
name: name,
37+
}
38+
}
39+
40+
func (m *copyFileServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) {
41+
if mechanism := kernel.ToMechanism(request.GetConnection().GetMechanism()); mechanism != nil {
42+
//nsHandle, err := mechutils.ToNSHandle(mechanism)
43+
//fd, err := syscall.Open("/run/netns/" + m.name, unix.O_RDONLY|unix.O_CLOEXEC, 0)
44+
//if err != nil {
45+
// return nil, err
46+
//}
47+
//filename := fmt.Sprintf("/proc/%d/fd/%d", os.Getpid(), fd)
48+
mechanism.SetNetNSURL((&url.URL{Scheme: "file", Path: "/run/netns/" + m.name}).String())
49+
}
50+
return next.Server(ctx).Request(ctx, request)
51+
}
52+
53+
func (m *copyFileServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) {
54+
return next.Server(ctx).Close(ctx, conn)
55+
}
56+
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package tests
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"git.fd.io/govpp.git/api"
7+
"github.com/edwarnicke/vpphelper"
8+
"github.com/google/uuid"
9+
"github.com/networkservicemesh/api/pkg/api/networkservice"
10+
"github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/cls"
11+
"github.com/networkservicemesh/cmd-forwarder-vpp/internal/tests/copyfile"
12+
"github.com/networkservicemesh/cmd-forwarder-vpp/internal/tests/ns"
13+
"github.com/networkservicemesh/sdk-kernel/pkg/kernel/networkservice/connectioncontextkernel"
14+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/connectioncontext"
15+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/connectioncontext/mtu"
16+
17+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/kernel"
18+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/memif"
19+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/vxlan"
20+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/wireguard"
21+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/pinhole"
22+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/stats"
23+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/tag"
24+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/up"
25+
"github.com/networkservicemesh/sdk-vpp/pkg/networkservice/xconnect"
26+
"github.com/networkservicemesh/sdk/pkg/networkservice/chains/endpoint"
27+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/authorize"
28+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms"
29+
kernelmechanism "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms/kernel"
30+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanismtranslation"
31+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/refresh"
32+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/serialize"
33+
"github.com/networkservicemesh/sdk/pkg/networkservice/common/updatepath"
34+
"github.com/networkservicemesh/sdk/pkg/networkservice/core/adapters"
35+
"github.com/networkservicemesh/sdk/pkg/networkservice/core/chain"
36+
"github.com/networkservicemesh/sdk/pkg/networkservice/ipam/point2pointipam"
37+
"github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata"
38+
"github.com/networkservicemesh/sdk/pkg/tools/token"
39+
"github.com/thanhpk/randstr"
40+
"github.com/vishvananda/netns"
41+
"net"
42+
)
43+
44+
type kernelToVxlanVerifiableEndpoint struct {
45+
ctx context.Context
46+
vppConn api.Connection
47+
endpointNSHandle netns.NsHandle
48+
endpoint.Endpoint
49+
}
50+
51+
func newKernelToVxlanVerifiableEndpoint(ctx context.Context,
52+
prefix1, prefix2 *net.IPNet,
53+
tokenGenerator token.GeneratorFunc,
54+
vppConn vpphelper.Connection) verifiableEndpoint {
55+
56+
rootNSHandle, err := netns.Get()
57+
if err != nil {
58+
panic(fmt.Sprintf("unable to get root netNs: %+v", err))
59+
}
60+
endpointNSName := fmt.Sprintf("endpoint-%s", randstr.Hex(4))
61+
endpointNSHandle, err := netns.NewNamed(endpointNSName)
62+
if err != nil {
63+
panic(fmt.Sprintf("unable create netNs %s: %+v", endpointNSName, err))
64+
}
65+
go func(endpointNsName string) {
66+
<-ctx.Done()
67+
_ = netns.DeleteNamed(endpointNsName)
68+
}(endpointNSName)
69+
70+
rv := &kernelToVxlanVerifiableEndpoint{
71+
ctx: ctx,
72+
vppConn: vppConn,
73+
endpointNSHandle: endpointNSHandle,
74+
}
75+
name := "vxlanVerifiableEndpoint"
76+
rv.Endpoint = endpoint.NewServer(ctx,
77+
tokenGenerator,
78+
endpoint.WithName(name),
79+
endpoint.WithAuthorizeServer(authorize.NewServer()),
80+
endpoint.WithAdditionalFunctionality(
81+
metadata.NewServer(),
82+
connectioncontext.NewServer(vppConn),
83+
up.NewServer(ctx, vppConn),
84+
xconnect.NewServer(vppConn),
85+
connectioncontextkernel.NewServer(),
86+
tag.NewServer(ctx, vppConn),
87+
mtu.NewServer(vppConn),
88+
pinhole.NewServer(vppConn),
89+
mechanisms.NewServer(map[string]networkservice.NetworkServiceServer{
90+
vxlan.MECHANISM: vxlan.NewServer(vppConn, net.ParseIP(serverIP)),
91+
}),
92+
adapters.NewClientToServer(clientChain(ctx, vppConn, net.ParseIP(serverIP))),
93+
updatepath.NewServer("ep-" + uuid.New().String()),
94+
//metadata.NewServer(),
95+
point2pointipam.NewServer(prefix1),
96+
point2pointipam.NewServer(prefix2),
97+
mechanisms.NewServer(map[string]networkservice.NetworkServiceServer{
98+
kernel.MECHANISM: chain.NewNetworkServiceServer(
99+
kernelmechanism.NewServer(),
100+
),
101+
}),
102+
ns.NewServer(endpointNSHandle),
103+
copyfile.NewServer(endpointNSName),
104+
ns.NewServer(rootNSHandle),
105+
),
106+
)
107+
108+
return rv
109+
}
110+
111+
func clientChain(ctx context.Context, vppConn vpphelper.Connection, tunnelIP net.IP) networkservice.NetworkServiceClient{
112+
return chain.NewNetworkServiceClient(
113+
[]networkservice.NetworkServiceClient{
114+
mechanismtranslation.NewClient(),
115+
updatepath.NewClient("client-" + uuid.New().String()),
116+
serialize.NewClient(),
117+
refresh.NewClient(ctx),
118+
metadata.NewClient(),
119+
mechanismtranslation.NewClient(),
120+
connectioncontextkernel.NewClient(),
121+
stats.NewClient(ctx),
122+
up.NewClient(ctx, vppConn),
123+
mtu.NewClient(vppConn),
124+
tag.NewClient(ctx, vppConn),
125+
// mechanisms
126+
memif.NewClient(vppConn),
127+
kernel.NewClient(vppConn),
128+
vxlan.NewClient(vppConn, tunnelIP),
129+
wireguard.NewClient(vppConn, tunnelIP),
130+
pinhole.NewClient(vppConn),
131+
}...)
132+
}
133+
134+
func (v *kernelToVxlanVerifiableEndpoint) VerifyConnection(conn *networkservice.Connection) error {
135+
//namingConn := conn.Clone()
136+
//namingConn.Id = conn.GetPath().GetPathSegments()[len(conn.GetPath().GetPathSegments())-1].GetId()
137+
//namingConn.Mechanism = &networkservice.Mechanism{
138+
// Cls: cls.LOCAL,
139+
// Type: kernel.MECHANISM,
140+
// Parameters: map[string]string{
141+
// krnl.InterfaceNameKey : "ns-",
142+
// },
143+
//}
144+
////rootNSHandle, err := netns.Get()
145+
////if err != nil {
146+
//// panic(fmt.Sprintf("unable to get root netNs: %+v", err))
147+
////}
148+
//if err := checkKernelInterface(namingConn, conn.GetContext().GetIpContext().GetDstIPNets(), v.endpointNSHandle); err != nil {
149+
// return err
150+
//}
151+
namingConn := conn.Clone()
152+
namingConn.Id = conn.GetPath().GetPathSegments()[len(conn.GetPath().GetPathSegments())-1].GetId()
153+
namingConn.Mechanism = &networkservice.Mechanism{
154+
Cls: cls.LOCAL,
155+
Type: kernel.MECHANISM,
156+
}
157+
if err := checkKernelInterface(namingConn, conn.GetContext().GetIpContext().GetDstIPNets(), v.endpointNSHandle); err != nil {
158+
return err
159+
}
160+
for _, ip := range conn.GetContext().GetIpContext().GetSrcIPNets() {
161+
if err := pingKernel(ip, v.endpointNSHandle); err != nil {
162+
return err
163+
}
164+
}
165+
return nil
166+
}
167+
168+
func (v *kernelToVxlanVerifiableEndpoint) VerifyClose(conn *networkservice.Connection) error {
169+
return checkNoKernelInterface(conn, v.endpointNSHandle)
170+
}

0 commit comments

Comments
 (0)