|
| 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