Skip to content

Commit

Permalink
feat(frr): replace static config with dynamic grpc
Browse files Browse the repository at this point in the history
Signed-off-by: Boris Glimcher <[email protected]>
  • Loading branch information
glimchb committed Oct 16, 2023
1 parent 79f56ca commit 1367389
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 80 deletions.
68 changes: 0 additions & 68 deletions conf/leaf1.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,6 @@ service integrated-vtysh-config
password opi
enable password opi
!
vrf green
vni 100
exit-vrf
!
vrf yellow
vni 101
exit-vrf
!
router bgp 65000
no bgp log-neighbor-changes
no bgp default show-hostname
Expand All @@ -39,64 +31,4 @@ router bgp 65000
exit-address-family
exit
!
router bgp 65000 vrf blue
no bgp log-neighbor-changes
bgp ebgp-requires-policy
no bgp default show-hostname
no bgp default show-nexthop-hostname
no bgp deterministic-med
timers bgp 60 180
!
address-family ipv4 unicast
redistribute kernel
redistribute connected
redistribute static
maximum-paths ibgp 1
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit
!
router bgp 65000 vrf green
no bgp log-neighbor-changes
bgp ebgp-requires-policy
no bgp default show-hostname
no bgp default show-nexthop-hostname
no bgp deterministic-med
timers bgp 60 180
!
address-family ipv4 unicast
redistribute kernel
redistribute connected
redistribute static
maximum-paths ibgp 1
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit
!
router bgp 65000 vrf yellow
no bgp log-neighbor-changes
bgp ebgp-requires-policy
no bgp default show-hostname
no bgp default show-nexthop-hostname
no bgp deterministic-med
timers bgp 60 180
!
address-family ipv4 unicast
redistribute kernel
redistribute connected
redistribute static
maximum-paths ibgp 1
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit
!

20 changes: 8 additions & 12 deletions pkg/evpn/vrf.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"github.com/vishvananda/netlink"

pb "github.com/opiproject/opi-api/network/evpn-gw/v1alpha1/gen/go"
"github.com/opiproject/opi-evpn-bridge/pkg/utils"

"go.einride.tech/aip/fieldbehavior"
"go.einride.tech/aip/resourceid"
Expand Down Expand Up @@ -138,18 +137,11 @@ func (s *Server) CreateVrf(ctx context.Context, in *pb.CreateVrfRequest) (*pb.Vr
fmt.Printf("Failed to up Vxlan link: %v", err)
return nil, err
}
// configure FRR
data, err := utils.FrrZebraCmd(ctx, fmt.Sprintf(
`configure terminal
vrf %s-opi
vni 3%d
exit-vrf
exit`, vrfName, *in.Vrf.Spec.Vni))
fmt.Printf("FrrZebraCmd: %v:%v", data, err)
}
// check FRR for debug
data, err := utils.FrrZebraCmd(ctx, "show vrf")
fmt.Printf("FrrZebraCmd: %v:%v", data, err)
// configure FRR
if err := s.frrCreateVrfRequest(ctx, in); err != nil {
return nil, err
}
// save object to the database
response := protoClone(in.Vrf)
response.Status = &pb.VrfStatus{LocalAs: 4, RoutingTable: tableID, Rmac: mac}
Expand Down Expand Up @@ -229,6 +221,10 @@ func (s *Server) DeleteVrf(ctx context.Context, in *pb.DeleteVrfRequest) (*empty
fmt.Printf("Failed to delete link: %v", err)
return nil, err
}
// delete from FRR
if err := s.frrDeleteVrfRequest(ctx, obj); err != nil {
return nil, err
}
// remove from the Database
delete(s.Vrfs, obj.Name)
return &emptypb.Empty{}, nil
Expand Down
87 changes: 87 additions & 0 deletions pkg/evpn/vrf_frr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2022-2023 Dell Inc, or its subsidiaries.

// Package evpn is the main package of the application
package evpn

import (
"context"
"fmt"
"path"

pb "github.com/opiproject/opi-api/network/evpn-gw/v1alpha1/gen/go"
"github.com/opiproject/opi-evpn-bridge/pkg/utils"
)

func (s *Server) frrCreateVrfRequest(ctx context.Context, in *pb.CreateVrfRequest) error {
vrfName := path.Base(in.Vrf.Name)
if in.Vrf.Spec.Vni != nil {
data, err := utils.FrrZebraCmd(ctx, fmt.Sprintf(
`configure terminal
vrf %s
vni %d
exit-vrf
exit`, vrfName, *in.Vrf.Spec.Vni))
fmt.Printf("FrrZebraCmd: %v:%v", data, err)
if err != nil {
return err
}
}
if in.Vrf.Spec.Vni != nil {
data, err := utils.FrrBgpCmd(ctx, fmt.Sprintf(
`configure terminal
router bgp 65000 vrf %s
no bgp log-neighbor-changes
bgp ebgp-requires-policy
no bgp default show-hostname
no bgp default show-nexthop-hostname
no bgp deterministic-med
timers bgp 60 180
address-family ipv4 unicast
redistribute kernel
redistribute connected
redistribute static
maximum-paths ibgp 1
exit-address-family
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit`, vrfName))
fmt.Printf("FrrBgpCmd: %v:%v", data, err)
if err != nil {
return err
}
}
// check FRR for debug
data, err := utils.FrrZebraCmd(ctx, "show vrf")
fmt.Printf("FrrZebraCmd: %v:%v", data, err)
if err != nil {
return err
}
return nil
}

func (s *Server) frrDeleteVrfRequest(ctx context.Context, obj *pb.Vrf) error {
vrfName := path.Base(obj.Name)
if obj.Spec.Vni != nil {
data, err := utils.FrrBgpCmd(ctx, fmt.Sprintf(
`configure terminal
no router bgp 65000 vrf %s
exit`, vrfName))
fmt.Printf("FrrBgpCmd: %v:%v", data, err)
if err != nil {
return err
}
}
if obj.Spec.Vni != nil {
data, err := utils.FrrZebraCmd(ctx, fmt.Sprintf(
`configure terminal
no vrf %s
exit`, vrfName))
fmt.Printf("FrrZebraCmd: %v:%v", data, err)
if err != nil {
return err
}
}
return nil
}

0 comments on commit 1367389

Please sign in to comment.