diff --git a/pkg/networkservice/chains/xconnectns/server.go b/pkg/networkservice/chains/xconnectns/server.go index 2d5c2ebc..c9478fa7 100644 --- a/pkg/networkservice/chains/xconnectns/server.go +++ b/pkg/networkservice/chains/xconnectns/server.go @@ -24,6 +24,7 @@ import ( "net/url" "git.fd.io/govpp.git/api" + "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms" "google.golang.org/grpc" "github.com/networkservicemesh/api/pkg/api/networkservice" @@ -32,24 +33,22 @@ import ( "github.com/networkservicemesh/sdk/pkg/networkservice/common/clienturl" "github.com/networkservicemesh/sdk/pkg/networkservice/common/connect" "github.com/networkservicemesh/sdk/pkg/networkservice/common/heal" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms" "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms/recvfd" "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms/sendfd" - "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanisms/supported" "github.com/networkservicemesh/sdk/pkg/networkservice/common/mechanismtranslation" "github.com/networkservicemesh/sdk/pkg/networkservice/core/adapters" - "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" "github.com/networkservicemesh/sdk/pkg/tools/addressof" "github.com/networkservicemesh/sdk/pkg/tools/token" + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/up" + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/xconnect" + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/connectioncontextkernel" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/kernel" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/memif" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/vxlan" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/stats" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/tag" - "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/up" - "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/xconnect" ) // Connection aggregates the api.Connection and api.ChannelProvider interfaces @@ -66,17 +65,21 @@ type xconnectNSServer struct { func NewServer(ctx context.Context, name string, authzServer networkservice.NetworkServiceServer, tokenGenerator token.GeneratorFunc, clientURL *url.URL, vppConn Connection, tunnelIP net.IP, clientDialOptions ...grpc.DialOption) endpoint.Endpoint { rv := &xconnectNSServer{} additionalFunctionality := []networkservice.NetworkServiceServer{ - supported.NewServer(supported.WithSupportedMechanismTypes( - memif.MECHANISM, - kernel.MECHANISM, - vxlan.MECHANISM, - )), - metadata.NewServer(), recvfd.NewServer(), + sendfd.NewServer(), stats.NewServer(ctx), // Statically set the url we use to the unix file socket for the NSMgr clienturl.NewServer(clientURL), heal.NewServer(ctx, addressof.NetworkServiceClient(adapters.NewServerToClient(rv))), + up.NewServer(ctx, vppConn), + xconnect.NewServer(vppConn), + connectioncontextkernel.NewServer(), + tag.NewServer(ctx, vppConn), + mechanisms.NewServer(map[string]networkservice.NetworkServiceServer{ + memif.MECHANISM: memif.NewServer(vppConn), + kernel.MECHANISM: kernel.NewServer(vppConn), + vxlan.MECHANISM: vxlan.NewServer(vppConn, tunnelIP), + }), connect.NewServer( ctx, func(ctx context.Context, cc grpc.ClientConnInterface) networkservice.NetworkServiceClient { @@ -99,16 +102,6 @@ func NewServer(ctx context.Context, name string, authzServer networkservice.Netw }, connect.WithDialOptions(clientDialOptions...), ), - mechanisms.NewServer(map[string]networkservice.NetworkServiceServer{ - memif.MECHANISM: memif.NewServer(vppConn), - kernel.MECHANISM: kernel.NewServer(vppConn), - vxlan.MECHANISM: vxlan.NewServer(vppConn, tunnelIP), - }), - tag.NewServer(ctx, vppConn), - connectioncontextkernel.NewServer(), - xconnect.NewServer(vppConn), - up.NewServer(ctx, vppConn), - sendfd.NewServer(), } rv.Endpoint = endpoint.NewServer(ctx, tokenGenerator, diff --git a/pkg/networkservice/connectioncontext/ipcontext/ipaddress/server.go b/pkg/networkservice/connectioncontext/ipcontext/ipaddress/server.go index 4e7edac8..53630291 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/ipaddress/server.go +++ b/pkg/networkservice/connectioncontext/ipcontext/ipaddress/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -59,10 +59,15 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (i *ipaddressServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := addDel(ctx, request.GetConnection(), i.vppConn, metadata.IsClient(i), true); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := addDel(ctx, conn, i.vppConn, metadata.IsClient(i), true); err != nil { + _, _ = i.Close(ctx, conn) + return nil, err + } + return conn, nil } func (i *ipaddressServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/connectioncontext/ipcontext/routes/server.go b/pkg/networkservice/connectioncontext/ipcontext/routes/server.go index 18631725..7cdb67b3 100644 --- a/pkg/networkservice/connectioncontext/ipcontext/routes/server.go +++ b/pkg/networkservice/connectioncontext/ipcontext/routes/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -60,10 +60,15 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (r *routesServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := addDel(ctx, request.GetConnection(), r.vppConn, metadata.IsClient(r), true); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := addDel(ctx, conn, r.vppConn, metadata.IsClient(r), true); err != nil { + _, _ = r.Close(ctx, conn) + return nil, err + } + return conn, nil } func (r *routesServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/connectioncontext/server.go b/pkg/networkservice/connectioncontext/server.go index a7f43636..a2ff05af 100644 --- a/pkg/networkservice/connectioncontext/server.go +++ b/pkg/networkservice/connectioncontext/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -20,9 +20,10 @@ package connectioncontext import ( "git.fd.io/govpp.git/api" - "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/chain" + "github.com/networkservicemesh/api/pkg/api/networkservice" + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/connectioncontext/ipcontext/ipaddress" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/connectioncontext/ipcontext/routes" ) @@ -51,7 +52,7 @@ import ( // func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { return chain.NewNetworkServiceServer( - ipaddress.NewServer(vppConn), routes.NewServer(vppConn), + ipaddress.NewServer(vppConn), ) } diff --git a/pkg/networkservice/connectioncontextkernel/ipcontext/ipaddress/server.go b/pkg/networkservice/connectioncontextkernel/ipcontext/ipaddress/server.go index 20e659a5..5ef74dff 100644 --- a/pkg/networkservice/connectioncontextkernel/ipcontext/ipaddress/server.go +++ b/pkg/networkservice/connectioncontextkernel/ipcontext/ipaddress/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -59,10 +59,15 @@ func NewServer() networkservice.NetworkServiceServer { } func (i *ipaddressServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), metadata.IsClient(i)); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := create(ctx, conn, metadata.IsClient(i)); err != nil { + _, _ = i.Close(ctx, conn) + return nil, err + } + return conn, nil } func (i *ipaddressServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/connectioncontextkernel/ipcontext/routes/server.go b/pkg/networkservice/connectioncontextkernel/ipcontext/routes/server.go index f2c7219d..e2457a15 100644 --- a/pkg/networkservice/connectioncontextkernel/ipcontext/routes/server.go +++ b/pkg/networkservice/connectioncontextkernel/ipcontext/routes/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -58,10 +58,15 @@ func NewServer() networkservice.NetworkServiceServer { } func (i *routesServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), metadata.IsClient(i)); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := create(ctx, conn, metadata.IsClient(i)); err != nil { + _, _ = i.Close(ctx, conn) + return nil, err + } + return conn, nil } func (i *routesServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/connectioncontextkernel/server.go b/pkg/networkservice/connectioncontextkernel/server.go index 4e2c7949..c5312d66 100644 --- a/pkg/networkservice/connectioncontextkernel/server.go +++ b/pkg/networkservice/connectioncontextkernel/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -52,7 +52,7 @@ import ( // func NewServer() networkservice.NetworkServiceServer { return chain.NewNetworkServiceServer( - ipaddress.NewServer(), routes.NewServer(), + ipaddress.NewServer(), ) } diff --git a/pkg/networkservice/mechanisms/kernel/kerneltap/server.go b/pkg/networkservice/mechanisms/kernel/kerneltap/server.go index f0fd082f..b0065eda 100644 --- a/pkg/networkservice/mechanisms/kernel/kerneltap/server.go +++ b/pkg/networkservice/mechanisms/kernel/kerneltap/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -41,14 +41,15 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (k *kernelTapServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), k.vppConn, metadata.IsClient(k)); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = del(ctx, conn, k.vppConn, false) + return nil, err + } + if err := create(ctx, conn, k.vppConn, metadata.IsClient(k)); err != nil { + _, _ = k.Close(ctx, conn) + return nil, err } - return conn, err + return conn, nil } func (k *kernelTapServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/client.go b/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/client.go index fd206b7a..05d6ad07 100644 --- a/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/client.go +++ b/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // diff --git a/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/server.go b/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/server.go index 4e3a8f55..b76b4284 100644 --- a/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/server.go +++ b/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -25,6 +25,7 @@ import ( "github.com/golang/protobuf/ptypes/empty" "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" + "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" ) type afPacketServer struct { @@ -39,14 +40,15 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (a *afPacketServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), a.vppConn, false); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = del(ctx, conn, a.vppConn, false) + return nil, err + } + if err := create(ctx, conn, a.vppConn, metadata.IsClient(a)); err != nil { + _, _ = a.Close(ctx, conn) + return nil, err } - return conn, err + return conn, nil } func (a *afPacketServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/mechanisms/kernel/kernelvethpair/common.go b/pkg/networkservice/mechanisms/kernel/kernelvethpair/common.go index c1b18cb3..edee5608 100644 --- a/pkg/networkservice/mechanisms/kernel/kernelvethpair/common.go +++ b/pkg/networkservice/mechanisms/kernel/kernelvethpair/common.go @@ -26,9 +26,10 @@ import ( "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/api/pkg/api/networkservice/mechanisms/kernel" + "github.com/networkservicemesh/sdk/pkg/tools/log" + "github.com/networkservicemesh/sdk-vpp/pkg/tools/ethtool" "github.com/networkservicemesh/sdk-vpp/pkg/tools/link" - "github.com/networkservicemesh/sdk/pkg/tools/log" "github.com/pkg/errors" "github.com/thanhpk/randstr" diff --git a/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor/server.go b/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor/server.go index 65860fa4..6963b0c6 100644 --- a/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor/server.go +++ b/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor/server.go @@ -44,10 +44,15 @@ func (i *ipneighborServer) Request(ctx context.Context, request *networkservice. if request.GetConnection().GetPayload() != payload.IP { return next.Server(ctx).Request(ctx, request) } - if err := addDel(ctx, request.GetConnection(), i.vppConn, metadata.IsClient(i), true); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := addDel(ctx, conn, i.vppConn, metadata.IsClient(i), true); err != nil { + _, _ = i.Close(ctx, conn) + return nil, err + } + return conn, nil } func (i *ipneighborServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/mechanisms/kernel/kernelvethpair/server.go b/pkg/networkservice/mechanisms/kernel/kernelvethpair/server.go index 56e4ca45..fef4c95a 100644 --- a/pkg/networkservice/mechanisms/kernel/kernelvethpair/server.go +++ b/pkg/networkservice/mechanisms/kernel/kernelvethpair/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -23,14 +23,16 @@ import ( "git.fd.io/govpp.git/api" "github.com/golang/protobuf/ptypes/empty" - "github.com/networkservicemesh/api/pkg/api/networkservice" "github.com/networkservicemesh/sdk/pkg/networkservice/core/chain" "github.com/networkservicemesh/sdk/pkg/networkservice/core/next" + "github.com/networkservicemesh/api/pkg/api/networkservice" + + "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor" + "github.com/networkservicemesh/sdk/pkg/networkservice/utils/metadata" "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/kernel/kernelvethpair/afpacket" - "github.com/networkservicemesh/sdk-vpp/pkg/networkservice/mechanisms/kernel/kernelvethpair/ipneighbor" ) type kernelVethPairServer struct{} @@ -38,9 +40,9 @@ type kernelVethPairServer struct{} // NewServer - return a new Server chain element implementing the kernel mechanism with vpp using a veth pair func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { return chain.NewNetworkServiceServer( - &kernelVethPairServer{}, - afpacket.NewServer(vppConn), ipneighbor.NewServer(vppConn), + afpacket.NewServer(vppConn), + &kernelVethPairServer{}, ) } diff --git a/pkg/networkservice/mechanisms/memif/server.go b/pkg/networkservice/mechanisms/memif/server.go index a15ad6d7..539e3823 100644 --- a/pkg/networkservice/mechanisms/memif/server.go +++ b/pkg/networkservice/mechanisms/memif/server.go @@ -39,12 +39,12 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (m *memifServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), m.vppConn, metadata.IsClient(m)); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = del(ctx, conn, m.vppConn, metadata.IsClient(m)) + return nil, err + } + if err := create(ctx, conn, m.vppConn, metadata.IsClient(m)); err != nil { + _, _ = m.Close(ctx, conn) return nil, err } return conn, nil diff --git a/pkg/networkservice/mechanisms/vxlan/server.go b/pkg/networkservice/mechanisms/vxlan/server.go index 6b7d33bc..c6f4871a 100644 --- a/pkg/networkservice/mechanisms/vxlan/server.go +++ b/pkg/networkservice/mechanisms/vxlan/server.go @@ -52,12 +52,16 @@ func (v *vxlanServer) Request(ctx context.Context, request *networkservice.Netwo if request.GetConnection().GetPayload() != payload.Ethernet { return next.Server(ctx).Request(ctx, request) } - if err := addDel(ctx, request.GetConnection(), v.vppConn, true, metadata.IsClient(v)); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = addDel(ctx, request.GetConnection(), v.vppConn, false, metadata.IsClient(v)) + return nil, err + } + + if err := addDel(ctx, conn, v.vppConn, true, metadata.IsClient(v)); err != nil { + _, _ = v.Close(ctx, conn) + return nil, err + } + if err := addDel(ctx, request.GetConnection(), v.vppConn, true, metadata.IsClient(v)); err != nil { return nil, err } return conn, nil diff --git a/pkg/networkservice/tag/server.go b/pkg/networkservice/tag/server.go index f8e96488..6683684d 100644 --- a/pkg/networkservice/tag/server.go +++ b/pkg/networkservice/tag/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -39,10 +39,15 @@ func NewServer(ctx context.Context, vppConn api.Connection) networkservice.Netwo } func (t *tagServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if err := create(ctx, request.GetConnection(), t.vppConn, true); err != nil { + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { return nil, err } - return next.Server(ctx).Request(ctx, request) + if err := create(ctx, conn, t.vppConn, true); err != nil { + _, _ = t.Close(ctx, conn) + return nil, err + } + return conn, nil } func (t *tagServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/up/server.go b/pkg/networkservice/up/server.go index e0f0660f..adb19701 100644 --- a/pkg/networkservice/up/server.go +++ b/pkg/networkservice/up/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -46,13 +46,20 @@ func (u *upServer) Request(ctx context.Context, request *networkservice.NetworkS if err := u.init(ctx); err != nil { return nil, err } + conn, err := next.Server(ctx).Request(ctx, request) + if err != nil { + return nil, err + } + if err := up(ctx, u.vppConn, u.apiChannel, true); err != nil { + _, _ = u.Close(ctx, conn) return nil, err } if err := up(ctx, u.vppConn, u.apiChannel, false); err != nil { + _, _ = u.Close(ctx, conn) return nil, err } - return next.Server(ctx).Request(ctx, request) + return conn, nil } func (u *upServer) Close(ctx context.Context, conn *networkservice.Connection) (*empty.Empty, error) { diff --git a/pkg/networkservice/xconnect/l2xconnect/client.go b/pkg/networkservice/xconnect/l2xconnect/client.go index fcaebafc..fb1a5230 100644 --- a/pkg/networkservice/xconnect/l2xconnect/client.go +++ b/pkg/networkservice/xconnect/l2xconnect/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // diff --git a/pkg/networkservice/xconnect/l2xconnect/server.go b/pkg/networkservice/xconnect/l2xconnect/server.go index c0417760..b146a2e6 100644 --- a/pkg/networkservice/xconnect/l2xconnect/server.go +++ b/pkg/networkservice/xconnect/l2xconnect/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Cisco and/or its affiliates. +// Copyright (c) 2020-2021 Cisco and/or its affiliates. // // SPDX-License-Identifier: Apache-2.0 // @@ -41,12 +41,13 @@ func (v *l2XconnectServer) Request(ctx context.Context, request *networkservice. if request.GetConnection().GetPayload() != payload.Ethernet { return next.Server(ctx).Request(ctx, request) } - if err := addDel(ctx, v.vppConn, true); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = addDel(ctx, v.vppConn, false) + return nil, err + } + + if err := addDel(ctx, v.vppConn, true); err != nil { + _, _ = v.Close(ctx, conn) return nil, err } return conn, nil @@ -56,8 +57,12 @@ func (v *l2XconnectServer) Close(ctx context.Context, conn *networkservice.Conne if conn.GetPayload() != payload.Ethernet { return next.Server(ctx).Close(ctx, conn) } + rv, err := next.Server(ctx).Close(ctx, conn) + if err != nil { + return nil, err + } if err := addDel(ctx, v.vppConn, false); err != nil { return nil, err } - return next.Server(ctx).Close(ctx, conn) + return rv, nil } diff --git a/pkg/networkservice/xconnect/l3xconnect/server.go b/pkg/networkservice/xconnect/l3xconnect/server.go index 74e0aa2d..f5fad66a 100644 --- a/pkg/networkservice/xconnect/l3xconnect/server.go +++ b/pkg/networkservice/xconnect/l3xconnect/server.go @@ -39,15 +39,13 @@ func NewServer(vppConn api.Connection) networkservice.NetworkServiceServer { } func (v *l3XconnectServer) Request(ctx context.Context, request *networkservice.NetworkServiceRequest) (*networkservice.Connection, error) { - if request.GetConnection().GetPayload() != payload.IP { - return next.Server(ctx).Request(ctx, request) - } - if err := create(ctx, v.vppConn, request.GetConnection()); err != nil { - return nil, err - } conn, err := next.Server(ctx).Request(ctx, request) if err != nil { - _ = del(ctx, v.vppConn) + return nil, err + } + + if err := create(ctx, v.vppConn, conn); err != nil { + _, _ = v.Close(ctx, conn) return nil, err } return conn, nil @@ -57,8 +55,12 @@ func (v *l3XconnectServer) Close(ctx context.Context, conn *networkservice.Conne if conn.GetPayload() != payload.IP { return next.Server(ctx).Close(ctx, conn) } + rv, err := next.Server(ctx).Close(ctx, conn) + if err != nil { + return nil, err + } if err := del(ctx, v.vppConn); err != nil { return nil, err } - return next.Server(ctx).Close(ctx, conn) + return rv, nil }