summaryrefslogtreecommitdiffhomepage
path: root/gobgpd
diff options
context:
space:
mode:
authorSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2018-05-29 09:31:23 +0900
committerSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2018-06-13 13:50:30 +0900
commit0c334f5b3f8d330ced71649316c894119b2432d3 (patch)
treefe85e3e7e2bba38548d3519ff5373cedc9e8ff1f /gobgpd
parent4c63ed5d87f28ba2a829cec8cb65c01388a703ed (diff)
gobgpd: Use gRPC APIs Instead of BgpServer functions
In order to integarate the setting via configuration files and via gRPC API, This commit fixes gobgpd to use gRPC APIs instead of using BgpServer functions directly, for consistency. Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
Diffstat (limited to 'gobgpd')
-rw-r--r--gobgpd/main.go157
1 files changed, 116 insertions, 41 deletions
diff --git a/gobgpd/main.go b/gobgpd/main.go
index 9b504441..c0d9b40f 100644
--- a/gobgpd/main.go
+++ b/gobgpd/main.go
@@ -29,6 +29,7 @@ import (
"github.com/jessevdk/go-flags"
"github.com/kr/pretty"
log "github.com/sirupsen/logrus"
+ "golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
@@ -41,6 +42,18 @@ import (
var version = "master"
+func serializeRouteTargets(l []string) ([][]byte, error) {
+ rtList := make([]bgp.ExtendedCommunityInterface, 0, len(l))
+ for _, rtString := range l {
+ rt, err := bgp.ParseRouteTarget(rtString)
+ if err != nil {
+ return nil, err
+ }
+ rtList = append(rtList, rt)
+ }
+ return bgp.SerializeExtendedCommunities(rtList)
+}
+
func main() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGTERM)
@@ -155,7 +168,7 @@ func main() {
go config.ReadConfigfileServe(opts.ConfigFile, opts.ConfigType, configCh)
}
- var c *config.BgpConfigSet = nil
+ var c *config.BgpConfigSet
for {
select {
case newConfig := <-configCh:
@@ -165,26 +178,56 @@ func main() {
if c == nil {
c = newConfig
- if err := bgpServer.Start(&newConfig.Global); err != nil {
+ if _, err := apiServer.StartServer(context.Background(), &api.StartServerRequest{
+ Global: &api.Global{
+ As: c.Global.Config.As,
+ RouterId: c.Global.Config.RouterId,
+ ListenPort: c.Global.Config.Port,
+ ListenAddresses: c.Global.Config.LocalAddressList,
+ UseMultiplePaths: c.Global.UseMultiplePaths.Config.Enabled,
+ },
+ }); err != nil {
log.Fatalf("failed to set global config: %s", err)
}
+
if newConfig.Zebra.Config.Enabled {
- if err := bgpServer.StartZebraClient(&newConfig.Zebra.Config); err != nil {
+ tps := c.Zebra.Config.RedistributeRouteTypeList
+ l := make([]string, 0, len(tps))
+ for _, t := range tps {
+ l = append(l, string(t))
+ }
+ if _, err := apiServer.EnableZebra(context.Background(), &api.EnableZebraRequest{
+ Url: c.Zebra.Config.Url,
+ RouteTypes: l,
+ Version: uint32(c.Zebra.Config.Version),
+ NexthopTriggerEnable: c.Zebra.Config.NexthopTriggerEnable,
+ NexthopTriggerDelay: uint32(c.Zebra.Config.NexthopTriggerDelay),
+ }); err != nil {
log.Fatalf("failed to set zebra config: %s", err)
}
}
+
if len(newConfig.Collector.Config.Url) > 0 {
if err := bgpServer.StartCollector(&newConfig.Collector.Config); err != nil {
log.Fatalf("failed to set collector config: %s", err)
}
}
- for i, _ := range newConfig.RpkiServers {
- if err := bgpServer.AddRpki(&newConfig.RpkiServers[i].Config); err != nil {
+
+ for _, c := range newConfig.RpkiServers {
+ if _, err := apiServer.AddRpki(context.Background(), &api.AddRpkiRequest{
+ Address: c.Config.Address,
+ Port: c.Config.Port,
+ Lifetime: c.Config.RecordLifetime,
+ }); err != nil {
log.Fatalf("failed to set rpki config: %s", err)
}
}
- for i, _ := range newConfig.BmpServers {
- if err := bgpServer.AddBmp(&newConfig.BmpServers[i].Config); err != nil {
+ for _, c := range newConfig.BmpServers {
+ if _, err := apiServer.AddBmp(context.Background(), &api.AddBmpRequest{
+ Address: c.Config.Address,
+ Port: c.Config.Port,
+ Type: api.AddBmpRequest_MonitoringPolicy(c.Config.RouteMonitoringPolicy.ToInt()),
+ }); err != nil {
log.Fatalf("failed to set bmp config: %s", err)
}
}
@@ -193,31 +236,38 @@ func main() {
if err != nil {
log.Fatalf("failed to load vrf rd config: %s", err)
}
- importRtList := make([]bgp.ExtendedCommunityInterface, 0, len(vrf.Config.ImportRtList))
- for _, rtString := range vrf.Config.ImportRtList {
- rt, err := bgp.ParseRouteTarget(rtString)
- if err != nil {
- log.Fatalf("failed to load vrf import rt config: %s", err)
- }
- importRtList = append(importRtList, rt)
+ rdbuf, _ := rd.Serialize()
+
+ importRtList, err := serializeRouteTargets(vrf.Config.ImportRtList)
+ if err != nil {
+ log.Fatalf("failed to load vrf import rt config: %s", err)
}
- exportRtList := make([]bgp.ExtendedCommunityInterface, 0, len(vrf.Config.ExportRtList))
- for _, rtString := range vrf.Config.ExportRtList {
- rt, err := bgp.ParseRouteTarget(rtString)
- if err != nil {
- log.Fatalf("failed to load vrf export rt config: %s", err)
- }
- exportRtList = append(exportRtList, rt)
+ exportRtList, err := serializeRouteTargets(vrf.Config.ExportRtList)
+ if err != nil {
+ log.Fatalf("failed to load vrf export rt config: %s", err)
}
- if err := bgpServer.AddVrf(vrf.Config.Name, vrf.Config.Id, rd, importRtList, exportRtList); err != nil {
+
+ if _, err := apiServer.AddVrf(context.Background(), &api.AddVrfRequest{
+ Vrf: &api.Vrf{
+ Name: vrf.Config.Name,
+ Rd: rdbuf,
+ Id: uint32(vrf.Config.Id),
+ ImportRt: importRtList,
+ ExportRt: exportRtList,
+ },
+ }); err != nil {
log.Fatalf("failed to set vrf config: %s", err)
}
}
- for i, _ := range newConfig.MrtDump {
- if len(newConfig.MrtDump[i].Config.FileName) == 0 {
+ for _, c := range newConfig.MrtDump {
+ if len(c.Config.FileName) == 0 {
continue
}
- if err := bgpServer.EnableMrt(&newConfig.MrtDump[i].Config); err != nil {
+ if _, err := apiServer.EnableMrt(context.Background(), &api.EnableMrtRequest{
+ DumpType: int32(c.Config.DumpType.ToInt()),
+ Filename: c.Config.FileName,
+ Interval: c.Config.DumpInterval,
+ }); err != nil {
log.Fatalf("failed to set mrt config: %s", err)
}
}
@@ -259,10 +309,10 @@ func main() {
}
return def
}
- toPolicyDefinitions := func(r []string) []*config.PolicyDefinition {
- p := make([]*config.PolicyDefinition, 0, len(r))
+ toPolicies := func(r []string) []*table.Policy {
+ p := make([]*table.Policy, 0, len(r))
for _, n := range r {
- p = append(p, &config.PolicyDefinition{
+ p = append(p, &table.Policy{
Name: n,
})
}
@@ -270,12 +320,26 @@ func main() {
}
def := toDefaultTable(a.DefaultImportPolicy)
- ps := toPolicyDefinitions(a.ImportPolicyList)
- bgpServer.ReplacePolicyAssignment("", table.POLICY_DIRECTION_IMPORT, ps, def)
+ ps := toPolicies(a.ImportPolicyList)
+ apiServer.ReplacePolicyAssignment(context.Background(), &api.ReplacePolicyAssignmentRequest{
+ Assignment: api.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{
+ Name: "",
+ Type: table.POLICY_DIRECTION_IMPORT,
+ Policies: ps,
+ Default: def,
+ }),
+ })
def = toDefaultTable(a.DefaultExportPolicy)
- ps = toPolicyDefinitions(a.ExportPolicyList)
- bgpServer.ReplacePolicyAssignment("", table.POLICY_DIRECTION_EXPORT, ps, def)
+ ps = toPolicies(a.ExportPolicyList)
+ apiServer.ReplacePolicyAssignment(context.Background(), &api.ReplacePolicyAssignmentRequest{
+ Assignment: api.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{
+ Name: "",
+ Type: table.POLICY_DIRECTION_EXPORT,
+ Policies: ps,
+ Default: def,
+ }),
+ })
updatePolicy = true
@@ -308,29 +372,40 @@ func main() {
log.Warn(err)
}
}
- for i, p := range added {
+ for _, p := range added {
log.Infof("Peer %v is added", p.State.NeighborAddress)
- if err := bgpServer.AddNeighbor(&added[i]); err != nil {
+ if _, err := apiServer.AddNeighbor(context.Background(), &api.AddNeighborRequest{
+ Peer: api.NewPeerFromConfigStruct(&p),
+ }); err != nil {
log.Warn(err)
}
}
- for i, p := range deleted {
+ for _, p := range deleted {
log.Infof("Peer %v is deleted", p.State.NeighborAddress)
- if err := bgpServer.DeleteNeighbor(&deleted[i]); err != nil {
+ if _, err := apiServer.DeleteNeighbor(context.Background(), &api.DeleteNeighborRequest{
+ Peer: api.NewPeerFromConfigStruct(&p),
+ }); err != nil {
log.Warn(err)
}
}
- for i, p := range updated {
+ for _, p := range updated {
log.Infof("Peer %v is updated", p.State.NeighborAddress)
- u, err := bgpServer.UpdateNeighbor(&updated[i])
- if err != nil {
+ if u, err := apiServer.UpdateNeighbor(context.Background(), &api.UpdateNeighborRequest{
+ Peer: api.NewPeerFromConfigStruct(&p),
+ }); err != nil {
log.Warn(err)
+ } else {
+ updatePolicy = updatePolicy || u.NeedsSoftResetIn
}
- updatePolicy = updatePolicy || u
}
if updatePolicy {
- bgpServer.SoftResetIn("", bgp.RouteFamily(0))
+ if _, err := apiServer.SoftResetNeighbor(context.Background(), &api.SoftResetNeighborRequest{
+ Address: "",
+ Direction: api.SoftResetNeighborRequest_IN,
+ }); err != nil {
+ log.Warn(err)
+ }
}
case <-sigCh:
bgpServer.Shutdown()