From 15b7489fa627ba1bf3219530a6e807ad6427f27c Mon Sep 17 00:00:00 2001 From: Boris Glimcher Date: Tue, 17 Oct 2023 00:45:16 +0300 Subject: [PATCH] test(frr): start using mockery Fixes #251 Signed-off-by: Boris Glimcher --- pkg/evpn/bridge_test.go | 45 ++++++++++++---------- pkg/evpn/evpn.go | 10 +++-- pkg/evpn/evpn_test.go | 10 ++++- pkg/evpn/port_test.go | 51 ++++++++++++++----------- pkg/evpn/svi.go | 6 +-- pkg/evpn/svi_test.go | 55 ++++++++++++++------------ pkg/evpn/vrf.go | 6 +-- pkg/evpn/vrf_test.go | 68 +++++++++++++++++++-------------- pkg/utils/{telnet.go => frr.go} | 1 - 9 files changed, 143 insertions(+), 109 deletions(-) rename pkg/utils/{telnet.go => frr.go} (98%) diff --git a/pkg/evpn/bridge_test.go b/pkg/evpn/bridge_test.go index 1307538c..1501794f 100644 --- a/pkg/evpn/bridge_test.go +++ b/pkg/evpn/bridge_test.go @@ -67,7 +67,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode codes.Code errMsg string exist bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "illegal resource_id": { id: "CapitalLettersNotAllowed", @@ -147,7 +147,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", tenantbridgeName), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(nil, errors.New(errMsg)).Once() }, }, @@ -158,7 +158,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { // myip := net.ParseIP("10.0.0.2") myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) @@ -176,7 +176,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetMaster", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -194,7 +194,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -213,7 +213,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -234,7 +234,7 @@ func Test_CreateLogicalBridge(t *testing.T) { errCode: codes.OK, errMsg: "", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -256,7 +256,8 @@ func Test_CreateLogicalBridge(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -280,7 +281,7 @@ func Test_CreateLogicalBridge(t *testing.T) { tt.out.Name = testLogicalBridgeName } if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.CreateLogicalBridgeRequest{LogicalBridge: tt.in, LogicalBridgeId: tt.id} @@ -310,7 +311,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode codes.Code errMsg string missing bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "valid request with unknown key": { in: "unknown-id", @@ -342,7 +343,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", "vni11"), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) mockNetlink.EXPECT().LinkByName(mock.Anything, vxlanName).Return(nil, errors.New(errMsg)).Once() }, @@ -353,7 +354,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -368,7 +369,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -385,7 +386,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -403,7 +404,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { errCode: codes.OK, errMsg: "", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testLogicalBridge.Spec.Vni) @@ -423,7 +424,8 @@ func Test_DeleteLogicalBridge(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -443,7 +445,7 @@ func Test_DeleteLogicalBridge(t *testing.T) { opi.Bridges[testLogicalBridgeName] = protoClone(&testLogicalBridgeWithStatus) if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.DeleteLogicalBridgeRequest{Name: fname1, AllowMissing: tt.missing} @@ -513,7 +515,8 @@ func Test_UpdateLogicalBridge(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -593,7 +596,8 @@ func Test_GetLogicalBridge(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -696,7 +700,8 @@ func Test_ListLogicalBridges(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), diff --git a/pkg/evpn/evpn.go b/pkg/evpn/evpn.go index 8832e72c..ff7d731d 100644 --- a/pkg/evpn/evpn.go +++ b/pkg/evpn/evpn.go @@ -45,12 +45,16 @@ type Server struct { // NewServer creates initialized instance of EVPN server func NewServer() *Server { nLink := utils.NewNetlinkWrapper() - return NewServerWithArgs(nLink) + frr := utils.NewFrrWrapper() + return NewServerWithArgs(nLink, frr) } // NewServerWithArgs creates initialized instance of EVPN server // with externally created Netlink -func NewServerWithArgs(nLink utils.Netlink) *Server { +func NewServerWithArgs(nLink utils.Netlink, frr utils.Frr) *Server { + if frr == nil { + log.Panic("nil for Frr is not allowed") + } if nLink == nil { log.Panic("nil for Netlink is not allowed") } @@ -61,7 +65,7 @@ func NewServerWithArgs(nLink utils.Netlink) *Server { Vrfs: make(map[string]*pe.Vrf), Pagination: make(map[string]int), nLink: nLink, - frr: utils.NewFrrWrapper(), + frr: frr, tracer: otel.Tracer(""), } } diff --git a/pkg/evpn/evpn_test.go b/pkg/evpn/evpn_test.go index 602c1aa4..f3b43d30 100644 --- a/pkg/evpn/evpn_test.go +++ b/pkg/evpn/evpn_test.go @@ -56,14 +56,22 @@ func equalProtoSlices[T proto.Message](x, y []T) bool { func TestFrontEnd_NewServerWithArgs(t *testing.T) { tests := map[string]struct { + frr utils.Frr nLink utils.Netlink wantPanic bool }{ "nil netlink argument": { + frr: &utils.FrrWrapper{}, nLink: nil, wantPanic: true, }, + "nil frr argument": { + frr: nil, + nLink: &utils.NetlinkWrapper{}, + wantPanic: true, + }, "all valid arguments": { + frr: &utils.FrrWrapper{}, nLink: &utils.NetlinkWrapper{}, wantPanic: false, }, @@ -78,7 +86,7 @@ func TestFrontEnd_NewServerWithArgs(t *testing.T) { } }() - server := NewServerWithArgs(tt.nLink) + server := NewServerWithArgs(tt.nLink, tt.frr) if server == nil && !tt.wantPanic { t.Error("expected non nil server or panic") } diff --git a/pkg/evpn/port_test.go b/pkg/evpn/port_test.go index aa19d5fd..acb148fa 100644 --- a/pkg/evpn/port_test.go +++ b/pkg/evpn/port_test.go @@ -57,7 +57,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode codes.Code errMsg string exist bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "illegal resource_id": { id: "CapitalLettersNotAllowed", @@ -132,7 +132,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", tenantbridgeName), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(nil, errors.New(errMsg)).Once() }, }, @@ -143,7 +143,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", testBridgePortID), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(nil, errors.New(errMsg)).Once() @@ -156,7 +156,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetHardwareAddr", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -172,7 +172,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetMaster", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -195,7 +195,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", "Japan"), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -212,7 +212,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -237,7 +237,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -256,7 +256,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -276,7 +276,7 @@ func Test_CreateBridgePort(t *testing.T) { errCode: codes.OK, errMsg: "", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} @@ -297,7 +297,8 @@ func Test_CreateBridgePort(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -322,7 +323,7 @@ func Test_CreateBridgePort(t *testing.T) { tt.out.Name = testBridgePortName } if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.CreateBridgePortRequest{BridgePort: tt.in, BridgePortId: tt.id} @@ -352,7 +353,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode codes.Code errMsg string missing bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "valid request with unknown key": { in: "unknown-id", @@ -384,7 +385,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", testBridgePortID), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(nil, errors.New(errMsg)).Once() }, }, @@ -394,7 +395,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(iface, nil).Once() mockNetlink.EXPECT().LinkSetDown(mock.Anything, iface).Return(errors.New(errMsg)).Once() @@ -406,7 +407,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(iface, nil).Once() mockNetlink.EXPECT().LinkSetDown(mock.Anything, iface).Return(nil).Once() @@ -420,7 +421,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(iface, nil).Once() mockNetlink.EXPECT().LinkSetDown(mock.Anything, iface).Return(nil).Once() @@ -435,7 +436,7 @@ func Test_DeleteBridgePort(t *testing.T) { errCode: codes.OK, errMsg: "", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { iface := &netlink.Dummy{LinkAttrs: netlink.LinkAttrs{Name: testBridgePortID}} mockNetlink.EXPECT().LinkByName(mock.Anything, testBridgePortID).Return(iface, nil).Once() mockNetlink.EXPECT().LinkSetDown(mock.Anything, iface).Return(nil).Once() @@ -452,7 +453,8 @@ func Test_DeleteBridgePort(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -472,7 +474,7 @@ func Test_DeleteBridgePort(t *testing.T) { opi.Ports[testBridgePortName] = protoClone(&testBridgePortWithStatus) opi.Bridges[testLogicalBridgeName] = protoClone(&testLogicalBridgeWithStatus) if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.DeleteBridgePortRequest{Name: fname1, AllowMissing: tt.missing} @@ -543,7 +545,8 @@ func Test_UpdateBridgePort(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -623,7 +626,8 @@ func Test_GetBridgePort(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -726,7 +730,8 @@ func Test_ListBridgePorts(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), diff --git a/pkg/evpn/svi.go b/pkg/evpn/svi.go index 60fed1f3..9db99d33 100644 --- a/pkg/evpn/svi.go +++ b/pkg/evpn/svi.go @@ -120,8 +120,7 @@ func (s *Server) CreateSvi(ctx context.Context, in *pb.CreateSviRequest) (*pb.Sv } // configure FRR if err := s.frrCreateSviRequest(ctx, in, vrfName, vlanName); err != nil { - fmt.Printf("skip err check for now: %v", err) - // return nil, err + return nil, err } // save object to the database response := protoClone(in.Svi) @@ -189,8 +188,7 @@ func (s *Server) DeleteSvi(ctx context.Context, in *pb.DeleteSviRequest) (*empty vrfName := path.Base(vrf.Name) // delete from FRR if err := s.frrDeleteSviRequest(ctx, obj, vrfName, vlanName); err != nil { - fmt.Printf("skip err check for now: %v", err) - // return nil, err + return nil, err } // remove from the Database delete(s.Svis, obj.Name) diff --git a/pkg/evpn/svi_test.go b/pkg/evpn/svi_test.go index d05e64e2..844b26f3 100644 --- a/pkg/evpn/svi_test.go +++ b/pkg/evpn/svi_test.go @@ -59,7 +59,7 @@ func Test_CreateSvi(t *testing.T) { errCode codes.Code errMsg string exist bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "illegal resource_id": { id: "CapitalLettersNotAllowed", @@ -212,7 +212,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", tenantbridgeName), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(nil, errors.New(errMsg)).Once() }, }, @@ -223,7 +223,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -237,7 +237,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -254,7 +254,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetHardwareAddr", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -273,7 +273,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call AddrAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -295,7 +295,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", testVrfName), exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -318,7 +318,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetMaster", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -343,7 +343,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -369,7 +369,7 @@ func Test_CreateSvi(t *testing.T) { errCode: codes.OK, errMsg: "", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vid := uint16(testLogicalBridge.Spec.VlanId) bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() @@ -386,6 +386,8 @@ func Test_CreateSvi(t *testing.T) { mockNetlink.EXPECT().LinkByName(mock.Anything, testVrfID).Return(vrfdev, nil).Once() mockNetlink.EXPECT().LinkSetMaster(mock.Anything, vlandev, vrfdev).Return(nil).Once() mockNetlink.EXPECT().LinkSetUp(mock.Anything, vlandev).Return(nil).Once() + // frr + mockFrr.EXPECT().FrrZebraCmd(mock.Anything, mock.Anything).Return("", nil).Once() }, }, } @@ -396,7 +398,8 @@ func Test_CreateSvi(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -420,7 +423,7 @@ func Test_CreateSvi(t *testing.T) { tt.out.Name = testSviName } if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } opi.Vrfs[testVrfName] = protoClone(&testVrfWithStatus) opi.Bridges[testLogicalBridgeName] = protoClone(&testLogicalBridgeWithStatus) @@ -452,7 +455,7 @@ func Test_DeleteSvi(t *testing.T) { errCode codes.Code errMsg string missing bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "valid request with unknown key": { in: "unknown-id", @@ -484,7 +487,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", tenantbridgeName), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(nil, errors.New(errMsg)).Once() }, }, @@ -494,7 +497,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call BridgeVlanDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() vid := uint16(testLogicalBridge.Spec.VlanId) @@ -507,7 +510,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", "vlan22"), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() vid := uint16(testLogicalBridge.Spec.VlanId) @@ -522,7 +525,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() vid := uint16(testLogicalBridge.Spec.VlanId) @@ -539,7 +542,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() vid := uint16(testLogicalBridge.Spec.VlanId) @@ -557,7 +560,7 @@ func Test_DeleteSvi(t *testing.T) { errCode: codes.OK, errMsg: "", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: tenantbridgeName}} mockNetlink.EXPECT().LinkByName(mock.Anything, tenantbridgeName).Return(bridge, nil).Once() vid := uint16(testLogicalBridge.Spec.VlanId) @@ -577,7 +580,8 @@ func Test_DeleteSvi(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -598,7 +602,7 @@ func Test_DeleteSvi(t *testing.T) { opi.Vrfs[testVrfName] = protoClone(&testVrfWithStatus) opi.Bridges[testLogicalBridgeName] = protoClone(&testLogicalBridgeWithStatus) if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.DeleteSviRequest{Name: fname1, AllowMissing: tt.missing} @@ -670,7 +674,8 @@ func Test_UpdateSvi(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -750,7 +755,8 @@ func Test_GetSvi(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -853,7 +859,8 @@ func Test_ListSvis(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), diff --git a/pkg/evpn/vrf.go b/pkg/evpn/vrf.go index e870fc1e..0c265d2a 100644 --- a/pkg/evpn/vrf.go +++ b/pkg/evpn/vrf.go @@ -140,8 +140,7 @@ func (s *Server) CreateVrf(ctx context.Context, in *pb.CreateVrfRequest) (*pb.Vr } // configure FRR if err := s.frrCreateVrfRequest(ctx, in); err != nil { - fmt.Printf("skip err check for now: %v", err) - // return nil, err + return nil, err } // save object to the database response := protoClone(in.Vrf) @@ -224,8 +223,7 @@ func (s *Server) DeleteVrf(ctx context.Context, in *pb.DeleteVrfRequest) (*empty } // delete from FRR if err := s.frrDeleteVrfRequest(ctx, obj); err != nil { - fmt.Printf("skip err check for now: %v", err) - // return nil, err + return nil, err } // remove from the Database delete(s.Vrfs, obj.Name) diff --git a/pkg/evpn/vrf_test.go b/pkg/evpn/vrf_test.go index a7cb0e86..a2b3afcd 100644 --- a/pkg/evpn/vrf_test.go +++ b/pkg/evpn/vrf_test.go @@ -75,7 +75,7 @@ func Test_CreateVrf(t *testing.T) { errCode codes.Code errMsg string exist bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "illegal resource_id": { id: "CapitalLettersNotAllowed", @@ -139,10 +139,12 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.OK, errMsg: "", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1000} mockNetlink.EXPECT().LinkAdd(mock.Anything, vrf).Return(nil).Once() mockNetlink.EXPECT().LinkSetUp(mock.Anything, vrf).Return(nil).Once() + // frr + mockFrr.EXPECT().FrrZebraCmd(mock.Anything, mock.Anything).Return("", nil).Once() }, }, "failed LinkAdd call": { @@ -152,7 +154,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} mockNetlink.EXPECT().LinkAdd(mock.Anything, vrf).Return(errors.New(errMsg)).Once() }, @@ -164,7 +166,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} mockNetlink.EXPECT().LinkAdd(mock.Anything, vrf).Return(nil).Once() mockNetlink.EXPECT().LinkSetUp(mock.Anything, vrf).Return(errors.New(errMsg)).Once() @@ -177,7 +179,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkAdd", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -193,7 +195,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetMaster", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -210,7 +212,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetHardwareAddr", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -228,7 +230,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -247,7 +249,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -271,7 +273,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetMaster", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -296,7 +298,7 @@ func Test_CreateVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetUp", exist: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { bridgeName := fmt.Sprintf("br%d", *testVrf.Spec.Vni) vrf := &netlink.Vrf{LinkAttrs: netlink.LinkAttrs{Name: testVrfID}, Table: 1001} bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}} @@ -323,7 +325,8 @@ func Test_CreateVrf(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -347,7 +350,7 @@ func Test_CreateVrf(t *testing.T) { tt.out.Name = testVrfName } if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.CreateVrfRequest{Vrf: tt.in, VrfId: tt.id} @@ -381,7 +384,7 @@ func Test_DeleteVrf(t *testing.T) { errCode codes.Code errMsg string missing bool - on func(mockNetlink *mocks.Netlink, errMsg string) + on func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) }{ "valid request with unknown key": { in: "unknown-id", @@ -413,7 +416,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", "vni1000"), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) mockNetlink.EXPECT().LinkByName(mock.Anything, vxlanName).Return(nil, errors.New(errMsg)).Once() }, @@ -424,7 +427,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -439,7 +442,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -455,7 +458,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", "br1000"), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -473,7 +476,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -493,7 +496,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -514,7 +517,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.NotFound, errMsg: fmt.Sprintf("unable to find key %v", testVrfID), missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -536,7 +539,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkSetDown", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -560,7 +563,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.Unknown, errMsg: "Failed to call LinkDel", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -585,7 +588,7 @@ func Test_DeleteVrf(t *testing.T) { errCode: codes.OK, errMsg: "", missing: false, - on: func(mockNetlink *mocks.Netlink, errMsg string) { + on: func(mockNetlink *mocks.Netlink, mockFrr *mocks.Frr, errMsg string) { myip := make(net.IP, 4) binary.BigEndian.PutUint32(myip, 167772162) vxlanName := fmt.Sprintf("vni%d", *testVrf.Spec.Vni) @@ -602,6 +605,9 @@ func Test_DeleteVrf(t *testing.T) { mockNetlink.EXPECT().LinkByName(mock.Anything, testVrfID).Return(vrf, nil).Once() mockNetlink.EXPECT().LinkSetDown(mock.Anything, vrf).Return(nil).Once() mockNetlink.EXPECT().LinkDel(mock.Anything, vrf).Return(nil).Once() + // frr + mockFrr.EXPECT().FrrBgpCmd(mock.Anything, mock.Anything).Return("", nil).Once() + mockFrr.EXPECT().FrrZebraCmd(mock.Anything, mock.Anything).Return("", nil).Once() }, }, } @@ -612,7 +618,8 @@ func Test_DeleteVrf(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -631,7 +638,7 @@ func Test_DeleteVrf(t *testing.T) { fname1 := resourceIDToFullName("vrfs", tt.in) opi.Vrfs[testVrfName] = protoClone(&testVrfWithStatus) if tt.on != nil { - tt.on(mockNetlink, tt.errMsg) + tt.on(mockNetlink, mockFrr, tt.errMsg) } request := &pb.DeleteVrfRequest{Name: fname1, AllowMissing: tt.missing} @@ -703,7 +710,8 @@ func Test_UpdateVrf(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -783,7 +791,8 @@ func Test_GetVrf(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), @@ -886,7 +895,8 @@ func Test_ListVrfs(t *testing.T) { // start GRPC mockup server ctx := context.Background() mockNetlink := mocks.NewNetlink(t) - opi := NewServerWithArgs(mockNetlink) + mockFrr := mocks.NewFrr(t) + opi := NewServerWithArgs(mockNetlink, mockFrr) conn, err := grpc.DialContext(ctx, "", grpc.WithTransportCredentials(insecure.NewCredentials()), diff --git a/pkg/utils/telnet.go b/pkg/utils/frr.go similarity index 98% rename from pkg/utils/telnet.go rename to pkg/utils/frr.go index bebac195..58a277f7 100644 --- a/pkg/utils/telnet.go +++ b/pkg/utils/frr.go @@ -106,7 +106,6 @@ func (n *FrrWrapper) FrrBgpCmd(ctx context.Context, command string) (string, err // TelnetDialAndCommunicate connects to telnet with password and runs command func (n *FrrWrapper) TelnetDialAndCommunicate(ctx context.Context, command string, port int) (string, error) { _, childSpan := n.tracer.Start(ctx, "frr.Command") - childSpan.SetAttributes(attribute.String("command.name", command)) defer childSpan.End() if childSpan.IsRecording() {